2026-10-24T19:49:41.1927241Z Current runner version: '2.338.1' 2026-10-24T19:49:41.1930754Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-z6r5lyhioymnh7ra' 2026-10-24T19:49:41.1931499Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T19:49:41.1932257Z Machine name: 'ip-172-31-73-130' 2026-10-24T19:49:41.1933904Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T19:49:41.1935169Z Contents: read 2026-10-24T19:49:41.1935668Z Metadata: read 2026-10-24T19:49:41.1936028Z ##[endgroup] 2026-10-24T19:49:41.1937447Z Secret source: Actions 2026-10-24T19:49:41.1938126Z Cache mode: write 2026-10-24T19:49:41.1938597Z Prepare workflow directory 2026-10-24T19:49:41.2125858Z Prepare all required actions 2026-10-24T19:49:41.2152987Z Getting action download info 2026-10-24T19:49:41.3396457Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T19:49:41.3681729Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T19:49:41.4898253Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T19:49:41.4937013Z Complete job name: Lint 2026-10-24T19:49:41.5330852Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T19:49:41.5389651Z ##[group]Run '/setup.sh' 2026-10-24T19:49:41.5397867Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T19:49:41.5398275Z env: 2026-10-24T19:49:41.5398502Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:41.5398791Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:41.5399070Z BLACKSMITH_CHECK_RUN_ID: 120970600013 2026-10-24T19:49:41.5399347Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T19:49:41.5399621Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T19:49:41.5399883Z ##[endgroup] 2026-10-24T19:49:41.5629888Z Logging daemon started (blacksmithd for logs) 2026-10-24T19:49:41.5710731Z Results daemon started (blacksmithd for results) 2026-10-24T19:49:41.5836206Z Background adoption and SSH setup started (PID: 3058) 2026-10-24T19:49:41.5838842Z 2026-10-24T19:49:41.5838954Z ---------------------------------------- 2026-10-24T19:49:41.5839429Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40127045827/jobs/120970600013 2026-10-24T19:49:41.5839849Z SSH Access (using your GitHub SSH key): 2026-10-24T19:49:41.5840261Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-z6r5lyhioymnh7ra.vm.blacksmith.sh 2026-10-24T19:49:41.5840612Z 2026-10-24T19:49:41.5840719Z No GitHub SSH key? Add one at: 2026-10-24T19:49:41.5841195Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T19:49:41.5841592Z 2026-10-24T19:49:41.5841696Z ---------------------------------------- 2026-10-24T19:49:41.5841869Z 2026-10-24T19:49:41.5842011Z VM ID: blacksmith-8vcpu-ubuntu-2404-z6r5lyhioymnh7ra 2026-10-24T19:49:41.5842331Z Host: production-152.236.41.191-x8664 2026-10-24T19:49:41.5842600Z Host Agent PID: 744619 2026-10-24T19:49:41.5842841Z Host Agent Git SHA: 1637818df 2026-10-24T19:49:41.5843110Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T19:49:41.5843386Z Blacksmith Host Generation: gen 2 2026-10-24T19:49:41.5843668Z Petname: production-excited-amoeba-77611e30 2026-10-24T19:49:41.5843954Z Region: us-east 2026-10-24T19:49:41.5844184Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T19:49:41.5851018Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T19:49:41.5851389Z 2026-10-24T19:49:41.5851504Z Enabling Blacksmith transparent cache 2026-10-24T19:49:41.6073964Z ##[group]Run actions/checkout@v6 2026-10-24T19:49:41.6074265Z with: 2026-10-24T19:49:41.6074586Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T19:49:41.6074973Z sparse-checkout-cone-mode: false 2026-10-24T19:49:41.6075250Z repository: pingdotgg/t3code 2026-10-24T19:49:41.6077097Z token: *** 2026-10-24T19:49:41.6077312Z ssh-strict: true 2026-10-24T19:49:41.6077535Z ssh-user: git 2026-10-24T19:49:41.6077758Z persist-credentials: true 2026-10-24T19:49:41.6078232Z clean: true 2026-10-24T19:49:41.6078445Z fetch-depth: 1 2026-10-24T19:49:41.6078662Z fetch-tags: false 2026-10-24T19:49:41.6078889Z show-progress: true 2026-10-24T19:49:41.6079114Z lfs: false 2026-10-24T19:49:41.6079325Z submodules: false 2026-10-24T19:49:41.6079552Z set-safe-directory: true 2026-10-24T19:49:41.6079803Z allow-unsafe-pr-checkout: false 2026-10-24T19:49:41.6080061Z env: 2026-10-24T19:49:41.6080295Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:41.6080633Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:41.6080910Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:41.6081170Z ##[endgroup] 2026-10-24T19:49:41.7061362Z Syncing repository: pingdotgg/t3code 2026-10-24T19:49:41.7062267Z ##[group]Getting Git version info 2026-10-24T19:49:41.7062595Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T19:49:41.7063064Z [command]/usr/local/bin/git version 2026-10-24T19:49:41.7155093Z git version 2.55.0 2026-10-24T19:49:41.7166760Z ##[endgroup] 2026-10-24T19:49:41.7174416Z Temporarily overriding HOME='/home/runner/_work/_temp/79ab3e5d-504f-4f1d-a709-73030fb54789' before making global git config changes 2026-10-24T19:49:41.7175052Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T19:49:41.7177906Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T19:49:41.7212783Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T19:49:41.7214437Z ##[group]Determining repository object format 2026-10-24T19:49:41.7215532Z ##[endgroup] 2026-10-24T19:49:41.7215896Z ##[group]Initializing the repository 2026-10-24T19:49:41.7218039Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T19:49:41.7257484Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T19:49:41.7258075Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T19:49:41.7258618Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T19:49:41.7258986Z hint: call: 2026-10-24T19:49:41.7259194Z hint: 2026-10-24T19:49:41.7259470Z hint: git config --global init.defaultBranch 2026-10-24T19:49:41.7259776Z hint: 2026-10-24T19:49:41.7260061Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T19:49:41.7260560Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T19:49:41.7260929Z hint: 2026-10-24T19:49:41.7261139Z hint: git branch -m 2026-10-24T19:49:41.7261374Z hint: 2026-10-24T19:49:41.7261681Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T19:49:41.7262166Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T19:49:41.7263201Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T19:49:41.7322281Z ##[endgroup] 2026-10-24T19:49:41.7322676Z ##[group]Disabling automatic garbage collection 2026-10-24T19:49:41.7324240Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T19:49:41.7349861Z ##[endgroup] 2026-10-24T19:49:41.7350212Z ##[group]Setting up auth 2026-10-24T19:49:41.7350512Z Removing SSH command configuration 2026-10-24T19:49:41.7353767Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T19:49:41.7380421Z [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-24T19:49:41.7523838Z Removing HTTP extra header 2026-10-24T19:49:41.7527001Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T19:49:41.7552069Z [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-24T19:49:41.7669137Z Removing includeIf entries pointing to credentials config files 2026-10-24T19:49:41.7672072Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T19:49:41.7695416Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T19:49:41.7808621Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-380a693c-2f5c-426f-be77-fda39f78f6cc.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T19:49:41.7835075Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-380a693c-2f5c-426f-be77-fda39f78f6cc.config 2026-10-24T19:49:41.7861309Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-380a693c-2f5c-426f-be77-fda39f78f6cc.config 2026-10-24T19:49:41.7882915Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-380a693c-2f5c-426f-be77-fda39f78f6cc.config 2026-10-24T19:49:41.7903736Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-380a693c-2f5c-426f-be77-fda39f78f6cc.config 2026-10-24T19:49:41.7922622Z ##[endgroup] 2026-10-24T19:49:41.7922978Z ##[group]Fetching the repository 2026-10-24T19:49:41.7928269Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +ea41701979c3cb110addeacd144923abe1ba07b2:refs/remotes/origin/main 2026-10-24T19:49:42.0792693Z From https://github.com/pingdotgg/t3code 2026-10-24T19:49:42.0793378Z * [new ref] ea41701979c3cb110addeacd144923abe1ba07b2 -> origin/main 2026-10-24T19:49:42.0823715Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T19:49:42.0845396Z origin/main 2026-10-24T19:49:42.0849854Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T19:49:42.0868335Z ea41701979c3cb110addeacd144923abe1ba07b2 2026-10-24T19:49:42.0870175Z ##[endgroup] 2026-10-24T19:49:42.0870620Z ##[group]Determining the checkout info 2026-10-24T19:49:42.0871105Z ##[endgroup] 2026-10-24T19:49:42.0871530Z ##[group]Setting up sparse checkout 2026-10-24T19:49:42.0873544Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T19:49:42.0895756Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T19:49:42.0912883Z .git/info/sparse-checkout 2026-10-24T19:49:42.0916734Z ##[endgroup] 2026-10-24T19:49:42.0917236Z ##[group]Checking out the ref 2026-10-24T19:49:42.0919359Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T19:49:49.3670815Z Updating files: 0% (1/6400) 2026-10-24T19:49:49.3701043Z Updating files: 1% (64/6400) 2026-10-24T19:49:49.3719787Z Updating files: 2% (128/6400) 2026-10-24T19:49:49.3742823Z Updating files: 3% (192/6400) 2026-10-24T19:49:49.3765479Z Updating files: 4% (256/6400) 2026-10-24T19:49:49.3799206Z Updating files: 5% (320/6400) 2026-10-24T19:49:49.3822960Z Updating files: 6% (384/6400) 2026-10-24T19:49:49.3881808Z Updating files: 7% (448/6400) 2026-10-24T19:49:49.3913475Z Updating files: 8% (512/6400) 2026-10-24T19:49:49.3939155Z Updating files: 9% (576/6400) 2026-10-24T19:49:49.4227811Z Updating files: 10% (640/6400) 2026-10-24T19:49:49.4244967Z Updating files: 11% (704/6400) 2026-10-24T19:49:49.4256247Z Updating files: 12% (768/6400) 2026-10-24T19:49:49.4272731Z Updating files: 13% (832/6400) 2026-10-24T19:49:49.4290349Z Updating files: 14% (896/6400) 2026-10-24T19:49:49.4309832Z Updating files: 15% (960/6400) 2026-10-24T19:49:49.4329600Z Updating files: 16% (1024/6400) 2026-10-24T19:49:49.4345426Z Updating files: 17% (1088/6400) 2026-10-24T19:49:49.4364581Z Updating files: 18% (1152/6400) 2026-10-24T19:49:49.4380819Z Updating files: 19% (1216/6400) 2026-10-24T19:49:49.4405607Z Updating files: 20% (1280/6400) 2026-10-24T19:49:49.4424710Z Updating files: 21% (1344/6400) 2026-10-24T19:49:49.4445485Z Updating files: 22% (1408/6400) 2026-10-24T19:49:49.4459887Z Updating files: 23% (1472/6400) 2026-10-24T19:49:49.4474199Z Updating files: 24% (1536/6400) 2026-10-24T19:49:49.4491001Z Updating files: 25% (1600/6400) 2026-10-24T19:49:49.4505807Z Updating files: 26% (1664/6400) 2026-10-24T19:49:49.4521656Z Updating files: 27% (1728/6400) 2026-10-24T19:49:49.4540417Z Updating files: 28% (1792/6400) 2026-10-24T19:49:49.4570386Z Updating files: 29% (1856/6400) 2026-10-24T19:49:49.4590029Z Updating files: 30% (1920/6400) 2026-10-24T19:49:49.4612507Z Updating files: 31% (1984/6400) 2026-10-24T19:49:49.4639257Z Updating files: 32% (2048/6400) 2026-10-24T19:49:49.4668916Z Updating files: 33% (2112/6400) 2026-10-24T19:49:49.4744435Z Updating files: 34% (2176/6400) 2026-10-24T19:49:49.4805529Z Updating files: 35% (2240/6400) 2026-10-24T19:49:49.4843987Z Updating files: 36% (2304/6400) 2026-10-24T19:49:49.4877519Z Updating files: 37% (2368/6400) 2026-10-24T19:49:49.4926748Z Updating files: 38% (2432/6400) 2026-10-24T19:49:49.4957820Z Updating files: 39% (2496/6400) 2026-10-24T19:49:49.4989035Z Updating files: 40% (2560/6400) 2026-10-24T19:49:49.5017083Z Updating files: 41% (2624/6400) 2026-10-24T19:49:49.5033826Z Updating files: 42% (2688/6400) 2026-10-24T19:49:49.5044323Z Updating files: 43% (2752/6400) 2026-10-24T19:49:49.5076842Z Updating files: 44% (2816/6400) 2026-10-24T19:49:49.5105672Z Updating files: 45% (2880/6400) 2026-10-24T19:49:49.5135130Z Updating files: 46% (2944/6400) 2026-10-24T19:49:49.5162169Z Updating files: 47% (3008/6400) 2026-10-24T19:49:49.5191788Z Updating files: 48% (3072/6400) 2026-10-24T19:49:49.5233481Z Updating files: 49% (3136/6400) 2026-10-24T19:49:49.5262982Z Updating files: 50% (3200/6400) 2026-10-24T19:49:49.5279218Z Updating files: 51% (3264/6400) 2026-10-24T19:49:49.5317965Z Updating files: 52% (3328/6400) 2026-10-24T19:49:49.5347989Z Updating files: 53% (3392/6400) 2026-10-24T19:49:49.5368701Z Updating files: 54% (3456/6400) 2026-10-24T19:49:49.5392649Z Updating files: 55% (3520/6400) 2026-10-24T19:49:49.5409419Z Updating files: 56% (3584/6400) 2026-10-24T19:49:49.5430015Z Updating files: 57% (3648/6400) 2026-10-24T19:49:49.5449751Z Updating files: 58% (3712/6400) 2026-10-24T19:49:49.5840670Z Updating files: 59% (3776/6400) 2026-10-24T19:49:49.5856029Z Updating files: 60% (3840/6400) 2026-10-24T19:49:49.5876744Z Updating files: 61% (3904/6400) 2026-10-24T19:49:49.5895522Z Updating files: 62% (3968/6400) 2026-10-24T19:49:49.5918851Z Updating files: 63% (4032/6400) 2026-10-24T19:49:49.5948135Z Updating files: 64% (4096/6400) 2026-10-24T19:49:49.5968541Z Updating files: 65% (4160/6400) 2026-10-24T19:49:49.5986588Z Updating files: 66% (4224/6400) 2026-10-24T19:49:49.6011224Z Updating files: 67% (4288/6400) 2026-10-24T19:49:49.6026450Z Updating files: 68% (4352/6400) 2026-10-24T19:49:49.6045063Z Updating files: 69% (4416/6400) 2026-10-24T19:49:49.6058708Z Updating files: 70% (4480/6400) 2026-10-24T19:49:49.6078845Z Updating files: 71% (4544/6400) 2026-10-24T19:49:49.6092653Z Updating files: 72% (4608/6400) 2026-10-24T19:49:49.6142125Z Updating files: 73% (4672/6400) 2026-10-24T19:49:49.6573008Z Updating files: 74% (4736/6400) 2026-10-24T19:49:49.6597609Z Updating files: 75% (4800/6400) 2026-10-24T19:49:49.6620869Z Updating files: 76% (4864/6400) 2026-10-24T19:49:49.6646812Z Updating files: 77% (4928/6400) 2026-10-24T19:49:49.6670137Z Updating files: 78% (4992/6400) 2026-10-24T19:49:49.6687156Z Updating files: 79% (5056/6400) 2026-10-24T19:49:49.6710687Z Updating files: 80% (5120/6400) 2026-10-24T19:49:49.6727476Z Updating files: 81% (5184/6400) 2026-10-24T19:49:49.6746407Z Updating files: 82% (5248/6400) 2026-10-24T19:49:49.6770449Z Updating files: 83% (5312/6400) 2026-10-24T19:49:49.6796462Z Updating files: 84% (5376/6400) 2026-10-24T19:49:49.6814552Z Updating files: 85% (5440/6400) 2026-10-24T19:49:49.6841334Z Updating files: 86% (5504/6400) 2026-10-24T19:49:49.6917340Z Updating files: 87% (5568/6400) 2026-10-24T19:49:49.6948546Z Updating files: 88% (5632/6400) 2026-10-24T19:49:49.6969263Z Updating files: 89% (5696/6400) 2026-10-24T19:49:49.6999404Z Updating files: 90% (5760/6400) 2026-10-24T19:49:49.7029864Z Updating files: 91% (5824/6400) 2026-10-24T19:49:49.7045643Z Updating files: 92% (5888/6400) 2026-10-24T19:49:49.7068863Z Updating files: 93% (5952/6400) 2026-10-24T19:49:49.7091024Z Updating files: 94% (6016/6400) 2026-10-24T19:49:49.7115771Z Updating files: 95% (6080/6400) 2026-10-24T19:49:49.7178520Z Updating files: 96% (6144/6400) 2026-10-24T19:49:49.7202788Z Updating files: 97% (6208/6400) 2026-10-24T19:49:49.7252435Z Updating files: 98% (6272/6400) 2026-10-24T19:49:49.7273281Z Updating files: 99% (6336/6400) 2026-10-24T19:49:49.7273544Z Updating files: 100% (6400/6400) 2026-10-24T19:49:49.7273736Z Updating files: 100% (6400/6400), done. 2026-10-24T19:49:49.7437722Z Switched to a new branch 'main' 2026-10-24T19:49:49.7438394Z branch 'main' set up to track 'origin/main'. 2026-10-24T19:49:49.7488370Z ##[endgroup] 2026-10-24T19:49:49.7490640Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T19:49:49.7509958Z ea41701979c3cb110addeacd144923abe1ba07b2 2026-10-24T19:49:49.7593181Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T19:49:49.7593462Z files="$(git ls-files .github/pr-assets)" 2026-10-24T19:49:49.7593674Z if test -n "$files"; then 2026-10-24T19:49:49.7593934Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T19:49:49.7594176Z  exit 1 2026-10-24T19:49:49.7594314Z fi 2026-10-24T19:49:49.7603405Z shell: /usr/bin/bash -e {0} 2026-10-24T19:49:49.7603559Z env: 2026-10-24T19:49:49.7603701Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:49.7603893Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:49.7604065Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:49.7604231Z ##[endgroup] 2026-10-24T19:49:49.7765285Z Prepare all required actions 2026-10-24T19:49:49.7765642Z Getting action download info 2026-10-24T19:49:49.8730009Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T19:49:49.9830132Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T19:49:49.9830314Z env: 2026-10-24T19:49:49.9830454Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:49.9830626Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:49.9830798Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:49.9830965Z ##[endgroup] 2026-10-24T19:49:49.9924242Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T19:49:49.9938307Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T19:49:49.9938699Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T19:49:49.9939025Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T19:49:49.9939291Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T19:49:49.9947641Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T19:49:49.9947834Z env: 2026-10-24T19:49:49.9947976Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:49.9948148Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:49.9948320Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:49.9948481Z ##[endgroup] 2026-10-24T19:49:50.0171464Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=24] 2026-10-24T19:49:50.0173604Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T19:49:50.0221906Z ##[group]Run actions/cache@v6 2026-10-24T19:49:50.0222073Z with: 2026-10-24T19:49:50.0222386Z path: ~/.vite-plus 2026-10-24T19:49:50.0222587Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T19:49:50.0222817Z enableCrossOsArchive: false 2026-10-24T19:49:50.0222983Z fail-on-cache-miss: false 2026-10-24T19:49:50.0223135Z lookup-only: false 2026-10-24T19:49:50.0223275Z save-always: false 2026-10-24T19:49:50.0223417Z env: 2026-10-24T19:49:50.0223556Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:50.0223737Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:50.0223907Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:50.0224072Z ##[endgroup] 2026-10-24T19:49:50.5209811Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T19:49:50.9436016Z Received 170349591 of 170349591 (100.0%), 407.2 MBs/sec 2026-10-24T19:49:50.9437440Z Cache Size: ~162 MB (170349591 B) 2026-10-24T19:49:50.9459519Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/7c850549-0312-43f1-a983-fd422a54636d/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T19:49:51.7396363Z Cache restored successfully 2026-10-24T19:49:51.7544448Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T19:49:51.7630323Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1745] 2026-10-24T19:49:51.7632811Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T19:49:51.7651021Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T19:49:51.7651239Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T19:49:51.7651416Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T19:49:51.7660681Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T19:49:51.7660849Z env: 2026-10-24T19:49:51.7660975Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:51.7661128Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:51.7661280Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:51.7661433Z ##[endgroup] 2026-10-24T19:49:51.7702213Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T19:49:51.7713788Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T19:49:51.7715817Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T19:49:51.7720417Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T19:49:51.7721590Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T19:49:51.7732148Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T19:49:51.7732348Z store_path="$(vp pm cache dir)" 2026-10-24T19:49:51.7732516Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T19:49:51.7743565Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T19:49:51.7743751Z env: 2026-10-24T19:49:51.7743868Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:51.7744023Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:51.7744203Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:51.7744376Z ##[endgroup] 2026-10-24T19:49:51.7890443Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=16] 2026-10-24T19:49:51.7891901Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T19:49:51.8235361Z ##[group]Run actions/cache@v6 2026-10-24T19:49:51.8235505Z with: 2026-10-24T19:49:51.8235694Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T19:49:51.8236011Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T19:49:51.8236323Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T19:49:51.8236609Z enableCrossOsArchive: false 2026-10-24T19:49:51.8236791Z fail-on-cache-miss: false 2026-10-24T19:49:51.8236996Z lookup-only: false 2026-10-24T19:49:51.8237151Z save-always: false 2026-10-24T19:49:51.8237334Z env: 2026-10-24T19:49:51.8237490Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:51.8237829Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:51.8238050Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:51.8238235Z ##[endgroup] 2026-10-24T19:49:52.0238464Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T19:49:53.0426540Z Received 671088640 of 994208090 (67.5%), 638.1 MBs/sec 2026-10-24T19:49:53.4705339Z Received 994208090 of 994208090 (100.0%), 662.6 MBs/sec 2026-10-24T19:49:53.4705574Z Cache Size: ~948 MB (994208090 B) 2026-10-24T19:49:53.4737589Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/28f84aca-d6bb-4777-9450-e68f510ccd98/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T19:49:59.2684416Z Cache restored successfully 2026-10-24T19:49:59.3161996Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T19:49:59.3230546Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7533] 2026-10-24T19:49:59.3233130Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T19:49:59.3242951Z ##[group]Run vp install 2026-10-24T19:49:59.3243097Z vp install 2026-10-24T19:49:59.3252110Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T19:49:59.3252283Z env: 2026-10-24T19:49:59.3252402Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:49:59.3252553Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:49:59.3252701Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:49:59.3252841Z ##[endgroup] 2026-10-24T19:49:59.3603956Z Scope: all 34 workspace projects 2026-10-24T19:49:59.4628270Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T19:49:59.7595266Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T19:49:59.7595593Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T19:49:59.7595816Z Virtual store is at: node_modules/.pnpm 2026-10-24T19:50:02.2134733Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.8s) 2026-10-24T19:50:02.2134998Z Lockfile is up to date, resolution step is skipped 2026-10-24T19:50:02.2308645Z Packages: +1721 2026-10-24T19:50:02.2308820Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T19:50:02.2649676Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T19:50:03.3303462Z . prepare$ vp config --no-agent 2026-10-24T19:50:03.4445119Z . prepare: Done 2026-10-24T19:50:03.4460953Z 2026-10-24T19:50:03.4461378Z devDependencies: 2026-10-24T19:50:03.4461566Z + @coderabbitai/config 1.1.0 2026-10-24T19:50:03.4461723Z + @shadcn/lint 0.1.5 2026-10-24T19:50:03.4461917Z + @types/node 24.12.4 2026-10-24T19:50:03.4462047Z + knip 6.34.0 2026-10-24T19:50:03.4462199Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T19:50:03.4462345Z + vite-plus 1.3.0 2026-10-24T19:50:03.4462417Z 2026-10-24T19:50:03.4477363Z Done in 4.1s using pnpm v12.14.0 2026-10-24T19:50:03.4719583Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4148] 2026-10-24T19:50:03.5195351Z ##[group]Run actions/cache@v6 2026-10-24T19:50:03.5195517Z with: 2026-10-24T19:50:03.5195644Z path: ~/.cache/electron 2026-10-24T19:50:03.5195891Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T19:50:03.5196157Z enableCrossOsArchive: false 2026-10-24T19:50:03.5196306Z fail-on-cache-miss: false 2026-10-24T19:50:03.5196437Z lookup-only: false 2026-10-24T19:50:03.5196556Z save-always: false 2026-10-24T19:50:03.5196667Z env: 2026-10-24T19:50:03.5196783Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:03.5196930Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:03.5197093Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:50:03.5197233Z ##[endgroup] 2026-10-24T19:50:03.7351588Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T19:50:03.8957595Z Received 122906203 of 122906203 (100.0%), 819.7 MBs/sec 2026-10-24T19:50:03.8958456Z Cache Size: ~117 MB (122906203 B) 2026-10-24T19:50:03.8977402Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/0f5d4f05-6021-4f35-b35e-4db4fe894f9f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T19:50:03.9613584Z Cache restored successfully 2026-10-24T19:50:03.9744152Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T19:50:03.9864229Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T19:50:03.9864477Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T19:50:03.9873131Z shell: /usr/bin/bash -e {0} 2026-10-24T19:50:03.9873256Z env: 2026-10-24T19:50:03.9873564Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:03.9873718Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:03.9873858Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:50:03.9874043Z ##[endgroup] 2026-10-24T19:50:04.1601533Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T19:50:04.7593048Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T19:50:04.7614891Z 2026-10-24T19:50:04.7706515Z ##[group]Run vp run knip:check 2026-10-24T19:50:04.7706688Z vp run knip:check 2026-10-24T19:50:04.7715621Z shell: /usr/bin/bash -e {0} 2026-10-24T19:50:04.7715747Z env: 2026-10-24T19:50:04.7715865Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:04.7716015Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:04.7716157Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:50:04.7716299Z ##[endgroup] 2026-10-24T19:50:04.9262251Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T19:50:08.9654177Z 2026-10-24T19:50:08.9657258Z $ 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-24T19:50:17.8640323Z 2026-10-24T19:50:17.8640817Z --- 2026-10-24T19:50:17.8641105Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T19:50:17.8701636Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T19:50:17.8701928Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T19:50:17.8710725Z shell: /usr/bin/bash -e {0} 2026-10-24T19:50:17.8710855Z env: 2026-10-24T19:50:17.8710972Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:17.8711129Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:17.8711276Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:50:17.8711420Z ##[endgroup] 2026-10-24T19:50:18.0216999Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T19:50:18.2228575Z 2026-10-24T19:50:18.2332553Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T19:50:18.2332780Z vp run --filter t3 generate --check 2026-10-24T19:50:18.2341647Z shell: /usr/bin/bash -e {0} 2026-10-24T19:50:18.2341776Z env: 2026-10-24T19:50:18.2341908Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:18.2342060Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:18.2342204Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:50:18.2342346Z ##[endgroup] 2026-10-24T19:50:18.3847142Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T19:50:18.5457989Z 2026-10-24T19:50:18.5549751Z ##[group]Run vp check 2026-10-24T19:50:18.5549914Z vp check 2026-10-24T19:50:18.5558877Z shell: /usr/bin/bash -e {0} 2026-10-24T19:50:18.5559008Z env: 2026-10-24T19:50:18.5559121Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:18.5559275Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:18.5559418Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T19:50:18.5559560Z ##[endgroup] 2026-10-24T19:50:19.1111002Z pass: All 5749 files are correctly formatted (408ms, 8 threads) 2026-10-24T19:50:25.1344629Z warn: Lint warnings found 2026-10-24T19:50:25.1346164Z ⚠ 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-24T19:50:25.1346926Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T19:50:25.1347267Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T19:50:25.1347612Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T19:50:25.1347914Z 567 │ │ const nextEvent = { 2026-10-24T19:50:25.1348218Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T19:50:25.1348537Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T19:50:25.1348791Z 570 │ │ threadId, 2026-10-24T19:50:25.1349057Z 571 │ │ providerInstanceId, 2026-10-24T19:50:25.1349281Z 572 │ │ occurredAt: now, 2026-10-24T19:50:25.1349574Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T19:50:25.1349863Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T19:50:25.1350144Z 575 │ │ const reader = yield* eventSink 2026-10-24T19:50:25.1350404Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T19:50:25.1350683Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T19:50:25.1350945Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1351243Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T19:50:25.1351544Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T19:50:25.1351812Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T19:50:25.1352149Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T19:50:25.1352435Z 583 │ │ } 2026-10-24T19:50:25.1352703Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T19:50:25.1353026Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T19:50:25.1353314Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T19:50:25.1353598Z 587 │ ╰─▶ } 2026-10-24T19:50:25.1353807Z 588 │ }), 2026-10-24T19:50:25.1353973Z ╰──── 2026-10-24T19:50:25.1354032Z 2026-10-24T19:50:25.1354535Z ⚠ 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-24T19:50:25.1355162Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T19:50:25.1355422Z 2326 │ let settled = false; 2026-10-24T19:50:25.1355692Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T19:50:25.1356171Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T19:50:25.1356534Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T19:50:25.1356763Z 2330 │ │ ); 2026-10-24T19:50:25.1356997Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T19:50:25.1357277Z 2332 │ ╰─▶ } 2026-10-24T19:50:25.1357543Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T19:50:25.1357735Z ╰──── 2026-10-24T19:50:25.1357795Z 2026-10-24T19:50:25.1358016Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T19:50:25.1358371Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T19:50:25.1358577Z 21 │ 2026-10-24T19:50:25.1358811Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T19:50:25.1359092Z ·  ────────┬─────── 2026-10-24T19:50:25.1359357Z · ╰── 'summarizePayload' is declared here 2026-10-24T19:50:25.1359615Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T19:50:25.1359793Z ╰──── 2026-10-24T19:50:25.1359960Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1360084Z 2026-10-24T19:50:25.1360284Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T19:50:25.1360628Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T19:50:25.1360848Z  80 │ 2026-10-24T19:50:25.1361204Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T19:50:25.1361591Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T19:50:25.1361854Z  83 │ │ ): Effect.fn.Return { 2026-10-24T19:50:25.1362164Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T19:50:25.1362475Z  85 │ │ const connections = new Map(); 2026-10-24T19:50:25.1362698Z  86 │ │ 2026-10-24T19:50:25.1363007Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T19:50:25.1363327Z  88 │ │ Effect.suspend(() => { 2026-10-24T19:50:25.1363583Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T19:50:25.1363851Z  90 │ │ return connection === undefined 2026-10-24T19:50:25.1364234Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T19:50:25.1364564Z  92 │ │ : Effect.succeed(connection); 2026-10-24T19:50:25.1364767Z  93 │ │ }); 2026-10-24T19:50:25.1364934Z  94 │ │ 2026-10-24T19:50:25.1365209Z  95 │ │ const send = ( 2026-10-24T19:50:25.1365454Z  96 │ │ connection: Connection, 2026-10-24T19:50:25.1365668Z  97 │ │ message: unknown, 2026-10-24T19:50:25.1365942Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T19:50:25.1366308Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T19:50:25.1366681Z 100 │ │ Effect.gen(function* () { 2026-10-24T19:50:25.1366929Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T19:50:25.1367212Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T19:50:25.1367582Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T19:50:25.1367878Z 104 │ │ } 2026-10-24T19:50:25.1368113Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T19:50:25.1368359Z 106 │ │ try: (signal) => 2026-10-24T19:50:25.1368611Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T19:50:25.1368867Z 108 │ │ method: "POST", 2026-10-24T19:50:25.1369089Z 109 │ │ signal, 2026-10-24T19:50:25.1369312Z 110 │ │ headers: { 2026-10-24T19:50:25.1369557Z 111 │ │ "content-type": "application/json", 2026-10-24T19:50:25.1369862Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T19:50:25.1370149Z 113 │ │ authorization: options.authorization, 2026-10-24T19:50:25.1370421Z 114 │ │ ...(connection.sessionId === null 2026-10-24T19:50:25.1370658Z 115 │ │ ? {} 2026-10-24T19:50:25.1370916Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T19:50:25.1371211Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T19:50:25.1371456Z 118 │ │ ? {} 2026-10-24T19:50:25.1371746Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T19:50:25.1372003Z 120 │ │ }, 2026-10-24T19:50:25.1372202Z 121 │ │ body, 2026-10-24T19:50:25.1372396Z 122 │ │ }), 2026-10-24T19:50:25.1372602Z 123 │ │ catch: bridgeError, 2026-10-24T19:50:25.1372801Z 124 │ │ }); 2026-10-24T19:50:25.1373118Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T19:50:25.1373437Z 126 │ │ if (!response.ok) { 2026-10-24T19:50:25.1373668Z 127 │ │ yield* Effect.promise( 2026-10-24T19:50:25.1374021Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T19:50:25.1374288Z 129 │ │ ); 2026-10-24T19:50:25.1374510Z 130 │ │ return yield* Effect.fail( 2026-10-24T19:50:25.1374855Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T19:50:25.1375150Z 132 │ │ ); 2026-10-24T19:50:25.1375328Z 133 │ │ } 2026-10-24T19:50:25.1375646Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T19:50:25.1376123Z 135 │ │ for (const payload of payloads) { 2026-10-24T19:50:25.1376552Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T19:50:25.1376848Z 137 │ │ } 2026-10-24T19:50:25.1377049Z 138 │ │ return payloads; 2026-10-24T19:50:25.1377289Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T19:50:25.1377506Z 140 │ │ ); 2026-10-24T19:50:25.1377673Z 141 │ │ 2026-10-24T19:50:25.1377945Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T19:50:25.1378256Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T19:50:25.1378590Z 144 │ │ ): Effect.fn.Return { 2026-10-24T19:50:25.1378951Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T19:50:25.1379253Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T19:50:25.1379523Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T19:50:25.1379764Z 148 │ │ if (sessionId !== null) { 2026-10-24T19:50:25.1380019Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T19:50:25.1380262Z 150 │ │ try: (signal) => 2026-10-24T19:50:25.1380513Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T19:50:25.1380759Z 152 │ │ method: "DELETE", 2026-10-24T19:50:25.1380975Z 153 │ │ signal, 2026-10-24T19:50:25.1381188Z 154 │ │ headers: { 2026-10-24T19:50:25.1381440Z 155 │ │ authorization: options.authorization, 2026-10-24T19:50:25.1381702Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T19:50:25.1381970Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T19:50:25.1382206Z 158 │ │ ? {} 2026-10-24T19:50:25.1382483Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T19:50:25.1382736Z 160 │ │ }, 2026-10-24T19:50:25.1382926Z 161 │ │ }), 2026-10-24T19:50:25.1383125Z 162 │ │ catch: bridgeError, 2026-10-24T19:50:25.1383320Z 163 │ │ }); 2026-10-24T19:50:25.1383562Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T19:50:25.1383822Z 165 │ │ return yield* Effect.fail( 2026-10-24T19:50:25.1384099Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T19:50:25.1384411Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T19:50:25.1384682Z 168 │ │ ), 2026-10-24T19:50:25.1384861Z 169 │ │ ); 2026-10-24T19:50:25.1385040Z 170 │ │ } 2026-10-24T19:50:25.1385243Z 171 │ │ yield* Effect.promise( 2026-10-24T19:50:25.1385549Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T19:50:25.1385906Z 173 │ │ ); 2026-10-24T19:50:25.1386117Z 174 │ │ } 2026-10-24T19:50:25.1386297Z 175 │ │ return {}; 2026-10-24T19:50:25.1386475Z 176 │ │ }); 2026-10-24T19:50:25.1386642Z 177 │ │ 2026-10-24T19:50:25.1386812Z 178 │ │ return { 2026-10-24T19:50:25.1387091Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T19:50:25.1387391Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T19:50:25.1387639Z 181 │ │ return yield* Effect.fail( 2026-10-24T19:50:25.1387954Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T19:50:25.1388225Z 183 │ │ ); 2026-10-24T19:50:25.1388406Z 184 │ │ } 2026-10-24T19:50:25.1388638Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T19:50:25.1388991Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T19:50:25.1389281Z 187 │ │ } 2026-10-24T19:50:25.1389536Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T19:50:25.1389817Z 189 │ │ connections.set(connectionId, { 2026-10-24T19:50:25.1390066Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T19:50:25.1390299Z 191 │ │ sessionId: null, 2026-10-24T19:50:25.1390518Z 192 │ │ protocolVersion: null, 2026-10-24T19:50:25.1390747Z 193 │ │ nextRequestId: 0, 2026-10-24T19:50:25.1390949Z 194 │ │ }); 2026-10-24T19:50:25.1391153Z 195 │ │ return { connectionId }; 2026-10-24T19:50:25.1391354Z 196 │ │ }), 2026-10-24T19:50:25.1391625Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T19:50:25.1391971Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T19:50:25.1392264Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T19:50:25.1392533Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T19:50:25.1392772Z 201 │ │ jsonrpc: "2.0", 2026-10-24T19:50:25.1392971Z 202 │ │ id, 2026-10-24T19:50:25.1393186Z 203 │ │ method: request.method, 2026-10-24T19:50:25.1393480Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T19:50:25.1393728Z 205 │ │ }); 2026-10-24T19:50:25.1394052Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T19:50:25.1394371Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T19:50:25.1394618Z 208 │ │ if (envelope === null) { 2026-10-24T19:50:25.1394850Z 209 │ │ return yield* Effect.fail( 2026-10-24T19:50:25.1395167Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T19:50:25.1395442Z 211 │ │ ); 2026-10-24T19:50:25.1395703Z 212 │ │ } 2026-10-24T19:50:25.1395957Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T19:50:25.1396291Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T19:50:25.1396566Z 215 │ │ } 2026-10-24T19:50:25.1396835Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T19:50:25.1397091Z 217 │ │ }), 2026-10-24T19:50:25.1397382Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T19:50:25.1397745Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T19:50:25.1398019Z 220 │ │ yield* send(connection, { 2026-10-24T19:50:25.1398248Z 221 │ │ jsonrpc: "2.0", 2026-10-24T19:50:25.1398471Z 222 │ │ method: request.method, 2026-10-24T19:50:25.1398777Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T19:50:25.1399026Z 224 │ │ }); 2026-10-24T19:50:25.1399199Z 225 │ │ }), 2026-10-24T19:50:25.1399385Z 226 │ │ disconnect, 2026-10-24T19:50:25.1399600Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T19:50:25.1399823Z 228 │ │ Effect.forEach( 2026-10-24T19:50:25.1400046Z 229 │ │ [...connections.keys()], 2026-10-24T19:50:25.1400341Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T19:50:25.1400625Z 231 │ │ { discard: true }, 2026-10-24T19:50:25.1400823Z 232 │ │ ), 2026-10-24T19:50:25.1400999Z 233 │ │ ), 2026-10-24T19:50:25.1401169Z 234 │ │ }; 2026-10-24T19:50:25.1401396Z 235 │ ╰─▶ }); 2026-10-24T19:50:25.1401587Z ╰──── 2026-10-24T19:50:25.1401903Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T19:50:25.1402151Z 2026-10-24T19:50:25.1402422Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1402850Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T19:50:25.1403151Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T19:50:25.1403363Z 278 │ useEffect(() => { 2026-10-24T19:50:25.1403527Z ·  ────┬──── 2026-10-24T19:50:25.1403751Z · ╰── This is the containing effect 2026-10-24T19:50:25.1404005Z 279 │ setNow(new Date().toISOString()); 2026-10-24T19:50:25.1404185Z ·  ───┬── 2026-10-24T19:50:25.1404448Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1404756Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T19:50:25.1404963Z ╰──── 2026-10-24T19:50:25.1405722Z  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-24T19:50:25.1406757Z  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-24T19:50:25.1407071Z 2026-10-24T19:50:25.1407315Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T19:50:25.1407708Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T19:50:25.1407959Z 12 │ threadSearchMatchKey, 2026-10-24T19:50:25.1408140Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T19:50:25.1408356Z ·  ──────────────┬───────────── 2026-10-24T19:50:25.1408660Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T19:50:25.1408951Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T19:50:25.1409132Z ╰──── 2026-10-24T19:50:25.1409289Z  help: Consider removing this import. 2026-10-24T19:50:25.1409408Z 2026-10-24T19:50:25.1409617Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1409988Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T19:50:25.1410297Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T19:50:25.1410962Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T19:50:25.1411179Z ·  ───────┬────── 2026-10-24T19:50:25.1411475Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T19:50:25.1411770Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T19:50:25.1411952Z ╰──── 2026-10-24T19:50:25.1412315Z  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-24T19:50:25.1412920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1413225Z 2026-10-24T19:50:25.1413404Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1413748Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T19:50:25.1414040Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T19:50:25.1414457Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T19:50:25.1414799Z ·  ─────┬──── 2026-10-24T19:50:25.1415106Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1415359Z 351 │ const id = setTimeout(() => { 2026-10-24T19:50:25.1415516Z ╰──── 2026-10-24T19:50:25.1415870Z  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-24T19:50:25.1416446Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1416737Z 2026-10-24T19:50:25.1416910Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1417227Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T19:50:25.1417537Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T19:50:25.1417836Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T19:50:25.1418071Z ·  ────┬─── 2026-10-24T19:50:25.1418303Z · ╰── `rotation` originates here 2026-10-24T19:50:25.1418500Z 172 │ 2026-10-24T19:50:25.1418636Z 173 │ useLayoutEffect(() => { 2026-10-24T19:50:25.1418864Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T19:50:25.1419091Z ·  ────┬─── 2026-10-24T19:50:25.1419324Z · ╰── `rotation` cannot be modified 2026-10-24T19:50:25.1419577Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T19:50:25.1419749Z ╰──── 2026-10-24T19:50:25.1420080Z  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-24T19:50:25.1420651Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1420950Z 2026-10-24T19:50:25.1421154Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1421508Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T19:50:25.1421745Z 1245 │ { 2026-10-24T19:50:25.1424156Z ·  ────┬──── 2026-10-24T19:50:25.1424382Z · ╰── This is the containing effect 2026-10-24T19:50:25.1424682Z 60 │ setMountedModes((current) => { 2026-10-24T19:50:25.1424910Z ·  ───────┬─────── 2026-10-24T19:50:25.1425185Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1425447Z 61 │ if (current.has(props.mode)) { 2026-10-24T19:50:25.1425605Z ╰──── 2026-10-24T19:50:25.1426280Z  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-24T19:50:25.1427161Z  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-24T19:50:25.1427472Z 2026-10-24T19:50:25.1427656Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1427996Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T19:50:25.1428353Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T19:50:25.1428713Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T19:50:25.1429041Z ·  ─────┬──── 2026-10-24T19:50:25.1429373Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1429692Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T19:50:25.1429903Z ╰──── 2026-10-24T19:50:25.1430257Z  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-24T19:50:25.1430834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1431121Z 2026-10-24T19:50:25.1431296Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1431632Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T19:50:25.1431882Z 718 │ const snoozePresets = useMemo( 2026-10-24T19:50:25.1432167Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T19:50:25.1432498Z ·  ─────┬──── 2026-10-24T19:50:25.1432828Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1433127Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T19:50:25.1433316Z ╰──── 2026-10-24T19:50:25.1433662Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T19:50:25.1434261Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1434547Z 2026-10-24T19:50:25.1434740Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T19:50:25.1435170Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T19:50:25.1435566Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T19:50:25.1435866Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T19:50:25.1436100Z ·  ────────────┬─────────── 2026-10-24T19:50:25.1436391Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T19:50:25.1436629Z 721 │ ); 2026-10-24T19:50:25.1436749Z ╰──── 2026-10-24T19:50:25.1437128Z  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-24T19:50:25.1437759Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1438067Z 2026-10-24T19:50:25.1438254Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T19:50:25.1438600Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T19:50:25.1438838Z 765 │ thread.pinnedAt, 2026-10-24T19:50:25.1438994Z 766 │ variant, 2026-10-24T19:50:25.1439148Z ·  ───┬─── 2026-10-24T19:50:25.1439384Z · ╰── Unnecessary dependency `variant` 2026-10-24T19:50:25.1439588Z 767 │ ], 2026-10-24T19:50:25.1439716Z ╰──── 2026-10-24T19:50:25.1440092Z  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-24T19:50:25.1440722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1441031Z 2026-10-24T19:50:25.1441231Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1441597Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T19:50:25.1441910Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T19:50:25.1442191Z 1216 │ 2026-10-24T19:50:25.1442456Z ·  ────────────────────────── 2026-10-24T19:50:25.1442695Z 1217 │ 2026-10-24T19:50:25.1442875Z ╰──── 2026-10-24T19:50:25.1443093Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T19:50:25.1443254Z 2026-10-24T19:50:25.1443432Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.1443759Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T19:50:25.1444010Z 465 │ 2026-10-24T19:50:25.1444185Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T19:50:25.1444384Z ·  ── 2026-10-24T19:50:25.1444530Z 467 │ } 2026-10-24T19:50:25.1444650Z ╰──── 2026-10-24T19:50:25.1444945Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.1445176Z 2026-10-24T19:50:25.1445339Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1445774Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T19:50:25.1446124Z 35 │ 2026-10-24T19:50:25.1446326Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T19:50:25.1446647Z ·  ────────┬──────── 2026-10-24T19:50:25.1446904Z · ╰── `inspectorProgress` originates here 2026-10-24T19:50:25.1447158Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T19:50:25.1447412Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T19:50:25.1447618Z 39 │ 2026-10-24T19:50:25.1447761Z 40 │ const onClosed = props.onClosed; 2026-10-24T19:50:25.1447935Z 41 │ useEffect(() => { 2026-10-24T19:50:25.1448113Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T19:50:25.1448316Z ·  ────────┬──────── 2026-10-24T19:50:25.1448576Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T19:50:25.1448806Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T19:50:25.1448961Z ╰──── 2026-10-24T19:50:25.1449290Z  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-24T19:50:25.1449869Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1450169Z 2026-10-24T19:50:25.1450329Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1450659Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T19:50:25.1450938Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T19:50:25.1451194Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T19:50:25.1451435Z ·  ──────────┬───────── 2026-10-24T19:50:25.1451705Z · ╰── `renderedContentWidth` originates here 2026-10-24T19:50:25.1451918Z 39 │ 2026-10-24T19:50:25.1452066Z 40 │ const onClosed = props.onClosed; 2026-10-24T19:50:25.1452234Z 41 │ useEffect(() => { 2026-10-24T19:50:25.1452409Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T19:50:25.1452601Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T19:50:25.1452773Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T19:50:25.1452938Z 45 │ (finished) => { 2026-10-24T19:50:25.1453166Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T19:50:25.1453400Z 47 │ runOnJS(onClosed)(); 2026-10-24T19:50:25.1453556Z 48 │ } 2026-10-24T19:50:25.1453691Z 49 │ }, 2026-10-24T19:50:25.1453820Z 50 │ ); 2026-10-24T19:50:25.1454054Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T19:50:25.1454287Z 52 │ renderedInspectorWidth.set( 2026-10-24T19:50:25.1454537Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T19:50:25.1471806Z 54 │ ); 2026-10-24T19:50:25.1472001Z 55 │ }, [ 2026-10-24T19:50:25.1472140Z 56 │ inspectorProgress, 2026-10-24T19:50:25.1472300Z 57 │ inspectorVisible, 2026-10-24T19:50:25.1472454Z 58 │ inspectorWidth, 2026-10-24T19:50:25.1472600Z 59 │ onClosed, 2026-10-24T19:50:25.1472747Z 60 │ renderedInspectorWidth, 2026-10-24T19:50:25.1472899Z 61 │ resizing, 2026-10-24T19:50:25.1473022Z 62 │ ]); 2026-10-24T19:50:25.1473306Z 63 │ 2026-10-24T19:50:25.1473486Z 64 │ useEffect(() => { 2026-10-24T19:50:25.1473666Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T19:50:25.1473867Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T19:50:25.1474097Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T19:50:25.1474311Z ·  ──────────┬───────── 2026-10-24T19:50:25.1474594Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T19:50:25.1474821Z 68 │ return; 2026-10-24T19:50:25.1474946Z ╰──── 2026-10-24T19:50:25.1475285Z  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-24T19:50:25.1475877Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1476186Z 2026-10-24T19:50:25.1476405Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1476783Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T19:50:25.1477016Z 154 │ } 2026-10-24T19:50:25.1477154Z 155 │ }, [wrappedRender]); 2026-10-24T19:50:25.1477331Z ·  ──────┬────── 2026-10-24T19:50:25.1477588Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T19:50:25.1477802Z 156 │ 2026-10-24T19:50:25.1477918Z ╰──── 2026-10-24T19:50:25.1478280Z  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-24T19:50:25.1478889Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1479194Z 2026-10-24T19:50:25.1479449Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T19:50:25.1479857Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T19:50:25.1480089Z 799 │ > 2026-10-24T19:50:25.1480291Z 800 │ 2026-10-24T19:50:25.1480570Z ·  ──────────────────── 2026-10-24T19:50:25.1480806Z 801 │ 2026-10-24T19:50:25.1480977Z ╰──── 2026-10-24T19:50:25.1481354Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T19:50:25.1481762Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T19:50:25.1481946Z 2026-10-24T19:50:25.1482126Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1482441Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T19:50:25.1482730Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T19:50:25.1483022Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T19:50:25.1483310Z ·  ─────┬──── 2026-10-24T19:50:25.1483623Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1483934Z 141 │ onSelect={(selected) => { 2026-10-24T19:50:25.1484104Z ╰──── 2026-10-24T19:50:25.1484461Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T19:50:25.1485042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1485333Z 2026-10-24T19:50:25.1485509Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1485841Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T19:50:25.1486195Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T19:50:25.1486684Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T19:50:25.1486970Z ·  ─────┬──── 2026-10-24T19:50:25.1487276Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1487503Z 153 │ } 2026-10-24T19:50:25.1487625Z ╰──── 2026-10-24T19:50:25.1487978Z  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-24T19:50:25.1488558Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1488851Z 2026-10-24T19:50:25.1489101Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T19:50:25.1489473Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T19:50:25.1489756Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T19:50:25.1490146Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T19:50:25.1490512Z 986 │ │ (approval) => approval.requestId, 2026-10-24T19:50:25.1490785Z 987 │ ╰─▶ ); 2026-10-24T19:50:25.1491072Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T19:50:25.1491280Z ╰──── 2026-10-24T19:50:25.1491419Z  help: Switch to `Set` 2026-10-24T19:50:25.1491559Z 2026-10-24T19:50:25.1491906Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T19:50:25.1492312Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T19:50:25.1492527Z 113 │ const declared = { 2026-10-24T19:50:25.1492716Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T19:50:25.1492949Z ·  ──────────────────────────────── 2026-10-24T19:50:25.1493181Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T19:50:25.1493359Z ╰──── 2026-10-24T19:50:25.1493689Z  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-24T19:50:25.1493976Z 2026-10-24T19:50:25.1494215Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T19:50:25.1494568Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T19:50:25.1494805Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T19:50:25.1495020Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T19:50:25.1495272Z ·  ──────────────────────────────────────── 2026-10-24T19:50:25.1495500Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T19:50:25.1495674Z ╰──── 2026-10-24T19:50:25.1495999Z  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-24T19:50:25.1496262Z 2026-10-24T19:50:25.1496489Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T19:50:25.1496844Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T19:50:25.1497094Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T19:50:25.1497313Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T19:50:25.1497553Z ·  ──────────────────────────────────── 2026-10-24T19:50:25.1497742Z 117 │ }; 2026-10-24T19:50:25.1497872Z ╰──── 2026-10-24T19:50:25.1498197Z  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-24T19:50:25.1498458Z 2026-10-24T19:50:25.1498654Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T19:50:25.1499005Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T19:50:25.1499357Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T19:50:25.1499621Z 602 │ const gesture = Gesture.Pan() 2026-10-24T19:50:25.1499815Z ·  ─┬─ 2026-10-24T19:50:25.1500066Z · ╰── `Pan` may be a component 2026-10-24T19:50:25.1500291Z 603 │ .enabled(!props.disabled) 2026-10-24T19:50:25.1500446Z ╰──── 2026-10-24T19:50:25.1500790Z  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-24T19:50:25.1501525Z  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-24T19:50:25.1501939Z 2026-10-24T19:50:25.1502319Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T19:50:25.1502767Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T19:50:25.1502976Z 248 │ }, 2026-10-24T19:50:25.1503131Z 249 │ (effect, flow, stopSessions) => 2026-10-24T19:50:25.1503334Z ·  ──────┬───── 2026-10-24T19:50:25.1503601Z · ╰── 'stopSessions' is declared here 2026-10-24T19:50:25.1503822Z 250 │ effect.pipe( 2026-10-24T19:50:25.1503984Z ╰──── 2026-10-24T19:50:25.1504146Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1504268Z 2026-10-24T19:50:25.1504493Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.1504862Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T19:50:25.1505130Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T19:50:25.1505387Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T19:50:25.1505635Z ·  ────────────┬──────────── 2026-10-24T19:50:25.1505919Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T19:50:25.1506154Z 774 │ } 2026-10-24T19:50:25.1506428Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T19:50:25.1506756Z ·  ────────────────┬──────────────── 2026-10-24T19:50:25.1507178Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T19:50:25.1507502Z 776 │ 2026-10-24T19:50:25.1507619Z ╰──── 2026-10-24T19:50:25.1508111Z  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-24T19:50:25.1508831Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1509143Z 2026-10-24T19:50:25.1509308Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1509619Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T19:50:25.1509947Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T19:50:25.1510260Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T19:50:25.1510506Z ·  ──────────┬───────── 2026-10-24T19:50:25.1510777Z · ╰── `animatedBorderRadius` originates here 2026-10-24T19:50:25.1511100Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T19:50:25.1511349Z 390 │ useLayoutEffect(() => { 2026-10-24T19:50:25.1511542Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T19:50:25.1511755Z ·  ──────────┬───────── 2026-10-24T19:50:25.1512016Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T19:50:25.1512274Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T19:50:25.1512437Z ╰──── 2026-10-24T19:50:25.1512858Z  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-24T19:50:25.1513467Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1513765Z 2026-10-24T19:50:25.1514079Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1514515Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T19:50:25.1514744Z 14 │ 2026-10-24T19:50:25.1514880Z 15 │ const legacyCredentials = { 2026-10-24T19:50:25.1515066Z ·  ────────┬──────── 2026-10-24T19:50:25.1515325Z · ╰── 'legacyCredentials' is declared here 2026-10-24T19:50:25.1515555Z 16 │ version: 1 as const, 2026-10-24T19:50:25.1515695Z ╰──── 2026-10-24T19:50:25.1515857Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1515978Z 2026-10-24T19:50:25.1516245Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1516663Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T19:50:25.1516949Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T19:50:25.1517145Z 38 │ useLayoutEffect(() => { 2026-10-24T19:50:25.1517318Z ·  ───────┬─────── 2026-10-24T19:50:25.1517548Z · ╰── This is the containing effect 2026-10-24T19:50:25.1517753Z 39 │ reset(); 2026-10-24T19:50:25.1517902Z 40 │ setInitialized(true); 2026-10-24T19:50:25.1518074Z ·  ───────┬────── 2026-10-24T19:50:25.1518340Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1518577Z 41 │ }, [reset]); 2026-10-24T19:50:25.1518703Z ╰──── 2026-10-24T19:50:25.1519370Z  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-24T19:50:25.1520247Z  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-24T19:50:25.1520559Z 2026-10-24T19:50:25.1520903Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1521356Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T19:50:25.1521579Z 88 │ 2026-10-24T19:50:25.1521702Z 89 │ useEffect(() => { 2026-10-24T19:50:25.1521858Z ·  ────┬──── 2026-10-24T19:50:25.1522074Z · ╰── This is the containing effect 2026-10-24T19:50:25.1522377Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T19:50:25.1522650Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T19:50:25.1522836Z 92 │ let active = true; 2026-10-24T19:50:25.1523019Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T19:50:25.1523228Z ·  ─────────┬───────── 2026-10-24T19:50:25.1523506Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1523835Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T19:50:25.1524080Z ╰──── 2026-10-24T19:50:25.1524746Z  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-24T19:50:25.1525624Z  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-24T19:50:25.1525934Z 2026-10-24T19:50:25.1526114Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1536008Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T19:50:25.1536785Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T19:50:25.1537039Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T19:50:25.1537286Z ·  ─────┬──── 2026-10-24T19:50:25.1537609Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1537892Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T19:50:25.1538085Z ╰──── 2026-10-24T19:50:25.1538450Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T19:50:25.1539084Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1539384Z 2026-10-24T19:50:25.1539622Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T19:50:25.1539979Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T19:50:25.1540225Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T19:50:25.1540487Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T19:50:25.1540800Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T19:50:25.1541022Z 347 │ }; 2026-10-24T19:50:25.1541148Z ╰──── 2026-10-24T19:50:25.1541912Z  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-24T19:50:25.1542286Z 2026-10-24T19:50:25.1542519Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T19:50:25.1542865Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T19:50:25.1543071Z 447 │ const favorites = 2026-10-24T19:50:25.1543275Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T19:50:25.1543494Z ·  ───┬── 2026-10-24T19:50:25.1543734Z · ╰── For this reduce 2026-10-24T19:50:25.1543993Z 449 │ const exists = current.some( 2026-10-24T19:50:25.1544281Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T19:50:25.1544530Z 451 │ ); 2026-10-24T19:50:25.1544685Z 452 │ return change.favorite 2026-10-24T19:50:25.1544854Z 453 │ ? exists 2026-10-24T19:50:25.1545000Z 454 │ ? current 2026-10-24T19:50:25.1545227Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T19:50:25.1545464Z ·  ─────┬──── 2026-10-24T19:50:25.1545695Z · ╰── From this spread 2026-10-24T19:50:25.1545898Z 456 │ : current.filter( 2026-10-24T19:50:25.1546050Z ╰──── 2026-10-24T19:50:25.1546322Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T19:50:25.1546697Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T19:50:25.1546870Z 2026-10-24T19:50:25.1547074Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T19:50:25.1547391Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T19:50:25.1547590Z 464 │ null; 2026-10-24T19:50:25.1547782Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T19:50:25.1548013Z ·  ──────────┬───────── 2026-10-24T19:50:25.1548246Z · ╰── From this accumulator 2026-10-24T19:50:25.1548489Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T19:50:25.1548677Z ·  ─┬─ 2026-10-24T19:50:25.1548871Z · ╰── For this loop 2026-10-24T19:50:25.1549129Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T19:50:25.1549354Z 468 │ hiddenModels: [], 2026-10-24T19:50:25.1549512Z 469 │ modelOrder: [], 2026-10-24T19:50:25.1549670Z 470 │ }; 2026-10-24T19:50:25.1549931Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T19:50:25.1550232Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T19:50:25.1550441Z 473 │ nextModelPreferences = { 2026-10-24T19:50:25.1550616Z 474 │ ...nextModelPreferences, 2026-10-24T19:50:25.1550819Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1551052Z · ╰── From this spread 2026-10-24T19:50:25.1551303Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T19:50:25.1551487Z ╰──── 2026-10-24T19:50:25.1551707Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T19:50:25.1552101Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T19:50:25.1552307Z 2026-10-24T19:50:25.1552801Z ⚠ 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-24T19:50:25.1553424Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T19:50:25.1553713Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T19:50:25.1554195Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T19:50:25.1554545Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T19:50:25.1554804Z 137 │ │ if (predicate(lastState)) { 2026-10-24T19:50:25.1555046Z 138 │ │ return lastState; 2026-10-24T19:50:25.1555242Z 139 │ │ } 2026-10-24T19:50:25.1555449Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1555700Z 141 │ ╰─▶ } 2026-10-24T19:50:25.1555915Z 142 │ return yield* Effect.die( 2026-10-24T19:50:25.1556072Z ╰──── 2026-10-24T19:50:25.1556134Z 2026-10-24T19:50:25.1556296Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1556634Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T19:50:25.1556868Z 107 │ ); 2026-10-24T19:50:25.1557095Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T19:50:25.1557352Z ·  ─────────┬──────── 2026-10-24T19:50:25.1557625Z · ╰── `separationProgress` originates here 2026-10-24T19:50:25.1557839Z 109 │ 2026-10-24T19:50:25.1557975Z 110 │ useEffect(() => { 2026-10-24T19:50:25.1558237Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T19:50:25.1558507Z ·  ─────────┬──────── 2026-10-24T19:50:25.1558766Z · ╰── `separationProgress` cannot be modified 2026-10-24T19:50:25.1559035Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T19:50:25.1559218Z ╰──── 2026-10-24T19:50:25.1559551Z  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-24T19:50:25.1560140Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1560444Z 2026-10-24T19:50:25.1560604Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1560934Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T19:50:25.1561220Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T19:50:25.1561474Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T19:50:25.1561691Z ·  ──────┬───── 2026-10-24T19:50:25.1561936Z · ╰── `capsuleWidth` originates here 2026-10-24T19:50:25.1562194Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T19:50:25.1562444Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1562769Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T19:50:25.1563033Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T19:50:25.1563218Z 134 │ return; 2026-10-24T19:50:25.1563357Z 135 │ } 2026-10-24T19:50:25.1563536Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T19:50:25.1563748Z 137 │ measuredWidthRef.current = width; 2026-10-24T19:50:25.1564042Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T19:50:25.1564277Z ·  ──────┬───── 2026-10-24T19:50:25.1564521Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T19:50:25.1564726Z 139 │ }; 2026-10-24T19:50:25.1564855Z ╰──── 2026-10-24T19:50:25.1565192Z  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-24T19:50:25.1565769Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1566067Z 2026-10-24T19:50:25.1566227Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1567006Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T19:50:25.1567294Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T19:50:25.1567544Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T19:50:25.1567760Z ·  ──────┬───── 2026-10-24T19:50:25.1568004Z · ╰── `capsuleWidth` originates here 2026-10-24T19:50:25.1568287Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T19:50:25.1568542Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1568782Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T19:50:25.1569010Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T19:50:25.1569190Z 134 │ return; 2026-10-24T19:50:25.1569324Z 135 │ } 2026-10-24T19:50:25.1569504Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T19:50:25.1569717Z 137 │ measuredWidthRef.current = width; 2026-10-24T19:50:25.1569976Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T19:50:25.1570190Z 139 │ }; 2026-10-24T19:50:25.1570353Z 140 │ const hasStatus = props.status !== null; 2026-10-24T19:50:25.1570604Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T19:50:25.1570834Z 142 │ useEffect(() => { 2026-10-24T19:50:25.1570991Z 143 │ if (!hasStatus) { 2026-10-24T19:50:25.1571167Z 144 │ measuredWidthRef.current = null; 2026-10-24T19:50:25.1571360Z 145 │ capsuleWidth.value = null; 2026-10-24T19:50:25.1571543Z ·  ──────┬───── 2026-10-24T19:50:25.1571787Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T19:50:25.1571989Z 146 │ } 2026-10-24T19:50:25.1572114Z ╰──── 2026-10-24T19:50:25.1572442Z  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-24T19:50:25.1573013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1573307Z 2026-10-24T19:50:25.1573599Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T19:50:25.1574056Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T19:50:25.1574368Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T19:50:25.1574593Z 142 │ useEffect(() => { 2026-10-24T19:50:25.1574761Z ·  ───┬─── 2026-10-24T19:50:25.1575096Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T19:50:25.1575382Z 143 │ if (!hasStatus) { 2026-10-24T19:50:25.1575566Z 144 │ measuredWidthRef.current = null; 2026-10-24T19:50:25.1575755Z 145 │ capsuleWidth.value = null; 2026-10-24T19:50:25.1575933Z ·  ──────┬───── 2026-10-24T19:50:25.1576182Z · ╰── This modifies `capsuleWidth` 2026-10-24T19:50:25.1576389Z 146 │ } 2026-10-24T19:50:25.1576513Z ╰──── 2026-10-24T19:50:25.1576923Z  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-24T19:50:25.1577557Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1577855Z 2026-10-24T19:50:25.1578058Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T19:50:25.1578428Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T19:50:25.1578715Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T19:50:25.1578972Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1579237Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.1579622Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T19:50:25.1579964Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T19:50:25.1580192Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T19:50:25.1580373Z 134 │ return; 2026-10-24T19:50:25.1580510Z 135 │ } 2026-10-24T19:50:25.1580687Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T19:50:25.1580902Z 137 │ measuredWidthRef.current = width; 2026-10-24T19:50:25.1581155Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T19:50:25.1581466Z ·  ──────┬───── 2026-10-24T19:50:25.1581737Z · ╰── This modifies `capsuleWidth` 2026-10-24T19:50:25.1581936Z 139 │ }; 2026-10-24T19:50:25.1582059Z ╰──── 2026-10-24T19:50:25.1582463Z  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-24T19:50:25.1583098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1583397Z 2026-10-24T19:50:25.1583883Z ⚠ 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-24T19:50:25.1584500Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T19:50:25.1584800Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T19:50:25.1585097Z 133 │ ╭─▶ for ( 2026-10-24T19:50:25.1585355Z 134 │ │ let attempt = 0; 2026-10-24T19:50:25.1585648Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T19:50:25.1585924Z 136 │ │ attempt += 1 2026-10-24T19:50:25.1586130Z 137 │ │ ) { 2026-10-24T19:50:25.1586347Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1586624Z 139 │ ╰─▶ } 2026-10-24T19:50:25.1586897Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T19:50:25.1587096Z ╰──── 2026-10-24T19:50:25.1587158Z 2026-10-24T19:50:25.1587319Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1587646Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T19:50:25.1587866Z 83 │ 2026-10-24T19:50:25.1588027Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T19:50:25.1588226Z ·  ──────┬───── 2026-10-24T19:50:25.1588470Z · ╰── `cardCoverage` originates here 2026-10-24T19:50:25.1588695Z 85 │ const barHeightRef = useRef(0); 2026-10-24T19:50:25.1588878Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T19:50:25.1589079Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T19:50:25.1589281Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T19:50:25.1589467Z 89 │ if (!cardCoverage) { 2026-10-24T19:50:25.1589619Z 90 │ return; 2026-10-24T19:50:25.1589754Z 91 │ } 2026-10-24T19:50:25.1589989Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T19:50:25.1590271Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T19:50:25.1590556Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T19:50:25.1590808Z ·  ──────┬───── 2026-10-24T19:50:25.1591046Z · ╰── `cardCoverage` cannot be modified 2026-10-24T19:50:25.1591264Z 95 │ }, [cardCoverage]); 2026-10-24T19:50:25.1591406Z ╰──── 2026-10-24T19:50:25.1591843Z  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-24T19:50:25.1592486Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1592784Z 2026-10-24T19:50:25.1592950Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1593273Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T19:50:25.1593523Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T19:50:25.1593722Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T19:50:25.1593945Z ·  ─────┬──── 2026-10-24T19:50:25.1594186Z · ╰── `cardHeight` originates here 2026-10-24T19:50:25.1594433Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T19:50:25.1594625Z  89 │ if (!cardCoverage) { 2026-10-24T19:50:25.1594780Z  90 │ return; 2026-10-24T19:50:25.1594917Z  91 │ } 2026-10-24T19:50:25.1595153Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T19:50:25.1595434Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T19:50:25.1595713Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T19:50:25.1595949Z  95 │ }, [cardCoverage]); 2026-10-24T19:50:25.1596128Z  96 │ const handleBarLayout = useCallback( 2026-10-24T19:50:25.1596317Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1596550Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T19:50:25.1596765Z  99 │ notifyCoverage(); 2026-10-24T19:50:25.1596921Z 100 │ }, 2026-10-24T19:50:25.1597058Z 101 │ [notifyCoverage], 2026-10-24T19:50:25.1597206Z 102 │ ); 2026-10-24T19:50:25.1597359Z 103 │ const handleCardLayout = useCallback( 2026-10-24T19:50:25.1597550Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1597787Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T19:50:25.1598046Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T19:50:25.1598262Z ·  ─────┬──── 2026-10-24T19:50:25.1598495Z · ╰── `cardHeight` cannot be modified 2026-10-24T19:50:25.1598714Z 107 │ notifyCoverage(); 2026-10-24T19:50:25.1598857Z ╰──── 2026-10-24T19:50:25.1599198Z  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-24T19:50:25.1599770Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1600068Z 2026-10-24T19:50:25.1600279Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T19:50:25.1600638Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T19:50:25.1600893Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T19:50:25.1601096Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T19:50:25.1601321Z ·  ───┬─── 2026-10-24T19:50:25.1601686Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T19:50:25.1602056Z 89 │ if (!cardCoverage) { 2026-10-24T19:50:25.1602266Z 90 │ return; 2026-10-24T19:50:25.1602403Z 91 │ } 2026-10-24T19:50:25.1602637Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T19:50:25.1602912Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T19:50:25.1603197Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T19:50:25.1603444Z ·  ──────┬───── 2026-10-24T19:50:25.1603679Z · ╰── This modifies `cardCoverage` 2026-10-24T19:50:25.1603887Z 95 │ }, [cardCoverage]); 2026-10-24T19:50:25.1604052Z ╰──── 2026-10-24T19:50:25.1604465Z  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-24T19:50:25.1605104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1605400Z 2026-10-24T19:50:25.1605604Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T19:50:25.1605970Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T19:50:25.1606241Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T19:50:25.1606590Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T19:50:25.1606838Z ·  ──────┬───── 2026-10-24T19:50:25.1607071Z · ╰── This modifies `cardCoverage` 2026-10-24T19:50:25.1607286Z 95 │ }, [cardCoverage]); 2026-10-24T19:50:25.1607470Z 96 │ const handleBarLayout = useCallback( 2026-10-24T19:50:25.1607662Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1607878Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.1608224Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T19:50:25.1608567Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T19:50:25.1608759Z ╰──── 2026-10-24T19:50:25.1609162Z  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-24T19:50:25.1609799Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1610098Z 2026-10-24T19:50:25.1610305Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T19:50:25.1610662Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T19:50:25.1610918Z 103 │ const handleCardLayout = useCallback( 2026-10-24T19:50:25.1611108Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T19:50:25.1611319Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.1611658Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T19:50:25.1611997Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T19:50:25.1612258Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T19:50:25.1612548Z ·  ─────┬──── 2026-10-24T19:50:25.1612821Z · ╰── This modifies `cardHeight` 2026-10-24T19:50:25.1613032Z 107 │ notifyCoverage(); 2026-10-24T19:50:25.1613179Z ╰──── 2026-10-24T19:50:25.1613580Z  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-24T19:50:25.1614248Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1614544Z 2026-10-24T19:50:25.1614811Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1615214Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2195:5] 2026-10-24T19:50:25.1615426Z 2193 │ ); 2026-10-24T19:50:25.1615570Z 2194 │ useEffect(() => { 2026-10-24T19:50:25.1615735Z ·  ────┬──── 2026-10-24T19:50:25.1615963Z · ╰── This is the containing effect 2026-10-24T19:50:25.1616183Z 2195 │ setExpandedVideo(null); 2026-10-24T19:50:25.1616368Z ·  ────────┬─────── 2026-10-24T19:50:25.1616643Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1616890Z 2196 │ setExpandedFile(null); 2026-10-24T19:50:25.1617044Z ╰──── 2026-10-24T19:50:25.1617728Z  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-24T19:50:25.1618617Z  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-24T19:50:25.1618929Z 2026-10-24T19:50:25.1619196Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1619587Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2700:9] 2026-10-24T19:50:25.1619884Z 2691 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T19:50:25.1620103Z 2692 │ useEffect(() => { 2026-10-24T19:50:25.1620270Z ·  ────┬──── 2026-10-24T19:50:25.1620500Z · ╰── This is the containing effect 2026-10-24T19:50:25.1620776Z 2693 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T19:50:25.1621024Z 2694 │ const index = presentedFeed.findIndex( 2026-10-24T19:50:25.1621278Z 2695 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T19:50:25.1621491Z 2696 │ ); 2026-10-24T19:50:25.1621641Z 2697 │ if (index === -1) { 2026-10-24T19:50:25.1621869Z 2698 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T19:50:25.1622120Z 2699 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T19:50:25.1622342Z 2700 │ setInteractionState((current) => ({ 2026-10-24T19:50:25.1622550Z ·  ─────────┬───────── 2026-10-24T19:50:25.1622844Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1623161Z 2701 │ ...current, 2026-10-24T19:50:25.1623344Z ╰──── 2026-10-24T19:50:25.1624042Z  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-24T19:50:25.1624918Z  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-24T19:50:25.1625224Z 2026-10-24T19:50:25.1625466Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T19:50:25.1625837Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-24T19:50:25.1626136Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T19:50:25.1626439Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T19:50:25.1626696Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1626981Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T19:50:25.1627308Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T19:50:25.1627538Z ╰──── 2026-10-24T19:50:25.1627698Z  help: Consider removing this import. 2026-10-24T19:50:25.1627817Z 2026-10-24T19:50:25.1628034Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T19:50:25.1628376Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-24T19:50:25.1628587Z 95 │ import { 2026-10-24T19:50:25.1628734Z 96 │ createContext, 2026-10-24T19:50:25.1628893Z ·  ──────┬────── 2026-10-24T19:50:25.1629129Z · ╰── 'createContext' is imported here 2026-10-24T19:50:25.1629333Z 97 │ memo, 2026-10-24T19:50:25.1629461Z ╰──── 2026-10-24T19:50:25.1629618Z  help: Consider removing this import. 2026-10-24T19:50:25.1629735Z 2026-10-24T19:50:25.1629955Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T19:50:25.1630300Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-24T19:50:25.1630512Z 111 │ import { 2026-10-24T19:50:25.1630654Z 112 │ ActivityIndicator, 2026-10-24T19:50:25.1630826Z ·  ────────┬──────── 2026-10-24T19:50:25.1631140Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T19:50:25.1631391Z 113 │ Image, 2026-10-24T19:50:25.1631520Z ╰──── 2026-10-24T19:50:25.1631677Z  help: Consider removing this import. 2026-10-24T19:50:25.1631794Z 2026-10-24T19:50:25.1632004Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T19:50:25.1632340Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-24T19:50:25.1632556Z 118 │ Pressable, 2026-10-24T19:50:25.1632700Z 119 │ ScrollView, 2026-10-24T19:50:25.1632860Z ·  ─────┬──── 2026-10-24T19:50:25.1633081Z · ╰── 'ScrollView' is imported here 2026-10-24T19:50:25.1633291Z 120 │ StyleSheet, 2026-10-24T19:50:25.1633424Z ╰──── 2026-10-24T19:50:25.1633589Z  help: Consider removing this import. 2026-10-24T19:50:25.1633711Z 2026-10-24T19:50:25.1633942Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T19:50:25.1634277Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-24T19:50:25.1634493Z 120 │ StyleSheet, 2026-10-24T19:50:25.1634639Z 121 │ Text as NativeText, 2026-10-24T19:50:25.1634815Z ·  ─────┬──── 2026-10-24T19:50:25.1635056Z · ╰── 'NativeText' is imported here 2026-10-24T19:50:25.1635276Z 122 │ type ColorValue, 2026-10-24T19:50:25.1635417Z ╰──── 2026-10-24T19:50:25.1635577Z  help: Consider removing this import. 2026-10-24T19:50:25.1635690Z 2026-10-24T19:50:25.1635921Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T19:50:25.1636278Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-24T19:50:25.1636563Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T19:50:25.1636843Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T19:50:25.1637085Z ·  ─────────┬──────── 2026-10-24T19:50:25.1637349Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T19:50:25.1637665Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T19:50:25.1637879Z ╰──── 2026-10-24T19:50:25.1638040Z  help: Consider removing this import. 2026-10-24T19:50:25.1638158Z 2026-10-24T19:50:25.1638385Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T19:50:25.1638745Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-24T19:50:25.1639031Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T19:50:25.1639315Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T19:50:25.1639550Z ·  ─────────┬───────── 2026-10-24T19:50:25.1639819Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T19:50:25.1640038Z 148 │ import { 2026-10-24T19:50:25.1640169Z ╰──── 2026-10-24T19:50:25.1640326Z  help: Consider removing this import. 2026-10-24T19:50:25.1640445Z 2026-10-24T19:50:25.1640665Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T19:50:25.1641077Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-24T19:50:25.1641414Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T19:50:25.1641716Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T19:50:25.1641960Z ·  ────────┬─────── 2026-10-24T19:50:25.1642218Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T19:50:25.1642515Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T19:50:25.1642729Z ╰──── 2026-10-24T19:50:25.1642885Z  help: Consider removing this import. 2026-10-24T19:50:25.1643003Z 2026-10-24T19:50:25.1643235Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T19:50:25.1643594Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-24T19:50:25.1643836Z 164 │ attachmentVideoPreviewSource, 2026-10-24T19:50:25.1644039Z 165 │ mediaVideoPreviewUri, 2026-10-24T19:50:25.1644224Z ·  ──────────┬───────── 2026-10-24T19:50:25.1644482Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T19:50:25.1644717Z 166 │ mediaVideoThumbnailKey, 2026-10-24T19:50:25.1644866Z ╰──── 2026-10-24T19:50:25.1645022Z  help: Consider removing this import. 2026-10-24T19:50:25.1645143Z 2026-10-24T19:50:25.1645373Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T19:50:25.1645734Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-24T19:50:25.1645953Z 165 │ mediaVideoPreviewUri, 2026-10-24T19:50:25.1646128Z 166 │ mediaVideoThumbnailKey, 2026-10-24T19:50:25.1646320Z ·  ───────────┬────────── 2026-10-24T19:50:25.1646765Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T19:50:25.1647015Z 167 │ type MediaVideoPreviewSource, 2026-10-24T19:50:25.1647172Z ╰──── 2026-10-24T19:50:25.1647331Z  help: Consider removing this import. 2026-10-24T19:50:25.1647443Z 2026-10-24T19:50:25.1647665Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T19:50:25.1648015Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-24T19:50:25.1657866Z 166 │ mediaVideoThumbnailKey, 2026-10-24T19:50:25.1658087Z 167 │ type MediaVideoPreviewSource, 2026-10-24T19:50:25.1658303Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1658595Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T19:50:25.1658851Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-24T19:50:25.1659013Z ╰──── 2026-10-24T19:50:25.1659175Z  help: Consider removing this import. 2026-10-24T19:50:25.1659294Z 2026-10-24T19:50:25.1659502Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T19:50:25.1659845Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:175:15] 2026-10-24T19:50:25.1660176Z 174 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T19:50:25.1660511Z 175 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T19:50:25.1660761Z ·  ───────┬─────── 2026-10-24T19:50:25.1661160Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T19:50:25.1661423Z 176 │ import { 2026-10-24T19:50:25.1661555Z ╰──── 2026-10-24T19:50:25.1661714Z  help: Consider removing this import. 2026-10-24T19:50:25.1661832Z 2026-10-24T19:50:25.1662070Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T19:50:25.1662431Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-24T19:50:25.1662643Z 189 │ import { 2026-10-24T19:50:25.1662792Z 190 │ resolveMarkdownFontSizes, 2026-10-24T19:50:25.1662983Z ·  ────────────┬─────────── 2026-10-24T19:50:25.1663255Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T19:50:25.1663517Z 191 │ resolveNativeMarkdownTypography, 2026-10-24T19:50:25.1663688Z ╰──── 2026-10-24T19:50:25.1663843Z  help: Consider removing this import. 2026-10-24T19:50:25.1663987Z 2026-10-24T19:50:25.1664253Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T19:50:25.1664636Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:197:3] 2026-10-24T19:50:25.1664865Z 196 │ normalizeNativeMarkdownUrl, 2026-10-24T19:50:25.1665062Z 197 │ resolveMarkdownInlineCodePresentation, 2026-10-24T19:50:25.1665298Z ·  ──────────────────┬────────────────── 2026-10-24T19:50:25.1665619Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T19:50:25.1665902Z 198 │ resolveMarkdownLinkPresentation, 2026-10-24T19:50:25.1666071Z ╰──── 2026-10-24T19:50:25.1666234Z  help: Consider removing this import. 2026-10-24T19:50:25.1666347Z 2026-10-24T19:50:25.1666584Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T19:50:25.1666948Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:242:10] 2026-10-24T19:50:25.1667204Z 241 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T19:50:25.1667475Z 242 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T19:50:25.1667746Z ·  ────────────┬─────────── 2026-10-24T19:50:25.1668030Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T19:50:25.1668263Z 243 │ import { 2026-10-24T19:50:25.1668385Z ╰──── 2026-10-24T19:50:25.1668549Z  help: Consider removing this import. 2026-10-24T19:50:25.1668669Z 2026-10-24T19:50:25.1668884Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T19:50:25.1669229Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:246:3] 2026-10-24T19:50:25.1669442Z 245 │ useAssetUrl, 2026-10-24T19:50:25.1669595Z 246 │ useAssetUrlState, 2026-10-24T19:50:25.1669766Z ·  ────────┬─────── 2026-10-24T19:50:25.1670015Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T19:50:25.1670236Z 247 │ useRefreshAssetUrl, 2026-10-24T19:50:25.1670380Z ╰──── 2026-10-24T19:50:25.1670542Z  help: Consider removing this import. 2026-10-24T19:50:25.1670661Z 2026-10-24T19:50:25.1671029Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1671426Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2197:7] 2026-10-24T19:50:25.1671652Z 2196 │ setExpandedFile(null); 2026-10-24T19:50:25.1671915Z 2197 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T19:50:25.1672323Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T19:50:25.1672838Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T19:50:25.1673050Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T19:50:25.1673227Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T19:50:25.1673383Z 2198 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T19:50:25.1673441Z ╰──── 2026-10-24T19:50:25.1673749Z  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-24T19:50:25.1674099Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1674102Z 2026-10-24T19:50:25.1674308Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1674451Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2669:7] 2026-10-24T19:50:25.1674559Z 2668 │ reportHeaderMaterialVisibility(false); 2026-10-24T19:50:25.1674685Z 2669 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T19:50:25.1674768Z ·  ──────┬────── 2026-10-24T19:50:25.1674928Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T19:50:25.1674989Z 2670 │ 2026-10-24T19:50:25.1675047Z ╰──── 2026-10-24T19:50:25.1675344Z  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-24T19:50:25.1675663Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1675666Z 2026-10-24T19:50:25.1675926Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1676100Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-24T19:50:25.1676163Z 2684 │ } 2026-10-24T19:50:25.1676295Z 2685 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T19:50:25.1676380Z ·  ──────┬───── 2026-10-24T19:50:25.1676535Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T19:50:25.1676685Z 2686 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T19:50:25.1676738Z ╰──── 2026-10-24T19:50:25.1677037Z  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-24T19:50:25.1677357Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1677363Z 2026-10-24T19:50:25.1677570Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1677707Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2881:7] 2026-10-24T19:50:25.1677769Z 2880 │ } 2026-10-24T19:50:25.1677956Z 2881 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T19:50:25.1678170Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T19:50:25.1678435Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T19:50:25.1678653Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T19:50:25.1678818Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T19:50:25.1678878Z 2882 │ 2026-10-24T19:50:25.1678935Z ╰──── 2026-10-24T19:50:25.1679230Z  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-24T19:50:25.1679547Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1679549Z 2026-10-24T19:50:25.1679738Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T19:50:25.1679884Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:627:9] 2026-10-24T19:50:25.1679945Z 626 │ }; 2026-10-24T19:50:25.1680069Z 627 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T19:50:25.1680273Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T19:50:25.1680523Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T19:50:25.1680727Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T19:50:25.1680894Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T19:50:25.1680955Z 628 │ ); 2026-10-24T19:50:25.1681013Z ╰──── 2026-10-24T19:50:25.1681394Z  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-24T19:50:25.1681748Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1681751Z 2026-10-24T19:50:25.1682020Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1682182Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T19:50:25.1682326Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T19:50:25.1682399Z 356 │ useEffect(() => { 2026-10-24T19:50:25.1682473Z ·  ────┬──── 2026-10-24T19:50:25.1682618Z · ╰── This is the containing effect 2026-10-24T19:50:25.1682718Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T19:50:25.1682786Z 358 │ return; 2026-10-24T19:50:25.1682843Z 359 │ } 2026-10-24T19:50:25.1682946Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T19:50:25.1683046Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T19:50:25.1683154Z ·  ──────────────┬────────────── 2026-10-24T19:50:25.1683342Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1683409Z 362 │ return; 2026-10-24T19:50:25.1683466Z ╰──── 2026-10-24T19:50:25.1684121Z  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-24T19:50:25.1684450Z  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-24T19:50:25.1684453Z 2026-10-24T19:50:25.1684721Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1684880Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T19:50:25.1684940Z 447 │ 2026-10-24T19:50:25.1685006Z 448 │ useEffect(() => { 2026-10-24T19:50:25.1685084Z ·  ────┬──── 2026-10-24T19:50:25.1685222Z · ╰── This is the containing effect 2026-10-24T19:50:25.1685334Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T19:50:25.1685398Z 450 │ return; 2026-10-24T19:50:25.1685459Z 451 │ } 2026-10-24T19:50:25.1685608Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T19:50:25.1685747Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T19:50:25.1685856Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T19:50:25.1685916Z 455 │ } 2026-10-24T19:50:25.1686062Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T19:50:25.1686195Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T19:50:25.1686301Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T19:50:25.1686379Z 459 │ const directProject = 2026-10-24T19:50:25.1686821Z 460 │ projects.find( 2026-10-24T19:50:25.1686973Z 461 │ (project) => 2026-10-24T19:50:25.1687198Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T19:50:25.1687267Z 463 │ ) ?? null; 2026-10-24T19:50:25.1687325Z 464 │ 2026-10-24T19:50:25.1687401Z 465 │ if (directProject) { 2026-10-24T19:50:25.1687543Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T19:50:25.1687687Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T19:50:25.1687855Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T19:50:25.1687998Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T19:50:25.1688062Z 470 │ return; 2026-10-24T19:50:25.1688124Z 471 │ } 2026-10-24T19:50:25.1688237Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T19:50:25.1688306Z 473 │ if ( 2026-10-24T19:50:25.1688451Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T19:50:25.1688556Z 475 │ selectedProject.id !== directProject.id 2026-10-24T19:50:25.1688620Z 476 │ ) { 2026-10-24T19:50:25.1688711Z 477 │ setProject(directProject); 2026-10-24T19:50:25.1688775Z 478 │ return; 2026-10-24T19:50:25.1688839Z 479 │ } 2026-10-24T19:50:25.1688927Z 480 │ if (!flow.draftKey) return; 2026-10-24T19:50:25.1689074Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T19:50:25.1689221Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T19:50:25.1689337Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T19:50:25.1689427Z 484 │ workspaceSelection: { 2026-10-24T19:50:25.1689507Z 485 │ mode: "local", 2026-10-24T19:50:25.1689614Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T19:50:25.1689757Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T19:50:25.1689844Z 488 │ startFromOrigin: false, 2026-10-24T19:50:25.1689904Z 489 │ }, 2026-10-24T19:50:25.1689968Z 490 │ }); 2026-10-24T19:50:25.1690030Z 491 │ } 2026-10-24T19:50:25.1690163Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T19:50:25.1690223Z 493 │ if ( 2026-10-24T19:50:25.1690371Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T19:50:25.1690474Z 495 │ selectedProject.id === directProject.id 2026-10-24T19:50:25.1690543Z 496 │ ) { 2026-10-24T19:50:25.1690610Z 497 │ return; 2026-10-24T19:50:25.1690672Z 498 │ } 2026-10-24T19:50:25.1690757Z 499 │ setProject(directProject); 2026-10-24T19:50:25.1690823Z 500 │ return; 2026-10-24T19:50:25.1690880Z 501 │ } 2026-10-24T19:50:25.1690937Z 502 │ 2026-10-24T19:50:25.1691021Z 503 │ if (projects.length > 0) { 2026-10-24T19:50:25.1691123Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T19:50:25.1691234Z ·  ──────────────┬────────────── 2026-10-24T19:50:25.1691424Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1691486Z 505 │ } 2026-10-24T19:50:25.1691542Z ╰──── 2026-10-24T19:50:25.1692227Z  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-24T19:50:25.1692594Z  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-24T19:50:25.1692597Z 2026-10-24T19:50:25.1692864Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1693024Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T19:50:25.1693083Z 545 │ 2026-10-24T19:50:25.1693148Z 546 │ useEffect(() => { 2026-10-24T19:50:25.1693226Z ·  ────┬──── 2026-10-24T19:50:25.1693367Z · ╰── This is the containing effect 2026-10-24T19:50:25.1693471Z 547 │ const shareId = props.incomingShareId; 2026-10-24T19:50:25.1693554Z 548 │ const draftKey = flow.draftKey; 2026-10-24T19:50:25.1693662Z 549 │ const destinationProject = selectedProject; 2026-10-24T19:50:25.1693808Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T19:50:25.1693969Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T19:50:25.1694062Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T19:50:25.1694144Z 553 │ !initialEnvironmentId || 2026-10-24T19:50:25.1694220Z 554 │ !initialProjectId || 2026-10-24T19:50:25.1694353Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T19:50:25.1694463Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T19:50:25.1694532Z 557 │ if ( 2026-10-24T19:50:25.1694603Z 558 │ !shareId || 2026-10-24T19:50:25.1694667Z 559 │ !draftKey || 2026-10-24T19:50:25.1694745Z 560 │ !destinationProject || 2026-10-24T19:50:25.1694837Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T19:50:25.1694933Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T19:50:25.1694990Z 563 │ ) { 2026-10-24T19:50:25.1695055Z 564 │ return; 2026-10-24T19:50:25.1695115Z 565 │ } 2026-10-24T19:50:25.1695216Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T19:50:25.1695275Z 567 │ if ( 2026-10-24T19:50:25.1695391Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T19:50:25.1695507Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T19:50:25.1695567Z 570 │ ) { 2026-10-24T19:50:25.1695627Z 571 │ return; 2026-10-24T19:50:25.1695691Z 572 │ } 2026-10-24T19:50:25.1695751Z 573 │ 2026-10-24T19:50:25.1695820Z 574 │ if (!incomingShare) { 2026-10-24T19:50:25.1696023Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T19:50:25.1696155Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T19:50:25.1696226Z 577 │ Dialog.alert( 2026-10-24T19:50:25.1696312Z 578 │ "Shared content unavailable", 2026-10-24T19:50:25.1696498Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T19:50:25.1696557Z 580 │ ); 2026-10-24T19:50:25.1696611Z 581 │ } 2026-10-24T19:50:25.1696668Z 582 │ return; 2026-10-24T19:50:25.1696720Z 583 │ } 2026-10-24T19:50:25.1696773Z 584 │ 2026-10-24T19:50:25.1696829Z 585 │ if ( 2026-10-24T19:50:25.1697050Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T19:50:25.1697185Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T19:50:25.1697241Z 588 │ ) { 2026-10-24T19:50:25.1697299Z 589 │ return; 2026-10-24T19:50:25.1697353Z 590 │ } 2026-10-24T19:50:25.1697402Z 591 │ 2026-10-24T19:50:25.1697541Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T19:50:25.1697661Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T19:50:25.1697712Z 594 │ } 2026-10-24T19:50:25.1697819Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T19:50:25.1697888Z 596 │ const draftBackup = 2026-10-24T19:50:25.1698074Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T19:50:25.1698216Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T19:50:25.1698309Z 599 │ const importToken = Symbol(importKey); 2026-10-24T19:50:25.1698388Z 600 │ let didReserveShare = false; 2026-10-24T19:50:25.1698464Z 601 │ let didConsumeShare = false; 2026-10-24T19:50:25.1698543Z 602 │ let needsDraftRestore = false; 2026-10-24T19:50:25.1698654Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T19:50:25.1698737Z 604 │ setImportingShareKey(importKey); 2026-10-24T19:50:25.1698824Z ·  ──────────┬───────── 2026-10-24T19:50:25.1698999Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1699069Z 605 │ void (async () => { 2026-10-24T19:50:25.1699122Z ╰──── 2026-10-24T19:50:25.1699736Z  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-24T19:50:25.1700066Z  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-24T19:50:25.1700068Z 2026-10-24T19:50:25.1700273Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1700426Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T19:50:25.1700502Z 523 │ props.initialProjectRef, 2026-10-24T19:50:25.1700573Z 524 │ props.incomingShareId, 2026-10-24T19:50:25.1700715Z ·  ──────────┬────────── 2026-10-24T19:50:25.1700927Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T19:50:25.1700997Z 525 │ props.pendingTaskId, 2026-10-24T19:50:25.1701049Z ╰──── 2026-10-24T19:50:25.1701343Z  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-24T19:50:25.1701658Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1701661Z 2026-10-24T19:50:25.1701879Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.1702031Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T19:50:25.1702155Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T19:50:25.1702226Z 543 │ flow.loadBranches(); 2026-10-24T19:50:25.1702295Z ·  ──┬─ 2026-10-24T19:50:25.1702422Z · ╰── Missing dependency `flow` 2026-10-24T19:50:25.1702516Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T19:50:25.1702599Z ·  ────────┬──────── 2026-10-24T19:50:25.1702803Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T19:50:25.1702857Z 545 │ 2026-10-24T19:50:25.1702910Z ╰──── 2026-10-24T19:50:25.1703345Z  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-24T19:50:25.1703662Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1703665Z 2026-10-24T19:50:25.1703867Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1704051Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T19:50:25.1704115Z 765 │ flow.draftKey, 2026-10-24T19:50:25.1704190Z 766 │ hasImportedIncomingShare, 2026-10-24T19:50:25.1704283Z ·  ────────────┬─────────── 2026-10-24T19:50:25.1704465Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T19:50:25.1704527Z 767 │ incomingShare, 2026-10-24T19:50:25.1704614Z 768 │ isIncomingShareInboxLoading, 2026-10-24T19:50:25.1704714Z ·  ─────────────┬───────────── 2026-10-24T19:50:25.1704900Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T19:50:25.1704978Z 769 │ isIncomingShareUnavailable, 2026-10-24T19:50:25.1705050Z 770 │ props.incomingShareId, 2026-10-24T19:50:25.1705145Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T19:50:25.1705233Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T19:50:25.1705305Z 773 │ releaseShareReservation, 2026-10-24T19:50:25.1705369Z 774 │ reserveShare, 2026-10-24T19:50:25.1705454Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T19:50:25.1705520Z 776 │ selectedProject, 2026-10-24T19:50:25.1705588Z 777 │ shareImportAttempt, 2026-10-24T19:50:25.1705675Z ·  ─────────┬──────── 2026-10-24T19:50:25.1705899Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T19:50:25.1705986Z 778 │ ]); 2026-10-24T19:50:25.1706036Z ╰──── 2026-10-24T19:50:25.1706333Z  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-24T19:50:25.1706645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1706647Z 2026-10-24T19:50:25.1706844Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1707017Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T19:50:25.1707083Z 87 │
  • { 2026-10-24T19:50:25.1708248Z ·  ────┬──── 2026-10-24T19:50:25.1708386Z · ╰── This is the containing effect 2026-10-24T19:50:25.1708456Z 57 │ setDecodedSize(null); 2026-10-24T19:50:25.1708534Z ·  ───────┬────── 2026-10-24T19:50:25.1708704Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1708773Z 58 │ }, [props.sourceKey]); 2026-10-24T19:50:25.1708822Z ╰──── 2026-10-24T19:50:25.1709436Z  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-24T19:50:25.1709767Z  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-24T19:50:25.1709772Z 2026-10-24T19:50:25.1710034Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1710185Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T19:50:25.1710236Z 59 │ 2026-10-24T19:50:25.1710302Z 60 │ useEffect(() => { 2026-10-24T19:50:25.1710371Z ·  ────┬──── 2026-10-24T19:50:25.1710499Z · ╰── This is the containing effect 2026-10-24T19:50:25.1710565Z 61 │ setFailedUri(null); 2026-10-24T19:50:25.1710639Z ·  ──────┬───── 2026-10-24T19:50:25.1710806Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1710930Z 62 │ }, [props.uri]); 2026-10-24T19:50:25.1711012Z ╰──── 2026-10-24T19:50:25.1711613Z  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-24T19:50:25.1711935Z  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-24T19:50:25.1711938Z 2026-10-24T19:50:25.1712156Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T19:50:25.1712308Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T19:50:25.1712438Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T19:50:25.1712622Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T19:50:25.1712711Z ·  ────────┬──────── 2026-10-24T19:50:25.1712865Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T19:50:25.1712916Z 8 │ 2026-10-24T19:50:25.1712968Z ╰──── 2026-10-24T19:50:25.1713068Z  help: Consider removing this import. 2026-10-24T19:50:25.1713071Z 2026-10-24T19:50:25.1713273Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1713423Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T19:50:25.1713491Z 57 │ setDecodedSize(null); 2026-10-24T19:50:25.1713568Z 58 │ }, [props.sourceKey]); 2026-10-24T19:50:25.1713652Z ·  ───────┬─────── 2026-10-24T19:50:25.1713806Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T19:50:25.1713859Z 59 │ 2026-10-24T19:50:25.1713945Z ╰──── 2026-10-24T19:50:25.1714240Z  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-24T19:50:25.1714549Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1714552Z 2026-10-24T19:50:25.1714753Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1714909Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T19:50:25.1714979Z 61 │ setFailedUri(null); 2026-10-24T19:50:25.1715041Z 62 │ }, [props.uri]); 2026-10-24T19:50:25.1715116Z ·  ────┬──── 2026-10-24T19:50:25.1715258Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T19:50:25.1715312Z 63 │ 2026-10-24T19:50:25.1715361Z ╰──── 2026-10-24T19:50:25.1715656Z  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-24T19:50:25.1715968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1715971Z 2026-10-24T19:50:25.1716286Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1716486Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T19:50:25.1716540Z 213 │ }; 2026-10-24T19:50:25.1716606Z 214 │ useEffect(() => { 2026-10-24T19:50:25.1716676Z ·  ────┬──── 2026-10-24T19:50:25.1716807Z · ╰── This is the containing effect 2026-10-24T19:50:25.1716983Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T19:50:25.1717047Z 216 │ if (inserted) { 2026-10-24T19:50:25.1717122Z 217 │ setSelection((current) => 2026-10-24T19:50:25.1717199Z ·  ──────┬───── 2026-10-24T19:50:25.1717369Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1717551Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T19:50:25.1717607Z ╰──── 2026-10-24T19:50:25.1718211Z  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-24T19:50:25.1718533Z  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-24T19:50:25.1718537Z 2026-10-24T19:50:25.1718795Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1718962Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T19:50:25.1719040Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T19:50:25.1719104Z 287 │ useEffect(() => { 2026-10-24T19:50:25.1719174Z ·  ────┬──── 2026-10-24T19:50:25.1719305Z · ╰── This is the containing effect 2026-10-24T19:50:25.1719454Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T19:50:25.1719604Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T19:50:25.1719674Z 290 │ const now = Date.now(); 2026-10-24T19:50:25.1719790Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T19:50:25.1719848Z 292 │ if ( 2026-10-24T19:50:25.1719926Z 293 │ lastRequest?.key === key && 2026-10-24T19:50:25.1720070Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T19:50:25.1720128Z 295 │ ) 2026-10-24T19:50:25.1720189Z 296 │ return; 2026-10-24T19:50:25.1720364Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T19:50:25.1720450Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T19:50:25.1720546Z ·  ────────────┬─────────── 2026-10-24T19:50:25.1720725Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1720786Z 299 │ return; 2026-10-24T19:50:25.1720835Z ╰──── 2026-10-24T19:50:25.1721503Z  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-24T19:50:25.1721862Z  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-24T19:50:25.1721865Z 2026-10-24T19:50:25.1722068Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1722233Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T19:50:25.1722288Z 327 │ }, [ 2026-10-24T19:50:25.1722351Z 328 │ draftMessage, 2026-10-24T19:50:25.1722429Z ·  ──────┬───── 2026-10-24T19:50:25.1722573Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T19:50:25.1722639Z 329 │ environmentId, 2026-10-24T19:50:25.1722698Z ╰──── 2026-10-24T19:50:25.1722995Z  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-24T19:50:25.1723308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1723310Z 2026-10-24T19:50:25.1723573Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1723708Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T19:50:25.1723761Z 3404 │ 2026-10-24T19:50:25.1723974Z 3405 │ const layer: Layer.Layer = 2026-10-24T19:50:25.1724050Z ·  ──┬── 2026-10-24T19:50:25.1724181Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.1724244Z 3406 │ Layer.effect( 2026-10-24T19:50:25.1724296Z ╰──── 2026-10-24T19:50:25.1724401Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1724403Z 2026-10-24T19:50:25.1724605Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T19:50:25.1724741Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T19:50:25.1724835Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T19:50:25.1724926Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T19:50:25.1725005Z ·  ────┬─── 2026-10-24T19:50:25.1725142Z · ╰── 'Duration' is imported here 2026-10-24T19:50:25.1725284Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T19:50:25.1725368Z ╰──── 2026-10-24T19:50:25.1725467Z  help: Consider removing this import. 2026-10-24T19:50:25.1725469Z 2026-10-24T19:50:25.1725706Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T19:50:25.1725869Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T19:50:25.1725931Z 261 │ ): boolean { 2026-10-24T19:50:25.1726082Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T19:50:25.1726250Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T19:50:25.1726398Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T19:50:25.1726664Z ╰──── 2026-10-24T19:50:25.1726747Z  help: Switch to `Set` 2026-10-24T19:50:25.1726755Z 2026-10-24T19:50:25.1727015Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1727165Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T19:50:25.1727219Z 404 │ 2026-10-24T19:50:25.1727283Z 405 │ useEffect(() => { 2026-10-24T19:50:25.1727355Z ·  ────┬──── 2026-10-24T19:50:25.1727485Z · ╰── This is the containing effect 2026-10-24T19:50:25.1727576Z 406 │ setInspectorSelection((current) => { 2026-10-24T19:50:25.1727662Z ·  ──────────┬────────── 2026-10-24T19:50:25.1727843Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1727951Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T19:50:25.1728001Z ╰──── 2026-10-24T19:50:25.1728603Z  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-24T19:50:25.1728927Z  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-24T19:50:25.1728929Z 2026-10-24T19:50:25.1729146Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T19:50:25.1729302Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T19:50:25.1729464Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T19:50:25.1729635Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T19:50:25.1729734Z 535 │ │ 2026-10-24T19:50:25.1730349Z 540 │ ╰─▶ ); 2026-10-24T19:50:25.1730504Z 541 │ const FilesInspector = () => 2026-10-24T19:50:25.1730595Z ╰──── 2026-10-24T19:50:25.1730821Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T19:50:25.1730823Z 2026-10-24T19:50:25.1731039Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T19:50:25.1731191Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T19:50:25.1731247Z 540 │ ); 2026-10-24T19:50:25.1731413Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T19:50:25.1731564Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T19:50:25.1731671Z 543 │ │ 2026-10-24T19:50:25.1732646Z 551 │ ╰─▶ ) : null; 2026-10-24T19:50:25.1732799Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T19:50:25.1732850Z ╰──── 2026-10-24T19:50:25.1733078Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T19:50:25.1733085Z 2026-10-24T19:50:25.1733347Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1733509Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T19:50:25.1733572Z 259 │ .join("|"); 2026-10-24T19:50:25.1733635Z 260 │ useEffect(() => { 2026-10-24T19:50:25.1733708Z ·  ────┬──── 2026-10-24T19:50:25.1733839Z · ╰── This is the containing effect 2026-10-24T19:50:25.1733923Z 261 │ stop(); 2026-10-24T19:50:25.1733992Z ·  ──┬─ 2026-10-24T19:50:25.1734166Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1734237Z 262 │ }, [orderVersion]); 2026-10-24T19:50:25.1734287Z ╰──── 2026-10-24T19:50:25.1734890Z  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-24T19:50:25.1735215Z  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-24T19:50:25.1735218Z 2026-10-24T19:50:25.1735436Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.1735653Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T19:50:25.1735749Z 260 │ useEffect(() => { 2026-10-24T19:50:25.1735809Z 261 │ stop(); 2026-10-24T19:50:25.1735876Z ·  ──┬─ 2026-10-24T19:50:25.1736003Z · ╰── Missing dependency `stop` 2026-10-24T19:50:25.1736066Z 262 │ }, [orderVersion]); 2026-10-24T19:50:25.1736146Z ·  ──────┬───── 2026-10-24T19:50:25.1736299Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T19:50:25.1736359Z 263 │ useEffect( 2026-10-24T19:50:25.1736408Z ╰──── 2026-10-24T19:50:25.1736836Z  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-24T19:50:25.1737158Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1737165Z 2026-10-24T19:50:25.1737312Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1737468Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T19:50:25.1737545Z 95 │ const latest = useRef(props); 2026-10-24T19:50:25.1737614Z 96 │ latest.current = props; 2026-10-24T19:50:25.1737722Z ·  ───┬──────┬─── 2026-10-24T19:50:25.1737902Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.1738019Z · ╰── This value is a ref 2026-10-24T19:50:25.1738097Z 97 │ const gesture = useMemo( 2026-10-24T19:50:25.1738153Z ╰──── 2026-10-24T19:50:25.1738630Z  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-24T19:50:25.1738927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1738929Z 2026-10-24T19:50:25.1739076Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1739237Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T19:50:25.1739306Z 103 │ .runOnJS(true) 2026-10-24T19:50:25.1739410Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T19:50:25.1739532Z ·  ───────────────┬────────────── 2026-10-24T19:50:25.1739737Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.1739873Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1739923Z ╰──── 2026-10-24T19:50:25.1740395Z  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-24T19:50:25.1740691Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1740694Z 2026-10-24T19:50:25.1740903Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1741097Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T19:50:25.1741197Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T19:50:25.1741331Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1741478Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T19:50:25.1741694Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.1741819Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1741873Z ╰──── 2026-10-24T19:50:25.1742349Z  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-24T19:50:25.1742648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1742651Z 2026-10-24T19:50:25.1742797Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1742955Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T19:50:25.1743089Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1743214Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1743364Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T19:50:25.1743576Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.1743704Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T19:50:25.1743756Z ╰──── 2026-10-24T19:50:25.1744249Z  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-24T19:50:25.1744539Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1744542Z 2026-10-24T19:50:25.1744740Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1744931Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T19:50:25.1745057Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1745182Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T19:50:25.1745322Z ·  ───────────────────────┬────────────────────── 2026-10-24T19:50:25.1745535Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.1745605Z 108 │ [props.disabled], 2026-10-24T19:50:25.1745660Z ╰──── 2026-10-24T19:50:25.1746138Z  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-24T19:50:25.1746434Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1746436Z 2026-10-24T19:50:25.1746580Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1746741Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T19:50:25.1746855Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T19:50:25.1746963Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T19:50:25.1747071Z ·  ───┬──────┬─── 2026-10-24T19:50:25.1747259Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.1747381Z · ╰── This value is a ref 2026-10-24T19:50:25.1747433Z 250 │ 2026-10-24T19:50:25.1747485Z ╰──── 2026-10-24T19:50:25.1747953Z  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-24T19:50:25.1748243Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1748246Z 2026-10-24T19:50:25.1748391Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1748550Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T19:50:25.1748679Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T19:50:25.1748798Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T19:50:25.1748926Z ·  ──────────────────┬────────────────── 2026-10-24T19:50:25.1749096Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.1749209Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T19:50:25.1749261Z ╰──── 2026-10-24T19:50:25.1749728Z  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-24T19:50:25.1750165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1750199Z 2026-10-24T19:50:25.1750372Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1750533Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T19:50:25.1750600Z 323 │ update(0); 2026-10-24T19:50:25.1750683Z 324 │ let last = performance.now(); 2026-10-24T19:50:25.1750780Z ·  ────────┬──────── 2026-10-24T19:50:25.1750924Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1750993Z 325 │ const tick = () => { 2026-10-24T19:50:25.1751045Z ╰──── 2026-10-24T19:50:25.1751353Z  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-24T19:50:25.1751654Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1751657Z 2026-10-24T19:50:25.1751849Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T19:50:25.1752010Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T19:50:25.1752071Z  98 │ () => 2026-10-24T19:50:25.1752136Z  99 │ Gesture.Pan() 2026-10-24T19:50:25.1752212Z ·  ─┬─ 2026-10-24T19:50:25.1752346Z · ╰── `Pan` may be a component 2026-10-24T19:50:25.1752426Z 100 │ .enabled(!props.disabled) 2026-10-24T19:50:25.1752477Z ╰──── 2026-10-24T19:50:25.1752762Z  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-24T19:50:25.1753210Z  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-24T19:50:25.1753213Z 2026-10-24T19:50:25.1753402Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T19:50:25.1753560Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T19:50:25.1753629Z 103 │ .runOnJS(true) 2026-10-24T19:50:25.1753731Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T19:50:25.1753823Z ·  ───┬── 2026-10-24T19:50:25.1754288Z · ╰── 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-24T19:50:25.1754423Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1754549Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T19:50:25.1754675Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T19:50:25.1754745Z 108 │ [props.disabled], 2026-10-24T19:50:25.1754827Z ·  ────────┬─────── 2026-10-24T19:50:25.1755017Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.1755073Z 109 │ ); 2026-10-24T19:50:25.1755181Z ╰──── 2026-10-24T19:50:25.1755421Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T19:50:25.1755734Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1755737Z 2026-10-24T19:50:25.1755925Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1756064Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T19:50:25.1756225Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T19:50:25.1756316Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T19:50:25.1756402Z ·  ┬ 2026-10-24T19:50:25.1756540Z · ╰── '_' is declared here 2026-10-24T19:50:25.1756644Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T19:50:25.1756696Z ╰──── 2026-10-24T19:50:25.1756800Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1756803Z 2026-10-24T19:50:25.1756989Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1757124Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T19:50:25.1757180Z 133 │ ); 2026-10-24T19:50:25.1757290Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T19:50:25.1757389Z ·  ┬ 2026-10-24T19:50:25.1757529Z · ╰── '_' is declared here 2026-10-24T19:50:25.1757604Z 135 │ Effect.succeed( 2026-10-24T19:50:25.1757659Z ╰──── 2026-10-24T19:50:25.1757761Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1757764Z 2026-10-24T19:50:25.1757945Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1758082Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T19:50:25.1758141Z 177 │ }); 2026-10-24T19:50:25.1758243Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T19:50:25.1758329Z ·  ┬ 2026-10-24T19:50:25.1758467Z · ╰── '_' is declared here 2026-10-24T19:50:25.1758567Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T19:50:25.1758619Z ╰──── 2026-10-24T19:50:25.1758722Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1758730Z 2026-10-24T19:50:25.1758912Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1759048Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T19:50:25.1759104Z 202 │ ); 2026-10-24T19:50:25.1759203Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T19:50:25.1759293Z ·  ┬ 2026-10-24T19:50:25.1759433Z · ╰── '_' is declared here 2026-10-24T19:50:25.1759512Z 204 │ options.removeWorktreeFails 2026-10-24T19:50:25.1759562Z ╰──── 2026-10-24T19:50:25.1759663Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1759666Z 2026-10-24T19:50:25.1759903Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1760075Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T19:50:25.1760132Z 207 │ ); 2026-10-24T19:50:25.1760234Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T19:50:25.1760331Z ·  ┬ 2026-10-24T19:50:25.1760472Z · ╰── '_' is declared here 2026-10-24T19:50:25.1760559Z 209 │ options.deleteLocalBranchFails 2026-10-24T19:50:25.1760609Z ╰──── 2026-10-24T19:50:25.1760708Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1760711Z 2026-10-24T19:50:25.1760890Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1761032Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T19:50:25.1761089Z 212 │ ); 2026-10-24T19:50:25.1761203Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T19:50:25.1761303Z ·  ┬ 2026-10-24T19:50:25.1761449Z · ╰── '_' is declared here 2026-10-24T19:50:25.1761533Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T19:50:25.1761588Z ╰──── 2026-10-24T19:50:25.1761688Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1761690Z 2026-10-24T19:50:25.1761871Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1762004Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T19:50:25.1762058Z 253 │ ); 2026-10-24T19:50:25.1762155Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T19:50:25.1762246Z ·  ┬ 2026-10-24T19:50:25.1762378Z · ╰── '_' is declared here 2026-10-24T19:50:25.1762448Z 255 │ Effect.succeed({ 2026-10-24T19:50:25.1762500Z ╰──── 2026-10-24T19:50:25.1762601Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1762603Z 2026-10-24T19:50:25.1762783Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1762919Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T19:50:25.1762974Z 263 │ ); 2026-10-24T19:50:25.1763128Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T19:50:25.1763221Z ·  ┬ 2026-10-24T19:50:25.1763363Z · ╰── '_' is declared here 2026-10-24T19:50:25.1763514Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T19:50:25.1763566Z ╰──── 2026-10-24T19:50:25.1763665Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1763667Z 2026-10-24T19:50:25.1763886Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.1764087Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T19:50:25.1764168Z 248 │ mountedRef.current = false; 2026-10-24T19:50:25.1764244Z 249 │ flow.setBranchQuery(""); 2026-10-24T19:50:25.1764313Z ·  ──┬─ 2026-10-24T19:50:25.1764500Z · ╰── Missing dependency `flow` 2026-10-24T19:50:25.1764592Z 250 │ }; 2026-10-24T19:50:25.1764666Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T19:50:25.1764756Z ·  ─────────┬───────── 2026-10-24T19:50:25.1764965Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T19:50:25.1765020Z 252 │ 2026-10-24T19:50:25.1765070Z ╰──── 2026-10-24T19:50:25.1765495Z  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-24T19:50:25.1765819Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1765825Z 2026-10-24T19:50:25.1765983Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T19:50:25.1766112Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T19:50:25.1766224Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T19:50:25.1766323Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T19:50:25.1766485Z ·  ───────────────────────────── 2026-10-24T19:50:25.1766613Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T19:50:25.1766664Z ╰──── 2026-10-24T19:50:25.1766826Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T19:50:25.1766828Z 2026-10-24T19:50:25.1767011Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T19:50:25.1767141Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T19:50:25.1767270Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T19:50:25.1767362Z 194 │ const codes = new Array(count); 2026-10-24T19:50:25.1767470Z ·  ──────────────────────── 2026-10-24T19:50:25.1767577Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T19:50:25.1767627Z ╰──── 2026-10-24T19:50:25.1768053Z  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-24T19:50:25.1768056Z 2026-10-24T19:50:25.1768386Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1768580Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T19:50:25.1768746Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T19:50:25.1768812Z 29 │ useEffect(() => { 2026-10-24T19:50:25.1768887Z ·  ────┬──── 2026-10-24T19:50:25.1769021Z · ╰── This is the containing effect 2026-10-24T19:50:25.1769146Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T19:50:25.1769249Z ·  ───┬─── 2026-10-24T19:50:25.1769447Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1769521Z 31 │ }, [key, live, snapshot]); 2026-10-24T19:50:25.1769582Z ╰──── 2026-10-24T19:50:25.1770191Z  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-24T19:50:25.1770517Z  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-24T19:50:25.1770520Z 2026-10-24T19:50:25.1770728Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T19:50:25.1770851Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T19:50:25.1770920Z 37 │ get isConnected() { 2026-10-24T19:50:25.1771015Z 38 │ let current: FakeElement | null = this; 2026-10-24T19:50:25.1771090Z ·  ─────── 2026-10-24T19:50:25.1771164Z 39 │ while (current?.parent) { 2026-10-24T19:50:25.1771217Z ╰──── 2026-10-24T19:50:25.1771494Z  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-24T19:50:25.1771497Z 2026-10-24T19:50:25.1771794Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1771923Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T19:50:25.1771978Z 217 │ 2026-10-24T19:50:25.1772127Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T19:50:25.1772219Z ·  ──────────┬────────── 2026-10-24T19:50:25.1772388Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T19:50:25.1772582Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T19:50:25.1772633Z ╰──── 2026-10-24T19:50:25.1772742Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1772745Z 2026-10-24T19:50:25.1773057Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1773183Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T19:50:25.1773234Z 220 │ 2026-10-24T19:50:25.1773370Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T19:50:25.1773476Z ·  ──────────────┬────────────── 2026-10-24T19:50:25.1773715Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T19:50:25.1773935Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T19:50:25.1773985Z ╰──── 2026-10-24T19:50:25.1774089Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1774092Z 2026-10-24T19:50:25.1774348Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T19:50:25.1774531Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T19:50:25.1774584Z 959 │ 2026-10-24T19:50:25.1774696Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T19:50:25.1774814Z ·  ──────────────────┬───────────────── 2026-10-24T19:50:25.1775024Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T19:50:25.1775130Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T19:50:25.1775183Z ╰──── 2026-10-24T19:50:25.1775287Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1775290Z 2026-10-24T19:50:25.1775533Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T19:50:25.1775655Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T19:50:25.1775758Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T19:50:25.1775899Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T19:50:25.1775987Z ·  ─────────────── 2026-10-24T19:50:25.1776043Z 518 │ ) 2026-10-24T19:50:25.1776104Z ╰──── 2026-10-24T19:50:25.1776265Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T19:50:25.1776268Z 2026-10-24T19:50:25.1776631Z ⚠ 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-24T19:50:25.1776768Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T19:50:25.1776906Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T19:50:25.1777058Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T19:50:25.1777177Z ·  ─────────────────── 2026-10-24T19:50:25.1777243Z 1787 │ cwd, 2026-10-24T19:50:25.1777295Z ╰──── 2026-10-24T19:50:25.1777305Z 2026-10-24T19:50:25.1777786Z ⚠ 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-24T19:50:25.1777924Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T19:50:25.1777982Z 93 │ ) { 2026-10-24T19:50:25.1778190Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T19:50:25.1778370Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T19:50:25.1778493Z 96 │ │ if (predicate(project)) return project; 2026-10-24T19:50:25.1778596Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1778779Z 98 │ ╰─▶ } 2026-10-24T19:50:25.1778969Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T19:50:25.1779020Z ╰──── 2026-10-24T19:50:25.1779023Z 2026-10-24T19:50:25.1779271Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T19:50:25.1779430Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T19:50:25.1779491Z 289 │ return ( 2026-10-24T19:50:25.1779627Z 290 │ 2026-10-24T19:50:25.1779752Z ·  ───────────── 2026-10-24T19:50:25.1779820Z 291 │ {props.children} 2026-10-24T19:50:25.1779873Z ╰──── 2026-10-24T19:50:25.1780109Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T19:50:25.1780254Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T19:50:25.1780257Z 2026-10-24T19:50:25.1780502Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T19:50:25.1780659Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T19:50:25.1780726Z 653 │ return ( 2026-10-24T19:50:25.1780850Z 654 │ 2026-10-24T19:50:25.1780970Z ·  ───────────── 2026-10-24T19:50:25.1781038Z 655 │ {props.children} 2026-10-24T19:50:25.1781094Z ╰──── 2026-10-24T19:50:25.1781326Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T19:50:25.1781472Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T19:50:25.1781475Z 2026-10-24T19:50:25.1781717Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T19:50:25.1781882Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T19:50:25.1781949Z 1461 │ return ( 2026-10-24T19:50:25.1782115Z 1462 │ 2026-10-24T19:50:25.1782251Z ·  ──────────────────── 2026-10-24T19:50:25.1782355Z 1463 │ { 2026-10-24T19:50:25.1786328Z ·  ────┬──── 2026-10-24T19:50:25.1786467Z · ╰── This is the containing effect 2026-10-24T19:50:25.1786558Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T19:50:25.1786650Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1786830Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1786940Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T19:50:25.1786996Z ╰──── 2026-10-24T19:50:25.1787606Z  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-24T19:50:25.1788002Z  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-24T19:50:25.1788039Z 2026-10-24T19:50:25.1788307Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1788465Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T19:50:25.1788626Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T19:50:25.1788692Z 964 │ useEffect(() => { 2026-10-24T19:50:25.1788771Z ·  ────┬──── 2026-10-24T19:50:25.1788908Z · ╰── This is the containing effect 2026-10-24T19:50:25.1789081Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T19:50:25.1789199Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T19:50:25.1789305Z ·  ─────────────┬──────────── 2026-10-24T19:50:25.1789489Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1789551Z 967 │ } 2026-10-24T19:50:25.1789604Z ╰──── 2026-10-24T19:50:25.1790217Z  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-24T19:50:25.1790558Z  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-24T19:50:25.1790562Z 2026-10-24T19:50:25.1790830Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1790992Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T19:50:25.1791048Z 1220 │ 2026-10-24T19:50:25.1791120Z 1221 │ useEffect(() => { 2026-10-24T19:50:25.1791198Z ·  ────┬──── 2026-10-24T19:50:25.1791336Z · ╰── This is the containing effect 2026-10-24T19:50:25.1791414Z 1222 │ setAnchorMessageId(null); 2026-10-24T19:50:25.1791504Z ·  ─────────┬──────── 2026-10-24T19:50:25.1791683Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1791776Z 1223 │ setSubmittedMessageId(null); 2026-10-24T19:50:25.1791835Z ╰──── 2026-10-24T19:50:25.1792443Z  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-24T19:50:25.1792768Z  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-24T19:50:25.1792771Z 2026-10-24T19:50:25.1792979Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1793136Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T19:50:25.1793284Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T19:50:25.1793426Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T19:50:25.1793574Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T19:50:25.1793793Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T19:50:25.1793974Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T19:50:25.1794107Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T19:50:25.1794162Z ╰──── 2026-10-24T19:50:25.1794464Z  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-24T19:50:25.1794784Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1794795Z 2026-10-24T19:50:25.1795000Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1795160Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T19:50:25.1795250Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T19:50:25.1795418Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T19:50:25.1795515Z ·  ────────────┬─────────── 2026-10-24T19:50:25.1795701Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T19:50:25.1795809Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T19:50:25.1795865Z ╰──── 2026-10-24T19:50:25.1796169Z  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-24T19:50:25.1796492Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1796495Z 2026-10-24T19:50:25.1796707Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1796870Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T19:50:25.1796944Z 1227 │ freeze.set(false); 2026-10-24T19:50:25.1797027Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T19:50:25.1797125Z ·  ────────┬──────── 2026-10-24T19:50:25.1797299Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T19:50:25.1797359Z 1229 │ 2026-10-24T19:50:25.1797412Z ╰──── 2026-10-24T19:50:25.1797710Z  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-24T19:50:25.1798026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1798029Z 2026-10-24T19:50:25.1798191Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1798343Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T19:50:25.1798459Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T19:50:25.1798626Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T19:50:25.1798756Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1798922Z · ╰── `floatingControlCoverage` originates here 2026-10-24T19:50:25.1799056Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T19:50:25.1799116Z 1056 │ ); 2026-10-24T19:50:25.1799186Z 1057 │ useEffect(() => { 2026-10-24T19:50:25.1799292Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T19:50:25.1799387Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1799558Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T19:50:25.1799690Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T19:50:25.1799743Z ╰──── 2026-10-24T19:50:25.1800024Z  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-24T19:50:25.1800338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1800340Z 2026-10-24T19:50:25.1800501Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1800658Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T19:50:25.1800849Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T19:50:25.1800982Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T19:50:25.1801104Z ·  ────────────────┬──────────────── 2026-10-24T19:50:25.1801300Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T19:50:25.1801433Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T19:50:25.1801492Z 1069 │ ); 2026-10-24T19:50:25.1801565Z 1070 │ useAnimatedReaction( 2026-10-24T19:50:25.1801629Z 1071 │ () => 2026-10-24T19:50:25.1801723Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T19:50:25.1801816Z 1073 │ floatingControlCoverage.value + 2026-10-24T19:50:25.1802020Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T19:50:25.1802088Z 1075 │ (value) => { 2026-10-24T19:50:25.1802205Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T19:50:25.1802320Z ·  ────────────────┬──────────────── 2026-10-24T19:50:25.1802526Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T19:50:25.1802589Z 1077 │ }, 2026-10-24T19:50:25.1802640Z ╰──── 2026-10-24T19:50:25.1802914Z  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-24T19:50:25.1803232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1803235Z 2026-10-24T19:50:25.1803529Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T19:50:25.1803702Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T19:50:25.1803827Z 472 │ onFilters, 2026-10-24T19:50:25.1803980Z 473 │ authorOptions = [], 2026-10-24T19:50:25.1804060Z ·  ── 2026-10-24T19:50:25.1804128Z 474 │ labelOptions = [], 2026-10-24T19:50:25.1804185Z ╰──── 2026-10-24T19:50:25.1804508Z  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-24T19:50:25.1804510Z 2026-10-24T19:50:25.1804801Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T19:50:25.1804974Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T19:50:25.1805040Z 473 │ authorOptions = [], 2026-10-24T19:50:25.1805109Z 474 │ labelOptions = [], 2026-10-24T19:50:25.1805195Z ·  ── 2026-10-24T19:50:25.1805264Z 475 │ optionScope, 2026-10-24T19:50:25.1805316Z ╰──── 2026-10-24T19:50:25.1805639Z  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-24T19:50:25.1805641Z 2026-10-24T19:50:25.1805875Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T19:50:25.1806027Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T19:50:25.1806086Z 237 │ ): string { 2026-10-24T19:50:25.1806249Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T19:50:25.1806367Z ·  ────── 2026-10-24T19:50:25.1806563Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T19:50:25.1806617Z ╰──── 2026-10-24T19:50:25.1806792Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T19:50:25.1806794Z 2026-10-24T19:50:25.1807014Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T19:50:25.1807142Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T19:50:25.1807245Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T19:50:25.1807338Z 259 │ for (const edit of edits.reverse()) 2026-10-24T19:50:25.1807437Z ·  ─────── 2026-10-24T19:50:25.1807606Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T19:50:25.1807658Z ╰──── 2026-10-24T19:50:25.1807947Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T19:50:25.1807953Z 2026-10-24T19:50:25.1808176Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T19:50:25.1808303Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T19:50:25.1808388Z 289 │ visit(parser.parse(markdown)); 2026-10-24T19:50:25.1808471Z 290 │ for (const edit of edits.reverse()) 2026-10-24T19:50:25.1808568Z ·  ─────── 2026-10-24T19:50:25.1808736Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T19:50:25.1808793Z ╰──── 2026-10-24T19:50:25.1809137Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T19:50:25.1809182Z 2026-10-24T19:50:25.1809399Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T19:50:25.1809528Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T19:50:25.1809609Z 343 │ visit(parser.parse(markdown)); 2026-10-24T19:50:25.1809714Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T19:50:25.1809823Z ·  ─────── 2026-10-24T19:50:25.1809993Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T19:50:25.1810048Z ╰──── 2026-10-24T19:50:25.1810315Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T19:50:25.1810321Z 2026-10-24T19:50:25.1810586Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1810750Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T19:50:25.1810817Z 434 │ : null; 2026-10-24T19:50:25.1810886Z 435 │ useEffect(() => { 2026-10-24T19:50:25.1810958Z ·  ────┬──── 2026-10-24T19:50:25.1811094Z · ╰── This is the containing effect 2026-10-24T19:50:25.1811156Z 436 │ if ( 2026-10-24T19:50:25.1811234Z 437 │ props.active === false || 2026-10-24T19:50:25.1811313Z 438 │ activeDraftKey !== null || 2026-10-24T19:50:25.1811399Z 439 │ editingPendingTask !== null || 2026-10-24T19:50:25.1811484Z 440 │ selectedProject === null 2026-10-24T19:50:25.1811544Z 441 │ ) { 2026-10-24T19:50:25.1811609Z 442 │ return; 2026-10-24T19:50:25.1811664Z 443 │ } 2026-10-24T19:50:25.1811737Z 444 │ setActiveDraftKey( 2026-10-24T19:50:25.1811819Z ·  ────────┬──────── 2026-10-24T19:50:25.1811998Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1812073Z 445 │ createNewTaskDraft({ 2026-10-24T19:50:25.1812129Z ╰──── 2026-10-24T19:50:25.1812746Z  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-24T19:50:25.1813135Z  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-24T19:50:25.1813172Z 2026-10-24T19:50:25.1813422Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T19:50:25.1813593Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T19:50:25.1813706Z 1243 │ 2026-10-24T19:50:25.1813935Z 1244 │ {props.children} 2026-10-24T19:50:25.1814051Z ·  ───────────── 2026-10-24T19:50:25.1814130Z 1245 │ 2026-10-24T19:50:25.1814187Z ╰──── 2026-10-24T19:50:25.1814421Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T19:50:25.1814569Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T19:50:25.1814572Z 2026-10-24T19:50:25.1814724Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1814889Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T19:50:25.1814943Z 276 │ 2026-10-24T19:50:25.1815134Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T19:50:25.1815232Z 278 │ │ ...nativeProps, 2026-10-24T19:50:25.1815385Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T19:50:25.1815483Z 280 │ │ ref: nativeRef, 2026-10-24T19:50:25.1815620Z 281 │ ├─▶ }); 2026-10-24T19:50:25.1815867Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.1815926Z 282 │ } 2026-10-24T19:50:25.1815980Z ╰──── 2026-10-24T19:50:25.1816460Z  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-24T19:50:25.1816758Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1816760Z 2026-10-24T19:50:25.1817226Z ⚠ 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-24T19:50:25.1817363Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T19:50:25.1817538Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T19:50:25.1817726Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T19:50:25.1817844Z ·  ─────────────────── 2026-10-24T19:50:25.1817960Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T19:50:25.1818017Z ╰──── 2026-10-24T19:50:25.1818019Z 2026-10-24T19:50:25.1818530Z ⚠ 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-24T19:50:25.1818690Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T19:50:25.1818881Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T19:50:25.1818992Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T19:50:25.1819107Z ·  ─────────────────── 2026-10-24T19:50:25.1819229Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T19:50:25.1819285Z ╰──── 2026-10-24T19:50:25.1819288Z 2026-10-24T19:50:25.1819462Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.1819612Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T19:50:25.1819669Z 185 │ 2026-10-24T19:50:25.1819773Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T19:50:25.1819848Z ·  ── 2026-10-24T19:50:25.1819900Z 187 │ } 2026-10-24T19:50:25.1819953Z ╰──── 2026-10-24T19:50:25.1820189Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.1820191Z 2026-10-24T19:50:25.1820362Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.1820506Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T19:50:25.1820560Z 188 │ 2026-10-24T19:50:25.1820628Z 189 │ for (const {} of [ 2026-10-24T19:50:25.1820701Z ·  ── 2026-10-24T19:50:25.1820799Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T19:50:25.1820858Z ╰──── 2026-10-24T19:50:25.1821091Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.1821093Z 2026-10-24T19:50:25.1821264Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.1821403Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T19:50:25.1821456Z 310 │ 2026-10-24T19:50:25.1821586Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T19:50:25.1821659Z ·  ── 2026-10-24T19:50:25.1821714Z 312 │ } 2026-10-24T19:50:25.1821765Z ╰──── 2026-10-24T19:50:25.1822003Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.1822010Z 2026-10-24T19:50:25.1822178Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.1822317Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T19:50:25.1822369Z 313 │ 2026-10-24T19:50:25.1822435Z 314 │ for (const {} of [ 2026-10-24T19:50:25.1822507Z ·  ── 2026-10-24T19:50:25.1822564Z 315 │ { 2026-10-24T19:50:25.1822614Z ╰──── 2026-10-24T19:50:25.1822843Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.1822846Z 2026-10-24T19:50:25.1823111Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1823295Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T19:50:25.1823473Z 727 │ 2026-10-24T19:50:25.1823557Z 728 │ const layer = layerWithOptions(); 2026-10-24T19:50:25.1823630Z ·  ──┬── 2026-10-24T19:50:25.1823760Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.1823811Z ╰──── 2026-10-24T19:50:25.1823939Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1823942Z 2026-10-24T19:50:25.1824114Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1824267Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T19:50:25.1824382Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T19:50:25.1824555Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T19:50:25.1824692Z ·  ─────┬──── 2026-10-24T19:50:25.1824871Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1863206Z 179 │ } 2026-10-24T19:50:25.1863328Z ╰──── 2026-10-24T19:50:25.1863648Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T19:50:25.1863984Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1863991Z 2026-10-24T19:50:25.1864250Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T19:50:25.1864434Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T19:50:25.1864495Z 1397 │ 2026-10-24T19:50:25.1864586Z 1398 │ function assertUserMessagesExclude( 2026-10-24T19:50:25.1864694Z ·  ────────────┬──────────── 2026-10-24T19:50:25.1864874Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T19:50:25.1864987Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T19:50:25.1865040Z ╰──── 2026-10-24T19:50:25.1865144Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1865147Z 2026-10-24T19:50:25.1865644Z ⚠ 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-24T19:50:25.1865786Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T19:50:25.1865852Z 130 │ ) { 2026-10-24T19:50:25.1866073Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T19:50:25.1866200Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T19:50:25.1866292Z 133 │ │ return; 2026-10-24T19:50:25.1866374Z 134 │ │ } 2026-10-24T19:50:25.1866483Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1866619Z 136 │ ╰─▶ } 2026-10-24T19:50:25.1866787Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T19:50:25.1866977Z ╰──── 2026-10-24T19:50:25.1867028Z 2026-10-24T19:50:25.1867508Z ⚠ 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-24T19:50:25.1867645Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T19:50:25.1867811Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T19:50:25.1868072Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T19:50:25.1868180Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1868318Z 254 │ ╰─▶ } 2026-10-24T19:50:25.1868447Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T19:50:25.1868500Z ╰──── 2026-10-24T19:50:25.1868503Z 2026-10-24T19:50:25.1868978Z ⚠ 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-24T19:50:25.1869111Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T19:50:25.1869165Z 257 │ 2026-10-24T19:50:25.1869425Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T19:50:25.1869531Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1869666Z 260 │ ╰─▶ } 2026-10-24T19:50:25.1869775Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T19:50:25.1869827Z ╰──── 2026-10-24T19:50:25.1869830Z 2026-10-24T19:50:25.1870302Z ⚠ 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-24T19:50:25.1870434Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T19:50:25.1870493Z 321 │ ); 2026-10-24T19:50:25.1870750Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T19:50:25.1870858Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1870990Z 324 │ ╰─▶ } 2026-10-24T19:50:25.1871045Z 325 │ 2026-10-24T19:50:25.1871096Z ╰──── 2026-10-24T19:50:25.1871098Z 2026-10-24T19:50:25.1871566Z ⚠ 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-24T19:50:25.1871697Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T19:50:25.1871863Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T19:50:25.1872169Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T19:50:25.1872308Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1872438Z 332 │ ╰─▶ } 2026-10-24T19:50:25.1872542Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T19:50:25.1872592Z ╰──── 2026-10-24T19:50:25.1872596Z 2026-10-24T19:50:25.1873065Z ⚠ 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-24T19:50:25.1873200Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T19:50:25.1873256Z 225 │ ) { 2026-10-24T19:50:25.1873465Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T19:50:25.1873579Z 227 │ │ const socket = sockets[index]; 2026-10-24T19:50:25.1873668Z 228 │ │ if (socket) { 2026-10-24T19:50:25.1873762Z 229 │ │ return socket; 2026-10-24T19:50:25.1873836Z 230 │ │ } 2026-10-24T19:50:25.1873957Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1874084Z 232 │ ╰─▶ } 2026-10-24T19:50:25.1874261Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T19:50:25.1874312Z ╰──── 2026-10-24T19:50:25.1874314Z 2026-10-24T19:50:25.1874788Z ⚠ 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-24T19:50:25.1874927Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T19:50:25.1874981Z 239 │ ) { 2026-10-24T19:50:25.1875183Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T19:50:25.1875398Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T19:50:25.1875487Z 242 │ │ if (request) { 2026-10-24T19:50:25.1875581Z 243 │ │ return request; 2026-10-24T19:50:25.1875653Z 244 │ │ } 2026-10-24T19:50:25.1875754Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.1875883Z 246 │ ╰─▶ } 2026-10-24T19:50:25.1876056Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T19:50:25.1876107Z ╰──── 2026-10-24T19:50:25.1876110Z 2026-10-24T19:50:25.1876373Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1876545Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T19:50:25.1876598Z 118 │ 2026-10-24T19:50:25.1876665Z 119 │ useEffect(() => { 2026-10-24T19:50:25.1876738Z ·  ────┬──── 2026-10-24T19:50:25.1876872Z · ╰── This is the containing effect 2026-10-24T19:50:25.1876954Z 120 │ if (orientationSettled) return; 2026-10-24T19:50:25.1877122Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T19:50:25.1877242Z 122 │ if (orientation === null) { 2026-10-24T19:50:25.1877323Z 123 │ setOrientationSettled(true); 2026-10-24T19:50:25.1877414Z ·  ──────────┬────────── 2026-10-24T19:50:25.1877594Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1877655Z 124 │ return; 2026-10-24T19:50:25.1877705Z ╰──── 2026-10-24T19:50:25.1878321Z  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-24T19:50:25.1878660Z  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-24T19:50:25.1878669Z 2026-10-24T19:50:25.1878932Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1879105Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T19:50:25.1879158Z 292 │ 2026-10-24T19:50:25.1879222Z 293 │ useEffect(() => { 2026-10-24T19:50:25.1879293Z ·  ────┬──── 2026-10-24T19:50:25.1879425Z · ╰── This is the containing effect 2026-10-24T19:50:25.1879482Z 294 │ if ( 2026-10-24T19:50:25.1879549Z 295 │ scene === null || 2026-10-24T19:50:25.1879625Z 296 │ requestedScene === null || 2026-10-24T19:50:25.1879707Z 297 │ scene !== requestedScene || 2026-10-24T19:50:25.1879774Z 298 │ !hasFixture || 2026-10-24T19:50:25.1879848Z 299 │ !orientationSettled || 2026-10-24T19:50:25.1879916Z 300 │ !themeApplied || 2026-10-24T19:50:25.1880032Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T19:50:25.1880166Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T19:50:25.1880224Z 303 │ ) { 2026-10-24T19:50:25.1880294Z 304 │ setReadyScene(null); 2026-10-24T19:50:25.1880371Z ·  ──────┬────── 2026-10-24T19:50:25.1880545Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1880605Z 305 │ return; 2026-10-24T19:50:25.1880657Z ╰──── 2026-10-24T19:50:25.1881337Z  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-24T19:50:25.1881703Z  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-24T19:50:25.1881706Z 2026-10-24T19:50:25.1881983Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1882160Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T19:50:25.1882230Z 127 │ let cancelled = false; 2026-10-24T19:50:25.1882319Z 128 │ let lastOutcome: string | null = null; 2026-10-24T19:50:25.1882403Z ·  ─────┬───── 2026-10-24T19:50:25.1882545Z · ╰── 'lastOutcome' is declared here 2026-10-24T19:50:25.1882726Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T19:50:25.1882776Z ╰──── 2026-10-24T19:50:25.1882883Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1882886Z 2026-10-24T19:50:25.1883147Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1883318Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T19:50:25.1883371Z 76 │ 2026-10-24T19:50:25.1883434Z 77 │ useEffect(() => { 2026-10-24T19:50:25.1883506Z ·  ────┬──── 2026-10-24T19:50:25.1883642Z · ╰── This is the containing effect 2026-10-24T19:50:25.1883771Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T19:50:25.1883839Z 79 │ setHostInput(host); 2026-10-24T19:50:25.1883937Z ·  ──────┬───── 2026-10-24T19:50:25.1884107Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1884173Z 80 │ setCodeInput(code); 2026-10-24T19:50:25.1884225Z ╰──── 2026-10-24T19:50:25.1884832Z  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-24T19:50:25.1885169Z  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-24T19:50:25.1885174Z 2026-10-24T19:50:25.1885435Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1885608Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T19:50:25.1885659Z 82 │ 2026-10-24T19:50:25.1885722Z 83 │ useEffect(() => { 2026-10-24T19:50:25.1885791Z ·  ────┬──── 2026-10-24T19:50:25.1885918Z · ╰── This is the containing effect 2026-10-24T19:50:25.1886006Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T19:50:25.1886066Z 85 │ return; 2026-10-24T19:50:25.1886120Z 86 │ } 2026-10-24T19:50:25.1886171Z 87 │ 2026-10-24T19:50:25.1886338Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T19:50:25.1886494Z 89 │ setHostInput(host); 2026-10-24T19:50:25.1886569Z ·  ──────┬───── 2026-10-24T19:50:25.1886736Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1886802Z 90 │ setCodeInput(code); 2026-10-24T19:50:25.1886852Z ╰──── 2026-10-24T19:50:25.1887467Z  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-24T19:50:25.1887797Z  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-24T19:50:25.1887803Z 2026-10-24T19:50:25.1888061Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1888234Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T19:50:25.1888286Z 92 │ 2026-10-24T19:50:25.1888348Z 93 │ useEffect(() => { 2026-10-24T19:50:25.1888416Z ·  ────┬──── 2026-10-24T19:50:25.1888544Z · ╰── This is the containing effect 2026-10-24T19:50:25.1888626Z 94 │ if (pairingConnectionError) { 2026-10-24T19:50:25.1888699Z 95 │ setIsSubmitting(false); 2026-10-24T19:50:25.1888779Z ·  ───────┬─────── 2026-10-24T19:50:25.1888957Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1889016Z 96 │ } 2026-10-24T19:50:25.1889067Z ╰──── 2026-10-24T19:50:25.1889669Z  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-24T19:50:25.1889998Z  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-24T19:50:25.1890000Z 2026-10-24T19:50:25.1890258Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1890433Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T19:50:25.1890487Z 638 │ 2026-10-24T19:50:25.1890550Z 639 │ useEffect(() => { 2026-10-24T19:50:25.1890620Z ·  ────┬──── 2026-10-24T19:50:25.1890751Z · ╰── This is the containing effect 2026-10-24T19:50:25.1890863Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T19:50:25.1890923Z 641 │ return; 2026-10-24T19:50:25.1890979Z 642 │ } 2026-10-24T19:50:25.1891055Z 643 │ setPendingLaunchEntry({ 2026-10-24T19:50:25.1891143Z ·  ──────────┬────────── 2026-10-24T19:50:25.1891318Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1891389Z 644 │ key: launchTargetKey, 2026-10-24T19:50:25.1891440Z ╰──── 2026-10-24T19:50:25.1892217Z  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-24T19:50:25.1892587Z  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-24T19:50:25.1892589Z 2026-10-24T19:50:25.1892849Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1893020Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T19:50:25.1893073Z 648 │ 2026-10-24T19:50:25.1893140Z 649 │ useEffect(() => { 2026-10-24T19:50:25.1893215Z ·  ────┬──── 2026-10-24T19:50:25.1893343Z · ╰── This is the containing effect 2026-10-24T19:50:25.1893459Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T19:50:25.1893517Z 651 │ return; 2026-10-24T19:50:25.1893571Z 652 │ } 2026-10-24T19:50:25.1893650Z 653 │ setInitialAttachGridEntry({ 2026-10-24T19:50:25.1893744Z ·  ────────────┬──────────── 2026-10-24T19:50:25.1893941Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1894014Z 654 │ key: launchTargetKey, 2026-10-24T19:50:25.1894065Z ╰──── 2026-10-24T19:50:25.1894687Z  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-24T19:50:25.1895016Z  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-24T19:50:25.1895019Z 2026-10-24T19:50:25.1895275Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1895443Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T19:50:25.1895496Z 743 │ 2026-10-24T19:50:25.1895560Z 744 │ useEffect(() => { 2026-10-24T19:50:25.1895628Z ·  ────┬──── 2026-10-24T19:50:25.1895760Z · ╰── This is the containing effect 2026-10-24T19:50:25.1895867Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T19:50:25.1895935Z 746 │ setLastGridSize({ 2026-10-24T19:50:25.1896016Z ·  ───────┬─────── 2026-10-24T19:50:25.1896187Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1896270Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T19:50:25.1896321Z ╰──── 2026-10-24T19:50:25.1896925Z  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-24T19:50:25.1897308Z  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-24T19:50:25.1897340Z 2026-10-24T19:50:25.1897548Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1897721Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T19:50:25.1897777Z 537 │ }); 2026-10-24T19:50:25.1897901Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T19:50:25.1898015Z ·  ───────────┬────────── 2026-10-24T19:50:25.1898265Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T19:50:25.1898436Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T19:50:25.1898493Z ╰──── 2026-10-24T19:50:25.1898795Z  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-24T19:50:25.1899109Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1899112Z 2026-10-24T19:50:25.1899314Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1899482Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T19:50:25.1899577Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T19:50:25.1899643Z 709 │ }, [terminalKey]); 2026-10-24T19:50:25.1899724Z ·  ─────┬───── 2026-10-24T19:50:25.1899871Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T19:50:25.1899922Z 710 │ 2026-10-24T19:50:25.1899973Z ╰──── 2026-10-24T19:50:25.1900269Z  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-24T19:50:25.1900581Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1900584Z 2026-10-24T19:50:25.1900785Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1900954Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T19:50:25.1901013Z 799 │ }; 2026-10-24T19:50:25.1901197Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T19:50:25.1901381Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T19:50:25.1901618Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T19:50:25.1901833Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T19:50:25.1901885Z 801 │ 2026-10-24T19:50:25.1901936Z ╰──── 2026-10-24T19:50:25.1902293Z  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-24T19:50:25.1902634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1902637Z 2026-10-24T19:50:25.1902782Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.1902953Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T19:50:25.1903008Z 792 │ } 2026-10-24T19:50:25.1903113Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T19:50:25.1903225Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1903392Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.1903444Z 794 │ 2026-10-24T19:50:25.1903494Z ╰──── 2026-10-24T19:50:25.1904002Z  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-24T19:50:25.1904304Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.1904306Z 2026-10-24T19:50:25.1904463Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.1904621Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T19:50:25.1904717Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T19:50:25.1904808Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T19:50:25.1904893Z ·  ──────┬────── 2026-10-24T19:50:25.1905034Z · ╰── `pulseProgress` originates here 2026-10-24T19:50:25.1905086Z 55 │ 2026-10-24T19:50:25.1905149Z 56 │ useEffect(() => { 2026-10-24T19:50:25.1905213Z 57 │ if (pulse) { 2026-10-24T19:50:25.1905299Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T19:50:25.1905379Z ·  ──────┬────── 2026-10-24T19:50:25.1905522Z · ╰── `pulseProgress` cannot be modified 2026-10-24T19:50:25.1905590Z 59 │ withTiming(1, { 2026-10-24T19:50:25.1905640Z ╰──── 2026-10-24T19:50:25.1905909Z  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-24T19:50:25.1906271Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1906303Z 2026-10-24T19:50:25.1906500Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1906659Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T19:50:25.1906722Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T19:50:25.1907825Z 113 │ useEffect(() => { 2026-10-24T19:50:25.1907896Z ·  ────┬──── 2026-10-24T19:50:25.1908025Z · ╰── This is the containing effect 2026-10-24T19:50:25.1908190Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T19:50:25.1908252Z 115 │ return; 2026-10-24T19:50:25.1908307Z 116 │ } 2026-10-24T19:50:25.1908426Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T19:50:25.1908498Z ·  ────┬─── 2026-10-24T19:50:25.1908673Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1908799Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T19:50:25.1908850Z ╰──── 2026-10-24T19:50:25.1909460Z  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-24T19:50:25.1909787Z  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-24T19:50:25.1909790Z 2026-10-24T19:50:25.1910003Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T19:50:25.1910132Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T19:50:25.1910235Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T19:50:25.1910399Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T19:50:25.1910534Z 159 │ │ constructor(data: Record) { 2026-10-24T19:50:25.1910651Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T19:50:25.1910726Z 161 │ │ } 2026-10-24T19:50:25.1910852Z 162 │ ╰─▶ }, 2026-10-24T19:50:25.1910916Z 163 │ clipboard: { 2026-10-24T19:50:25.1910969Z ╰──── 2026-10-24T19:50:25.1911196Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T19:50:25.1911228Z 2026-10-24T19:50:25.1911413Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1911589Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T19:50:25.1911672Z 554 │ assert.deepStrictEqual( 2026-10-24T19:50:25.1911837Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T19:50:25.1911959Z ·  ┬ 2026-10-24T19:50:25.1912127Z · ╰── '_' is declared here 2026-10-24T19:50:25.1912188Z 556 │ [ 2026-10-24T19:50:25.1912241Z ╰──── 2026-10-24T19:50:25.1912349Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1912355Z 2026-10-24T19:50:25.1912542Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.1912720Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T19:50:25.1912803Z 1154 │ assert.deepStrictEqual( 2026-10-24T19:50:25.1912969Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T19:50:25.1913090Z ·  ┬ 2026-10-24T19:50:25.1913259Z · ╰── '_' is declared here 2026-10-24T19:50:25.1913321Z 1156 │ [ 2026-10-24T19:50:25.1913375Z ╰──── 2026-10-24T19:50:25.1913479Z  help: Consider removing this parameter. 2026-10-24T19:50:25.1913484Z 2026-10-24T19:50:25.1913670Z ⚠ react(static-components): Cannot create components during render 2026-10-24T19:50:25.1913835Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T19:50:25.1913949Z 196 │ const { onInput, onResize } = props; 2026-10-24T19:50:25.1914096Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T19:50:25.1914229Z ·  ────────────────┬─────────────── 2026-10-24T19:50:25.1914422Z · ╰── The component is created during render here 2026-10-24T19:50:25.1914549Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T19:50:25.1914600Z 199 │ 2026-10-24T19:50:25.1914672Z 200 │ useEffect(() => { 2026-10-24T19:50:25.1914763Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T19:50:25.1914850Z 202 │ terminalKey: props.terminalKey, 2026-10-24T19:50:25.1914925Z 203 │ native: hasNativeSurface, 2026-10-24T19:50:25.1915061Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T19:50:25.1915145Z 205 │ bufferLen: props.buffer.length, 2026-10-24T19:50:25.1915222Z 206 │ isRunning: props.isRunning, 2026-10-24T19:50:25.1915276Z 207 │ }); 2026-10-24T19:50:25.1915435Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T19:50:25.1915523Z 209 │ const handleNativeInput = useCallback( 2026-10-24T19:50:25.1915639Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T19:50:25.1915736Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T19:50:25.1915849Z 212 │ return; 2026-10-24T19:50:25.1915934Z 213 │ } 2026-10-24T19:50:25.1916024Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T19:50:25.1916174Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T19:50:25.1916232Z 216 │ }); 2026-10-24T19:50:25.1916317Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T19:50:25.1916372Z 218 │ }, 2026-10-24T19:50:25.1916469Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T19:50:25.1916523Z 220 │ ); 2026-10-24T19:50:25.1916611Z 221 │ const handleNativeResize = useCallback( 2026-10-24T19:50:25.1916725Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T19:50:25.1916790Z 223 │ onResize({ 2026-10-24T19:50:25.1916873Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T19:50:25.1916962Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T19:50:25.1917024Z 226 │ }); 2026-10-24T19:50:25.1917080Z 227 │ }, 2026-10-24T19:50:25.1917141Z 228 │ [onResize], 2026-10-24T19:50:25.1917195Z 229 │ ); 2026-10-24T19:50:25.1917245Z 230 │ 2026-10-24T19:50:25.1917328Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T19:50:25.1917387Z 232 │ return ( 2026-10-24T19:50:25.1917463Z 233 │ 2026-10-24T19:50:25.1917543Z 234 │ (null); 2026-10-24T19:50:25.1921494Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T19:50:25.1921625Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T19:50:25.1921718Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T19:50:25.1921794Z 498 │ setIsPullRefreshing(true); 2026-10-24T19:50:25.1921882Z 499 │ await refreshSelectedSection(); 2026-10-24T19:50:25.1921964Z 500 │ setIsPullRefreshing(false); 2026-10-24T19:50:25.1922020Z 501 │ }; 2026-10-24T19:50:25.1922164Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T19:50:25.1922306Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T19:50:25.1922413Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T19:50:25.1922498Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T19:50:25.1922588Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T19:50:25.1922656Z 507 │ files: reviewFiles, 2026-10-24T19:50:25.1922755Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T19:50:25.1922888Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T19:50:25.1922952Z 510 │ : undefined, 2026-10-24T19:50:25.1923049Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T19:50:25.1923176Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T19:50:25.1923238Z 513 │ : undefined, 2026-10-24T19:50:25.1923292Z 514 │ }); 2026-10-24T19:50:25.1923483Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T19:50:25.1923615Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T19:50:25.1923678Z 517 │ environmentId, 2026-10-24T19:50:25.1923742Z 518 │ threadId, 2026-10-24T19:50:25.1923806Z 519 │ selectedSection, 2026-10-24T19:50:25.1923878Z 520 │ nativeReviewDiffData, 2026-10-24T19:50:25.1924089Z 521 │ }); 2026-10-24T19:50:25.1924196Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T19:50:25.1924280Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T19:50:25.1924374Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T19:50:25.1924452Z 525 │ diff: selectedSection?.diff, 2026-10-24T19:50:25.1924527Z 526 │ data: nativeReviewDiffData, 2026-10-24T19:50:25.1924596Z 527 │ collapsedFileIds, 2026-10-24T19:50:25.1924657Z 528 │ viewedFileIds, 2026-10-24T19:50:25.1924766Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T19:50:25.1924862Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T19:50:25.1924917Z 531 │ }); 2026-10-24T19:50:25.1924991Z 532 │ const showcaseReviewKey = 2026-10-24T19:50:25.1925125Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T19:50:25.1925332Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T19:50:25.1925393Z 535 │ : null; 2026-10-24T19:50:25.1925620Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T19:50:25.1925735Z 537 │ nativeBridge.onDebug(event); 2026-10-24T19:50:25.1925792Z 538 │ if ( 2026-10-24T19:50:25.1925871Z 539 │ showcaseReviewKey === null || 2026-10-24T19:50:25.1925993Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T19:50:25.1926102Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T19:50:25.1926157Z 542 │ ) { 2026-10-24T19:50:25.1926219Z 543 │ return; 2026-10-24T19:50:25.1926273Z 544 │ } 2026-10-24T19:50:25.1926385Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T19:50:25.1926597Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T19:50:25.1926652Z 547 │ }; 2026-10-24T19:50:25.1926704Z 548 │ 2026-10-24T19:50:25.1926829Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T19:50:25.1926911Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T19:50:25.1927002Z 551 │ commentSelection.clearSelection(); 2026-10-24T19:50:25.1927121Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T19:50:25.1927201Z 553 │ toggleExpandedFile(fileId); 2026-10-24T19:50:25.1927253Z 554 │ } 2026-10-24T19:50:25.1927367Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T19:50:25.1927439Z 556 │ if (!nativeView) return; 2026-10-24T19:50:25.1927531Z 557 │ const result = await settlePromise(() => 2026-10-24T19:50:25.1927707Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T19:50:25.1927761Z 559 │ ); 2026-10-24T19:50:25.1927850Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T19:50:25.1928037Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T19:50:25.1928094Z 562 │ } 2026-10-24T19:50:25.1928147Z 563 │ }; 2026-10-24T19:50:25.1928229Z 564 │ const handleVisibleFileChange = ( 2026-10-24T19:50:25.1928359Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T19:50:25.1928416Z 566 │ ) => { 2026-10-24T19:50:25.1928523Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T19:50:25.1928691Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T19:50:25.1928743Z 569 │ }; 2026-10-24T19:50:25.1928822Z 570 │ const renderInspector = () => ( 2026-10-24T19:50:25.1928890Z 571 │ void handleSelectFile(fileId)} 2026-10-24T19:50:25.1929405Z 577 │ /> 2026-10-24T19:50:25.1929458Z 578 │ ); 2026-10-24T19:50:25.1929510Z 579 │ 2026-10-24T19:50:25.1929696Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T19:50:25.1929781Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T19:50:25.1929843Z 582 │ if (fileId) { 2026-10-24T19:50:25.1929924Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T19:50:25.1930003Z 584 │ toggleExpandedFile(fileId); 2026-10-24T19:50:25.1930056Z 585 │ } 2026-10-24T19:50:25.1930109Z 586 │ }; 2026-10-24T19:50:25.1930233Z 587 │ 2026-10-24T19:50:25.1930361Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T19:50:25.1930478Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T19:50:25.1930534Z 590 │ ) => { 2026-10-24T19:50:25.1930621Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T19:50:25.1930681Z 592 │ if (fileId) { 2026-10-24T19:50:25.1930756Z 593 │ toggleViewedFile(fileId); 2026-10-24T19:50:25.1930808Z 594 │ } 2026-10-24T19:50:25.1930861Z 595 │ }; 2026-10-24T19:50:25.1930911Z 596 │ 2026-10-24T19:50:25.1930983Z 597 │ const parsedDiffNotice = 2026-10-24T19:50:25.1931146Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T19:50:25.1931266Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T19:50:25.1931427Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T19:50:25.1931551Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T19:50:25.1931712Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T19:50:25.1931821Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T19:50:25.1931919Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T19:50:25.1931992Z 605 │ hasCachedSelectedDiff, 2026-10-24T19:50:25.1932057Z 606 │ hasAnyCachedDiff, 2026-10-24T19:50:25.1932110Z 607 │ }); 2026-10-24T19:50:25.1932196Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T19:50:25.1932282Z 609 │ void retryEnvironment(environmentId); 2026-10-24T19:50:25.1932334Z 610 │ }; 2026-10-24T19:50:25.1932419Z 611 │ const handleReturnToThread = () => { 2026-10-24T19:50:25.1932500Z 612 │ if (navigation.canGoBack()) { 2026-10-24T19:50:25.1932572Z 613 │ navigation.goBack(); 2026-10-24T19:50:25.1932630Z 614 │ return; 2026-10-24T19:50:25.1932682Z 615 │ } 2026-10-24T19:50:25.1932764Z 616 │ navigation.navigate("Thread", { 2026-10-24T19:50:25.1932853Z 617 │ environmentId: String(environmentId), 2026-10-24T19:50:25.1932929Z 618 │ threadId: String(threadId), 2026-10-24T19:50:25.1932983Z 619 │ }); 2026-10-24T19:50:25.1933037Z 620 │ }; 2026-10-24T19:50:25.1933116Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T19:50:25.1933188Z 622 │ selectedSection?.title, 2026-10-24T19:50:25.1933267Z 623 │ headerDiffSummary.additions, 2026-10-24T19:50:25.1933346Z 624 │ headerDiffSummary.deletions, 2026-10-24T19:50:25.1933398Z 625 │ ] 2026-10-24T19:50:25.1933503Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T19:50:25.1933570Z 627 │ .join(" · "); 2026-10-24T19:50:25.1933625Z 628 │ 2026-10-24T19:50:25.1933705Z 629 │ const showChangedFilesPane = 2026-10-24T19:50:25.1933775Z 630 │ !showConnectionNotice && 2026-10-24T19:50:25.1933849Z 631 │ selectedSection !== null && 2026-10-24T19:50:25.1933956Z 632 │ parsedDiff.kind === "files" && 2026-10-24T19:50:25.1934035Z 633 │ NativeReviewDiffView !== null; 2026-10-24T19:50:25.1934206Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T19:50:25.1934378Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T19:50:25.1934430Z 636 │ 2026-10-24T19:50:25.1934504Z 637 │ const listHeader = (() => { 2026-10-24T19:50:25.1934588Z 638 │ const children: ReactElement[] = []; 2026-10-24T19:50:25.1934641Z 639 │ 2026-10-24T19:50:25.1934760Z 640 │ if (error) { 2026-10-24T19:50:25.1934861Z 641 │ children.push( 2026-10-24T19:50:25.1934920Z 642 │ 2026-10-24T19:50:25.1935574Z 649 │ Review unavailable 2026-10-24T19:50:25.1935731Z 650 │ {error} 2026-10-24T19:50:25.1935793Z 651 │ , 2026-10-24T19:50:25.1935850Z 652 │ ); 2026-10-24T19:50:25.1935903Z 653 │ } 2026-10-24T19:50:25.1935961Z 654 │ 2026-10-24T19:50:25.1936039Z 655 │ if (parsedDiffNotice) { 2026-10-24T19:50:25.1936201Z 656 │ children.push(); 2026-10-24T19:50:25.1936254Z 657 │ } 2026-10-24T19:50:25.1936306Z 658 │ 2026-10-24T19:50:25.1936383Z 659 │ if (children.length === 0) { 2026-10-24T19:50:25.1936447Z 660 │ return null; 2026-10-24T19:50:25.1936501Z 661 │ } 2026-10-24T19:50:25.1936552Z 662 │ 2026-10-24T19:50:25.1936623Z 663 │ return <>{children}; 2026-10-24T19:50:25.1936677Z 664 │ })(); 2026-10-24T19:50:25.1936745Z 665 │ const headerSubtitle = [ 2026-10-24T19:50:25.1936825Z 666 │ headerDiffSummary.additions, 2026-10-24T19:50:25.1936902Z 667 │ headerDiffSummary.deletions, 2026-10-24T19:50:25.1936981Z 668 │ pendingReviewCommentCount > 0 2026-10-24T19:50:25.1937160Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T19:50:25.1937223Z 670 │ : null, 2026-10-24T19:50:25.1937277Z 671 │ ] 2026-10-24T19:50:25.1937341Z 672 │ .filter(Boolean) 2026-10-24T19:50:25.1937403Z 673 │ .join(" · "); 2026-10-24T19:50:25.1937538Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T19:50:25.1937588Z 675 │ 2026-10-24T19:50:25.1937645Z 676 │ return ( 2026-10-24T19:50:25.1937700Z 677 │ <> 2026-10-24T19:50:25.1937764Z 678 │ 2026-10-24T19:50:25.1939160Z 694 │ 2026-10-24T19:50:25.1939225Z 695 │ 2026-10-24T19:50:25.1939349Z 696 │ 2026-10-24T19:50:25.1939432Z 697 │ {showConnectionNotice ? ( 2026-10-24T19:50:25.1939572Z 698 │ 2026-10-24T19:50:25.1939661Z 699 │ 2026-10-24T19:50:25.1940672Z 711 │ 2026-10-24T19:50:25.1940831Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T19:50:25.1940892Z 713 │ 2026-10-24T19:50:25.1941323Z 719 │ 2026-10-24T19:50:25.1941684Z 723 │ {listHeader} 2026-10-24T19:50:25.1941803Z 724 │ 2026-10-24T19:50:25.1941884Z 725 │ { 2026-10-24T19:50:25.1946998Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T19:50:25.1947070Z ·  ────┬─── 2026-10-24T19:50:25.1947203Z · ╰── `progress` cannot be modified 2026-10-24T19:50:25.1947274Z 69 │ }, [expanded, progress]); 2026-10-24T19:50:25.1947327Z ╰──── 2026-10-24T19:50:25.1947653Z  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-24T19:50:25.1947994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.1947997Z 2026-10-24T19:50:25.1948262Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1948440Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T19:50:25.1948493Z 55 │ 2026-10-24T19:50:25.1948555Z 56 │ useEffect(() => { 2026-10-24T19:50:25.1948624Z ·  ────┬──── 2026-10-24T19:50:25.1948752Z · ╰── This is the containing effect 2026-10-24T19:50:25.1948819Z 57 │ scheduler.reset(); 2026-10-24T19:50:25.1948921Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T19:50:25.1949011Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T19:50:25.1949128Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T19:50:25.1949208Z ·  ───────┬─────── 2026-10-24T19:50:25.1949378Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1949492Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T19:50:25.1949544Z ╰──── 2026-10-24T19:50:25.1950155Z  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-24T19:50:25.1950487Z  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-24T19:50:25.1950493Z 2026-10-24T19:50:25.1950697Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1950874Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T19:50:25.1950954Z 62 │ return () => scheduler.cancel(); 2026-10-24T19:50:25.1951054Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T19:50:25.1951181Z ·  ───┬─── ─────┬───── 2026-10-24T19:50:25.1951377Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T19:50:25.1951523Z · ╰── Unnecessary dependency `enabled` 2026-10-24T19:50:25.1951579Z 64 │ 2026-10-24T19:50:25.1951628Z ╰──── 2026-10-24T19:50:25.1951928Z  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-24T19:50:25.1952242Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1952245Z 2026-10-24T19:50:25.1952522Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.1952661Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T19:50:25.1952712Z 913 │ 2026-10-24T19:50:25.1952958Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T19:50:25.1953073Z ·  ─────┬───── 2026-10-24T19:50:25.1953210Z · ╰── 'layerDaemon' is declared here 2026-10-24T19:50:25.1953296Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T19:50:25.1953347Z ╰──── 2026-10-24T19:50:25.1953452Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1953455Z 2026-10-24T19:50:25.1953717Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1953928Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T19:50:25.1953980Z 104 │ 2026-10-24T19:50:25.1954045Z 105 │ useEffect(() => { 2026-10-24T19:50:25.1954117Z ·  ────┬──── 2026-10-24T19:50:25.1954253Z · ╰── This is the containing effect 2026-10-24T19:50:25.1954336Z 106 │ clearReviewCommentTarget(); 2026-10-24T19:50:25.1954434Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T19:50:25.1954541Z ·  ────────────────┬─────────────── 2026-10-24T19:50:25.1954721Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1954794Z 108 │ }, [selectedSection?.id]); 2026-10-24T19:50:25.1954846Z ╰──── 2026-10-24T19:50:25.1955465Z  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-24T19:50:25.1955795Z  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-24T19:50:25.1955800Z 2026-10-24T19:50:25.1956061Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1956249Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T19:50:25.1956302Z 109 │ 2026-10-24T19:50:25.1956365Z 110 │ useEffect(() => { 2026-10-24T19:50:25.1956435Z ·  ────┬──── 2026-10-24T19:50:25.1956565Z · ╰── This is the containing effect 2026-10-24T19:50:25.1956653Z 111 │ if (activeCommentTarget === null) { 2026-10-24T19:50:25.1956760Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T19:50:25.1956871Z ·  ────────────────┬─────────────── 2026-10-24T19:50:25.1957050Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1957105Z 113 │ } 2026-10-24T19:50:25.1957157Z ╰──── 2026-10-24T19:50:25.1957767Z  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-24T19:50:25.1958091Z  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-24T19:50:25.1958093Z 2026-10-24T19:50:25.1958352Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1958573Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T19:50:25.1958670Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T19:50:25.1958741Z 108 │ }, [selectedSection?.id]); 2026-10-24T19:50:25.1958828Z ·  ─────────┬───────── 2026-10-24T19:50:25.1958991Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T19:50:25.1959043Z 109 │ 2026-10-24T19:50:25.1959092Z ╰──── 2026-10-24T19:50:25.1959393Z  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-24T19:50:25.1959713Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1959719Z 2026-10-24T19:50:25.1959980Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1960149Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T19:50:25.1960201Z 100 │ 2026-10-24T19:50:25.1960265Z 101 │ useEffect(() => { 2026-10-24T19:50:25.1960335Z ·  ────┬──── 2026-10-24T19:50:25.1960463Z · ╰── This is the containing effect 2026-10-24T19:50:25.1960567Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T19:50:25.1960652Z 103 │ setHighlightedLinesById({}); 2026-10-24T19:50:25.1960748Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1960925Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1960987Z 104 │ return; 2026-10-24T19:50:25.1961039Z ╰──── 2026-10-24T19:50:25.1961652Z  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-24T19:50:25.1961979Z  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-24T19:50:25.1961981Z 2026-10-24T19:50:25.1962202Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.1962428Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T19:50:25.1962480Z 52 │ 2026-10-24T19:50:25.1962545Z 53 │ for (const {} of [ 2026-10-24T19:50:25.1962614Z ·  ── 2026-10-24T19:50:25.1962681Z 54 │ { healthy: true }, 2026-10-24T19:50:25.1962732Z ╰──── 2026-10-24T19:50:25.1962967Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.1962970Z 2026-10-24T19:50:25.1963229Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1963377Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T19:50:25.1963434Z 61 │ }, []); 2026-10-24T19:50:25.1963505Z 62 │ useEffect(() => { 2026-10-24T19:50:25.1963580Z ·  ────┬──── 2026-10-24T19:50:25.1963710Z · ╰── This is the containing effect 2026-10-24T19:50:25.1963861Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T19:50:25.1964007Z ·  ───────┬────── 2026-10-24T19:50:25.1964221Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1964298Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T19:50:25.1964349Z ╰──── 2026-10-24T19:50:25.1964963Z  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-24T19:50:25.1965297Z  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-24T19:50:25.1965299Z 2026-10-24T19:50:25.1965497Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1965649Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T19:50:25.1965759Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T19:50:25.1965854Z 223 │ 2026-10-24T19:50:25.1965962Z ·  ─────────────── 2026-10-24T19:50:25.1966059Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T19:50:25.1966113Z ╰──── 2026-10-24T19:50:25.1966262Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T19:50:25.1966265Z 2026-10-24T19:50:25.1966514Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1966664Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T19:50:25.1966739Z 226 │ { 2026-10-24T19:50:25.1967947Z ·  ────┬──── 2026-10-24T19:50:25.1968076Z · ╰── This is the containing effect 2026-10-24T19:50:25.1968140Z 68 │ setUri(null); 2026-10-24T19:50:25.1968208Z ·  ───┬── 2026-10-24T19:50:25.1968374Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1968436Z 69 │ setError(null); 2026-10-24T19:50:25.1968493Z ╰──── 2026-10-24T19:50:25.1969107Z  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-24T19:50:25.1969431Z  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-24T19:50:25.1969433Z 2026-10-24T19:50:25.1969637Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1969772Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T19:50:25.1969827Z 90 │ }; 2026-10-24T19:50:25.1969905Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T19:50:25.1970026Z ·  ──────┬───── ───┬─── 2026-10-24T19:50:25.1970211Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T19:50:25.1970360Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T19:50:25.1970494Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T19:50:25.1970546Z ╰──── 2026-10-24T19:50:25.1970844Z  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-24T19:50:25.1971159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1971167Z 2026-10-24T19:50:25.1971388Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.1971529Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T19:50:25.1971593Z 212 │ useEffect(() => { 2026-10-24T19:50:25.1971705Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T19:50:25.1971804Z ·  ──┬── 2026-10-24T19:50:25.1971958Z · ╰── Missing dependency `props` 2026-10-24T19:50:25.1972064Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T19:50:25.1972174Z ·  ──────────┬───────── 2026-10-24T19:50:25.1972466Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T19:50:25.1972574Z 215 │ const { source } = props; 2026-10-24T19:50:25.1972625Z ╰──── 2026-10-24T19:50:25.1973059Z  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-24T19:50:25.1973376Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1973379Z 2026-10-24T19:50:25.1973548Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1973671Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T19:50:25.1973780Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T19:50:25.1973975Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T19:50:25.1974099Z ·  ─────┬──── 2026-10-24T19:50:25.1974270Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1974350Z 822 │ return AsyncResult.failure( 2026-10-24T19:50:25.1974400Z ╰──── 2026-10-24T19:50:25.1974682Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T19:50:25.1974980Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1974988Z 2026-10-24T19:50:25.1975160Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.1975280Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T19:50:25.1975352Z 708 │ const wokeAt = resolved 2026-10-24T19:50:25.1975487Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T19:50:25.1975599Z ·  ─────┬──── 2026-10-24T19:50:25.1975761Z · ╰── Cannot call impure function 2026-10-24T19:50:25.1975821Z 710 │ : null; 2026-10-24T19:50:25.1975872Z ╰──── 2026-10-24T19:50:25.1976151Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T19:50:25.1976453Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.1976458Z 2026-10-24T19:50:25.1976718Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1976853Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T19:50:25.1976906Z 57 │ 2026-10-24T19:50:25.1976971Z 58 │ useEffect(() => { 2026-10-24T19:50:25.1977041Z ·  ────┬──── 2026-10-24T19:50:25.1977171Z · ╰── This is the containing effect 2026-10-24T19:50:25.1977267Z 59 │ const controller = new AbortController(); 2026-10-24T19:50:25.1977340Z 60 │ setLoadState("pending"); 2026-10-24T19:50:25.1977471Z ·  ──────┬───── 2026-10-24T19:50:25.1977671Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1977833Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T19:50:25.1977885Z ╰──── 2026-10-24T19:50:25.1978494Z  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-24T19:50:25.1978818Z  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-24T19:50:25.1978821Z 2026-10-24T19:50:25.1979030Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1979167Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T19:50:25.1979249Z 70 │ return () => controller.abort(); 2026-10-24T19:50:25.1979344Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T19:50:25.1979520Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T19:50:25.1979753Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T19:50:25.1979960Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T19:50:25.1980107Z · ╰── Unnecessary dependency `player_0` 2026-10-24T19:50:25.1980163Z 72 │ 2026-10-24T19:50:25.1980214Z ╰──── 2026-10-24T19:50:25.1980514Z  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-24T19:50:25.1980835Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1980838Z 2026-10-24T19:50:25.1981036Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.1981193Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T19:50:25.1981309Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T19:50:25.1981489Z 272 │ 2026-10-24T19:50:25.1981651Z ·  ─────────────────────────────────────────────────────── 2026-10-24T19:50:25.1981732Z 273 │ = 2026-10-24T19:50:25.1982764Z ·  ──┬── 2026-10-24T19:50:25.1982934Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.1983008Z 3756 │ Layer.effect( 2026-10-24T19:50:25.1983068Z ╰──── 2026-10-24T19:50:25.1983174Z  help: Consider removing this declaration. 2026-10-24T19:50:25.1983183Z 2026-10-24T19:50:25.1983389Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.1983523Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T19:50:25.1983586Z 81 │ }, 2026-10-24T19:50:25.1983649Z 82 │ [draftKey], 2026-10-24T19:50:25.1983727Z ·  ────┬─── 2026-10-24T19:50:25.1983872Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T19:50:25.1983956Z 83 │ ); 2026-10-24T19:50:25.1984009Z ╰──── 2026-10-24T19:50:25.1984323Z  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-24T19:50:25.1984650Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1984653Z 2026-10-24T19:50:25.1984919Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1985059Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T19:50:25.1985253Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T19:50:25.1985331Z 168 │ useLayoutEffect(() => { 2026-10-24T19:50:25.1985420Z ·  ───────┬─────── 2026-10-24T19:50:25.1985561Z · ╰── This is the containing effect 2026-10-24T19:50:25.1985669Z 169 │ if (faviconRequest === null) return; 2026-10-24T19:50:25.1985728Z 170 │ 2026-10-24T19:50:25.1985865Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T19:50:25.1985966Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T19:50:25.1986059Z ·  ───────────┬─────────── 2026-10-24T19:50:25.1986258Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1986403Z 173 │ return endRequest; 2026-10-24T19:50:25.1986481Z ╰──── 2026-10-24T19:50:25.1987300Z  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-24T19:50:25.1987702Z  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-24T19:50:25.1987705Z 2026-10-24T19:50:25.1987991Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.1988220Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T19:50:25.1988294Z 328 │ }; 2026-10-24T19:50:25.1988400Z 329 │ useEffect(() => { 2026-10-24T19:50:25.1988507Z ·  ────┬──── 2026-10-24T19:50:25.1988680Z · ╰── This is the containing effect 2026-10-24T19:50:25.1988807Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T19:50:25.1988944Z 331 │ requestedSection.current = "overview"; 2026-10-24T19:50:25.1989146Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T19:50:25.1989244Z 333 │ setSection("overview"); 2026-10-24T19:50:25.1989373Z ·  ─────┬──── 2026-10-24T19:50:25.1989561Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.1989655Z 334 │ } 2026-10-24T19:50:25.1989741Z ╰──── 2026-10-24T19:50:25.1990395Z  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-24T19:50:25.1990861Z  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-24T19:50:25.1990888Z 2026-10-24T19:50:25.1991110Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T19:50:25.1991321Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T19:50:25.1991447Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T19:50:25.1991594Z 331 │ requestedSection.current = "overview"; 2026-10-24T19:50:25.1991699Z ·  ────────┬─────── 2026-10-24T19:50:25.1992195Z · ╰── 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-24T19:50:25.1992399Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T19:50:25.1992589Z ·  ─────────┬───────── ──────┬────── 2026-10-24T19:50:25.1993147Z · │ ╰── 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-24T19:50:25.1993676Z · ╰── 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-24T19:50:25.1993817Z 333 │ setSection("overview"); 2026-10-24T19:50:25.1993922Z 334 │ } 2026-10-24T19:50:25.1994065Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T19:50:25.1994195Z ·  ──────────────────┬───────────────── 2026-10-24T19:50:25.1994426Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.1994551Z 336 │ const tabContent = activityContent; 2026-10-24T19:50:25.1994753Z ╰──── 2026-10-24T19:50:25.1994948Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T19:50:25.1995312Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.1995320Z 2026-10-24T19:50:25.1995562Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T19:50:25.1995765Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T19:50:25.1995876Z 860 │ if ( 2026-10-24T19:50:25.1996008Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T19:50:25.1996125Z ·  ──────┬────── 2026-10-24T19:50:25.1996607Z · ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-24T19:50:25.1996774Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T19:50:25.1996868Z 863 │ ) 2026-10-24T19:50:25.1996951Z 864 │ return; 2026-10-24T19:50:25.1997169Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T19:50:25.1997332Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T19:50:25.1997472Z 867 │ setJumpPath(route.params.path); 2026-10-24T19:50:25.1997561Z 868 │ setSelectedRowId(null); 2026-10-24T19:50:25.1997679Z 869 │ jumpStarted.current = false; 2026-10-24T19:50:25.1997970Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T19:50:25.1998112Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T19:50:25.1998225Z ·  ─────┬──── 2026-10-24T19:50:25.1998714Z · ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-24T19:50:25.1998882Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T19:50:25.1998985Z 873 │ jumpStarted.current = true; 2026-10-24T19:50:25.1999153Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T19:50:25.1999277Z 875 │ jumpStarted.current = false; 2026-10-24T19:50:25.1999375Z 876 │ }); 2026-10-24T19:50:25.1999605Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T19:50:25.1999823Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T19:50:25.2000164Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2000350Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T19:50:25.2000435Z ╰──── 2026-10-24T19:50:25.2000631Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T19:50:25.2000983Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2000987Z 2026-10-24T19:50:25.2001180Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2001438Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T19:50:25.2001653Z 53 │ const child = children as ReactElement>; 2026-10-24T19:50:25.2001845Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T19:50:25.2002014Z 55 │ │ onTouchStart: (event) => { 2026-10-24T19:50:25.2002208Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T19:50:25.2002400Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T19:50:25.2002553Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T19:50:25.2002755Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T19:50:25.2002907Z 60 │ │ pendingPress.current = null; 2026-10-24T19:50:25.2003061Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T19:50:25.2003171Z 62 │ │ }, 2026-10-24T19:50:25.2003291Z 63 │ │ onPress: (event) => { 2026-10-24T19:50:25.2003522Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T19:50:25.2003693Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T19:50:25.2003917Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T19:50:25.2004128Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T19:50:25.2004251Z 68 │ │ return; 2026-10-24T19:50:25.2004371Z 69 │ │ } 2026-10-24T19:50:25.2004644Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T19:50:25.2004860Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T19:50:25.2005037Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T19:50:25.2005193Z 73 │ │ event.persist(); 2026-10-24T19:50:25.2005387Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T19:50:25.2005511Z 75 │ │ return; 2026-10-24T19:50:25.2005602Z 76 │ │ } 2026-10-24T19:50:25.2005759Z 77 │ │ child.props.onPress?.(event); 2026-10-24T19:50:25.2005875Z 78 │ │ }, 2026-10-24T19:50:25.2006041Z 79 │ ├─▶ }); 2026-10-24T19:50:25.2006366Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2006602Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T19:50:25.2006709Z ╰──── 2026-10-24T19:50:25.2007231Z  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-24T19:50:25.2007559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2007562Z 2026-10-24T19:50:25.2007790Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T19:50:25.2007921Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T19:50:25.2008137Z 21 │ EnvironmentThreadShell, 2026-10-24T19:50:25.2008242Z 22 │ ThreadRunSummary, 2026-10-24T19:50:25.2008337Z ·  ────────┬─────── 2026-10-24T19:50:25.2008509Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T19:50:25.2008636Z 23 │ ThreadRuntimeSummary, 2026-10-24T19:50:25.2008722Z ╰──── 2026-10-24T19:50:25.2008838Z  help: Consider removing this import. 2026-10-24T19:50:25.2008841Z 2026-10-24T19:50:25.2009020Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2009229Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T19:50:25.2009356Z 26 │ const latestInput = useRef(input); 2026-10-24T19:50:25.2009448Z 27 │ latestInput.current = input; 2026-10-24T19:50:25.2009601Z ·  ─────┬─────────┬─── 2026-10-24T19:50:25.2009819Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.2009999Z · ╰── This value is a ref 2026-10-24T19:50:25.2010109Z 28 │ const mounted = useRef(true); 2026-10-24T19:50:25.2010177Z ╰──── 2026-10-24T19:50:25.2010686Z  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-24T19:50:25.2011036Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2011039Z 2026-10-24T19:50:25.2011406Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.2011651Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T19:50:25.2011727Z 90 │ }) { 2026-10-24T19:50:25.2011864Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T19:50:25.2011986Z ·  ────┬─── 2026-10-24T19:50:25.2012155Z · ╰── `rotation` originates here 2026-10-24T19:50:25.2012241Z 92 │ useLayoutEffect(() => { 2026-10-24T19:50:25.2012426Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T19:50:25.2012535Z ·  ────┬─── 2026-10-24T19:50:25.2012714Z · ╰── `rotation` cannot be modified 2026-10-24T19:50:25.2012805Z 94 │ }, [props.hidden, rotation]); 2026-10-24T19:50:25.2012900Z ╰──── 2026-10-24T19:50:25.2013200Z  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-24T19:50:25.2013567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.2013570Z 2026-10-24T19:50:25.2013743Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.2013986Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T19:50:25.2014206Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T19:50:25.2014373Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T19:50:25.2014484Z ·  ────────┬──────── 2026-10-24T19:50:25.2014678Z · ╰── `loadingVisibility` originates here 2026-10-24T19:50:25.2014783Z 268 │ useLayoutEffect(() => { 2026-10-24T19:50:25.2014968Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T19:50:25.2015105Z ·  ────────┬──────── 2026-10-24T19:50:25.2015271Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T19:50:25.2015401Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T19:50:25.2015486Z ╰──── 2026-10-24T19:50:25.2015791Z  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-24T19:50:25.2016128Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.2016133Z 2026-10-24T19:50:25.2016326Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.2016529Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T19:50:25.2016609Z 325 │ }) { 2026-10-24T19:50:25.2016792Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T19:50:25.2016929Z ·  ─────────┬───────── 2026-10-24T19:50:25.2017117Z · ╰── `recordingVisibility` originates here 2026-10-24T19:50:25.2017325Z 327 │ useLayoutEffect(() => { 2026-10-24T19:50:25.2017550Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T19:50:25.2017664Z ·  ─────────┬───────── 2026-10-24T19:50:25.2017914Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T19:50:25.2018078Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T19:50:25.2018158Z ╰──── 2026-10-24T19:50:25.2018450Z  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-24T19:50:25.2018801Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.2018804Z 2026-10-24T19:50:25.2018985Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2019184Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T19:50:25.2019385Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T19:50:25.2019536Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T19:50:25.2019692Z ·  ───────────┬────────── 2026-10-24T19:50:25.2019903Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2020052Z 123 │ const sessionRef = useRef(null); 2026-10-24T19:50:25.2020128Z ╰──── 2026-10-24T19:50:25.2020647Z  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-24T19:50:25.2021087Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2021094Z 2026-10-24T19:50:25.2021277Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2021478Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T19:50:25.2021556Z 125 │ 2026-10-24T19:50:25.2021700Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T19:50:25.2021826Z ·  ─────────┬──────── 2026-10-24T19:50:25.2022002Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2022136Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T19:50:25.2022231Z ╰──── 2026-10-24T19:50:25.2022748Z  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-24T19:50:25.2023078Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2023081Z 2026-10-24T19:50:25.2023261Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2023444Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T19:50:25.2023533Z 125 │ 2026-10-24T19:50:25.2023677Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T19:50:25.2023790Z ·  ─────────┬───────── 2026-10-24T19:50:25.2023991Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2024291Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T19:50:25.2024407Z ╰──── 2026-10-24T19:50:25.2024911Z  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-24T19:50:25.2025214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2025251Z 2026-10-24T19:50:25.2025425Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2025619Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T19:50:25.2025705Z 125 │ 2026-10-24T19:50:25.2025843Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T19:50:25.2025988Z ·  ─────────┬───────── 2026-10-24T19:50:25.2026206Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2026338Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T19:50:25.2026423Z ╰──── 2026-10-24T19:50:25.2026904Z  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-24T19:50:25.2027256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2027259Z 2026-10-24T19:50:25.2027444Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2027640Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T19:50:25.2027720Z 125 │ 2026-10-24T19:50:25.2027959Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T19:50:25.2028116Z ·  ──────────┬───────── 2026-10-24T19:50:25.2028317Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2028448Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T19:50:25.2028512Z ╰──── 2026-10-24T19:50:25.2029040Z  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-24T19:50:25.2029371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2029374Z 2026-10-24T19:50:25.2029550Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2029742Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T19:50:25.2029884Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T19:50:25.2030122Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T19:50:25.2030331Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T19:50:25.2030552Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T19:50:25.2030781Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T19:50:25.2030923Z 131 │ │ isFinished: status.isFinished, 2026-10-24T19:50:25.2031142Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T19:50:25.2031384Z 133 │ │ error: status.error, 2026-10-24T19:50:25.2031509Z 134 │ │ url: status.url, 2026-10-24T19:50:25.2031619Z 135 │ │ }); 2026-10-24T19:50:25.2031740Z 136 │ │ }, 2026-10-24T19:50:25.2031975Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T19:50:25.2032123Z 138 │ │ selectInput: (inputs) => { 2026-10-24T19:50:25.2032289Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T19:50:25.2032491Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T19:50:25.2032697Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T19:50:25.2032871Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T19:50:25.2032991Z 143 │ │ if (order !== known) { 2026-10-24T19:50:25.2033166Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T19:50:25.2033326Z 145 │ │ transform: (current) => ({ 2026-10-24T19:50:25.2033574Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T19:50:25.2033696Z 147 │ │ }), 2026-10-24T19:50:25.2033785Z 148 │ │ }); 2026-10-24T19:50:25.2033971Z 149 │ │ } 2026-10-24T19:50:25.2034145Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T19:50:25.2034358Z 151 │ │ }, 2026-10-24T19:50:25.2034505Z 152 │ ├─▶ }); 2026-10-24T19:50:25.2038045Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2038147Z 153 │ recorderRef.current = recorder; 2026-10-24T19:50:25.2038202Z ╰──── 2026-10-24T19:50:25.2038695Z  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-24T19:50:25.2038998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2039001Z 2026-10-24T19:50:25.2039154Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2039317Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T19:50:25.2039377Z 152 │ }); 2026-10-24T19:50:25.2039462Z 153 │ recorderRef.current = recorder; 2026-10-24T19:50:25.2039579Z ·  ─────┬─────────┬─── 2026-10-24T19:50:25.2039843Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.2040008Z · ╰── This value is a ref 2026-10-24T19:50:25.2040117Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T19:50:25.2040171Z ╰──── 2026-10-24T19:50:25.2040644Z  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-24T19:50:25.2040943Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2040945Z 2026-10-24T19:50:25.2041100Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2041269Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T19:50:25.2041356Z 153 │ recorderRef.current = recorder; 2026-10-24T19:50:25.2041554Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T19:50:25.2041641Z 155 │ │ recorder, 2026-10-24T19:50:25.2041774Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T19:50:25.2041893Z 157 │ │ requestPermission: async () => { 2026-10-24T19:50:25.2042059Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T19:50:25.2042254Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T19:50:25.2042341Z 160 │ │ }, 2026-10-24T19:50:25.2042489Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T19:50:25.2042627Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T19:50:25.2042764Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T19:50:25.2042878Z 164 │ │ onStateChange: (nextState) => 2026-10-24T19:50:25.2042971Z 165 │ │ setState({ 2026-10-24T19:50:25.2043073Z 166 │ │ state: nextState, 2026-10-24T19:50:25.2043213Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T19:50:25.2043344Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T19:50:25.2043431Z 169 │ │ }), 2026-10-24T19:50:25.2043562Z 170 │ ├─▶ }); 2026-10-24T19:50:25.2043766Z · ╰──── Cannot access ref value during render 2026-10-24T19:50:25.2043825Z 171 │ } 2026-10-24T19:50:25.2043881Z ╰──── 2026-10-24T19:50:25.2044392Z  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-24T19:50:25.2044686Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2044689Z 2026-10-24T19:50:25.2044890Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2045086Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T19:50:25.2045169Z 153 │ recorderRef.current = recorder; 2026-10-24T19:50:25.2045274Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T19:50:25.2045388Z ·  ─────┬────────┬─── 2026-10-24T19:50:25.2045576Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.2045695Z · ╰── This value is a ref 2026-10-24T19:50:25.2045759Z 155 │ recorder, 2026-10-24T19:50:25.2045811Z ╰──── 2026-10-24T19:50:25.2046291Z  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-24T19:50:25.2046658Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2046661Z 2026-10-24T19:50:25.2046811Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2046972Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T19:50:25.2047060Z 184 │ return () => subscription.remove(); 2026-10-24T19:50:25.2047128Z 185 │ }, [controller]); 2026-10-24T19:50:25.2047209Z ·  ─────┬──── 2026-10-24T19:50:25.2047356Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2047412Z 186 │ 2026-10-24T19:50:25.2047469Z ╰──── 2026-10-24T19:50:25.2047947Z  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-24T19:50:25.2048239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2048241Z 2026-10-24T19:50:25.2048388Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2048548Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T19:50:25.2048635Z 184 │ return () => subscription.remove(); 2026-10-24T19:50:25.2048699Z 185 │ }, [controller]); 2026-10-24T19:50:25.2048851Z ·  ──────┬───── 2026-10-24T19:50:25.2049041Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2049095Z 186 │ 2026-10-24T19:50:25.2049146Z ╰──── 2026-10-24T19:50:25.2049619Z  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-24T19:50:25.2049910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2049913Z 2026-10-24T19:50:25.2050057Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2050221Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T19:50:25.2050280Z 191 │ }, 2026-10-24T19:50:25.2050353Z 192 │ [controller, recorder], 2026-10-24T19:50:25.2050429Z ·  ─────┬──── 2026-10-24T19:50:25.2050573Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2050627Z 193 │ ); 2026-10-24T19:50:25.2050678Z ╰──── 2026-10-24T19:50:25.2051151Z  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-24T19:50:25.2051443Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2051446Z 2026-10-24T19:50:25.2051596Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2051758Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T19:50:25.2051850Z 174 │ const controller = session.controller; 2026-10-24T19:50:25.2051937Z 175 │ const recorder = recorderRef.current; 2026-10-24T19:50:25.2052045Z ·  ─────────┬───────── 2026-10-24T19:50:25.2052206Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2052261Z 176 │ 2026-10-24T19:50:25.2052312Z ╰──── 2026-10-24T19:50:25.2052791Z  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-24T19:50:25.2053089Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2053092Z 2026-10-24T19:50:25.2053237Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2053396Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T19:50:25.2053452Z 191 │ }, 2026-10-24T19:50:25.2053524Z 192 │ [controller, recorder], 2026-10-24T19:50:25.2053615Z ·  ───────────┬────────── 2026-10-24T19:50:25.2053766Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2053821Z 193 │ ); 2026-10-24T19:50:25.2053874Z ╰──── 2026-10-24T19:50:25.2054432Z  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-24T19:50:25.2054765Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2054767Z 2026-10-24T19:50:25.2054912Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2055071Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T19:50:25.2055160Z 245 │ return () => clearInterval(intervalId); 2026-10-24T19:50:25.2055273Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T19:50:25.2055362Z ·  ─────┬──── 2026-10-24T19:50:25.2055525Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2055582Z 247 │ 2026-10-24T19:50:25.2055633Z ╰──── 2026-10-24T19:50:25.2056103Z  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-24T19:50:25.2056393Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2056395Z 2026-10-24T19:50:25.2056539Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2056699Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T19:50:25.2056792Z 245 │ return () => clearInterval(intervalId); 2026-10-24T19:50:25.2056901Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T19:50:25.2057034Z ·  ────────────────────────┬─────────────────────── 2026-10-24T19:50:25.2057196Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2057249Z 247 │ 2026-10-24T19:50:25.2057301Z ╰──── 2026-10-24T19:50:25.2057777Z  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-24T19:50:25.2058076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2058083Z 2026-10-24T19:50:25.2058226Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2058385Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T19:50:25.2058455Z 260 │ setOwnerFocused, 2026-10-24T19:50:25.2058516Z 261 │ session, 2026-10-24T19:50:25.2058587Z ·  ───┬─── 2026-10-24T19:50:25.2058729Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2058788Z 262 │ stop, 2026-10-24T19:50:25.2058838Z ╰──── 2026-10-24T19:50:25.2059386Z  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-24T19:50:25.2059721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2059723Z 2026-10-24T19:50:25.2059867Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2060026Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T19:50:25.2060080Z 250 │ 2026-10-24T19:50:25.2060221Z 251 │ ╭─▶ return { 2026-10-24T19:50:25.2060435Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T19:50:25.2060514Z 253 │ │ state, 2026-10-24T19:50:25.2060606Z 254 │ │ audioLevels, 2026-10-24T19:50:25.2060704Z 255 │ │ elapsedSeconds, 2026-10-24T19:50:25.2060835Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T19:50:25.2060917Z 257 │ │ ownerKey, 2026-10-24T19:50:25.2060992Z 258 │ │ label, 2026-10-24T19:50:25.2061082Z 259 │ │ focusedOwners, 2026-10-24T19:50:25.2061178Z 260 │ │ setOwnerFocused, 2026-10-24T19:50:25.2061258Z 261 │ │ session, 2026-10-24T19:50:25.2061333Z 262 │ │ stop, 2026-10-24T19:50:25.2061413Z 263 │ │ cancel, 2026-10-24T19:50:25.2061541Z 264 │ ├─▶ }; 2026-10-24T19:50:25.2061752Z · ╰──── Cannot access ref value during render 2026-10-24T19:50:25.2061809Z 265 │ } 2026-10-24T19:50:25.2061862Z ╰──── 2026-10-24T19:50:25.2062339Z  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-24T19:50:25.2062634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2062637Z 2026-10-24T19:50:25.2062795Z ⚠ react(immutability): This value cannot be modified 2026-10-24T19:50:25.2062953Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T19:50:25.2063119Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T19:50:25.2063248Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T19:50:25.2063329Z ·  ─────┬───── 2026-10-24T19:50:25.2063466Z · ╰── `audioLevels` originates here 2026-10-24T19:50:25.2063586Z 123 │ const sessionRef = useRef(null); 2026-10-24T19:50:25.2063733Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T19:50:25.2063786Z 125 │ 2026-10-24T19:50:25.2063920Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T19:50:25.2064021Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T19:50:25.2064161Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T19:50:25.2064315Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T19:50:25.2064473Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T19:50:25.2064560Z 131 │ isFinished: status.isFinished, 2026-10-24T19:50:25.2064705Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T19:50:25.2064779Z 133 │ error: status.error, 2026-10-24T19:50:25.2064847Z 134 │ url: status.url, 2026-10-24T19:50:25.2064906Z 135 │ }); 2026-10-24T19:50:25.2064963Z 136 │ }, 2026-10-24T19:50:25.2065130Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T19:50:25.2065207Z 138 │ selectInput: (inputs) => { 2026-10-24T19:50:25.2065332Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T19:50:25.2065445Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T19:50:25.2065584Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T19:50:25.2065699Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T19:50:25.2065773Z 143 │ if (order !== known) { 2026-10-24T19:50:25.2065880Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T19:50:25.2065962Z 145 │ transform: (current) => ({ 2026-10-24T19:50:25.2066134Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T19:50:25.2066196Z 147 │ }), 2026-10-24T19:50:25.2066257Z 148 │ }); 2026-10-24T19:50:25.2066314Z 149 │ } 2026-10-24T19:50:25.2066423Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T19:50:25.2066481Z 151 │ }, 2026-10-24T19:50:25.2066536Z 152 │ }); 2026-10-24T19:50:25.2066623Z 153 │ recorderRef.current = recorder; 2026-10-24T19:50:25.2066728Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T19:50:25.2066790Z 155 │ recorder, 2026-10-24T19:50:25.2066889Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T19:50:25.2066974Z 157 │ requestPermission: async () => { 2026-10-24T19:50:25.2067104Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T19:50:25.2067261Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T19:50:25.2067318Z 160 │ }, 2026-10-24T19:50:25.2067426Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T19:50:25.2067532Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T19:50:25.2067634Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T19:50:25.2067719Z 164 │ onStateChange: (nextState) => 2026-10-24T19:50:25.2067784Z 165 │ setState({ 2026-10-24T19:50:25.2067855Z 166 │ state: nextState, 2026-10-24T19:50:25.2067962Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T19:50:25.2068061Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T19:50:25.2068118Z 169 │ }), 2026-10-24T19:50:25.2068175Z 170 │ }); 2026-10-24T19:50:25.2068230Z 171 │ } 2026-10-24T19:50:25.2068282Z 172 │ 2026-10-24T19:50:25.2068365Z 173 │ const session = sessionRef.current; 2026-10-24T19:50:25.2068454Z 174 │ const controller = session.controller; 2026-10-24T19:50:25.2068538Z 175 │ const recorder = recorderRef.current; 2026-10-24T19:50:25.2068592Z 176 │ 2026-10-24T19:50:25.2068656Z 177 │ useEffect(() => { 2026-10-24T19:50:25.2068867Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T19:50:25.2069041Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T19:50:25.2069181Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T19:50:25.2069285Z 181 │ // calls and route interruptions during capture. 2026-10-24T19:50:25.2069421Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T19:50:25.2069476Z 183 │ }); 2026-10-24T19:50:25.2069561Z 184 │ return () => subscription.remove(); 2026-10-24T19:50:25.2069625Z 185 │ }, [controller]); 2026-10-24T19:50:25.2069677Z 186 │ 2026-10-24T19:50:25.2069738Z 187 │ useEffect( 2026-10-24T19:50:25.2069798Z 188 │ () => () => { 2026-10-24T19:50:25.2069872Z 189 │ controller.dispose(); 2026-10-24T19:50:25.2069940Z 190 │ recorder.release(); 2026-10-24T19:50:25.2069995Z 191 │ }, 2026-10-24T19:50:25.2070069Z 192 │ [controller, recorder], 2026-10-24T19:50:25.2070127Z 193 │ ); 2026-10-24T19:50:25.2070179Z 194 │ 2026-10-24T19:50:25.2070243Z 195 │ useEffect(() => { 2026-10-24T19:50:25.2070334Z 196 │ if (state.phase !== "recording") return; 2026-10-24T19:50:25.2070386Z 197 │ 2026-10-24T19:50:25.2070535Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T19:50:25.2070640Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T19:50:25.2070720Z 200 │ void activation.catch(() => {}); 2026-10-24T19:50:25.2070784Z 201 │ return () => { 2026-10-24T19:50:25.2070934Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T19:50:25.2071074Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T19:50:25.2071128Z 204 │ }; 2026-10-24T19:50:25.2071212Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T19:50:25.2071267Z 206 │ 2026-10-24T19:50:25.2071329Z 207 │ useEffect(() => { 2026-10-24T19:50:25.2071463Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T19:50:25.2071514Z 209 │ 2026-10-24T19:50:25.2071635Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T19:50:25.2071789Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T19:50:25.2071893Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T19:50:25.2071972Z ·  ─────┬───── 2026-10-24T19:50:25.2072119Z · ╰── `audioLevels` cannot be modified 2026-10-24T19:50:25.2072173Z 213 │ } 2026-10-24T19:50:25.2072226Z ╰──── 2026-10-24T19:50:25.2072505Z  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-24T19:50:25.2072823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.2072826Z 2026-10-24T19:50:25.2073030Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T19:50:25.2073189Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T19:50:25.2073242Z 206 │ 2026-10-24T19:50:25.2073306Z 207 │ useEffect(() => { 2026-10-24T19:50:25.2073383Z ·  ───┬─── 2026-10-24T19:50:25.2073666Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T19:50:25.2073836Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T19:50:25.2073887Z 209 │ 2026-10-24T19:50:25.2074031Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T19:50:25.2074183Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T19:50:25.2074286Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T19:50:25.2074362Z ·  ─────┬───── 2026-10-24T19:50:25.2074496Z · ╰── This modifies `audioLevels` 2026-10-24T19:50:25.2074550Z 213 │ } 2026-10-24T19:50:25.2074602Z ╰──── 2026-10-24T19:50:25.2074947Z  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-24T19:50:25.2075261Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T19:50:25.2075268Z 2026-10-24T19:50:25.2075613Z ⚠ 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-24T19:50:25.2075762Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T19:50:25.2075924Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T19:50:25.2076098Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T19:50:25.2076183Z ·  ───────── 2026-10-24T19:50:25.2076369Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T19:50:25.2076426Z ╰──── 2026-10-24T19:50:25.2076429Z 2026-10-24T19:50:25.2076767Z ⚠ 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-24T19:50:25.2076913Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T19:50:25.2077080Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T19:50:25.2077258Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T19:50:25.2077341Z ·  ───────── 2026-10-24T19:50:25.2077394Z 52 │ } 2026-10-24T19:50:25.2077445Z ╰──── 2026-10-24T19:50:25.2077447Z 2026-10-24T19:50:25.2077850Z ⚠ 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-24T19:50:25.2078030Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T19:50:25.2078094Z 54 │ assert.equal( 2026-10-24T19:50:25.2078269Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T19:50:25.2078339Z ·  ───────── 2026-10-24T19:50:25.2078395Z 56 │ true, 2026-10-24T19:50:25.2078445Z ╰──── 2026-10-24T19:50:25.2078448Z 2026-10-24T19:50:25.2078785Z ⚠ 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-24T19:50:25.2078926Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T19:50:25.2078993Z 58 │ assert.equal( 2026-10-24T19:50:25.2079183Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T19:50:25.2079255Z ·  ───────── 2026-10-24T19:50:25.2079311Z 60 │ true, 2026-10-24T19:50:25.2079362Z ╰──── 2026-10-24T19:50:25.2079364Z 2026-10-24T19:50:25.2079699Z ⚠ 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-24T19:50:25.2079849Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T19:50:25.2079901Z 102 │ 2026-10-24T19:50:25.2080068Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T19:50:25.2080152Z ·  ───────── 2026-10-24T19:50:25.2080212Z 104 │ }); 2026-10-24T19:50:25.2080265Z ╰──── 2026-10-24T19:50:25.2080268Z 2026-10-24T19:50:25.2080749Z ⚠ 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-24T19:50:25.2080872Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T19:50:25.2080947Z 138 │ Effect.gen(function* () { 2026-10-24T19:50:25.2081143Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T19:50:25.2081268Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T19:50:25.2081602Z 141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock 2026-10-24T19:50:25.2081794Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T19:50:25.2081924Z 143 │ ╰─▶ } 2026-10-24T19:50:25.2082008Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T19:50:25.2082060Z ╰──── 2026-10-24T19:50:25.2082063Z 2026-10-24T19:50:25.2082351Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T19:50:25.2082485Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T19:50:25.2082540Z 284 │ }, 2026-10-24T19:50:25.2082621Z 285 │ (effect, flow, stopSessions) => 2026-10-24T19:50:25.2082766Z ·  ──────┬───── 2026-10-24T19:50:25.2082952Z · ╰── 'stopSessions' is declared here 2026-10-24T19:50:25.2083017Z 286 │ effect.pipe( 2026-10-24T19:50:25.2083068Z ╰──── 2026-10-24T19:50:25.2083170Z  help: Consider removing this parameter. 2026-10-24T19:50:25.2083173Z 2026-10-24T19:50:25.2083381Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T19:50:25.2083529Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T19:50:25.2083584Z 236 │ 2026-10-24T19:50:25.2083701Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T19:50:25.2083785Z ·  ───────┬────── 2026-10-24T19:50:25.2083966Z · ╰── 'nonEmptyString' is declared here 2026-10-24T19:50:25.2084117Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T19:50:25.2084172Z ╰──── 2026-10-24T19:50:25.2084278Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2084281Z 2026-10-24T19:50:25.2084424Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2084576Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T19:50:25.2084758Z 151 │ 2026-10-24T19:50:25.2084836Z 152 │ {props.children(open)} 2026-10-24T19:50:25.2084925Z ·  ──┬─ 2026-10-24T19:50:25.2085084Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2085151Z 153 │ 2026-10-24T19:50:25.2085205Z ╰──── 2026-10-24T19:50:25.2085685Z  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-24T19:50:25.2085984Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2085986Z 2026-10-24T19:50:25.2086187Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T19:50:25.2086337Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T19:50:25.2086481Z 139 │ if (action.id !== undefined) { 2026-10-24T19:50:25.2086563Z 140 │ props.onPressAction?.({ 2026-10-24T19:50:25.2086638Z ·  ──┬── 2026-10-24T19:50:25.2086770Z · ╰── Missing dependency `props` 2026-10-24T19:50:25.2086863Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T19:50:25.2087009Z 142 │ } as Parameters>[0]); 2026-10-24T19:50:25.2087065Z 143 │ } 2026-10-24T19:50:25.2087121Z 144 │ }, 2026-10-24T19:50:25.2087202Z 145 │ [close, props.onPressAction], 2026-10-24T19:50:25.2087295Z ·  ─────────┬───────── 2026-10-24T19:50:25.2087512Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T19:50:25.2087567Z 146 │ ); 2026-10-24T19:50:25.2087619Z ╰──── 2026-10-24T19:50:25.2088184Z  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-24T19:50:25.2088550Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2088552Z 2026-10-24T19:50:25.2088931Z ⚠ 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-24T19:50:25.2089055Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T19:50:25.2089114Z 145 │ name, 2026-10-24T19:50:25.2089257Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T19:50:25.2089368Z ·  ────────────────────────── 2026-10-24T19:50:25.2089490Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T19:50:25.2089542Z ╰──── 2026-10-24T19:50:25.2089545Z 2026-10-24T19:50:25.2089805Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.2089937Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T19:50:25.2090045Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T19:50:25.2090110Z 84 │ useEffect(() => { 2026-10-24T19:50:25.2090180Z ·  ────┬──── 2026-10-24T19:50:25.2090311Z · ╰── This is the containing effect 2026-10-24T19:50:25.2090408Z 85 │ if (!actionState.isRunning) return; 2026-10-24T19:50:25.2090482Z 86 │ setNowMs(Date.now()); 2026-10-24T19:50:25.2090552Z ·  ────┬─── 2026-10-24T19:50:25.2090720Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.2090847Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T19:50:25.2090898Z ╰──── 2026-10-24T19:50:25.2091513Z  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-24T19:50:25.2091846Z  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-24T19:50:25.2091851Z 2026-10-24T19:50:25.2092060Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T19:50:25.2092195Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T19:50:25.2092269Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T19:50:25.2092338Z 3 │ type AuthSessionState, 2026-10-24T19:50:25.2092421Z ·  ────────┬─────── 2026-10-24T19:50:25.2092569Z · ╰── 'AuthSessionState' is imported here 2026-10-24T19:50:25.2092638Z 4 │ sessionGrantsScope, 2026-10-24T19:50:25.2092689Z ╰──── 2026-10-24T19:50:25.2092787Z  help: Consider removing this import. 2026-10-24T19:50:25.2092789Z 2026-10-24T19:50:25.2093081Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T19:50:25.2093249Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T19:50:25.2093432Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T19:50:25.2093527Z 35 │ instanceId === configured ? true : false, 2026-10-24T19:50:25.2093644Z ·  ──────────────────────────────────────── 2026-10-24T19:50:25.2093700Z 36 │ ); 2026-10-24T19:50:25.2093750Z ╰──── 2026-10-24T19:50:25.2093844Z  help: Remove this ternary operator 2026-10-24T19:50:25.2093847Z 2026-10-24T19:50:25.2094070Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T19:50:25.2094201Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T19:50:25.2094324Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T19:50:25.2094408Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T19:50:25.2094481Z ·  ─┬─ 2026-10-24T19:50:25.2094605Z · ╰── 'Arr' is imported here 2026-10-24T19:50:25.2094687Z 5 │ import * as Order from "effect/Order"; 2026-10-24T19:50:25.2094738Z ╰──── 2026-10-24T19:50:25.2094834Z  help: Consider removing this import. 2026-10-24T19:50:25.2094836Z 2026-10-24T19:50:25.2095030Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T19:50:25.2095159Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T19:50:25.2095236Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T19:50:25.2095317Z 5 │ import * as Order from "effect/Order"; 2026-10-24T19:50:25.2095399Z ·  ──┬── 2026-10-24T19:50:25.2095532Z · ╰── 'Order' is imported here 2026-10-24T19:50:25.2095582Z 6 │ 2026-10-24T19:50:25.2095633Z ╰──── 2026-10-24T19:50:25.2095729Z  help: Consider removing this import. 2026-10-24T19:50:25.2095731Z 2026-10-24T19:50:25.2096010Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2096155Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T19:50:25.2096209Z 60 │ ) { 2026-10-24T19:50:25.2096379Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T19:50:25.2096460Z ·  ──────┬────── 2026-10-24T19:50:25.2096606Z · ╰── 'useDragRegion' is declared here 2026-10-24T19:50:25.2096702Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T19:50:25.2096753Z ╰──── 2026-10-24T19:50:25.2096858Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2096860Z 2026-10-24T19:50:25.2097347Z ⚠ 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-24T19:50:25.2097504Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T19:50:25.2097598Z 1679 │ yield* harness.replaceSession; 2026-10-24T19:50:25.2097810Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T19:50:25.2098024Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T19:50:25.2098149Z 1682 │ │ break; 2026-10-24T19:50:25.2098228Z 1683 │ │ } 2026-10-24T19:50:25.2098337Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2098470Z 1685 │ ╰─▶ } 2026-10-24T19:50:25.2098546Z 1686 │ yield* Queue.offer( 2026-10-24T19:50:25.2098598Z ╰──── 2026-10-24T19:50:25.2098601Z 2026-10-24T19:50:25.2099078Z ⚠ 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-24T19:50:25.2099238Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T19:50:25.2099329Z 1788 │ yield* harness.replaceSession; 2026-10-24T19:50:25.2099540Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T19:50:25.2099700Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T19:50:25.2099807Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2099939Z 1792 │ ╰─▶ } 2026-10-24T19:50:25.2100070Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T19:50:25.2100123Z ╰──── 2026-10-24T19:50:25.2100126Z 2026-10-24T19:50:25.2100313Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T19:50:25.2100425Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T19:50:25.2100496Z 457 │ ): Array { 2026-10-24T19:50:25.2100602Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T19:50:25.2100703Z ·  ┬ 2026-10-24T19:50:25.2100849Z · ╰── '_' is declared here 2026-10-24T19:50:25.2100922Z 459 │ for (const b of data) { 2026-10-24T19:50:25.2100975Z ╰──── 2026-10-24T19:50:25.2101077Z  help: Consider removing this parameter. 2026-10-24T19:50:25.2101080Z 2026-10-24T19:50:25.2101303Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T19:50:25.2101440Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T19:50:25.2101572Z 1021 │ instanceId, 2026-10-24T19:50:25.2101748Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T19:50:25.2101890Z ·  ────────────────────────────────────────────────── 2026-10-24T19:50:25.2101950Z 1023 │ ]), 2026-10-24T19:50:25.2102001Z ╰──── 2026-10-24T19:50:25.2102273Z  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-24T19:50:25.2102276Z 2026-10-24T19:50:25.2102458Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T19:50:25.2102643Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T19:50:25.2102713Z 115 │ return [...commands]; 2026-10-24T19:50:25.2102854Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T19:50:25.2102976Z ·  ─────────┬───────── 2026-10-24T19:50:25.2103162Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T19:50:25.2103216Z 117 │ 2026-10-24T19:50:25.2103268Z ╰──── 2026-10-24T19:50:25.2103588Z  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-24T19:50:25.2103933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2103938Z 2026-10-24T19:50:25.2104165Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T19:50:25.2104306Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T19:50:25.2104371Z 20 │ [instanceId]: { 2026-10-24T19:50:25.2104451Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T19:50:25.2104552Z ·  ──────────────────────────── 2026-10-24T19:50:25.2104618Z 22 │ [model]: options, 2026-10-24T19:50:25.2104670Z ╰──── 2026-10-24T19:50:25.2104938Z  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-24T19:50:25.2104942Z 2026-10-24T19:50:25.2105143Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.2105285Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T19:50:25.2105370Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T19:50:25.2105436Z 1321 │ retryTick, 2026-10-24T19:50:25.2105511Z ·  ────┬──── 2026-10-24T19:50:25.2105656Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T19:50:25.2105728Z 1322 │ restoreQueuedMessage, 2026-10-24T19:50:25.2105779Z ╰──── 2026-10-24T19:50:25.2106079Z  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-24T19:50:25.2106399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2106402Z 2026-10-24T19:50:25.2106764Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.2106979Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T19:50:25.2107077Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T19:50:25.2107178Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T19:50:25.2107282Z ·  ──────┬───── 2026-10-24T19:50:25.2107453Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T19:50:25.2107558Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T19:50:25.2107609Z ╰──── 2026-10-24T19:50:25.2107903Z  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-24T19:50:25.2108227Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2108232Z 2026-10-24T19:50:25.2108704Z ⚠ 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-24T19:50:25.2108829Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T19:50:25.2108882Z 499 │ 2026-10-24T19:50:25.2108997Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T19:50:25.2109118Z ·  ────────────────────────── 2026-10-24T19:50:25.2109226Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T19:50:25.2109278Z ╰──── 2026-10-24T19:50:25.2109280Z 2026-10-24T19:50:25.2109505Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T19:50:25.2109642Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T19:50:25.2109716Z 89 │ let cursor = prompt.length; 2026-10-24T19:50:25.2109821Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T19:50:25.2109926Z ·  ─────── 2026-10-24T19:50:25.2110007Z 91 │ let { start, end } = occurrence; 2026-10-24T19:50:25.2110057Z ╰──── 2026-10-24T19:50:25.2110322Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T19:50:25.2110325Z 2026-10-24T19:50:25.2110543Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T19:50:25.2110671Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T19:50:25.2110725Z 40 │ 2026-10-24T19:50:25.2110846Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T19:50:25.2110954Z ·  ─────── 2026-10-24T19:50:25.2111049Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T19:50:25.2111101Z ╰──── 2026-10-24T19:50:25.2111361Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T19:50:25.2111363Z 2026-10-24T19:50:25.2111888Z ⚠ 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-24T19:50:25.2112051Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T19:50:25.2112144Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T19:50:25.2112252Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T19:50:25.2112371Z ·  ────────────────────────── 2026-10-24T19:50:25.2112440Z 130 │ Schema.Struct({ 2026-10-24T19:50:25.2112492Z ╰──── 2026-10-24T19:50:25.2112495Z 2026-10-24T19:50:25.2112873Z ⚠ 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-24T19:50:25.2112990Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T19:50:25.2113148Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T19:50:25.2113327Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T19:50:25.2113432Z ·  ────────────────────────── 2026-10-24T19:50:25.2113577Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T19:50:25.2113630Z ╰──── 2026-10-24T19:50:25.2113633Z 2026-10-24T19:50:25.2114013Z ⚠ 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-24T19:50:25.2114132Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T19:50:25.2114294Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T19:50:25.2114417Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T19:50:25.2114503Z ·  ───────── 2026-10-24T19:50:25.2114567Z 19 │ expect( 2026-10-24T19:50:25.2114617Z ╰──── 2026-10-24T19:50:25.2114619Z 2026-10-24T19:50:25.2114957Z ⚠ 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-24T19:50:25.2115075Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T19:50:25.2115135Z 19 │ expect( 2026-10-24T19:50:25.2115306Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T19:50:25.2115379Z ·  ───────── 2026-10-24T19:50:25.2115443Z 21 │ ).toBe(true); 2026-10-24T19:50:25.2115494Z ╰──── 2026-10-24T19:50:25.2115496Z 2026-10-24T19:50:25.2115753Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T19:50:25.2115869Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T19:50:25.2115922Z 55 │ 2026-10-24T19:50:25.2116022Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T19:50:25.2116132Z ·  ────────────────┬──────────────── 2026-10-24T19:50:25.2116325Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T19:50:25.2116413Z 57 │ selection: TerminalContextSelection, 2026-10-24T19:50:25.2116466Z ╰──── 2026-10-24T19:50:25.2116570Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2116573Z 2026-10-24T19:50:25.2116833Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2117024Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T19:50:25.2117111Z 407 │ 2026-10-24T19:50:25.2117181Z 408 │ const layer: Layer.Layer< 2026-10-24T19:50:25.2117249Z ·  ──┬── 2026-10-24T19:50:25.2117375Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.2117466Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T19:50:25.2117517Z ╰──── 2026-10-24T19:50:25.2117618Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2117621Z 2026-10-24T19:50:25.2117790Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.2117907Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T19:50:25.2118006Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T19:50:25.2118078Z 1136 │ Date.now(), 2026-10-24T19:50:25.2118164Z ·  ─────┬──── 2026-10-24T19:50:25.2118301Z · ╰── Cannot call impure function 2026-10-24T19:50:25.2118441Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T19:50:25.2118491Z ╰──── 2026-10-24T19:50:25.2118784Z  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-24T19:50:25.2119089Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.2119091Z 2026-10-24T19:50:25.2119357Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T19:50:25.2119511Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T19:50:25.2119564Z 1619 │ 2026-10-24T19:50:25.2119773Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T19:50:25.2119890Z ·  ──────────────────┬────────────────── 2026-10-24T19:50:25.2120097Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T19:50:25.2120173Z 1621 │ const meta = response._meta; 2026-10-24T19:50:25.2120225Z ╰──── 2026-10-24T19:50:25.2120327Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2120330Z 2026-10-24T19:50:25.2120858Z ⚠ 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-24T19:50:25.2121014Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T19:50:25.2121082Z 38 │ JSON.stringify( 2026-10-24T19:50:25.2121202Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T19:50:25.2121300Z ·  ──────────────────────── 2026-10-24T19:50:25.2121367Z 40 │ { name: "a" }, 2026-10-24T19:50:25.2121418Z ╰──── 2026-10-24T19:50:25.2121420Z 2026-10-24T19:50:25.2121884Z ⚠ 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-24T19:50:25.2122028Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T19:50:25.2122170Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T19:50:25.2122352Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T19:50:25.2122460Z ·  ──────────────────────── 2026-10-24T19:50:25.2122525Z 182 │ version: 1, 2026-10-24T19:50:25.2122576Z ╰──── 2026-10-24T19:50:25.2122579Z 2026-10-24T19:50:25.2122780Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.2122895Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T19:50:25.2122971Z 28 │ getPendingThreadOrder(); 2026-10-24T19:50:25.2123052Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T19:50:25.2123181Z ·  ────┬──── ───────┬────── 2026-10-24T19:50:25.2123382Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T19:50:25.2123522Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T19:50:25.2123587Z 30 │ return pending; 2026-10-24T19:50:25.2123637Z ╰──── 2026-10-24T19:50:25.2123969Z  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-24T19:50:25.2124286Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2124288Z 2026-10-24T19:50:25.2124666Z ⚠ 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-24T19:50:25.2124783Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T19:50:25.2124941Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T19:50:25.2125113Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T19:50:25.2125214Z ·  ──────────────────────── 2026-10-24T19:50:25.2125279Z 18 │ "review:write", 2026-10-24T19:50:25.2125330Z ╰──── 2026-10-24T19:50:25.2125333Z 2026-10-24T19:50:25.2125702Z ⚠ 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-24T19:50:25.2125872Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T19:50:25.2125962Z 19 │ ]); 2026-10-24T19:50:25.2126123Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T19:50:25.2126231Z ·  ──────────────────────── 2026-10-24T19:50:25.2126362Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T19:50:25.2126484Z ╰──── 2026-10-24T19:50:25.2126487Z 2026-10-24T19:50:25.2126853Z ⚠ 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-24T19:50:25.2126964Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T19:50:25.2127134Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T19:50:25.2127267Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T19:50:25.2127376Z ·  ──────────────────────── 2026-10-24T19:50:25.2127445Z 59 │ authenticated: true, 2026-10-24T19:50:25.2127495Z ╰──── 2026-10-24T19:50:25.2127498Z 2026-10-24T19:50:25.2127704Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T19:50:25.2127811Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T19:50:25.2127877Z 296 │ } from "./device.ts"; 2026-10-24T19:50:25.2127972Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T19:50:25.2128042Z ·  ── 2026-10-24T19:50:25.2128099Z 298 │ import { 2026-10-24T19:50:25.2128151Z ╰──── 2026-10-24T19:50:25.2128233Z  help: Remove empty braces 2026-10-24T19:50:25.2128235Z 2026-10-24T19:50:25.2128721Z ⚠ 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-24T19:50:25.2128874Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T19:50:25.2128934Z 168 │ }); 2026-10-24T19:50:25.2129134Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T19:50:25.2129332Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T19:50:25.2129437Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2129570Z 172 │ ╰─▶ } 2026-10-24T19:50:25.2129633Z 173 │ 2026-10-24T19:50:25.2129690Z ╰──── 2026-10-24T19:50:25.2129692Z 2026-10-24T19:50:25.2130167Z ⚠ 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-24T19:50:25.2130316Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T19:50:25.2130424Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T19:50:25.2130619Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T19:50:25.2130754Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T19:50:25.2130857Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2131068Z 181 │ ╰─▶ } 2026-10-24T19:50:25.2131164Z 182 │ 2026-10-24T19:50:25.2131216Z ╰──── 2026-10-24T19:50:25.2131219Z 2026-10-24T19:50:25.2131691Z ⚠ 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-24T19:50:25.2131836Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T19:50:25.2131965Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T19:50:25.2132160Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T19:50:25.2132287Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T19:50:25.2132485Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T19:50:25.2132572Z 310 │ │ break; 2026-10-24T19:50:25.2132650Z 311 │ │ } 2026-10-24T19:50:25.2132754Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2132885Z 313 │ ╰─▶ } 2026-10-24T19:50:25.2132938Z 314 │ 2026-10-24T19:50:25.2132992Z ╰──── 2026-10-24T19:50:25.2132994Z 2026-10-24T19:50:25.2133377Z ⚠ 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-24T19:50:25.2133513Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T19:50:25.2133666Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T19:50:25.2133824Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T19:50:25.2133985Z ·  ────────────────────────── 2026-10-24T19:50:25.2134101Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T19:50:25.2134152Z ╰──── 2026-10-24T19:50:25.2134154Z 2026-10-24T19:50:25.2134609Z ⚠ 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-24T19:50:25.2134740Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T19:50:25.2134884Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T19:50:25.2135077Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T19:50:25.2135191Z ·  ─────────────────── 2026-10-24T19:50:25.2135287Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T19:50:25.2135339Z ╰──── 2026-10-24T19:50:25.2135342Z 2026-10-24T19:50:25.2135557Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T19:50:25.2135692Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T19:50:25.2135816Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T19:50:25.2135923Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T19:50:25.2136089Z ·  ─────── 2026-10-24T19:50:25.2136234Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T19:50:25.2136287Z ╰──── 2026-10-24T19:50:25.2136553Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T19:50:25.2136555Z 2026-10-24T19:50:25.2136831Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2136937Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T19:50:25.2136990Z 35 │ 2026-10-24T19:50:25.2137122Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T19:50:25.2137197Z ·  ─────┬──── 2026-10-24T19:50:25.2137339Z · ╰── 'claudeCaps' is declared here 2026-10-24T19:50:25.2137413Z 37 │ optionDescriptors: [ 2026-10-24T19:50:25.2137464Z ╰──── 2026-10-24T19:50:25.2137570Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2137572Z 2026-10-24T19:50:25.2137736Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T19:50:25.2137896Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T19:50:25.2137949Z 1436 │ 2026-10-24T19:50:25.2138015Z 1437 │ for (const [] of [ 2026-10-24T19:50:25.2138085Z ·  ── 2026-10-24T19:50:25.2138159Z 1438 │ ["github", "github.com"], 2026-10-24T19:50:25.2138210Z ╰──── 2026-10-24T19:50:25.2138497Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T19:50:25.2138503Z 2026-10-24T19:50:25.2138699Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T19:50:25.2138837Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T19:50:25.2138900Z 1 │ import type { 2026-10-24T19:50:25.2138962Z 2 │ EnvironmentId, 2026-10-24T19:50:25.2139035Z ·  ──────┬────── 2026-10-24T19:50:25.2139174Z · ╰── 'EnvironmentId' is imported here 2026-10-24T19:50:25.2139261Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T19:50:25.2139312Z ╰──── 2026-10-24T19:50:25.2139411Z  help: Consider removing this import. 2026-10-24T19:50:25.2139414Z 2026-10-24T19:50:25.2139611Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T19:50:25.2139741Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T19:50:25.2139852Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T19:50:25.2139918Z 187 │ let next = initial; 2026-10-24T19:50:25.2139989Z ·  ──┬─ 2026-10-24T19:50:25.2140110Z · ╰── From this accumulator 2026-10-24T19:50:25.2140190Z 188 │ let receivedSnapshot = false; 2026-10-24T19:50:25.2140264Z 189 │ for (const item of items) { 2026-10-24T19:50:25.2140333Z ·  ─┬─ 2026-10-24T19:50:25.2140437Z · ╰── For this loop 2026-10-24T19:50:25.2140526Z 190 │ if (item.kind === "synchronized") { 2026-10-24T19:50:25.2140591Z 191 │ waiting = false; 2026-10-24T19:50:25.2140738Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T19:50:25.2140891Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T19:50:25.2140977Z ·  ───┬─── 2026-10-24T19:50:25.2141105Z · ╰── From this spread 2026-10-24T19:50:25.2141165Z 194 │ } 2026-10-24T19:50:25.2141216Z ╰──── 2026-10-24T19:50:25.2141373Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T19:50:25.2141527Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T19:50:25.2141530Z 2026-10-24T19:50:25.2141737Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T19:50:25.2141867Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T19:50:25.2141944Z 2 │ AuthFilesystemReadScope, 2026-10-24T19:50:25.2142016Z 3 │ type AuthSessionState, 2026-10-24T19:50:25.2142100Z ·  ────────┬─────── 2026-10-24T19:50:25.2142247Z · ╰── 'AuthSessionState' is imported here 2026-10-24T19:50:25.2142321Z 4 │ type FilesystemBrowseEntry, 2026-10-24T19:50:25.2142372Z ╰──── 2026-10-24T19:50:25.2142470Z  help: Consider removing this import. 2026-10-24T19:50:25.2142472Z 2026-10-24T19:50:25.2142737Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.2142930Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T19:50:25.2142983Z 117 │ 2026-10-24T19:50:25.2143047Z 118 │ useEffect(() => { 2026-10-24T19:50:25.2143124Z ·  ────┬──── 2026-10-24T19:50:25.2143258Z · ╰── This is the containing effect 2026-10-24T19:50:25.2143336Z 119 │ void refreshNotifications(); 2026-10-24T19:50:25.2143426Z ·  ──────────┬───────── 2026-10-24T19:50:25.2143604Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.2143747Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T19:50:25.2143798Z ╰──── 2026-10-24T19:50:25.2144487Z  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-24T19:50:25.2144849Z  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-24T19:50:25.2144851Z 2026-10-24T19:50:25.2145113Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.2145298Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T19:50:25.2145350Z 125 │ 2026-10-24T19:50:25.2145414Z 126 │ useEffect(() => { 2026-10-24T19:50:25.2145484Z ·  ────┬──── 2026-10-24T19:50:25.2145613Z · ╰── This is the containing effect 2026-10-24T19:50:25.2145677Z 127 │ if (!isLoaded) { 2026-10-24T19:50:25.2145771Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T19:50:25.2145866Z ·  ──────────┬────────── 2026-10-24T19:50:25.2146040Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.2146102Z 129 │ return; 2026-10-24T19:50:25.2146153Z ╰──── 2026-10-24T19:50:25.2146765Z  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-24T19:50:25.2147093Z  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-24T19:50:25.2147095Z 2026-10-24T19:50:25.2147267Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T19:50:25.2147464Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T19:50:25.2147604Z 219 │ 2026-10-24T19:50:25.2147746Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T19:50:25.2147856Z ·  ──┬─ 2026-10-24T19:50:25.2148028Z · ╰── 'U+001B' is a control character. 2026-10-24T19:50:25.2148091Z 221 │ 2026-10-24T19:50:25.2148142Z ╰──── 2026-10-24T19:50:25.2148385Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T19:50:25.2148390Z 2026-10-24T19:50:25.2148573Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T19:50:25.2148735Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T19:50:25.2148843Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T19:50:25.2149028Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T19:50:25.2149176Z ·  ─────┬───── 2026-10-24T19:50:25.2149383Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T19:50:25.2149465Z 101 │ const readEditor = useCallback( 2026-10-24T19:50:25.2149583Z ╰──── 2026-10-24T19:50:25.2149937Z  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-24T19:50:25.2150256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2150261Z 2026-10-24T19:50:25.2150443Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T19:50:25.2150608Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T19:50:25.2150670Z 120 │ setEditor, 2026-10-24T19:50:25.2150734Z 121 │ startEditor, 2026-10-24T19:50:25.2150810Z ·  ─────┬───── 2026-10-24T19:50:25.2150961Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T19:50:25.2151028Z 122 │ hasChanges, 2026-10-24T19:50:25.2151080Z ╰──── 2026-10-24T19:50:25.2151396Z  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-24T19:50:25.2151710Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2151712Z 2026-10-24T19:50:25.2151911Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T19:50:25.2152006Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T19:50:25.2152093Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T19:50:25.2152183Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T19:50:25.2152262Z ·  ──┬── 2026-10-24T19:50:25.2152391Z · ╰── 'Fiber' is imported here 2026-10-24T19:50:25.2152491Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T19:50:25.2152543Z ╰──── 2026-10-24T19:50:25.2152641Z  help: Consider removing this import. 2026-10-24T19:50:25.2152644Z 2026-10-24T19:50:25.2152842Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T19:50:25.2152934Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T19:50:25.2153013Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T19:50:25.2153106Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T19:50:25.2153185Z ·  ────┬─── 2026-10-24T19:50:25.2153325Z · ╰── 'Schedule' is imported here 2026-10-24T19:50:25.2153413Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T19:50:25.2153465Z ╰──── 2026-10-24T19:50:25.2153562Z  help: Consider removing this import. 2026-10-24T19:50:25.2153564Z 2026-10-24T19:50:25.2153867Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2153994Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T19:50:25.2154151Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T19:50:25.2154350Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T19:50:25.2154459Z ·  ────────────┬─────────── 2026-10-24T19:50:25.2154692Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T19:50:25.2154896Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T19:50:25.2154950Z ╰──── 2026-10-24T19:50:25.2155055Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2155058Z 2026-10-24T19:50:25.2155320Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T19:50:25.2155466Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T19:50:25.2155623Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T19:50:25.2155703Z 12 │ this.onmessage = listener; 2026-10-24T19:50:25.2155781Z ·  ───────── 2026-10-24T19:50:25.2155839Z 13 │ } 2026-10-24T19:50:25.2155899Z ╰──── 2026-10-24T19:50:25.2156223Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T19:50:25.2156226Z 2026-10-24T19:50:25.2156432Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T19:50:25.2156574Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T19:50:25.2156640Z 15 │ constructor() { 2026-10-24T19:50:25.2156706Z 16 │ source = this; 2026-10-24T19:50:25.2156776Z ·  ────── 2026-10-24T19:50:25.2156833Z 17 │ } 2026-10-24T19:50:25.2156885Z ╰──── 2026-10-24T19:50:25.2157171Z  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-24T19:50:25.2157176Z 2026-10-24T19:50:25.2157385Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T19:50:25.2157547Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T19:50:25.2157635Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T19:50:25.2157751Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T19:50:25.2157834Z ·  ─────┬───── 2026-10-24T19:50:25.2157975Z · ╰── 'HostProcess' is imported here 2026-10-24T19:50:25.2158029Z 26 │ 2026-10-24T19:50:25.2158082Z ╰──── 2026-10-24T19:50:25.2158177Z  help: Consider removing this import. 2026-10-24T19:50:25.2158181Z 2026-10-24T19:50:25.2158466Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2158637Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T19:50:25.2158720Z 123 │ const path = yield* Path.Path; 2026-10-24T19:50:25.2158839Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T19:50:25.2158920Z ·  ──────┬───── 2026-10-24T19:50:25.2159059Z · ╰── 'serverConfig' is declared here 2026-10-24T19:50:25.2159202Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T19:50:25.2159253Z ╰──── 2026-10-24T19:50:25.2159355Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2159358Z 2026-10-24T19:50:25.2159697Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2159896Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T19:50:25.2160011Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T19:50:25.2160152Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T19:50:25.2160239Z ·  ───────┬────── 2026-10-24T19:50:25.2160386Z · ╰── 'serverSettings' is declared here 2026-10-24T19:50:25.2160524Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T19:50:25.2160574Z ╰──── 2026-10-24T19:50:25.2160677Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2160680Z 2026-10-24T19:50:25.2160893Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T19:50:25.2161066Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T19:50:25.2161140Z 14 │ } from "@t3tools/contracts"; 2026-10-24T19:50:25.2161229Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T19:50:25.2161299Z ·  ── 2026-10-24T19:50:25.2161351Z 16 │ 2026-10-24T19:50:25.2161401Z ╰──── 2026-10-24T19:50:25.2161483Z  help: Remove empty braces 2026-10-24T19:50:25.2161486Z 2026-10-24T19:50:25.2161718Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T19:50:25.2161838Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T19:50:25.2161892Z 11 │ 2026-10-24T19:50:25.2161994Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T19:50:25.2162098Z ·  ────────────┬──────────── 2026-10-24T19:50:25.2162270Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T19:50:25.2162336Z 13 │ readonly thread: { 2026-10-24T19:50:25.2162387Z ╰──── 2026-10-24T19:50:25.2162492Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2162494Z 2026-10-24T19:50:25.2162761Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2162893Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T19:50:25.2162946Z 339 │ 2026-10-24T19:50:25.2163049Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T19:50:25.2163131Z ·  ────┬──── 2026-10-24T19:50:25.2163267Z · ╰── 'layerTest' is declared here 2026-10-24T19:50:25.2163317Z ╰──── 2026-10-24T19:50:25.2163422Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2163424Z 2026-10-24T19:50:25.2163641Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T19:50:25.2163748Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T19:50:25.2163812Z 1078 │ } 2026-10-24T19:50:25.2164151Z ·  ───────────────────────────────────────────── 2026-10-24T19:50:25.2164235Z 1080 │ screenOptions={({ route }) => 2026-10-24T19:50:25.2164286Z ╰──── 2026-10-24T19:50:25.2164720Z  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-24T19:50:25.2164786Z 2026-10-24T19:50:25.2164995Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T19:50:25.2165134Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T19:50:25.2165297Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T19:50:25.2165387Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2165480Z ·  ───────────┬─────────── 2026-10-24T19:50:25.2165958Z · ╰── 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-24T19:50:25.2166038Z 229 │ mostRecentEventCount, 2026-10-24T19:50:25.2166093Z 230 │ ); 2026-10-24T19:50:25.2166215Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T19:50:25.2166353Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T19:50:25.2166628Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2166710Z 232 │ const assumedValue = props.value; 2026-10-24T19:50:25.2166762Z ╰──── 2026-10-24T19:50:25.2166933Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T19:50:25.2167260Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2167266Z 2026-10-24T19:50:25.2167484Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.2167620Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T19:50:25.2167765Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T19:50:25.2167856Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2167946Z ·  ───────────┬─────────── 2026-10-24T19:50:25.2168421Z · ╰── 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-24T19:50:25.2168565Z 240 │ controlledEventCount, 2026-10-24T19:50:25.2168672Z 241 │ assumedValue, 2026-10-24T19:50:25.2168729Z 242 │ ); 2026-10-24T19:50:25.2168886Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T19:50:25.2169024Z ·  ───────────┬────────── 2026-10-24T19:50:25.2169237Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T19:50:25.2169330Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T19:50:25.2169380Z ╰──── 2026-10-24T19:50:25.2169812Z  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-24T19:50:25.2170138Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2170145Z 2026-10-24T19:50:25.2170295Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2170433Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T19:50:25.2170558Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T19:50:25.2170670Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T19:50:25.2170789Z ·  ─────────────┬──────────── 2026-10-24T19:50:25.2170960Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2171016Z 165 │ }); 2026-10-24T19:50:25.2171075Z ╰──── 2026-10-24T19:50:25.2171559Z  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-24T19:50:25.2171854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2171857Z 2026-10-24T19:50:25.2172001Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2172140Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T19:50:25.2172262Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T19:50:25.2172373Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T19:50:25.2172492Z ·  ─────────────┬──────────── 2026-10-24T19:50:25.2172707Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2172764Z 165 │ }); 2026-10-24T19:50:25.2172815Z ╰──── 2026-10-24T19:50:25.2173290Z  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-24T19:50:25.2173584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2173587Z 2026-10-24T19:50:25.2173798Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2174001Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T19:50:25.2174058Z 165 │ }); 2026-10-24T19:50:25.2174146Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T19:50:25.2174272Z ·  ─────────┬────────────┬─── 2026-10-24T19:50:25.2174464Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.2174584Z · ╰── This value is a ref 2026-10-24T19:50:25.2174655Z 167 │ return JSON.stringify( 2026-10-24T19:50:25.2174707Z ╰──── 2026-10-24T19:50:25.2175187Z  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-24T19:50:25.2175485Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2175487Z 2026-10-24T19:50:25.2175634Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2175767Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T19:50:25.2175839Z 207 │ mostRecentEventCount, 2026-10-24T19:50:25.2175928Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2176036Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.2176227Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2176287Z 209 │ ); 2026-10-24T19:50:25.2176344Z ╰──── 2026-10-24T19:50:25.2176818Z  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-24T19:50:25.2177111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2177116Z 2026-10-24T19:50:25.2177259Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2177394Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T19:50:25.2177466Z 213 │ mostRecentEventCount, 2026-10-24T19:50:25.2177552Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2177659Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.2177856Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2177913Z 215 │ ); 2026-10-24T19:50:25.2177966Z ╰──── 2026-10-24T19:50:25.2178437Z  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-24T19:50:25.2178730Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2178732Z 2026-10-24T19:50:25.2178923Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T19:50:25.2179117Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T19:50:25.2179268Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T19:50:25.2179378Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T19:50:25.2179489Z ·  ─────────┬──────── 2026-10-24T19:50:25.2179971Z · ╰── 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-24T19:50:25.2180026Z 165 │ }); 2026-10-24T19:50:25.2180114Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T19:50:25.2180185Z 167 │ return JSON.stringify( 2026-10-24T19:50:25.2180357Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T19:50:25.2180428Z 169 │ const record = 2026-10-24T19:50:25.2180506Z 170 │ token.type === "context" 2026-10-24T19:50:25.2180673Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T19:50:25.2180740Z 172 │ : undefined; 2026-10-24T19:50:25.2180850Z 173 │ const presentation = contextChipPresentation( 2026-10-24T19:50:25.2180959Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T19:50:25.2181022Z 175 │ record, 2026-10-24T19:50:25.2181081Z 176 │ ); 2026-10-24T19:50:25.2181165Z 177 │ const icon = contextChipIcon( 2026-10-24T19:50:25.2181232Z 178 │ presentation, 2026-10-24T19:50:25.2181376Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T19:50:25.2181441Z 180 │ ); 2026-10-24T19:50:25.2181507Z 181 │ return { 2026-10-24T19:50:25.2181576Z 182 │ type: token.type, 2026-10-24T19:50:25.2181650Z 183 │ source: token.source, 2026-10-24T19:50:25.2181724Z 184 │ start: token.start, 2026-10-24T19:50:25.2181789Z 185 │ end: token.end, 2026-10-24T19:50:25.2181939Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T19:50:25.2182000Z 187 │ label: 2026-10-24T19:50:25.2182078Z 188 │ token.type === "skill" 2026-10-24T19:50:25.2182185Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T19:50:25.2182270Z 190 │ : token.type === "context" 2026-10-24T19:50:25.2182516Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T19:50:25.2182601Z 192 │ : basename(token.value), 2026-10-24T19:50:25.2182745Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T19:50:25.2182838Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T19:50:25.2182926Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T19:50:25.2182985Z 196 │ }; 2026-10-24T19:50:25.2183042Z 197 │ }), 2026-10-24T19:50:25.2183097Z 198 │ ); 2026-10-24T19:50:25.2183231Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T19:50:25.2183385Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T19:50:25.2183593Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2183917Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T19:50:25.2184007Z ╰──── 2026-10-24T19:50:25.2184220Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T19:50:25.2184538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2184541Z 2026-10-24T19:50:25.2184729Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T19:50:25.2184868Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T19:50:25.2185000Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T19:50:25.2185103Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T19:50:25.2185199Z ·  ───────────┬─────────── 2026-10-24T19:50:25.2185673Z · ╰── 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-24T19:50:25.2185767Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T19:50:25.2185831Z 256 │ value, 2026-10-24T19:50:25.2185908Z 257 │ selection: nextSelection, 2026-10-24T19:50:25.2185965Z 258 │ }); 2026-10-24T19:50:25.2186051Z 259 │ return acknowledgedEventCount; 2026-10-24T19:50:25.2186108Z 260 │ }, 2026-10-24T19:50:25.2186162Z 261 │ [], 2026-10-24T19:50:25.2186231Z ·  ─┬ 2026-10-24T19:50:25.2186423Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2186481Z 262 │ ); 2026-10-24T19:50:25.2186531Z ╰──── 2026-10-24T19:50:25.2186738Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T19:50:25.2187056Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2187059Z 2026-10-24T19:50:25.2187205Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2187326Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T19:50:25.2187392Z 184 │ "options", 2026-10-24T19:50:25.2187485Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T19:50:25.2187595Z ·  ────────────────┬─────────────── 2026-10-24T19:50:25.2187846Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2187976Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T19:50:25.2188028Z ╰──── 2026-10-24T19:50:25.2188503Z  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-24T19:50:25.2188800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2188803Z 2026-10-24T19:50:25.2188948Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2189071Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T19:50:25.2189166Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T19:50:25.2189260Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T19:50:25.2189369Z ·  ────────────────┬──────────────── 2026-10-24T19:50:25.2189562Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2189654Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T19:50:25.2189707Z ╰──── 2026-10-24T19:50:25.2190177Z  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-24T19:50:25.2190475Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2190481Z 2026-10-24T19:50:25.2190680Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.2190827Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T19:50:25.2190914Z 35 │ { 2026-10-24T19:50:25.2194223Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T19:50:25.2194332Z ·  ──────────────────────── 2026-10-24T19:50:25.2194470Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T19:50:25.2194522Z ╰──── 2026-10-24T19:50:25.2194524Z 2026-10-24T19:50:25.2194894Z ⚠ 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-24T19:50:25.2195016Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T19:50:25.2195115Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T19:50:25.2195272Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T19:50:25.2195394Z ·  ──────────────────────── 2026-10-24T19:50:25.2195458Z 257 │ return [ 2026-10-24T19:50:25.2195509Z ╰──── 2026-10-24T19:50:25.2195512Z 2026-10-24T19:50:25.2195713Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T19:50:25.2195816Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T19:50:25.2195904Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T19:50:25.2195994Z 28 │ import { identity } from "effect/Function"; 2026-10-24T19:50:25.2196069Z ·  ────┬─── 2026-10-24T19:50:25.2196204Z · ╰── 'identity' is imported here 2026-10-24T19:50:25.2196288Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T19:50:25.2196341Z ╰──── 2026-10-24T19:50:25.2196437Z  help: Consider removing this import. 2026-10-24T19:50:25.2196446Z 2026-10-24T19:50:25.2196643Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T19:50:25.2196788Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T19:50:25.2196921Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T19:50:25.2197039Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T19:50:25.2197112Z ·  ──┬── 2026-10-24T19:50:25.2197238Z · ╰── 'Image' is imported here 2026-10-24T19:50:25.2197289Z 18 │ 2026-10-24T19:50:25.2197340Z ╰──── 2026-10-24T19:50:25.2197435Z  help: Consider removing this import. 2026-10-24T19:50:25.2197437Z 2026-10-24T19:50:25.2197700Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T19:50:25.2197874Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T19:50:25.2198039Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T19:50:25.2198128Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2198220Z ·  ───────────┬─────────── 2026-10-24T19:50:25.2198690Z · ╰── 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-24T19:50:25.2198766Z 227 │ mostRecentEventCount, 2026-10-24T19:50:25.2198823Z 228 │ ); 2026-10-24T19:50:25.2198946Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T19:50:25.2199086Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T19:50:25.2199295Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2199378Z 230 │ const assumedValue = props.value; 2026-10-24T19:50:25.2199430Z ╰──── 2026-10-24T19:50:25.2199600Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T19:50:25.2199920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2199922Z 2026-10-24T19:50:25.2200140Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T19:50:25.2200290Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T19:50:25.2200436Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T19:50:25.2200523Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2200615Z ·  ───────────┬─────────── 2026-10-24T19:50:25.2201085Z · ╰── 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-24T19:50:25.2201160Z 238 │ controlledEventCount, 2026-10-24T19:50:25.2201225Z 239 │ assumedValue, 2026-10-24T19:50:25.2201284Z 240 │ ); 2026-10-24T19:50:25.2202459Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T19:50:25.2202618Z ·  ───────────┬────────── 2026-10-24T19:50:25.2202841Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T19:50:25.2202932Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T19:50:25.2202982Z ╰──── 2026-10-24T19:50:25.2203417Z  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-24T19:50:25.2203737Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2203740Z 2026-10-24T19:50:25.2204000Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2204181Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T19:50:25.2204304Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T19:50:25.2204418Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T19:50:25.2204535Z ·  ─────────────┬──────────── 2026-10-24T19:50:25.2204707Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2204763Z 163 │ }); 2026-10-24T19:50:25.2204815Z ╰──── 2026-10-24T19:50:25.2205296Z  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-24T19:50:25.2205598Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2205605Z 2026-10-24T19:50:25.2205750Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2205896Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T19:50:25.2206018Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T19:50:25.2206128Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T19:50:25.2206244Z ·  ─────────────┬──────────── 2026-10-24T19:50:25.2206712Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2206776Z 163 │ }); 2026-10-24T19:50:25.2206831Z ╰──── 2026-10-24T19:50:25.2207305Z  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-24T19:50:25.2207597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2207600Z 2026-10-24T19:50:25.2207746Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2207890Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T19:50:25.2207944Z 163 │ }); 2026-10-24T19:50:25.2208034Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T19:50:25.2208229Z ·  ─────────┬────────────┬─── 2026-10-24T19:50:25.2208463Z · │ ╰── Cannot update ref value during render 2026-10-24T19:50:25.2208581Z · ╰── This value is a ref 2026-10-24T19:50:25.2208654Z 165 │ return JSON.stringify( 2026-10-24T19:50:25.2208705Z ╰──── 2026-10-24T19:50:25.2209177Z  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-24T19:50:25.2209468Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2209473Z 2026-10-24T19:50:25.2209622Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2209768Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T19:50:25.2209838Z 205 │ mostRecentEventCount, 2026-10-24T19:50:25.2209924Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2210029Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.2210218Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2210273Z 207 │ ); 2026-10-24T19:50:25.2210323Z ╰──── 2026-10-24T19:50:25.2210800Z  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-24T19:50:25.2211095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2211098Z 2026-10-24T19:50:25.2211242Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2211386Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T19:50:25.2211455Z 211 │ mostRecentEventCount, 2026-10-24T19:50:25.2211542Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T19:50:25.2211645Z ·  ───────────────┬─────────────── 2026-10-24T19:50:25.2211833Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T19:50:25.2211886Z 213 │ ); 2026-10-24T19:50:25.2211937Z ╰──── 2026-10-24T19:50:25.2212413Z  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-24T19:50:25.2212708Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2212710Z 2026-10-24T19:50:25.2212899Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T19:50:25.2213040Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T19:50:25.2213161Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T19:50:25.2213273Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T19:50:25.2213435Z ·  ─────────┬──────── 2026-10-24T19:50:25.2213967Z · ╰── 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-24T19:50:25.2214023Z 163 │ }); 2026-10-24T19:50:25.2214113Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T19:50:25.2214185Z 165 │ return JSON.stringify( 2026-10-24T19:50:25.2214348Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T19:50:25.2214415Z 167 │ const record = 2026-10-24T19:50:25.2214494Z 168 │ token.type === "context" 2026-10-24T19:50:25.2214665Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T19:50:25.2214732Z 170 │ : undefined; 2026-10-24T19:50:25.2214840Z 171 │ const presentation = contextChipPresentation( 2026-10-24T19:50:25.2214950Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T19:50:25.2215012Z 173 │ record, 2026-10-24T19:50:25.2215069Z 174 │ ); 2026-10-24T19:50:25.2215153Z 175 │ const icon = contextChipIcon( 2026-10-24T19:50:25.2215219Z 176 │ presentation, 2026-10-24T19:50:25.2215363Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T19:50:25.2215419Z 178 │ ); 2026-10-24T19:50:25.2215481Z 179 │ return { 2026-10-24T19:50:25.2215552Z 180 │ type: token.type, 2026-10-24T19:50:25.2215626Z 181 │ source: token.source, 2026-10-24T19:50:25.2215696Z 182 │ start: token.start, 2026-10-24T19:50:25.2215769Z 183 │ end: token.end, 2026-10-24T19:50:25.2215920Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T19:50:25.2215979Z 185 │ label: 2026-10-24T19:50:25.2216055Z 186 │ token.type === "skill" 2026-10-24T19:50:25.2216161Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T19:50:25.2216242Z 188 │ : token.type === "context" 2026-10-24T19:50:25.2216480Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T19:50:25.2216561Z 190 │ : basename(token.value), 2026-10-24T19:50:25.2216704Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T19:50:25.2216796Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T19:50:25.2216888Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T19:50:25.2216947Z 194 │ }; 2026-10-24T19:50:25.2217005Z 195 │ }), 2026-10-24T19:50:25.2217059Z 196 │ ); 2026-10-24T19:50:25.2217192Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T19:50:25.2217344Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T19:50:25.2217552Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2217691Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T19:50:25.2217742Z ╰──── 2026-10-24T19:50:25.2217953Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T19:50:25.2218335Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2218376Z 2026-10-24T19:50:25.2218565Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T19:50:25.2218706Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T19:50:25.2218834Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T19:50:25.2218936Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T19:50:25.2219029Z ·  ───────────┬─────────── 2026-10-24T19:50:25.2219500Z · ╰── 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-24T19:50:25.2219595Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T19:50:25.2219656Z 254 │ value, 2026-10-24T19:50:25.2219733Z 255 │ selection: nextSelection, 2026-10-24T19:50:25.2219790Z 256 │ }); 2026-10-24T19:50:25.2219872Z 257 │ return acknowledgedEventCount; 2026-10-24T19:50:25.2219925Z 258 │ }, 2026-10-24T19:50:25.2219979Z 259 │ [], 2026-10-24T19:50:25.2220047Z ·  ─┬ 2026-10-24T19:50:25.2220228Z · ╰── This dependency list is missing values used by the callback 2026-10-24T19:50:25.2220282Z 260 │ ); 2026-10-24T19:50:25.2220333Z ╰──── 2026-10-24T19:50:25.2220541Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T19:50:25.2220863Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2220869Z 2026-10-24T19:50:25.2221037Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T19:50:25.2221158Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T19:50:25.2221211Z 265 │ 2026-10-24T19:50:25.2221316Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T19:50:25.2221387Z ·  ── 2026-10-24T19:50:25.2221441Z 267 │ } 2026-10-24T19:50:25.2221492Z ╰──── 2026-10-24T19:50:25.2221724Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T19:50:25.2221727Z 2026-10-24T19:50:25.2221994Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2222163Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T19:50:25.2222215Z 409 │ 2026-10-24T19:50:25.2222340Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T19:50:25.2222409Z ·  ──┬── 2026-10-24T19:50:25.2222534Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.2222586Z ╰──── 2026-10-24T19:50:25.2222691Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2222694Z 2026-10-24T19:50:25.2223231Z ⚠ 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-24T19:50:25.2223395Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T19:50:25.2223493Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T19:50:25.2223731Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T19:50:25.2223852Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T19:50:25.2224030Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T19:50:25.2224162Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T19:50:25.2224260Z 2619 │ │ flush: () => { 2026-10-24T19:50:25.2224381Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T19:50:25.2224536Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T19:50:25.2224620Z 2622 │ │ }, 2026-10-24T19:50:25.2224700Z 2623 │ │ }; 2026-10-24T19:50:25.2224770Z 2624 │ │ 2026-10-24T19:50:25.2224929Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T19:50:25.2225034Z 2626 │ │ let requestChecks = 0; 2026-10-24T19:50:25.2225163Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T19:50:25.2225271Z 2628 │ │ executionMode: "async", 2026-10-24T19:50:25.2225390Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T19:50:25.2225507Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T19:50:25.2225643Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T19:50:25.2225747Z 2632 │ │ requestChecks += 1; 2026-10-24T19:50:25.2225887Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T19:50:25.2226003Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T19:50:25.2226099Z 2635 │ │ return true; 2026-10-24T19:50:25.2226180Z 2636 │ │ }, 2026-10-24T19:50:25.2226259Z 2637 │ │ }; 2026-10-24T19:50:25.2226329Z 2638 │ │ 2026-10-24T19:50:25.2226450Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T19:50:25.2226543Z 2640 │ │ ...WINDOW, 2026-10-24T19:50:25.2226731Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T19:50:25.2226958Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T19:50:25.2227037Z 2643 │ │ }; 2026-10-24T19:50:25.2227148Z 2644 │ │ const first = yield* service 2026-10-24T19:50:25.2227252Z 2645 │ │ .readSummary(input) 2026-10-24T19:50:25.2227341Z 2646 │ │ .pipe( 2026-10-24T19:50:25.2227437Z 2647 │ │ Effect.exit, 2026-10-24T19:50:25.2227594Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T19:50:25.2227696Z 2649 │ │ Effect.forkChild, 2026-10-24T19:50:25.2227783Z 2650 │ │ ); 2026-10-24T19:50:25.2227888Z 2651 │ │ requestFiber = first; 2026-10-24T19:50:25.2227993Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2228094Z 2653 │ │ dispatcher.flush(); 2026-10-24T19:50:25.2228165Z 2654 │ │ 2026-10-24T19:50:25.2228318Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T19:50:25.2228415Z 2656 │ │ Effect.match({ 2026-10-24T19:50:25.2228537Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T19:50:25.2228659Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T19:50:25.2228742Z 2659 │ │ }), 2026-10-24T19:50:25.2228904Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T19:50:25.2229007Z 2661 │ │ Effect.forkChild, 2026-10-24T19:50:25.2229087Z 2662 │ │ ); 2026-10-24T19:50:25.2229191Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2229293Z 2664 │ │ dispatcher.flush(); 2026-10-24T19:50:25.2229417Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T19:50:25.2229531Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T19:50:25.2229645Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T19:50:25.2229755Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T19:50:25.2229841Z 2669 │ │ break; 2026-10-24T19:50:25.2229925Z 2670 │ │ } 2026-10-24T19:50:25.2230046Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T19:50:25.2230203Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T19:50:25.2230281Z 2673 │ │ } 2026-10-24T19:50:25.2230431Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T19:50:25.2230565Z 2675 │ ╰─▶ } 2026-10-24T19:50:25.2230619Z 2676 │ 2026-10-24T19:50:25.2230670Z ╰──── 2026-10-24T19:50:25.2230674Z 2026-10-24T19:50:25.2230886Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T19:50:25.2231070Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T19:50:25.2231152Z 78 │ 2026-10-24T19:50:25.2231289Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T19:50:25.2231375Z ·  ────────┬─────── 2026-10-24T19:50:25.2231524Z · ╰── 'describeSchedule' is declared here 2026-10-24T19:50:25.2231631Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T19:50:25.2231683Z ╰──── 2026-10-24T19:50:25.2231785Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2231788Z 2026-10-24T19:50:25.2231976Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T19:50:25.2232090Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T19:50:25.2232146Z 7 │ () => 2026-10-24T19:50:25.2232218Z 8 │ Gesture.Hover() 2026-10-24T19:50:25.2232298Z ·  ──┬── 2026-10-24T19:50:25.2232432Z · ╰── `Hover` may be a component 2026-10-24T19:50:25.2232505Z 9 │ .manualActivation(true) 2026-10-24T19:50:25.2232555Z ╰──── 2026-10-24T19:50:25.2232840Z  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-24T19:50:25.2233296Z  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-24T19:50:25.2233299Z 2026-10-24T19:50:25.2233508Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T19:50:25.2233615Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T19:50:25.2233761Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T19:50:25.2233874Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T19:50:25.2233988Z ·  ──────┬────── 2026-10-24T19:50:25.2234132Z · ╰── 'HookForwarder' is imported here 2026-10-24T19:50:25.2234234Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T19:50:25.2234285Z ╰──── 2026-10-24T19:50:25.2234382Z  help: Consider removing this import. 2026-10-24T19:50:25.2234385Z 2026-10-24T19:50:25.2234654Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2234776Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T19:50:25.2234832Z 168 │ 2026-10-24T19:50:25.2234910Z 169 │ const layerTest = Layer.succeed( 2026-10-24T19:50:25.2234983Z ·  ────┬──── 2026-10-24T19:50:25.2235114Z · ╰── 'layerTest' is declared here 2026-10-24T19:50:25.2235179Z 170 │ UsageService, 2026-10-24T19:50:25.2235229Z ╰──── 2026-10-24T19:50:25.2235331Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2235334Z 2026-10-24T19:50:25.2235809Z ⚠ 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-24T19:50:25.2236050Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T19:50:25.2236157Z 520 │ })).delivery; 2026-10-24T19:50:25.2236355Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T19:50:25.2236468Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2236615Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T19:50:25.2236714Z 524 │ │ id: task.id, 2026-10-24T19:50:25.2236828Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T19:50:25.2236924Z 526 │ │ })).delivery; 2026-10-24T19:50:25.2237061Z 527 │ ╰─▶ } 2026-10-24T19:50:25.2237183Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T19:50:25.2237241Z ╰──── 2026-10-24T19:50:25.2237243Z 2026-10-24T19:50:25.2237472Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T19:50:25.2237595Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T19:50:25.2237651Z 730 │ ); 2026-10-24T19:50:25.2237823Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T19:50:25.2237919Z ·  ────── 2026-10-24T19:50:25.2238033Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T19:50:25.2238084Z ╰──── 2026-10-24T19:50:25.2238259Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T19:50:25.2238262Z 2026-10-24T19:50:25.2238481Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T19:50:25.2238656Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T19:50:25.2238724Z 1782 │ assert.equal( 2026-10-24T19:50:25.2238872Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T19:50:25.2238975Z ·  ────────────────────────── 2026-10-24T19:50:25.2239055Z 1784 │ stored.attachments[0]?.id, 2026-10-24T19:50:25.2239107Z ╰──── 2026-10-24T19:50:25.2239279Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T19:50:25.2239282Z 2026-10-24T19:50:25.2239570Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2239723Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7] 2026-10-24T19:50:25.2239781Z 12394 │ 2026-10-24T19:50:25.2239925Z 12395 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T19:50:25.2240011Z ·  ────────┬─────── 2026-10-24T19:50:25.2240160Z · ╰── 'layerUnavailable' is declared here 2026-10-24T19:50:25.2240228Z 12396 │ OrchestratorV2, 2026-10-24T19:50:25.2240280Z ╰──── 2026-10-24T19:50:25.2240385Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2240388Z 2026-10-24T19:50:25.2240688Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2240909Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T19:50:25.2240994Z 345 │ 2026-10-24T19:50:25.2241096Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T19:50:25.2241190Z ·  ────────────┬─────────── 2026-10-24T19:50:25.2241360Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T19:50:25.2241438Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T19:50:25.2241488Z ╰──── 2026-10-24T19:50:25.2241590Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2241594Z 2026-10-24T19:50:25.2241797Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T19:50:25.2241966Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T19:50:25.2242040Z 3 │ AuthProvidersManageScope, 2026-10-24T19:50:25.2242116Z 4 │ type AuthSessionState, 2026-10-24T19:50:25.2242202Z ·  ────────┬─────── 2026-10-24T19:50:25.2242349Z · ╰── 'AuthSessionState' is imported here 2026-10-24T19:50:25.2242415Z 5 │ type EnvironmentId, 2026-10-24T19:50:25.2242464Z ╰──── 2026-10-24T19:50:25.2242561Z  help: Consider removing this import. 2026-10-24T19:50:25.2242564Z 2026-10-24T19:50:25.2242825Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T19:50:25.2242967Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T19:50:25.2243019Z 150 │ 2026-10-24T19:50:25.2243083Z 151 │ useEffect(() => { 2026-10-24T19:50:25.2243154Z ·  ────┬──── 2026-10-24T19:50:25.2243290Z · ╰── This is the containing effect 2026-10-24T19:50:25.2243376Z 152 │ if (!controlledSelectedPath) { 2026-10-24T19:50:25.2243436Z 153 │ return; 2026-10-24T19:50:25.2243492Z 154 │ } 2026-10-24T19:50:25.2243573Z 155 │ setExpandedPaths((current) => { 2026-10-24T19:50:25.2243653Z ·  ────────┬─────── 2026-10-24T19:50:25.2243827Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T19:50:25.2243984Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T19:50:25.2244038Z ╰──── 2026-10-24T19:50:25.2244659Z  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-24T19:50:25.2244990Z  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-24T19:50:25.2244993Z 2026-10-24T19:50:25.2245222Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T19:50:25.2245397Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T19:50:25.2245465Z 1997 │ assert.equal( 2026-10-24T19:50:25.2245612Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T19:50:25.2245690Z ·  ────── 2026-10-24T19:50:25.2245767Z 1999 │ "authoritative answer", 2026-10-24T19:50:25.2245820Z ╰──── 2026-10-24T19:50:25.2246048Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T19:50:25.2246084Z 2026-10-24T19:50:25.2246825Z ⚠ 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-24T19:50:25.2246997Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T19:50:25.2247181Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T19:50:25.2247387Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T19:50:25.2247494Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2247634Z 3953 │ ╰─▶ } 2026-10-24T19:50:25.2247757Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T19:50:25.2247810Z ╰──── 2026-10-24T19:50:25.2247812Z 2026-10-24T19:50:25.2248283Z ⚠ 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-24T19:50:25.2248452Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T19:50:25.2248541Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T19:50:25.2248726Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T19:50:25.2248843Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2248980Z 6064 │ ╰─▶ } 2026-10-24T19:50:25.2249152Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T19:50:25.2249205Z ╰──── 2026-10-24T19:50:25.2249207Z 2026-10-24T19:50:25.2249677Z ⚠ 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-24T19:50:25.2249847Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T19:50:25.2249932Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T19:50:25.2250120Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T19:50:25.2250230Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T19:50:25.2250365Z 6199 │ ╰─▶ } 2026-10-24T19:50:25.2250529Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T19:50:25.2250580Z ╰──── 2026-10-24T19:50:25.2250583Z 2026-10-24T19:50:25.2250845Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2251012Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7] 2026-10-24T19:50:25.2251064Z 10601 │ 2026-10-24T19:50:25.2251138Z 10602 │ const layer: Layer.Layer< 2026-10-24T19:50:25.2251211Z ·  ──┬── 2026-10-24T19:50:25.2251417Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.2251551Z 10603 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T19:50:25.2251604Z ╰──── 2026-10-24T19:50:25.2251707Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2251709Z 2026-10-24T19:50:25.2251912Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.2252059Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T19:50:25.2252157Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T19:50:25.2252236Z 257 │ }, [props.path, targetIndex]); 2026-10-24T19:50:25.2252312Z ·  ─────┬──── 2026-10-24T19:50:25.2252457Z · ╰── Unnecessary dependency `props.path` 2026-10-24T19:50:25.2252518Z 258 │ 2026-10-24T19:50:25.2252576Z ╰──── 2026-10-24T19:50:25.2252881Z  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-24T19:50:25.2253196Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2253200Z 2026-10-24T19:50:25.2253394Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T19:50:25.2253545Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T19:50:25.2253619Z 292 │ 2026-10-24T19:50:25.2254736Z ·  ─────────── 2026-10-24T19:50:25.2254802Z 310 │ {body} 2026-10-24T19:50:25.2254852Z ╰──── 2026-10-24T19:50:25.2255059Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T19:50:25.2255206Z 2026-10-24T19:50:25.2255544Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2255711Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T19:50:25.2255766Z 1443 │ 2026-10-24T19:50:25.2255882Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T19:50:25.2256000Z ·  ───────────────────┬─────────────────── 2026-10-24T19:50:25.2256209Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T19:50:25.2256328Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T19:50:25.2256379Z ╰──── 2026-10-24T19:50:25.2256487Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2256495Z 2026-10-24T19:50:25.2256756Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T19:50:25.2256918Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T19:50:25.2256971Z 1679 │ 2026-10-24T19:50:25.2257041Z 1680 │ const layer: Layer.Layer< 2026-10-24T19:50:25.2257112Z ·  ──┬── 2026-10-24T19:50:25.2257238Z · ╰── 'layer' is declared here 2026-10-24T19:50:25.2257330Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T19:50:25.2257380Z ╰──── 2026-10-24T19:50:25.2257481Z  help: Consider removing this declaration. 2026-10-24T19:50:25.2257483Z 2026-10-24T19:50:25.2257776Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T19:50:25.2257937Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T19:50:25.2257994Z 162 │ keys, 2026-10-24T19:50:25.2258065Z 163 │ overridingProjects = [], 2026-10-24T19:50:25.2258147Z ·  ── 2026-10-24T19:50:25.2258214Z 164 │ onClearOverrides, 2026-10-24T19:50:25.2258265Z ╰──── 2026-10-24T19:50:25.2258587Z  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-24T19:50:25.2258590Z 2026-10-24T19:50:25.2259071Z ⚠ 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-24T19:50:25.2259255Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T19:50:25.2259326Z 222 │ let idlePasses = 0; 2026-10-24T19:50:25.2259470Z 223 │ ╭─▶ for (;;) { 2026-10-24T19:50:25.2259607Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T19:50:25.2259751Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T19:50:25.2259847Z 226 │ │ if (!pending) { 2026-10-24T19:50:25.2259939Z 227 │ │ idlePasses++; 2026-10-24T19:50:25.2260044Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T19:50:25.2260184Z 229 │ │ return; 2026-10-24T19:50:25.2260300Z 230 │ │ } 2026-10-24T19:50:25.2260385Z 231 │ │ continue; 2026-10-24T19:50:25.2260460Z 232 │ │ } 2026-10-24T19:50:25.2260553Z 233 │ │ idlePasses = 0; 2026-10-24T19:50:25.2260669Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T19:50:25.2260882Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T19:50:25.2260960Z 236 │ │ ); 2026-10-24T19:50:25.2261066Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T19:50:25.2261171Z 238 │ │ pending.resolve(exit); 2026-10-24T19:50:25.2261253Z 239 │ │ }); 2026-10-24T19:50:25.2261384Z 240 │ ╰─▶ } 2026-10-24T19:50:25.2261441Z 241 │ }, 2026-10-24T19:50:25.2261492Z ╰──── 2026-10-24T19:50:25.2261494Z 2026-10-24T19:50:25.2261640Z ⚠ react(refs): Cannot access refs during render 2026-10-24T19:50:25.2261795Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T19:50:25.2261853Z 493 │ > 2026-10-24T19:50:25.2261931Z 494 │ {props.children(close)} 2026-10-24T19:50:25.2262019Z ·  ──┬── 2026-10-24T19:50:25.2262183Z · ╰── Cannot access ref value during render 2026-10-24T19:50:25.2262259Z 495 │ 2026-10-24T19:50:25.2262311Z ╰──── 2026-10-24T19:50:25.2262796Z  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-24T19:50:25.2263094Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T19:50:25.2263097Z 2026-10-24T19:50:25.2263328Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T19:50:25.2263455Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T19:50:25.2263525Z 14 │ threadSearchMatchKey, 2026-10-24T19:50:25.2263609Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T19:50:25.2263718Z ·  ──────────────┬───────────── 2026-10-24T19:50:25.2263936Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T19:50:25.2264046Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T19:50:25.2264096Z ╰──── 2026-10-24T19:50:25.2264194Z  help: Consider removing this import. 2026-10-24T19:50:25.2264197Z 2026-10-24T19:50:25.2264399Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T19:50:25.2264528Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T19:50:25.2264657Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T19:50:25.2264749Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T19:50:25.2264849Z ·  ───────┬────── 2026-10-24T19:50:25.2265074Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T19:50:25.2265243Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T19:50:25.2265294Z ╰──── 2026-10-24T19:50:25.2265594Z  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-24T19:50:25.2265909Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T19:50:25.2265912Z 2026-10-24T19:50:25.2266082Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T19:50:25.2266209Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T19:50:25.2266299Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T19:50:25.2266461Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T19:50:25.2266588Z ·  ─────┬──── 2026-10-24T19:50:25.2266756Z · ╰── Cannot call impure function 2026-10-24T19:50:25.2266836Z 519 │ const id = setTimeout(() => { 2026-10-24T19:50:25.2266886Z ╰──── 2026-10-24T19:50:25.2267174Z  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-24T19:50:25.2267471Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T19:50:25.2267480Z 2026-10-24T19:50:25.2267566Z Found 0 errors and 367 warnings in 5477 files (6.0s, 8 threads) 2026-10-24T19:50:25.2721503Z Post job cleanup. 2026-10-24T19:50:25.3354088Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T19:50:25.3430046Z Post job cleanup. 2026-10-24T19:50:25.4253471Z ##[start-action display=Cache full pnpm store;id=__3cb0b5a0-99dd-466d-942d-2b46cf806664.__actions_cache] 2026-10-24T19:50:25.4576184Z Post job cleanup. 2026-10-24T19:50:25.5205336Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T19:50:25.5241400Z ##[end-action id=__3cb0b5a0-99dd-466d-942d-2b46cf806664.__actions_cache;outcome=success;conclusion=success;duration_ms=98] 2026-10-24T19:50:25.5242736Z ##[start-action display=Cache Vite+;id=__3cb0b5a0-99dd-466d-942d-2b46cf806664.vp_cache] 2026-10-24T19:50:25.5267847Z Post job cleanup. 2026-10-24T19:50:25.5908802Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-24T19:50:25.5944615Z ##[end-action id=__3cb0b5a0-99dd-466d-942d-2b46cf806664.vp_cache;outcome=success;conclusion=success;duration_ms=70] 2026-10-24T19:50:25.5975576Z Post job cleanup. 2026-10-24T19:50:25.6392786Z [command]/usr/local/bin/git version 2026-10-24T19:50:25.6423535Z git version 2.55.0 2026-10-24T19:50:25.6441258Z Temporarily overriding HOME='/home/runner/_work/_temp/9232ecfb-87b8-4140-bf64-9b5aafb3d816' before making global git config changes 2026-10-24T19:50:25.6441616Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T19:50:25.6444413Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T19:50:25.6468881Z Removing SSH command configuration 2026-10-24T19:50:25.6471874Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T19:50:25.6496901Z [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-24T19:50:25.6632044Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T19:50:25.6650424Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T19:50:25.6696225Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T19:50:25.6709235Z ##[group]Run '/job_completed.sh' 2026-10-24T19:50:25.6715280Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T19:50:25.6715452Z env: 2026-10-24T19:50:25.6715567Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 157 2026-10-24T19:50:25.6715717Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 352 2026-10-24T19:50:25.6715860Z BLACKSMITH_CHECK_RUN_ID: 120970600013 2026-10-24T19:50:25.6716004Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T19:50:25.6716155Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T19:50:25.6716291Z ##[endgroup] 2026-10-24T19:50:25.6795078Z Docker container cache not activated, skipping hash computation. 2026-10-24T19:50:25.7071947Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T19:50:25.7593835Z Cleaning up orphan processes