2026-10-24T14:29:10.0992803Z Current runner version: '2.338.1' 2026-10-24T14:29:10.0997091Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-tg2zuvlhgxpwc3ti' 2026-10-24T14:29:10.0997936Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T14:29:10.0998912Z Machine name: 'ip-172-31-73-130' 2026-10-24T14:29:10.1000601Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T14:29:10.1001954Z Contents: read 2026-10-24T14:29:10.1002350Z Metadata: read 2026-10-24T14:29:10.1002812Z ##[endgroup] 2026-10-24T14:29:10.1004112Z Secret source: None 2026-10-24T14:29:10.1004777Z Cache mode: write 2026-10-24T14:29:10.1005292Z Prepare workflow directory 2026-10-24T14:29:10.1190532Z Prepare all required actions 2026-10-24T14:29:10.1216473Z Getting action download info 2026-10-24T14:29:10.2357744Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T14:29:10.2747260Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T14:29:10.3831423Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T14:29:10.3870310Z Complete job name: Lint 2026-10-24T14:29:10.4232192Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T14:29:10.4352308Z ##[group]Run '/setup.sh' 2026-10-24T14:29:10.4368427Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:29:10.4368846Z env: 2026-10-24T14:29:10.4369069Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:10.4369362Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:10.4369645Z BLACKSMITH_CHECK_RUN_ID: 120897908140 2026-10-24T14:29:10.4369925Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T14:29:10.4370193Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T14:29:10.4370448Z ##[endgroup] 2026-10-24T14:29:10.4597454Z Logging daemon started (blacksmithd for logs) 2026-10-24T14:29:10.4683009Z Results daemon started (blacksmithd for results) 2026-10-24T14:29:10.4809164Z Background adoption and SSH setup started (PID: 3128) 2026-10-24T14:29:10.4812661Z 2026-10-24T14:29:10.4812911Z ---------------------------------------- 2026-10-24T14:29:10.4813408Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40102689594/jobs/120897908140 2026-10-24T14:29:10.4813832Z SSH Access (using your GitHub SSH key): 2026-10-24T14:29:10.4814260Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-tg2zuvlhgxpwc3ti.vm.blacksmith.sh 2026-10-24T14:29:10.4814577Z 2026-10-24T14:29:10.4814683Z No GitHub SSH key? Add one at: 2026-10-24T14:29:10.4815180Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T14:29:10.4815591Z 2026-10-24T14:29:10.4815697Z ---------------------------------------- 2026-10-24T14:29:10.4815874Z 2026-10-24T14:29:10.4816018Z VM ID: blacksmith-8vcpu-ubuntu-2404-tg2zuvlhgxpwc3ti 2026-10-24T14:29:10.4816344Z Host: production-152.236.39.222-x8664 2026-10-24T14:29:10.4821549Z Host Agent PID: 4096800 2026-10-24T14:29:10.4821985Z Host Agent Git SHA: 1637818df 2026-10-24T14:29:10.4822281Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T14:29:10.4822569Z Blacksmith Host Generation: gen 2 2026-10-24T14:29:10.4822858Z Petname: production-absolute-frog-60c1d2fd 2026-10-24T14:29:10.4823146Z Region: us-east 2026-10-24T14:29:10.4823382Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T14:29:10.4823906Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T14:29:10.4824757Z 2026-10-24T14:29:10.4824872Z Enabling Blacksmith transparent cache 2026-10-24T14:29:10.5098359Z ##[group]Run actions/checkout@v6 2026-10-24T14:29:10.5098667Z with: 2026-10-24T14:29:10.5098999Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T14:29:10.5099405Z sparse-checkout-cone-mode: false 2026-10-24T14:29:10.5099688Z repository: pingdotgg/t3code 2026-10-24T14:29:10.5101438Z token: *** 2026-10-24T14:29:10.5101655Z ssh-strict: true 2026-10-24T14:29:10.5101873Z ssh-user: git 2026-10-24T14:29:10.5102102Z persist-credentials: true 2026-10-24T14:29:10.5102502Z clean: true 2026-10-24T14:29:10.5102714Z fetch-depth: 1 2026-10-24T14:29:10.5102926Z fetch-tags: false 2026-10-24T14:29:10.5103149Z show-progress: true 2026-10-24T14:29:10.5103377Z lfs: false 2026-10-24T14:29:10.5103583Z submodules: false 2026-10-24T14:29:10.5103815Z set-safe-directory: true 2026-10-24T14:29:10.5104069Z allow-unsafe-pr-checkout: false 2026-10-24T14:29:10.5104341Z env: 2026-10-24T14:29:10.5104578Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:10.5104864Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:10.5105147Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:10.5105407Z ##[endgroup] 2026-10-24T14:29:10.6155854Z Syncing repository: pingdotgg/t3code 2026-10-24T14:29:10.6157090Z ##[group]Getting Git version info 2026-10-24T14:29:10.6157521Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T14:29:10.6158000Z [command]/usr/local/bin/git version 2026-10-24T14:29:10.6229270Z git version 2.55.0 2026-10-24T14:29:10.6240612Z ##[endgroup] 2026-10-24T14:29:10.6247586Z Temporarily overriding HOME='/home/runner/_work/_temp/0381e839-7a96-4843-b6b7-6146b462f322' before making global git config changes 2026-10-24T14:29:10.6248250Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T14:29:10.6250817Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T14:29:10.6280422Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T14:29:10.6282031Z ##[group]Determining repository object format 2026-10-24T14:29:10.6283204Z ##[endgroup] 2026-10-24T14:29:10.6283565Z ##[group]Initializing the repository 2026-10-24T14:29:10.6285214Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T14:29:10.6317998Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T14:29:10.6318489Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T14:29:10.6318964Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T14:29:10.6319328Z hint: call: 2026-10-24T14:29:10.6319528Z hint: 2026-10-24T14:29:10.6319796Z hint: git config --global init.defaultBranch 2026-10-24T14:29:10.6320103Z hint: 2026-10-24T14:29:10.6320402Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T14:29:10.6320856Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T14:29:10.6321221Z hint: 2026-10-24T14:29:10.6321430Z hint: git branch -m 2026-10-24T14:29:10.6321667Z hint: 2026-10-24T14:29:10.6321974Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T14:29:10.6322441Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T14:29:10.6323735Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T14:29:10.6349404Z ##[endgroup] 2026-10-24T14:29:10.6349792Z ##[group]Disabling automatic garbage collection 2026-10-24T14:29:10.6352812Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T14:29:10.6372465Z ##[endgroup] 2026-10-24T14:29:10.6373058Z ##[group]Setting up auth 2026-10-24T14:29:10.6373479Z Removing SSH command configuration 2026-10-24T14:29:10.6377061Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T14:29:10.6398737Z [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-24T14:29:10.6519867Z Removing HTTP extra header 2026-10-24T14:29:10.6522553Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T14:29:10.6543697Z [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-24T14:29:10.6633742Z Removing includeIf entries pointing to credentials config files 2026-10-24T14:29:10.6637439Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T14:29:10.6659153Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T14:29:10.6753152Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-6a5b4164-5445-4141-83f8-c6df22f556e5.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T14:29:10.6774468Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-6a5b4164-5445-4141-83f8-c6df22f556e5.config 2026-10-24T14:29:10.6793679Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-6a5b4164-5445-4141-83f8-c6df22f556e5.config 2026-10-24T14:29:10.6813153Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-6a5b4164-5445-4141-83f8-c6df22f556e5.config 2026-10-24T14:29:10.6831745Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-6a5b4164-5445-4141-83f8-c6df22f556e5.config 2026-10-24T14:29:10.6848936Z ##[endgroup] 2026-10-24T14:29:10.6849313Z ##[group]Fetching the repository 2026-10-24T14:29:10.6852859Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +c26f3dd8bcacb9741692a86334248fdbbff8a0a3:refs/remotes/pull/22029/merge 2026-10-24T14:29:10.9741976Z From https://github.com/pingdotgg/t3code 2026-10-24T14:29:10.9742972Z * [new ref] c26f3dd8bcacb9741692a86334248fdbbff8a0a3 -> pull/22029/merge 2026-10-24T14:29:10.9761729Z ##[endgroup] 2026-10-24T14:29:10.9762487Z ##[group]Determining the checkout info 2026-10-24T14:29:10.9763292Z ##[endgroup] 2026-10-24T14:29:10.9763961Z ##[group]Setting up sparse checkout 2026-10-24T14:29:10.9765499Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T14:29:10.9788639Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T14:29:10.9804166Z .git/info/sparse-checkout 2026-10-24T14:29:10.9808170Z ##[endgroup] 2026-10-24T14:29:10.9808934Z ##[group]Checking out the ref 2026-10-24T14:29:10.9810740Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/22029/merge 2026-10-24T14:29:17.6294350Z Updating files: 0% (1/6400) 2026-10-24T14:29:17.6322012Z Updating files: 1% (64/6400) 2026-10-24T14:29:17.6339838Z Updating files: 2% (128/6400) 2026-10-24T14:29:17.6360555Z Updating files: 3% (192/6400) 2026-10-24T14:29:17.6381272Z Updating files: 4% (256/6400) 2026-10-24T14:29:17.6411558Z Updating files: 5% (320/6400) 2026-10-24T14:29:17.6433159Z Updating files: 6% (384/6400) 2026-10-24T14:29:17.6485988Z Updating files: 7% (448/6400) 2026-10-24T14:29:17.6515369Z Updating files: 8% (512/6400) 2026-10-24T14:29:17.6539031Z Updating files: 9% (576/6400) 2026-10-24T14:29:17.6831824Z Updating files: 10% (640/6400) 2026-10-24T14:29:17.6847977Z Updating files: 11% (704/6400) 2026-10-24T14:29:17.6858748Z Updating files: 12% (768/6400) 2026-10-24T14:29:17.6874011Z Updating files: 13% (832/6400) 2026-10-24T14:29:17.6890023Z Updating files: 14% (896/6400) 2026-10-24T14:29:17.6909232Z Updating files: 15% (960/6400) 2026-10-24T14:29:17.6927680Z Updating files: 16% (1024/6400) 2026-10-24T14:29:17.6942298Z Updating files: 17% (1088/6400) 2026-10-24T14:29:17.6960429Z Updating files: 18% (1152/6400) 2026-10-24T14:29:17.6975148Z Updating files: 19% (1216/6400) 2026-10-24T14:29:17.6998308Z Updating files: 20% (1280/6400) 2026-10-24T14:29:17.7015472Z Updating files: 21% (1344/6400) 2026-10-24T14:29:17.7034115Z Updating files: 22% (1408/6400) 2026-10-24T14:29:17.7047390Z Updating files: 23% (1472/6400) 2026-10-24T14:29:17.7060764Z Updating files: 24% (1536/6400) 2026-10-24T14:29:17.7076778Z Updating files: 25% (1600/6400) 2026-10-24T14:29:17.7090435Z Updating files: 26% (1664/6400) 2026-10-24T14:29:17.7105297Z Updating files: 27% (1728/6400) 2026-10-24T14:29:17.7124569Z Updating files: 28% (1792/6400) 2026-10-24T14:29:17.7156861Z Updating files: 29% (1856/6400) 2026-10-24T14:29:17.7177523Z Updating files: 30% (1920/6400) 2026-10-24T14:29:17.7201431Z Updating files: 31% (1984/6400) 2026-10-24T14:29:17.7230822Z Updating files: 32% (2048/6400) 2026-10-24T14:29:17.7259114Z Updating files: 33% (2112/6400) 2026-10-24T14:29:17.7329196Z Updating files: 34% (2176/6400) 2026-10-24T14:29:17.7386111Z Updating files: 35% (2240/6400) 2026-10-24T14:29:17.7421903Z Updating files: 36% (2304/6400) 2026-10-24T14:29:17.7453688Z Updating files: 37% (2368/6400) 2026-10-24T14:29:17.7499725Z Updating files: 38% (2432/6400) 2026-10-24T14:29:17.7527306Z Updating files: 39% (2496/6400) 2026-10-24T14:29:17.7557188Z Updating files: 40% (2560/6400) 2026-10-24T14:29:17.7584073Z Updating files: 41% (2624/6400) 2026-10-24T14:29:17.7599133Z Updating files: 42% (2688/6400) 2026-10-24T14:29:17.7609145Z Updating files: 43% (2752/6400) 2026-10-24T14:29:17.7638496Z Updating files: 44% (2816/6400) 2026-10-24T14:29:17.7665752Z Updating files: 45% (2880/6400) 2026-10-24T14:29:17.7692952Z Updating files: 46% (2944/6400) 2026-10-24T14:29:17.7718421Z Updating files: 47% (3008/6400) 2026-10-24T14:29:17.7746469Z Updating files: 48% (3072/6400) 2026-10-24T14:29:17.7784672Z Updating files: 49% (3136/6400) 2026-10-24T14:29:17.7812095Z Updating files: 50% (3200/6400) 2026-10-24T14:29:17.7827441Z Updating files: 51% (3264/6400) 2026-10-24T14:29:17.7862624Z Updating files: 52% (3328/6400) 2026-10-24T14:29:17.7890317Z Updating files: 53% (3392/6400) 2026-10-24T14:29:17.7909882Z Updating files: 54% (3456/6400) 2026-10-24T14:29:17.7933042Z Updating files: 55% (3520/6400) 2026-10-24T14:29:17.7948211Z Updating files: 56% (3584/6400) 2026-10-24T14:29:17.7967379Z Updating files: 57% (3648/6400) 2026-10-24T14:29:17.7984966Z Updating files: 58% (3712/6400) 2026-10-24T14:29:17.8347939Z Updating files: 59% (3776/6400) 2026-10-24T14:29:17.8362485Z Updating files: 60% (3840/6400) 2026-10-24T14:29:17.8381661Z Updating files: 61% (3904/6400) 2026-10-24T14:29:17.8399397Z Updating files: 62% (3968/6400) 2026-10-24T14:29:17.8421322Z Updating files: 63% (4032/6400) 2026-10-24T14:29:17.8447755Z Updating files: 64% (4096/6400) 2026-10-24T14:29:17.8467286Z Updating files: 65% (4160/6400) 2026-10-24T14:29:17.8484207Z Updating files: 66% (4224/6400) 2026-10-24T14:29:17.8507204Z Updating files: 67% (4288/6400) 2026-10-24T14:29:17.8522405Z Updating files: 68% (4352/6400) 2026-10-24T14:29:17.8539972Z Updating files: 69% (4416/6400) 2026-10-24T14:29:17.8552746Z Updating files: 70% (4480/6400) 2026-10-24T14:29:17.8570803Z Updating files: 71% (4544/6400) 2026-10-24T14:29:17.8583415Z Updating files: 72% (4608/6400) 2026-10-24T14:29:17.8631233Z Updating files: 73% (4672/6400) 2026-10-24T14:29:17.9045374Z Updating files: 74% (4736/6400) 2026-10-24T14:29:17.9066743Z Updating files: 75% (4800/6400) 2026-10-24T14:29:17.9090101Z Updating files: 76% (4864/6400) 2026-10-24T14:29:17.9115018Z Updating files: 77% (4928/6400) 2026-10-24T14:29:17.9136094Z Updating files: 78% (4992/6400) 2026-10-24T14:29:17.9152321Z Updating files: 79% (5056/6400) 2026-10-24T14:29:17.9174489Z Updating files: 80% (5120/6400) 2026-10-24T14:29:17.9190649Z Updating files: 81% (5184/6400) 2026-10-24T14:29:17.9208552Z Updating files: 82% (5248/6400) 2026-10-24T14:29:17.9231412Z Updating files: 83% (5312/6400) 2026-10-24T14:29:17.9255986Z Updating files: 84% (5376/6400) 2026-10-24T14:29:17.9273506Z Updating files: 85% (5440/6400) 2026-10-24T14:29:17.9299666Z Updating files: 86% (5504/6400) 2026-10-24T14:29:17.9370767Z Updating files: 87% (5568/6400) 2026-10-24T14:29:17.9400519Z Updating files: 88% (5632/6400) 2026-10-24T14:29:17.9419857Z Updating files: 89% (5696/6400) 2026-10-24T14:29:17.9449140Z Updating files: 90% (5760/6400) 2026-10-24T14:29:17.9477330Z Updating files: 91% (5824/6400) 2026-10-24T14:29:17.9492138Z Updating files: 92% (5888/6400) 2026-10-24T14:29:17.9513960Z Updating files: 93% (5952/6400) 2026-10-24T14:29:17.9534135Z Updating files: 94% (6016/6400) 2026-10-24T14:29:17.9557933Z Updating files: 95% (6080/6400) 2026-10-24T14:29:17.9614346Z Updating files: 96% (6144/6400) 2026-10-24T14:29:17.9637484Z Updating files: 97% (6208/6400) 2026-10-24T14:29:17.9682851Z Updating files: 98% (6272/6400) 2026-10-24T14:29:17.9702230Z Updating files: 99% (6336/6400) 2026-10-24T14:29:17.9703459Z Updating files: 100% (6400/6400) 2026-10-24T14:29:17.9703881Z Updating files: 100% (6400/6400), done. 2026-10-24T14:29:17.9854060Z Note: switching to 'refs/remotes/pull/22029/merge'. 2026-10-24T14:29:17.9854266Z 2026-10-24T14:29:17.9854450Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T14:29:17.9854788Z changes and commit them, and you can discard any commits you make in this 2026-10-24T14:29:17.9855124Z state without impacting any branches by switching back to a branch. 2026-10-24T14:29:17.9855310Z 2026-10-24T14:29:17.9855458Z If you want to create a new branch to retain commits you create, you may 2026-10-24T14:29:17.9855793Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T14:29:17.9855970Z 2026-10-24T14:29:17.9856069Z git switch -c 2026-10-24T14:29:17.9856204Z 2026-10-24T14:29:17.9856300Z Or undo this operation with: 2026-10-24T14:29:17.9856416Z 2026-10-24T14:29:17.9856495Z git switch - 2026-10-24T14:29:17.9856598Z 2026-10-24T14:29:17.9856770Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T14:29:17.9856969Z 2026-10-24T14:29:17.9857218Z HEAD is now at c26f3dd Merge cab866468ea55076d613c1a1b4f95c746aacad18 into d53873b6a4799e87afd63c8d288ef0089f5a3748 2026-10-24T14:29:17.9866806Z ##[endgroup] 2026-10-24T14:29:17.9899033Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T14:29:17.9917084Z c26f3dd8bcacb9741692a86334248fdbbff8a0a3 2026-10-24T14:29:17.9995738Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T14:29:17.9996016Z files="$(git ls-files .github/pr-assets)" 2026-10-24T14:29:17.9996235Z if test -n "$files"; then 2026-10-24T14:29:17.9996497Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T14:29:17.9996737Z  exit 1 2026-10-24T14:29:17.9996888Z fi 2026-10-24T14:29:18.0018093Z shell: /usr/bin/bash -e {0} 2026-10-24T14:29:18.0018254Z env: 2026-10-24T14:29:18.0018394Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:18.0018584Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:18.0018753Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:18.0018917Z ##[endgroup] 2026-10-24T14:29:18.0169796Z Prepare all required actions 2026-10-24T14:29:18.0170140Z Getting action download info 2026-10-24T14:29:18.1143223Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T14:29:18.2508533Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T14:29:18.2508724Z env: 2026-10-24T14:29:18.2508871Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:18.2509044Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:18.2509221Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:18.2509379Z ##[endgroup] 2026-10-24T14:29:18.3841794Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T14:29:18.3860025Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T14:29:18.3860512Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T14:29:18.3860842Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T14:29:18.3861211Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T14:29:18.3883121Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:29:18.3883338Z env: 2026-10-24T14:29:18.3883484Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:18.3883658Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:18.3883827Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:18.3883988Z ##[endgroup] 2026-10-24T14:29:18.3959515Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T14:29:18.3960971Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T14:29:18.4008512Z ##[group]Run actions/cache@v6 2026-10-24T14:29:18.4008683Z with: 2026-10-24T14:29:18.4008810Z path: ~/.vite-plus 2026-10-24T14:29:18.4008999Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T14:29:18.4009220Z enableCrossOsArchive: false 2026-10-24T14:29:18.4009375Z fail-on-cache-miss: false 2026-10-24T14:29:18.4009526Z lookup-only: false 2026-10-24T14:29:18.4009660Z save-always: false 2026-10-24T14:29:18.4009793Z env: 2026-10-24T14:29:18.4009925Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:18.4010096Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:18.4010263Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:18.4010416Z ##[endgroup] 2026-10-24T14:29:18.5973375Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T14:29:18.9928883Z Received 170349591 of 170349591 (100.0%), 436.7 MBs/sec 2026-10-24T14:29:18.9929760Z Cache Size: ~162 MB (170349591 B) 2026-10-24T14:29:18.9955406Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/0ba8ef30-7f66-4fb1-9c1e-26bb46b00ab7/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T14:29:19.6452218Z Cache restored successfully 2026-10-24T14:29:19.6592002Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T14:29:19.6674364Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1271] 2026-10-24T14:29:19.6676563Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T14:29:19.6695955Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T14:29:19.6696175Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T14:29:19.6696355Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T14:29:19.6718269Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:29:19.6718438Z env: 2026-10-24T14:29:19.6718559Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:19.6718712Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:19.6718861Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:19.6719006Z ##[endgroup] 2026-10-24T14:29:19.6764564Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T14:29:19.6771223Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-24T14:29:19.6772472Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T14:29:19.6775932Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T14:29:19.6776988Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T14:29:19.6800801Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T14:29:19.6800980Z store_path="$(vp pm cache dir)" 2026-10-24T14:29:19.6801193Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T14:29:19.6819158Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:29:19.6819337Z env: 2026-10-24T14:29:19.6819459Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:19.6819607Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:19.6819901Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:19.6820064Z ##[endgroup] 2026-10-24T14:29:19.6950563Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=17] 2026-10-24T14:29:19.6951924Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T14:29:19.7269360Z ##[group]Run actions/cache@v6 2026-10-24T14:29:19.7269513Z with: 2026-10-24T14:29:19.7269640Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T14:29:19.7269914Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T14:29:19.7270166Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T14:29:19.7270319Z enableCrossOsArchive: false 2026-10-24T14:29:19.7270451Z fail-on-cache-miss: false 2026-10-24T14:29:19.7270575Z lookup-only: false 2026-10-24T14:29:19.7270691Z save-always: false 2026-10-24T14:29:19.7270804Z env: 2026-10-24T14:29:19.7270922Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:19.7271321Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:19.7271527Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:19.7271668Z ##[endgroup] 2026-10-24T14:29:19.9167466Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T14:29:20.9928342Z Received 671088640 of 994208090 (67.5%), 604.3 MBs/sec 2026-10-24T14:29:21.4869803Z Received 994208090 of 994208090 (100.0%), 610.5 MBs/sec 2026-10-24T14:29:21.4870247Z Cache Size: ~948 MB (994208090 B) 2026-10-24T14:29:21.4917323Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/edaa7b04-47fd-46c8-b305-dd99f5d7a006/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T14:29:26.6687720Z Cache restored successfully 2026-10-24T14:29:26.7148733Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T14:29:26.7202980Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7025] 2026-10-24T14:29:26.7204861Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T14:29:26.7215222Z ##[group]Run vp install 2026-10-24T14:29:26.7215360Z vp install 2026-10-24T14:29:26.7235203Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:29:26.7235368Z env: 2026-10-24T14:29:26.7235484Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:26.7235628Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:26.7235768Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:26.7235903Z ##[endgroup] 2026-10-24T14:29:26.7557789Z Scope: all 34 workspace projects 2026-10-24T14:29:26.8569858Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T14:29:27.0834013Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T14:29:27.0834338Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T14:29:27.0834561Z Virtual store is at: node_modules/.pnpm 2026-10-24T14:29:30.2806892Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.4s) 2026-10-24T14:29:30.2807234Z Lockfile is up to date, resolution step is skipped 2026-10-24T14:29:30.3044921Z Packages: +1721 2026-10-24T14:29:30.3045248Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T14:29:30.3548981Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T14:29:31.2710347Z . prepare$ vp config --no-agent 2026-10-24T14:29:31.3611025Z . prepare: Done 2026-10-24T14:29:31.3625180Z 2026-10-24T14:29:31.3625366Z devDependencies: 2026-10-24T14:29:31.3625566Z + @coderabbitai/config 1.1.0 2026-10-24T14:29:31.3626691Z + @shadcn/lint 0.1.5 2026-10-24T14:29:31.3626845Z + @types/node 24.12.4 2026-10-24T14:29:31.3626965Z + knip 6.34.0 2026-10-24T14:29:31.3627096Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T14:29:31.3627238Z + vite-plus 1.3.0 2026-10-24T14:29:31.3627303Z 2026-10-24T14:29:31.3651021Z Done in 4.6s using pnpm v12.14.0 2026-10-24T14:29:31.3806898Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4660] 2026-10-24T14:29:31.4261564Z ##[group]Run actions/cache@v6 2026-10-24T14:29:31.4261727Z with: 2026-10-24T14:29:31.4261841Z path: ~/.cache/electron 2026-10-24T14:29:31.4262068Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T14:29:31.4262309Z enableCrossOsArchive: false 2026-10-24T14:29:31.4262451Z fail-on-cache-miss: false 2026-10-24T14:29:31.4262577Z lookup-only: false 2026-10-24T14:29:31.4262696Z save-always: false 2026-10-24T14:29:31.4262804Z env: 2026-10-24T14:29:31.4262916Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:31.4263071Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:31.4263229Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:31.4263366Z ##[endgroup] 2026-10-24T14:29:31.6098051Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T14:29:31.7765247Z Received 122906203 of 122906203 (100.0%), 792.0 MBs/sec 2026-10-24T14:29:31.7766081Z Cache Size: ~117 MB (122906203 B) 2026-10-24T14:29:31.7798163Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/840d7108-e7d3-47db-aedb-7b65e8604aad/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T14:29:31.8466665Z Cache restored successfully 2026-10-24T14:29:31.8590441Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T14:29:31.8733007Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T14:29:31.8733297Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T14:29:31.8766542Z shell: /usr/bin/bash -e {0} 2026-10-24T14:29:31.8766767Z env: 2026-10-24T14:29:31.8766967Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:31.8767233Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:31.8767482Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:31.8767720Z ##[endgroup] 2026-10-24T14:29:32.0712616Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T14:29:32.6308216Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T14:29:32.6336008Z 2026-10-24T14:29:32.6503851Z ##[group]Run vp run knip:check 2026-10-24T14:29:32.6504116Z vp run knip:check 2026-10-24T14:29:32.6533233Z shell: /usr/bin/bash -e {0} 2026-10-24T14:29:32.6533386Z env: 2026-10-24T14:29:32.6533515Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:32.6533676Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:32.6533829Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:32.6533981Z ##[endgroup] 2026-10-24T14:29:32.8110769Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T14:29:36.4425159Z 2026-10-24T14:29:36.4428569Z $ 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-24T14:29:44.5134269Z 2026-10-24T14:29:44.5135293Z --- 2026-10-24T14:29:44.5135615Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T14:29:44.5205346Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T14:29:44.5205629Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T14:29:44.5225489Z shell: /usr/bin/bash -e {0} 2026-10-24T14:29:44.5225615Z env: 2026-10-24T14:29:44.5225727Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:44.5225875Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:44.5226015Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:44.5226170Z ##[endgroup] 2026-10-24T14:29:44.6691236Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T14:29:44.8574099Z 2026-10-24T14:29:44.8639283Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T14:29:44.8639510Z vp run --filter t3 generate --check 2026-10-24T14:29:44.8660527Z shell: /usr/bin/bash -e {0} 2026-10-24T14:29:44.8660676Z env: 2026-10-24T14:29:44.8660815Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:44.8660971Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:44.8661120Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:44.8661258Z ##[endgroup] 2026-10-24T14:29:45.0110829Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T14:29:45.1668290Z 2026-10-24T14:29:45.1735725Z ##[group]Run vp check 2026-10-24T14:29:45.1735872Z vp check 2026-10-24T14:29:45.1756996Z shell: /usr/bin/bash -e {0} 2026-10-24T14:29:45.1757138Z env: 2026-10-24T14:29:45.1757250Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:45.1757401Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:45.1757543Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T14:29:45.1757746Z ##[endgroup] 2026-10-24T14:29:45.7187081Z pass: All 5749 files are correctly formatted (405ms, 8 threads) 2026-10-24T14:29:51.9147254Z warn: Lint warnings found 2026-10-24T14:29:51.9149771Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T14:29:51.9150096Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T14:29:51.9150290Z 21 │ EnvironmentThreadShell, 2026-10-24T14:29:51.9150461Z 22 │ ThreadRunSummary, 2026-10-24T14:29:51.9150647Z ·  ────────┬─────── 2026-10-24T14:29:51.9150907Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T14:29:51.9151134Z 23 │ ThreadRuntimeSummary, 2026-10-24T14:29:51.9151280Z ╰──── 2026-10-24T14:29:51.9151436Z  help: Consider removing this import. 2026-10-24T14:29:51.9151556Z 2026-10-24T14:29:51.9151961Z ⚠ 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-24T14:29:51.9152493Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T14:29:51.9152805Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T14:29:51.9153132Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T14:29:51.9153428Z ·  ────────────────────────── 2026-10-24T14:29:51.9153684Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T14:29:51.9153869Z ╰──── 2026-10-24T14:29:51.9153931Z 2026-10-24T14:29:51.9154523Z ⚠ 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-24T14:29:51.9155088Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T14:29:51.9155371Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T14:29:51.9155715Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T14:29:51.9156034Z ·  ─────────────────── 2026-10-24T14:29:51.9156256Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T14:29:51.9156424Z ╰──── 2026-10-24T14:29:51.9156484Z 2026-10-24T14:29:51.9156751Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9157179Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T14:29:51.9157412Z 328 │ }; 2026-10-24T14:29:51.9157551Z 329 │ useEffect(() => { 2026-10-24T14:29:51.9157716Z ·  ────┬──── 2026-10-24T14:29:51.9157941Z · ╰── This is the containing effect 2026-10-24T14:29:51.9158184Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T14:29:51.9158397Z 331 │ requestedSection.current = "overview"; 2026-10-24T14:29:51.9158688Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T14:29:51.9158941Z 333 │ setSection("overview"); 2026-10-24T14:29:51.9159113Z ·  ─────┬──── 2026-10-24T14:29:51.9159396Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9159628Z 334 │ } 2026-10-24T14:29:51.9159747Z ╰──── 2026-10-24T14:29:51.9160549Z  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-24T14:29:51.9161469Z  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-24T14:29:51.9161782Z 2026-10-24T14:29:51.9161990Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:29:51.9162399Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T14:29:51.9162673Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T14:29:51.9162885Z 331 │ requestedSection.current = "overview"; 2026-10-24T14:29:51.9163086Z ·  ────────┬─────── 2026-10-24T14:29:51.9163632Z · ╰── 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-24T14:29:51.9164196Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T14:29:51.9164518Z ·  ─────────┬───────── ──────┬────── 2026-10-24T14:29:51.9165162Z · │ ╰── 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-24T14:29:51.9166036Z · ╰── 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-24T14:29:51.9166510Z 333 │ setSection("overview"); 2026-10-24T14:29:51.9166664Z 334 │ } 2026-10-24T14:29:51.9166826Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T14:29:51.9167053Z ·  ──────────────────┬───────────────── 2026-10-24T14:29:51.9167362Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9167634Z 336 │ const tabContent = activityContent; 2026-10-24T14:29:51.9167794Z ╰──── 2026-10-24T14:29:51.9168018Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:29:51.9168512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9168816Z 2026-10-24T14:29:51.9169022Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:29:51.9169389Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T14:29:51.9169622Z 860 │ if ( 2026-10-24T14:29:51.9169808Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T14:29:51.9170017Z ·  ──────┬────── 2026-10-24T14:29:51.9170617Z · ╰── 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-24T14:29:51.9171168Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T14:29:51.9171370Z 863 │ ) 2026-10-24T14:29:51.9171499Z 864 │ return; 2026-10-24T14:29:51.9171757Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T14:29:51.9172101Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T14:29:51.9172342Z 867 │ setJumpPath(route.params.path); 2026-10-24T14:29:51.9172532Z 868 │ setSelectedRowId(null); 2026-10-24T14:29:51.9172707Z 869 │ jumpStarted.current = false; 2026-10-24T14:29:51.9172958Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T14:29:51.9173212Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T14:29:51.9173424Z ·  ─────┬──── 2026-10-24T14:29:51.9173967Z · ╰── 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-24T14:29:51.9174481Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T14:29:51.9174705Z 873 │ jumpStarted.current = true; 2026-10-24T14:29:51.9174944Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T14:29:51.9175178Z 875 │ jumpStarted.current = false; 2026-10-24T14:29:51.9175338Z 876 │ }); 2026-10-24T14:29:51.9175601Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T14:29:51.9176015Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T14:29:51.9176418Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9176734Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T14:29:51.9176913Z ╰──── 2026-10-24T14:29:51.9177142Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:29:51.9177630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9177929Z 2026-10-24T14:29:51.9178129Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9178472Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T14:29:51.9178748Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T14:29:51.9178968Z 223 │ 2026-10-24T14:29:51.9179195Z ·  ─────────────── 2026-10-24T14:29:51.9179415Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T14:29:51.9179583Z ╰──── 2026-10-24T14:29:51.9179790Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T14:29:51.9179951Z 2026-10-24T14:29:51.9180149Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9180488Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T14:29:51.9180727Z 226 │ { 2026-10-24T14:29:51.9183230Z ·  ────┬──── 2026-10-24T14:29:51.9183461Z · ╰── This is the containing effect 2026-10-24T14:29:51.9183688Z 106 │ clearReviewCommentTarget(); 2026-10-24T14:29:51.9183896Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T14:29:51.9184123Z ·  ────────────────┬─────────────── 2026-10-24T14:29:51.9184419Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9184667Z 108 │ }, [selectedSection?.id]); 2026-10-24T14:29:51.9184817Z ╰──── 2026-10-24T14:29:51.9185481Z  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-24T14:29:51.9186509Z  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-24T14:29:51.9186822Z 2026-10-24T14:29:51.9187085Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9187526Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T14:29:51.9187771Z 109 │ 2026-10-24T14:29:51.9187903Z 110 │ useEffect(() => { 2026-10-24T14:29:51.9188062Z ·  ────┬──── 2026-10-24T14:29:51.9188285Z · ╰── This is the containing effect 2026-10-24T14:29:51.9188511Z 111 │ if (activeCommentTarget === null) { 2026-10-24T14:29:51.9188722Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T14:29:51.9188957Z ·  ────────────────┬─────────────── 2026-10-24T14:29:51.9189360Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9189755Z 113 │ } 2026-10-24T14:29:51.9189902Z ╰──── 2026-10-24T14:29:51.9190565Z  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-24T14:29:51.9191438Z  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-24T14:29:51.9191754Z 2026-10-24T14:29:51.9191965Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9192394Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T14:29:51.9192690Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T14:29:51.9192887Z 108 │ }, [selectedSection?.id]); 2026-10-24T14:29:51.9193074Z ·  ─────────┬───────── 2026-10-24T14:29:51.9193350Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T14:29:51.9193569Z 109 │ 2026-10-24T14:29:51.9193688Z ╰──── 2026-10-24T14:29:51.9194047Z  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-24T14:29:51.9194660Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9194969Z 2026-10-24T14:29:51.9195175Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9195529Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T14:29:51.9195764Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T14:29:51.9195988Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T14:29:51.9196261Z ·  ──────┬────── ────┬─── 2026-10-24T14:29:51.9196615Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T14:29:51.9196956Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T14:29:51.9197175Z 455 │ const { 2026-10-24T14:29:51.9197304Z ╰──── 2026-10-24T14:29:51.9197670Z  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-24T14:29:51.9198278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9198586Z 2026-10-24T14:29:51.9198778Z ⚠ react(static-components): Cannot create components during render 2026-10-24T14:29:51.9199105Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T14:29:51.9199328Z 492 │ // same check. 2026-10-24T14:29:51.9199544Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T14:29:51.9199819Z ·  ─────────────┬───────────── 2026-10-24T14:29:51.9200202Z · ╰── The component is created during render here 2026-10-24T14:29:51.9200573Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T14:29:51.9200868Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T14:29:51.9201152Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T14:29:51.9201400Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T14:29:51.9201598Z 498 │ setIsPullRefreshing(true); 2026-10-24T14:29:51.9201796Z 499 │ await refreshSelectedSection(); 2026-10-24T14:29:51.9201986Z 500 │ setIsPullRefreshing(false); 2026-10-24T14:29:51.9202194Z 501 │ }; 2026-10-24T14:29:51.9202414Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T14:29:51.9202750Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T14:29:51.9203031Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T14:29:51.9203261Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T14:29:51.9203471Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T14:29:51.9203660Z 507 │ files: reviewFiles, 2026-10-24T14:29:51.9203861Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T14:29:51.9204126Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T14:29:51.9204352Z 510 │ : undefined, 2026-10-24T14:29:51.9204540Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T14:29:51.9204795Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T14:29:51.9205005Z 513 │ : undefined, 2026-10-24T14:29:51.9205151Z 514 │ }); 2026-10-24T14:29:51.9205427Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T14:29:51.9205780Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T14:29:51.9206001Z 517 │ environmentId, 2026-10-24T14:29:51.9206154Z 518 │ threadId, 2026-10-24T14:29:51.9206304Z 519 │ selectedSection, 2026-10-24T14:29:51.9206468Z 520 │ nativeReviewDiffData, 2026-10-24T14:29:51.9206625Z 521 │ }); 2026-10-24T14:29:51.9222271Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T14:29:51.9222515Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T14:29:51.9222722Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T14:29:51.9222919Z 525 │ diff: selectedSection?.diff, 2026-10-24T14:29:51.9223097Z 526 │ data: nativeReviewDiffData, 2026-10-24T14:29:51.9223267Z 527 │ collapsedFileIds, 2026-10-24T14:29:51.9223437Z 528 │ viewedFileIds, 2026-10-24T14:29:51.9223641Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T14:29:51.9223872Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T14:29:51.9224047Z 531 │ }); 2026-10-24T14:29:51.9224191Z 532 │ const showcaseReviewKey = 2026-10-24T14:29:51.9224424Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T14:29:51.9224795Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T14:29:51.9225073Z 535 │ : null; 2026-10-24T14:29:51.9225328Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T14:29:51.9225588Z 537 │ nativeBridge.onDebug(event); 2026-10-24T14:29:51.9225751Z 538 │ if ( 2026-10-24T14:29:51.9225907Z 539 │ showcaseReviewKey === null || 2026-10-24T14:29:51.9226249Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T14:29:51.9226645Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T14:29:51.9226830Z 542 │ ) { 2026-10-24T14:29:51.9226964Z 543 │ return; 2026-10-24T14:29:51.9227098Z 544 │ } 2026-10-24T14:29:51.9227285Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T14:29:51.9227585Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T14:29:51.9227825Z 547 │ }; 2026-10-24T14:29:51.9227943Z 548 │ 2026-10-24T14:29:51.9228128Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T14:29:51.9228353Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T14:29:51.9228549Z 551 │ commentSelection.clearSelection(); 2026-10-24T14:29:51.9228797Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T14:29:51.9229019Z 553 │ toggleExpandedFile(fileId); 2026-10-24T14:29:51.9229183Z 554 │ } 2026-10-24T14:29:51.9229368Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T14:29:51.9229579Z 556 │ if (!nativeView) return; 2026-10-24T14:29:51.9229774Z 557 │ const result = await settlePromise(() => 2026-10-24T14:29:51.9230073Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T14:29:51.9230319Z 559 │ ); 2026-10-24T14:29:51.9230479Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T14:29:51.9230783Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T14:29:51.9231029Z 562 │ } 2026-10-24T14:29:51.9231152Z 563 │ }; 2026-10-24T14:29:51.9231303Z 564 │ const handleVisibleFileChange = ( 2026-10-24T14:29:51.9231557Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T14:29:51.9231769Z 566 │ ) => { 2026-10-24T14:29:51.9231955Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T14:29:51.9232295Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T14:29:51.9232533Z 569 │ }; 2026-10-24T14:29:51.9232681Z 570 │ const renderInspector = () => ( 2026-10-24T14:29:51.9232855Z 571 │ void handleSelectFile(fileId)} 2026-10-24T14:29:51.9234053Z 577 │ /> 2026-10-24T14:29:51.9234180Z 578 │ ); 2026-10-24T14:29:51.9234297Z 579 │ 2026-10-24T14:29:51.9234544Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T14:29:51.9234829Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T14:29:51.9235006Z 582 │ if (fileId) { 2026-10-24T14:29:51.9235172Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T14:29:51.9235355Z 584 │ toggleExpandedFile(fileId); 2026-10-24T14:29:51.9235514Z 585 │ } 2026-10-24T14:29:51.9235634Z 586 │ }; 2026-10-24T14:29:51.9235747Z 587 │ 2026-10-24T14:29:51.9235900Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T14:29:51.9236132Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T14:29:51.9236331Z 590 │ ) => { 2026-10-24T14:29:51.9236601Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T14:29:51.9236817Z 592 │ if (fileId) { 2026-10-24T14:29:51.9236976Z 593 │ toggleViewedFile(fileId); 2026-10-24T14:29:51.9237136Z 594 │ } 2026-10-24T14:29:51.9237255Z 595 │ }; 2026-10-24T14:29:51.9237374Z 596 │ 2026-10-24T14:29:51.9237513Z 597 │ const parsedDiffNotice = 2026-10-24T14:29:51.9237774Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T14:29:51.9238073Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T14:29:51.9238377Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T14:29:51.9238675Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T14:29:51.9238977Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T14:29:51.9239272Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T14:29:51.9239508Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T14:29:51.9239705Z 605 │ hasCachedSelectedDiff, 2026-10-24T14:29:51.9239866Z 606 │ hasAnyCachedDiff, 2026-10-24T14:29:51.9240012Z 607 │ }); 2026-10-24T14:29:51.9240167Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T14:29:51.9240372Z 609 │ void retryEnvironment(environmentId); 2026-10-24T14:29:51.9240537Z 610 │ }; 2026-10-24T14:29:51.9240685Z 611 │ const handleReturnToThread = () => { 2026-10-24T14:29:51.9240872Z 612 │ if (navigation.canGoBack()) { 2026-10-24T14:29:51.9241047Z 613 │ navigation.goBack(); 2026-10-24T14:29:51.9241203Z 614 │ return; 2026-10-24T14:29:51.9241333Z 615 │ } 2026-10-24T14:29:51.9241481Z 616 │ navigation.navigate("Thread", { 2026-10-24T14:29:51.9241688Z 617 │ environmentId: String(environmentId), 2026-10-24T14:29:51.9241881Z 618 │ threadId: String(threadId), 2026-10-24T14:29:51.9242040Z 619 │ }); 2026-10-24T14:29:51.9242195Z 620 │ }; 2026-10-24T14:29:51.9242340Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T14:29:51.9242514Z 622 │ selectedSection?.title, 2026-10-24T14:29:51.9242693Z 623 │ headerDiffSummary.additions, 2026-10-24T14:29:51.9242874Z 624 │ headerDiffSummary.deletions, 2026-10-24T14:29:51.9243030Z 625 │ ] 2026-10-24T14:29:51.9243208Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T14:29:51.9243403Z 627 │ .join(" · "); 2026-10-24T14:29:51.9243543Z 628 │ 2026-10-24T14:29:51.9243684Z 629 │ const showChangedFilesPane = 2026-10-24T14:29:51.9243863Z 630 │ !showConnectionNotice && 2026-10-24T14:29:51.9244038Z 631 │ selectedSection !== null && 2026-10-24T14:29:51.9244230Z 632 │ parsedDiff.kind === "files" && 2026-10-24T14:29:51.9244419Z 633 │ NativeReviewDiffView !== null; 2026-10-24T14:29:51.9244695Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T14:29:51.9245062Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T14:29:51.9245298Z 636 │ 2026-10-24T14:29:51.9245438Z 637 │ const listHeader = (() => { 2026-10-24T14:29:51.9245626Z 638 │ const children: ReactElement[] = []; 2026-10-24T14:29:51.9245792Z 639 │ 2026-10-24T14:29:51.9245917Z 640 │ if (error) { 2026-10-24T14:29:51.9246069Z 641 │ children.push( 2026-10-24T14:29:51.9246220Z 642 │ 2026-10-24T14:29:51.9247682Z 649 │ Review unavailable 2026-10-24T14:29:51.9248023Z 650 │ {error} 2026-10-24T14:29:51.9248253Z 651 │ , 2026-10-24T14:29:51.9248397Z 652 │ ); 2026-10-24T14:29:51.9248521Z 653 │ } 2026-10-24T14:29:51.9248641Z 654 │ 2026-10-24T14:29:51.9248780Z 655 │ if (parsedDiffNotice) { 2026-10-24T14:29:51.9249039Z 656 │ children.push(); 2026-10-24T14:29:51.9249269Z 657 │ } 2026-10-24T14:29:51.9249396Z 658 │ 2026-10-24T14:29:51.9249540Z 659 │ if (children.length === 0) { 2026-10-24T14:29:51.9249707Z 660 │ return null; 2026-10-24T14:29:51.9249849Z 661 │ } 2026-10-24T14:29:51.9249968Z 662 │ 2026-10-24T14:29:51.9250098Z 663 │ return <>{children}; 2026-10-24T14:29:51.9250252Z 664 │ })(); 2026-10-24T14:29:51.9250392Z 665 │ const headerSubtitle = [ 2026-10-24T14:29:51.9250575Z 666 │ headerDiffSummary.additions, 2026-10-24T14:29:51.9250759Z 667 │ headerDiffSummary.deletions, 2026-10-24T14:29:51.9250951Z 668 │ pendingReviewCommentCount > 0 2026-10-24T14:29:51.9251229Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T14:29:51.9251471Z 670 │ : null, 2026-10-24T14:29:51.9251604Z 671 │ ] 2026-10-24T14:29:51.9251735Z 672 │ .filter(Boolean) 2026-10-24T14:29:51.9251897Z 673 │ .join(" · "); 2026-10-24T14:29:51.9252144Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T14:29:51.9252351Z 675 │ 2026-10-24T14:29:51.9252473Z 676 │ return ( 2026-10-24T14:29:51.9252603Z 677 │ <> 2026-10-24T14:29:51.9252734Z 678 │ 2026-10-24T14:29:51.9255771Z 694 │ 2026-10-24T14:29:51.9255902Z 695 │ 2026-10-24T14:29:51.9256118Z 696 │ 2026-10-24T14:29:51.9256351Z 697 │ {showConnectionNotice ? ( 2026-10-24T14:29:51.9256603Z 698 │ 2026-10-24T14:29:51.9256920Z 699 │ 2026-10-24T14:29:51.9259308Z 711 │ 2026-10-24T14:29:51.9259558Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T14:29:51.9259796Z 713 │ 2026-10-24T14:29:51.9260861Z 719 │ 2026-10-24T14:29:51.9261667Z 723 │ {listHeader} 2026-10-24T14:29:51.9261898Z 724 │ 2026-10-24T14:29:51.9262156Z 725 │ { 2026-10-24T14:29:51.9265650Z ·  ────┬──── 2026-10-24T14:29:51.9265880Z · ╰── This is the containing effect 2026-10-24T14:29:51.9266098Z 57 │ scheduler.reset(); 2026-10-24T14:29:51.9266658Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T14:29:51.9266873Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T14:29:51.9267113Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T14:29:51.9267336Z ·  ───────┬─────── 2026-10-24T14:29:51.9267705Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9268045Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T14:29:51.9268241Z ╰──── 2026-10-24T14:29:51.9268930Z  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-24T14:29:51.9269839Z  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-24T14:29:51.9270160Z 2026-10-24T14:29:51.9270380Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9270785Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T14:29:51.9271058Z 62 │ return () => scheduler.cancel(); 2026-10-24T14:29:51.9271277Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T14:29:51.9271538Z ·  ───┬─── ─────┬───── 2026-10-24T14:29:51.9271892Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T14:29:51.9272266Z · ╰── Unnecessary dependency `enabled` 2026-10-24T14:29:51.9272478Z 64 │ 2026-10-24T14:29:51.9272598Z ╰──── 2026-10-24T14:29:51.9272971Z  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-24T14:29:51.9273603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9273920Z 2026-10-24T14:29:51.9274197Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9274638Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T14:29:51.9274879Z 100 │ 2026-10-24T14:29:51.9275011Z 101 │ useEffect(() => { 2026-10-24T14:29:51.9275182Z ·  ────┬──── 2026-10-24T14:29:51.9275418Z · ╰── This is the containing effect 2026-10-24T14:29:51.9275678Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T14:29:51.9275958Z 103 │ setHighlightedLinesById({}); 2026-10-24T14:29:51.9276199Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9276498Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9276748Z 104 │ return; 2026-10-24T14:29:51.9276885Z ╰──── 2026-10-24T14:29:51.9277573Z  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-24T14:29:51.9278478Z  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-24T14:29:51.9278801Z 2026-10-24T14:29:51.9279057Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T14:29:51.9279470Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T14:29:51.9279717Z 261 │ ): boolean { 2026-10-24T14:29:51.9279961Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T14:29:51.9280324Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T14:29:51.9280656Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T14:29:51.9280878Z ╰──── 2026-10-24T14:29:51.9281019Z  help: Switch to `Set` 2026-10-24T14:29:51.9281126Z 2026-10-24T14:29:51.9281308Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:51.9281661Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T14:29:51.9282032Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T14:29:51.9282444Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T14:29:51.9282777Z ·  ─────┬──── 2026-10-24T14:29:51.9283125Z · ╰── Cannot call impure function 2026-10-24T14:29:51.9283452Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T14:29:51.9283668Z ╰──── 2026-10-24T14:29:51.9284034Z  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-24T14:29:51.9284634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:51.9284935Z 2026-10-24T14:29:51.9285110Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:51.9285458Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T14:29:51.9285713Z 718 │ const snoozePresets = useMemo( 2026-10-24T14:29:51.9286012Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T14:29:51.9286343Z ·  ─────┬──── 2026-10-24T14:29:51.9286737Z · ╰── Cannot call impure function 2026-10-24T14:29:51.9287076Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T14:29:51.9287274Z ╰──── 2026-10-24T14:29:51.9287626Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:29:51.9288212Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:51.9288511Z 2026-10-24T14:29:51.9288703Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:29:51.9289062Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T14:29:51.9289419Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T14:29:51.9289733Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T14:29:51.9289970Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9290271Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T14:29:51.9290514Z 721 │ ); 2026-10-24T14:29:51.9290638Z ╰──── 2026-10-24T14:29:51.9291031Z  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-24T14:29:51.9291674Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9291984Z 2026-10-24T14:29:51.9292210Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:29:51.9292569Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T14:29:51.9292811Z 765 │ thread.pinnedAt, 2026-10-24T14:29:51.9292971Z 766 │ variant, 2026-10-24T14:29:51.9293138Z ·  ───┬─── 2026-10-24T14:29:51.9293380Z · ╰── Unnecessary dependency `variant` 2026-10-24T14:29:51.9293594Z 767 │ ], 2026-10-24T14:29:51.9293720Z ╰──── 2026-10-24T14:29:51.9294108Z  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-24T14:29:51.9294746Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9295062Z 2026-10-24T14:29:51.9295271Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9295641Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T14:29:51.9295968Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T14:29:51.9296260Z 1216 │ 2026-10-24T14:29:51.9296540Z ·  ────────────────────────── 2026-10-24T14:29:51.9296790Z 1217 │ 2026-10-24T14:29:51.9296983Z ╰──── 2026-10-24T14:29:51.9297199Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T14:29:51.9297366Z 2026-10-24T14:29:51.9297728Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T14:29:51.9298241Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T14:29:51.9298493Z 472 │ onFilters, 2026-10-24T14:29:51.9298646Z 473 │ authorOptions = [], 2026-10-24T14:29:51.9298827Z ·  ── 2026-10-24T14:29:51.9299000Z 474 │ labelOptions = [], 2026-10-24T14:29:51.9299150Z ╰──── 2026-10-24T14:29:51.9299544Z  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-24T14:29:51.9299861Z 2026-10-24T14:29:51.9300166Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T14:29:51.9300620Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T14:29:51.9300874Z 473 │ authorOptions = [], 2026-10-24T14:29:51.9301035Z 474 │ labelOptions = [], 2026-10-24T14:29:51.9301209Z ·  ── 2026-10-24T14:29:51.9301381Z 475 │ optionScope, 2026-10-24T14:29:51.9301520Z ╰──── 2026-10-24T14:29:51.9301916Z  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-24T14:29:51.9302254Z 2026-10-24T14:29:51.9302702Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-24T14:29:51.9303272Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T14:29:51.9303526Z 262 │ ...(update._meta !== undefined 2026-10-24T14:29:51.9303819Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T14:29:51.9304095Z ·  ───────── 2026-10-24T14:29:51.9304274Z 264 │ : {}), 2026-10-24T14:29:51.9304408Z ╰──── 2026-10-24T14:29:51.9304470Z 2026-10-24T14:29:51.9304760Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9305176Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T14:29:51.9305395Z 913 │ 2026-10-24T14:29:51.9305669Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T14:29:51.9305961Z ·  ─────┬───── 2026-10-24T14:29:51.9306207Z · ╰── 'layerDaemon' is declared here 2026-10-24T14:29:51.9306549Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T14:29:51.9306718Z ╰──── 2026-10-24T14:29:51.9306889Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9307020Z 2026-10-24T14:29:51.9307190Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T14:29:51.9307491Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T14:29:51.9307761Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T14:29:51.9307999Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T14:29:51.9308232Z ·  ───────────────────────────── 2026-10-24T14:29:51.9308567Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T14:29:51.9308818Z ╰──── 2026-10-24T14:29:51.9309047Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T14:29:51.9309222Z 2026-10-24T14:29:51.9309530Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9309951Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T14:29:51.9310154Z 217 │ 2026-10-24T14:29:51.9310378Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T14:29:51.9310650Z ·  ──────────┬────────── 2026-10-24T14:29:51.9310927Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T14:29:51.9311304Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T14:29:51.9311567Z ╰──── 2026-10-24T14:29:51.9311736Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9311864Z 2026-10-24T14:29:51.9312227Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9312672Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T14:29:51.9312873Z 220 │ 2026-10-24T14:29:51.9313078Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T14:29:51.9313352Z ·  ──────────────┬────────────── 2026-10-24T14:29:51.9313661Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T14:29:51.9314030Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T14:29:51.9314268Z ╰──── 2026-10-24T14:29:51.9314441Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9314567Z 2026-10-24T14:29:51.9314756Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T14:29:51.9315073Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T14:29:51.9315339Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T14:29:51.9315584Z 194 │ const codes = new Array(count); 2026-10-24T14:29:51.9315818Z ·  ──────────────────────── 2026-10-24T14:29:51.9316057Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T14:29:51.9316234Z ╰──── 2026-10-24T14:29:51.9316795Z  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-24T14:29:51.9317222Z 2026-10-24T14:29:51.9317713Z ⚠ 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-24T14:29:51.9318280Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T14:29:51.9318514Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T14:29:51.9318751Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T14:29:51.9319015Z ·  ────────────────────────── 2026-10-24T14:29:51.9319220Z 130 │ Schema.Struct({ 2026-10-24T14:29:51.9319369Z ╰──── 2026-10-24T14:29:51.9319434Z 2026-10-24T14:29:51.9319917Z ⚠ 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-24T14:29:51.9320479Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T14:29:51.9320677Z 499 │ 2026-10-24T14:29:51.9320858Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T14:29:51.9321122Z ·  ────────────────────────── 2026-10-24T14:29:51.9321367Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T14:29:51.9321550Z ╰──── 2026-10-24T14:29:51.9321608Z 2026-10-24T14:29:51.9321968Z ⚠ 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-24T14:29:51.9322863Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T14:29:51.9323223Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T14:29:51.9323535Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T14:29:51.9323780Z ·  ───────── 2026-10-24T14:29:51.9323950Z 19 │ expect( 2026-10-24T14:29:51.9324090Z ╰──── 2026-10-24T14:29:51.9324154Z 2026-10-24T14:29:51.9324554Z ⚠ 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-24T14:29:51.9325023Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T14:29:51.9325247Z 19 │ expect( 2026-10-24T14:29:51.9325518Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T14:29:51.9325790Z ·  ───────── 2026-10-24T14:29:51.9325959Z 21 │ ).toBe(true); 2026-10-24T14:29:51.9326098Z ╰──── 2026-10-24T14:29:51.9326157Z 2026-10-24T14:29:51.9326560Z ⚠ 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-24T14:29:51.9327043Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T14:29:51.9327349Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T14:29:51.9327704Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T14:29:51.9328187Z ·  ────────────────────────── 2026-10-24T14:29:51.9328558Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T14:29:51.9328780Z ╰──── 2026-10-24T14:29:51.9328844Z 2026-10-24T14:29:51.9329142Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9329531Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T14:29:51.9329818Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T14:29:51.9330047Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T14:29:51.9330291Z ·  ──────┬───── 2026-10-24T14:29:51.9330599Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T14:29:51.9330901Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T14:29:51.9331091Z ╰──── 2026-10-24T14:29:51.9331467Z  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-24T14:29:51.9332128Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9332445Z 2026-10-24T14:29:51.9332654Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9333043Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T14:29:51.9333295Z 87 │
  • (null); 2026-10-24T14:29:51.9342665Z 168 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9342848Z ·  ───────┬─────── 2026-10-24T14:29:51.9343094Z · ╰── This is the containing effect 2026-10-24T14:29:51.9343331Z 169 │ if (faviconRequest === null) return; 2026-10-24T14:29:51.9343504Z 170 │ 2026-10-24T14:29:51.9343707Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T14:29:51.9343961Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T14:29:51.9344177Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9344472Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9344725Z 173 │ return endRequest; 2026-10-24T14:29:51.9344872Z ╰──── 2026-10-24T14:29:51.9345545Z  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-24T14:29:51.9346724Z  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-24T14:29:51.9347032Z 2026-10-24T14:29:51.9347240Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9347599Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T14:29:51.9347871Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T14:29:51.9348177Z 272 │ 2026-10-24T14:29:51.9348519Z ·  ─────────────────────────────────────────────────────── 2026-10-24T14:29:51.9348758Z 273 │ 2026-10-24T14:29:51.9352771Z 152 │ {props.children(open)} 2026-10-24T14:29:51.9352977Z ·  ──┬─ 2026-10-24T14:29:51.9353250Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9353482Z 153 │ 2026-10-24T14:29:51.9353616Z ╰──── 2026-10-24T14:29:51.9354156Z  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-24T14:29:51.9354885Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9355168Z 2026-10-24T14:29:51.9355376Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T14:29:51.9355731Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T14:29:51.9355975Z 139 │ if (action.id !== undefined) { 2026-10-24T14:29:51.9356162Z 140 │ props.onPressAction?.({ 2026-10-24T14:29:51.9356340Z ·  ──┬── 2026-10-24T14:29:51.9356566Z · ╰── Missing dependency `props` 2026-10-24T14:29:51.9356805Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T14:29:51.9357066Z 142 │ } as Parameters>[0]); 2026-10-24T14:29:51.9357285Z 143 │ } 2026-10-24T14:29:51.9357415Z 144 │ }, 2026-10-24T14:29:51.9357569Z 145 │ [close, props.onPressAction], 2026-10-24T14:29:51.9357780Z ·  ─────────┬───────── 2026-10-24T14:29:51.9358111Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T14:29:51.9358376Z 146 │ ); 2026-10-24T14:29:51.9358494Z ╰──── 2026-10-24T14:29:51.9359043Z  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-24T14:29:51.9359803Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9360101Z 2026-10-24T14:29:51.9360508Z ⚠ 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-24T14:29:51.9361043Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T14:29:51.9361434Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T14:29:51.9361785Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T14:29:51.9362053Z ·  ───────── 2026-10-24T14:29:51.9362389Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T14:29:51.9362632Z ╰──── 2026-10-24T14:29:51.9362692Z 2026-10-24T14:29:51.9363026Z ⚠ 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-24T14:29:51.9363487Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T14:29:51.9363821Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T14:29:51.9364178Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T14:29:51.9364454Z ·  ───────── 2026-10-24T14:29:51.9364614Z 52 │ } 2026-10-24T14:29:51.9364731Z ╰──── 2026-10-24T14:29:51.9364791Z 2026-10-24T14:29:51.9365126Z ⚠ 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-24T14:29:51.9365576Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T14:29:51.9365799Z 54 │ assert.equal( 2026-10-24T14:29:51.9366062Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T14:29:51.9366324Z ·  ───────── 2026-10-24T14:29:51.9366477Z 56 │ true, 2026-10-24T14:29:51.9366605Z ╰──── 2026-10-24T14:29:51.9366661Z 2026-10-24T14:29:51.9366993Z ⚠ 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-24T14:29:51.9367444Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T14:29:51.9367661Z 58 │ assert.equal( 2026-10-24T14:29:51.9367928Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T14:29:51.9368191Z ·  ───────── 2026-10-24T14:29:51.9368340Z 60 │ true, 2026-10-24T14:29:51.9368463Z ╰──── 2026-10-24T14:29:51.9368522Z 2026-10-24T14:29:51.9368907Z ⚠ 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-24T14:29:51.9369441Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T14:29:51.9369661Z 102 │ 2026-10-24T14:29:51.9369968Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T14:29:51.9370235Z ·  ───────── 2026-10-24T14:29:51.9370395Z 104 │ }); 2026-10-24T14:29:51.9370512Z ╰──── 2026-10-24T14:29:51.9370573Z 2026-10-24T14:29:51.9370841Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9371252Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T14:29:51.9371488Z 409 │ 2026-10-24T14:29:51.9371684Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T14:29:51.9371903Z ·  ──┬── 2026-10-24T14:29:51.9372156Z · ╰── 'layer' is declared here 2026-10-24T14:29:51.9372346Z ╰──── 2026-10-24T14:29:51.9372512Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9372638Z 2026-10-24T14:29:51.9372842Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T14:29:51.9373208Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T14:29:51.9373446Z 1782 │ assert.equal( 2026-10-24T14:29:51.9373686Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T14:29:51.9373954Z ·  ────────────────────────── 2026-10-24T14:29:51.9374160Z 1784 │ stored.attachments[0]?.id, 2026-10-24T14:29:51.9374317Z ╰──── 2026-10-24T14:29:51.9374553Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T14:29:51.9374732Z 2026-10-24T14:29:51.9374899Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T14:29:51.9375271Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T14:29:51.9375611Z 219 │ 2026-10-24T14:29:51.9375914Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T14:29:51.9376174Z ·  ──┬─ 2026-10-24T14:29:51.9376476Z · ╰── 'U+001B' is a control character. 2026-10-24T14:29:51.9376708Z 221 │ 2026-10-24T14:29:51.9376850Z ╰──── 2026-10-24T14:29:51.9377144Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T14:29:51.9377375Z 2026-10-24T14:29:51.9377639Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9378031Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T14:29:51.9378243Z 3754 │ 2026-10-24T14:29:51.9378509Z 3755 │ const layer: Layer.Layer = 2026-10-24T14:29:51.9378793Z ·  ──┬── 2026-10-24T14:29:51.9379073Z · ╰── 'layer' is declared here 2026-10-24T14:29:51.9379349Z 3756 │ Layer.effect( 2026-10-24T14:29:51.9379489Z ╰──── 2026-10-24T14:29:51.9379652Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9379777Z 2026-10-24T14:29:51.9379985Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:51.9380389Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T14:29:51.9380637Z 52 │ 2026-10-24T14:29:51.9380764Z 53 │ for (const {} of [ 2026-10-24T14:29:51.9380927Z ·  ── 2026-10-24T14:29:51.9381087Z 54 │ { healthy: true }, 2026-10-24T14:29:51.9381229Z ╰──── 2026-10-24T14:29:51.9381523Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:51.9381754Z 2026-10-24T14:29:51.9382262Z ⚠ 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-24T14:29:51.9382850Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T14:29:51.9383136Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T14:29:51.9390358Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T14:29:51.9390743Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T14:29:51.9391002Z 137 │ │ if (predicate(lastState)) { 2026-10-24T14:29:51.9391240Z 138 │ │ return lastState; 2026-10-24T14:29:51.9391432Z 139 │ │ } 2026-10-24T14:29:51.9391632Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9391881Z 141 │ ╰─▶ } 2026-10-24T14:29:51.9392128Z 142 │ return yield* Effect.die( 2026-10-24T14:29:51.9392289Z ╰──── 2026-10-24T14:29:51.9392350Z 2026-10-24T14:29:51.9392547Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T14:29:51.9392888Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T14:29:51.9393103Z  80 │ 2026-10-24T14:29:51.9393440Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T14:29:51.9393821Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T14:29:51.9394086Z  83 │ │ ): Effect.fn.Return { 2026-10-24T14:29:51.9394388Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T14:29:51.9394703Z  85 │ │ const connections = new Map(); 2026-10-24T14:29:51.9394918Z  86 │ │ 2026-10-24T14:29:51.9395222Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T14:29:51.9395536Z  88 │ │ Effect.suspend(() => { 2026-10-24T14:29:51.9395791Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T14:29:51.9396174Z  90 │ │ return connection === undefined 2026-10-24T14:29:51.9396614Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T14:29:51.9396937Z  92 │ │ : Effect.succeed(connection); 2026-10-24T14:29:51.9397218Z  93 │ │ }); 2026-10-24T14:29:51.9397387Z  94 │ │ 2026-10-24T14:29:51.9397563Z  95 │ │ const send = ( 2026-10-24T14:29:51.9397772Z  96 │ │ connection: Connection, 2026-10-24T14:29:51.9397982Z  97 │ │ message: unknown, 2026-10-24T14:29:51.9398255Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T14:29:51.9398536Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T14:29:51.9398778Z 100 │ │ Effect.gen(function* () { 2026-10-24T14:29:51.9399028Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T14:29:51.9399309Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T14:29:51.9399675Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T14:29:51.9399968Z 104 │ │ } 2026-10-24T14:29:51.9400202Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T14:29:51.9400450Z 106 │ │ try: (signal) => 2026-10-24T14:29:51.9400699Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T14:29:51.9400949Z 108 │ │ method: "POST", 2026-10-24T14:29:51.9401168Z 109 │ │ signal, 2026-10-24T14:29:51.9401380Z 110 │ │ headers: { 2026-10-24T14:29:51.9401623Z 111 │ │ "content-type": "application/json", 2026-10-24T14:29:51.9401908Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T14:29:51.9402235Z 113 │ │ authorization: options.authorization, 2026-10-24T14:29:51.9402505Z 114 │ │ ...(connection.sessionId === null 2026-10-24T14:29:51.9402739Z 115 │ │ ? {} 2026-10-24T14:29:51.9402998Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T14:29:51.9403286Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T14:29:51.9403528Z 118 │ │ ? {} 2026-10-24T14:29:51.9403811Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T14:29:51.9404066Z 120 │ │ }, 2026-10-24T14:29:51.9404266Z 121 │ │ body, 2026-10-24T14:29:51.9404462Z 122 │ │ }), 2026-10-24T14:29:51.9404671Z 123 │ │ catch: bridgeError, 2026-10-24T14:29:51.9404871Z 124 │ │ }); 2026-10-24T14:29:51.9405185Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T14:29:51.9405500Z 126 │ │ if (!response.ok) { 2026-10-24T14:29:51.9405726Z 127 │ │ yield* Effect.promise( 2026-10-24T14:29:51.9406094Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T14:29:51.9406435Z 129 │ │ ); 2026-10-24T14:29:51.9406655Z 130 │ │ return yield* Effect.fail( 2026-10-24T14:29:51.9407045Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T14:29:51.9407368Z 132 │ │ ); 2026-10-24T14:29:51.9407546Z 133 │ │ } 2026-10-24T14:29:51.9407862Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T14:29:51.9408188Z 135 │ │ for (const payload of payloads) { 2026-10-24T14:29:51.9408552Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T14:29:51.9408845Z 137 │ │ } 2026-10-24T14:29:51.9409047Z 138 │ │ return payloads; 2026-10-24T14:29:51.9409287Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T14:29:51.9409504Z 140 │ │ ); 2026-10-24T14:29:51.9409671Z 141 │ │ 2026-10-24T14:29:51.9409939Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T14:29:51.9410248Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T14:29:51.9410576Z 144 │ │ ): Effect.fn.Return { 2026-10-24T14:29:51.9410932Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T14:29:51.9411233Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T14:29:51.9411500Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T14:29:51.9411744Z 148 │ │ if (sessionId !== null) { 2026-10-24T14:29:51.9411999Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T14:29:51.9412289Z 150 │ │ try: (signal) => 2026-10-24T14:29:51.9412537Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T14:29:51.9412780Z 152 │ │ method: "DELETE", 2026-10-24T14:29:51.9412995Z 153 │ │ signal, 2026-10-24T14:29:51.9413199Z 154 │ │ headers: { 2026-10-24T14:29:51.9413451Z 155 │ │ authorization: options.authorization, 2026-10-24T14:29:51.9413720Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T14:29:51.9413992Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T14:29:51.9414229Z 158 │ │ ? {} 2026-10-24T14:29:51.9414506Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T14:29:51.9414759Z 160 │ │ }, 2026-10-24T14:29:51.9414948Z 161 │ │ }), 2026-10-24T14:29:51.9415149Z 162 │ │ catch: bridgeError, 2026-10-24T14:29:51.9415345Z 163 │ │ }); 2026-10-24T14:29:51.9415736Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T14:29:51.9416044Z 165 │ │ return yield* Effect.fail( 2026-10-24T14:29:51.9416284Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T14:29:51.9416674Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T14:29:51.9416944Z 168 │ │ ), 2026-10-24T14:29:51.9417122Z 169 │ │ ); 2026-10-24T14:29:51.9417299Z 170 │ │ } 2026-10-24T14:29:51.9417501Z 171 │ │ yield* Effect.promise( 2026-10-24T14:29:51.9417803Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T14:29:51.9418061Z 173 │ │ ); 2026-10-24T14:29:51.9418244Z 174 │ │ } 2026-10-24T14:29:51.9418427Z 175 │ │ return {}; 2026-10-24T14:29:51.9418601Z 176 │ │ }); 2026-10-24T14:29:51.9418766Z 177 │ │ 2026-10-24T14:29:51.9418934Z 178 │ │ return { 2026-10-24T14:29:51.9419206Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T14:29:51.9419504Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T14:29:51.9419754Z 181 │ │ return yield* Effect.fail( 2026-10-24T14:29:51.9420071Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T14:29:51.9420340Z 183 │ │ ); 2026-10-24T14:29:51.9420514Z 184 │ │ } 2026-10-24T14:29:51.9420744Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T14:29:51.9421098Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T14:29:51.9421386Z 187 │ │ } 2026-10-24T14:29:51.9421638Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T14:29:51.9421917Z 189 │ │ connections.set(connectionId, { 2026-10-24T14:29:51.9422210Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T14:29:51.9422443Z 191 │ │ sessionId: null, 2026-10-24T14:29:51.9422742Z 192 │ │ protocolVersion: null, 2026-10-24T14:29:51.9422964Z 193 │ │ nextRequestId: 0, 2026-10-24T14:29:51.9423165Z 194 │ │ }); 2026-10-24T14:29:51.9423372Z 195 │ │ return { connectionId }; 2026-10-24T14:29:51.9423570Z 196 │ │ }), 2026-10-24T14:29:51.9423838Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T14:29:51.9424185Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T14:29:51.9424476Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T14:29:51.9424747Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T14:29:51.9424985Z 201 │ │ jsonrpc: "2.0", 2026-10-24T14:29:51.9425183Z 202 │ │ id, 2026-10-24T14:29:51.9425391Z 203 │ │ method: request.method, 2026-10-24T14:29:51.9425733Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T14:29:51.9426043Z 205 │ │ }); 2026-10-24T14:29:51.9426470Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T14:29:51.9426961Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T14:29:51.9427208Z 208 │ │ if (envelope === null) { 2026-10-24T14:29:51.9427442Z 209 │ │ return yield* Effect.fail( 2026-10-24T14:29:51.9427754Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T14:29:51.9428025Z 211 │ │ ); 2026-10-24T14:29:51.9428201Z 212 │ │ } 2026-10-24T14:29:51.9428426Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T14:29:51.9428768Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T14:29:51.9429042Z 215 │ │ } 2026-10-24T14:29:51.9429305Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T14:29:51.9429559Z 217 │ │ }), 2026-10-24T14:29:51.9429849Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T14:29:51.9430211Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T14:29:51.9430486Z 220 │ │ yield* send(connection, { 2026-10-24T14:29:51.9430718Z 221 │ │ jsonrpc: "2.0", 2026-10-24T14:29:51.9430939Z 222 │ │ method: request.method, 2026-10-24T14:29:51.9431222Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T14:29:51.9431464Z 224 │ │ }); 2026-10-24T14:29:51.9431640Z 225 │ │ }), 2026-10-24T14:29:51.9431823Z 226 │ │ disconnect, 2026-10-24T14:29:51.9432039Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T14:29:51.9432306Z 228 │ │ Effect.forEach( 2026-10-24T14:29:51.9432528Z 229 │ │ [...connections.keys()], 2026-10-24T14:29:51.9432822Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T14:29:51.9433180Z 231 │ │ { discard: true }, 2026-10-24T14:29:51.9433450Z 232 │ │ ), 2026-10-24T14:29:51.9433623Z 233 │ │ ), 2026-10-24T14:29:51.9433796Z 234 │ │ }; 2026-10-24T14:29:51.9434030Z 235 │ ╰─▶ }); 2026-10-24T14:29:51.9434290Z ╰──── 2026-10-24T14:29:51.9434603Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T14:29:51.9434847Z 2026-10-24T14:29:51.9435063Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T14:29:51.9435407Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T14:29:51.9435616Z 21 │ 2026-10-24T14:29:51.9435846Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T14:29:51.9436109Z ·  ────────┬─────── 2026-10-24T14:29:51.9436364Z · ╰── 'summarizePayload' is declared here 2026-10-24T14:29:51.9436622Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T14:29:51.9436796Z ╰──── 2026-10-24T14:29:51.9436964Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9437084Z 2026-10-24T14:29:51.9437281Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T14:29:51.9437575Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T14:29:51.9437777Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T14:29:51.9437970Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T14:29:51.9438154Z ·  ──┬── 2026-10-24T14:29:51.9438384Z · ╰── 'Fiber' is imported here 2026-10-24T14:29:51.9438627Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T14:29:51.9438795Z ╰──── 2026-10-24T14:29:51.9438954Z  help: Consider removing this import. 2026-10-24T14:29:51.9439068Z 2026-10-24T14:29:51.9439269Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T14:29:51.9439561Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T14:29:51.9439750Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T14:29:51.9439947Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T14:29:51.9440140Z ·  ────┬─── 2026-10-24T14:29:51.9440369Z · ╰── 'Schedule' is imported here 2026-10-24T14:29:51.9440606Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T14:29:51.9440766Z ╰──── 2026-10-24T14:29:51.9440921Z  help: Consider removing this import. 2026-10-24T14:29:51.9441035Z 2026-10-24T14:29:51.9441334Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9441717Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T14:29:51.9441994Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T14:29:51.9442399Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T14:29:51.9442714Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9443009Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T14:29:51.9443412Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T14:29:51.9443718Z ╰──── 2026-10-24T14:29:51.9443882Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9444004Z 2026-10-24T14:29:51.9444212Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T14:29:51.9444588Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T14:29:51.9444798Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T14:29:51.9445001Z 28 │ import { identity } from "effect/Function"; 2026-10-24T14:29:51.9445195Z ·  ────┬─── 2026-10-24T14:29:51.9445426Z · ╰── 'identity' is imported here 2026-10-24T14:29:51.9445652Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T14:29:51.9445818Z ╰──── 2026-10-24T14:29:51.9445975Z  help: Consider removing this import. 2026-10-24T14:29:51.9446095Z 2026-10-24T14:29:51.9446281Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:29:51.9446626Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T14:29:51.9446903Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T14:29:51.9447212Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T14:29:51.9447549Z ·  ─────┬───── 2026-10-24T14:29:51.9447899Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T14:29:51.9448180Z 101 │ const readEditor = useCallback( 2026-10-24T14:29:51.9448338Z ╰──── 2026-10-24T14:29:51.9448718Z  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-24T14:29:51.9449336Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9449639Z 2026-10-24T14:29:51.9449828Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:29:51.9450171Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T14:29:51.9450407Z 120 │ setEditor, 2026-10-24T14:29:51.9450554Z 121 │ startEditor, 2026-10-24T14:29:51.9450727Z ·  ─────┬───── 2026-10-24T14:29:51.9450977Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T14:29:51.9451196Z 122 │ hasChanges, 2026-10-24T14:29:51.9451332Z ╰──── 2026-10-24T14:29:51.9451707Z  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-24T14:29:51.9452360Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9452661Z 2026-10-24T14:29:51.9453038Z ⚠ 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-24T14:29:51.9453565Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T14:29:51.9453928Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T14:29:51.9454218Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T14:29:51.9454536Z ·  ──────────────────────── 2026-10-24T14:29:51.9454818Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T14:29:51.9455029Z ╰──── 2026-10-24T14:29:51.9455087Z 2026-10-24T14:29:51.9455467Z ⚠ 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-24T14:29:51.9455938Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T14:29:51.9456181Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T14:29:51.9456474Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T14:29:51.9456765Z ·  ──────────────────────── 2026-10-24T14:29:51.9456955Z 257 │ return [ 2026-10-24T14:29:51.9457090Z ╰──── 2026-10-24T14:29:51.9457152Z 2026-10-24T14:29:51.9457455Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9457908Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T14:29:51.9458135Z 345 │ 2026-10-24T14:29:51.9458243Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T14:29:51.9458342Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9458522Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T14:29:51.9458605Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T14:29:51.9458663Z ╰──── 2026-10-24T14:29:51.9458773Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9458776Z 2026-10-24T14:29:51.9459254Z ⚠ 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-24T14:29:51.9459417Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T14:29:51.9459512Z 1679 │ yield* harness.replaceSession; 2026-10-24T14:29:51.9459740Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:51.9459908Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T14:29:51.9460004Z 1682 │ │ break; 2026-10-24T14:29:51.9460086Z 1683 │ │ } 2026-10-24T14:29:51.9460202Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9460346Z 1685 │ ╰─▶ } 2026-10-24T14:29:51.9460426Z 1686 │ yield* Queue.offer( 2026-10-24T14:29:51.9460479Z ╰──── 2026-10-24T14:29:51.9460482Z 2026-10-24T14:29:51.9460959Z ⚠ 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-24T14:29:51.9461205Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T14:29:51.9461365Z 1788 │ yield* harness.replaceSession; 2026-10-24T14:29:51.9461576Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:51.9461743Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T14:29:51.9461856Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9462006Z 1792 │ ╰─▶ } 2026-10-24T14:29:51.9462411Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T14:29:51.9462501Z ╰──── 2026-10-24T14:29:51.9462506Z 2026-10-24T14:29:51.9462690Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9462853Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T14:29:51.9463083Z 53 │ const child = children as ReactElement>; 2026-10-24T14:29:51.9463301Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T14:29:51.9463436Z 55 │ │ onTouchStart: (event) => { 2026-10-24T14:29:51.9463637Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T14:29:51.9463835Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T14:29:51.9463992Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T14:29:51.9464202Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T14:29:51.9464352Z 60 │ │ pendingPress.current = null; 2026-10-24T14:29:51.9464509Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T14:29:51.9464606Z 62 │ │ }, 2026-10-24T14:29:51.9464730Z 63 │ │ onPress: (event) => { 2026-10-24T14:29:51.9464942Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T14:29:51.9465111Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T14:29:51.9465313Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T14:29:51.9465548Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T14:29:51.9465658Z 68 │ │ return; 2026-10-24T14:29:51.9465763Z 69 │ │ } 2026-10-24T14:29:51.9465936Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T14:29:51.9466147Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T14:29:51.9466421Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T14:29:51.9466547Z 73 │ │ event.persist(); 2026-10-24T14:29:51.9466746Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T14:29:51.9466850Z 75 │ │ return; 2026-10-24T14:29:51.9466947Z 76 │ │ } 2026-10-24T14:29:51.9467090Z 77 │ │ child.props.onPress?.(event); 2026-10-24T14:29:51.9467294Z 78 │ │ }, 2026-10-24T14:29:51.9467506Z 79 │ ├─▶ }); 2026-10-24T14:29:51.9467808Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9467938Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T14:29:51.9468008Z ╰──── 2026-10-24T14:29:51.9468579Z  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-24T14:29:51.9468944Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9468954Z 2026-10-24T14:29:51.9469278Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9469454Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T14:29:51.9469524Z 57 │ 2026-10-24T14:29:51.9469604Z 58 │ useEffect(() => { 2026-10-24T14:29:51.9469695Z ·  ────┬──── 2026-10-24T14:29:51.9469861Z · ╰── This is the containing effect 2026-10-24T14:29:51.9469981Z 59 │ const controller = new AbortController(); 2026-10-24T14:29:51.9470072Z 60 │ setLoadState("pending"); 2026-10-24T14:29:51.9470169Z ·  ──────┬───── 2026-10-24T14:29:51.9470383Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9470587Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T14:29:51.9470655Z ╰──── 2026-10-24T14:29:51.9471383Z  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-24T14:29:51.9471782Z  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-24T14:29:51.9471785Z 2026-10-24T14:29:51.9472034Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9472283Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T14:29:51.9472397Z 70 │ return () => controller.abort(); 2026-10-24T14:29:51.9472499Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T14:29:51.9472681Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T14:29:51.9472918Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T14:29:51.9473126Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T14:29:51.9473274Z · ╰── Unnecessary dependency `player_0` 2026-10-24T14:29:51.9473333Z 72 │ 2026-10-24T14:29:51.9473388Z ╰──── 2026-10-24T14:29:51.9473698Z  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-24T14:29:51.9474025Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9474027Z 2026-10-24T14:29:51.9474297Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9474456Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T14:29:51.9474514Z 404 │ 2026-10-24T14:29:51.9474582Z 405 │ useEffect(() => { 2026-10-24T14:29:51.9474660Z ·  ────┬──── 2026-10-24T14:29:51.9474799Z · ╰── This is the containing effect 2026-10-24T14:29:51.9474901Z 406 │ setInspectorSelection((current) => { 2026-10-24T14:29:51.9474995Z ·  ──────────┬────────── 2026-10-24T14:29:51.9475173Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9475281Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T14:29:51.9475335Z ╰──── 2026-10-24T14:29:51.9475950Z  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-24T14:29:51.9476286Z  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-24T14:29:51.9476289Z 2026-10-24T14:29:51.9476515Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T14:29:51.9476676Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T14:29:51.9476844Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T14:29:51.9477018Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T14:29:51.9477122Z 535 │ │ 2026-10-24T14:29:51.9477848Z 540 │ ╰─▶ ); 2026-10-24T14:29:51.9477933Z 541 │ const FilesInspector = () => 2026-10-24T14:29:51.9477985Z ╰──── 2026-10-24T14:29:51.9478212Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T14:29:51.9478215Z 2026-10-24T14:29:51.9478434Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T14:29:51.9478591Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T14:29:51.9478650Z 540 │ ); 2026-10-24T14:29:51.9478821Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T14:29:51.9478984Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T14:29:51.9479097Z 543 │ │ 2026-10-24T14:29:51.9480114Z 551 │ ╰─▶ ) : null; 2026-10-24T14:29:51.9480277Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T14:29:51.9480330Z ╰──── 2026-10-24T14:29:51.9480555Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T14:29:51.9480559Z 2026-10-24T14:29:51.9480768Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T14:29:51.9480905Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T14:29:51.9480980Z 2 │ AuthFilesystemReadScope, 2026-10-24T14:29:51.9481056Z 3 │ type AuthSessionState, 2026-10-24T14:29:51.9481145Z ·  ────────┬─────── 2026-10-24T14:29:51.9481306Z · ╰── 'AuthSessionState' is imported here 2026-10-24T14:29:51.9481387Z 4 │ type FilesystemBrowseEntry, 2026-10-24T14:29:51.9481442Z ╰──── 2026-10-24T14:29:51.9481546Z  help: Consider removing this import. 2026-10-24T14:29:51.9481549Z 2026-10-24T14:29:51.9481817Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9481968Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T14:29:51.9482031Z 61 │ }, []); 2026-10-24T14:29:51.9482205Z 62 │ useEffect(() => { 2026-10-24T14:29:51.9482313Z ·  ────┬──── 2026-10-24T14:29:51.9482454Z · ╰── This is the containing effect 2026-10-24T14:29:51.9482613Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T14:29:51.9482826Z ·  ───────┬────── 2026-10-24T14:29:51.9483111Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9483195Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T14:29:51.9483252Z ╰──── 2026-10-24T14:29:51.9483935Z  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-24T14:29:51.9484266Z  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-24T14:29:51.9484275Z 2026-10-24T14:29:51.9484543Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9484682Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T14:29:51.9484792Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T14:29:51.9484863Z 67 │ useEffect(() => { 2026-10-24T14:29:51.9484939Z ·  ────┬──── 2026-10-24T14:29:51.9485070Z · ╰── This is the containing effect 2026-10-24T14:29:51.9485138Z 68 │ setUri(null); 2026-10-24T14:29:51.9485214Z ·  ───┬── 2026-10-24T14:29:51.9485385Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9485450Z 69 │ setError(null); 2026-10-24T14:29:51.9485512Z ╰──── 2026-10-24T14:29:51.9486111Z  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-24T14:29:51.9486436Z  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-24T14:29:51.9486439Z 2026-10-24T14:29:51.9486647Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9486785Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T14:29:51.9486843Z 90 │ }; 2026-10-24T14:29:51.9486927Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T14:29:51.9487052Z ·  ──────┬───── ───┬─── 2026-10-24T14:29:51.9487238Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T14:29:51.9487391Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T14:29:51.9487532Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T14:29:51.9487586Z ╰──── 2026-10-24T14:29:51.9487882Z  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-24T14:29:51.9488195Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9488198Z 2026-10-24T14:29:51.9488470Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9488675Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T14:29:51.9488746Z 212 │ useEffect(() => { 2026-10-24T14:29:51.9488862Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T14:29:51.9488968Z ·  ──┬── 2026-10-24T14:29:51.9489124Z · ╰── Missing dependency `props` 2026-10-24T14:29:51.9489238Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T14:29:51.9489390Z ·  ──────────┬───────── 2026-10-24T14:29:51.9489663Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T14:29:51.9489744Z 215 │ const { source } = props; 2026-10-24T14:29:51.9489798Z ╰──── 2026-10-24T14:29:51.9490222Z  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-24T14:29:51.9490536Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9490539Z 2026-10-24T14:29:51.9490766Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T14:29:51.9490915Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T14:29:51.9490985Z 237 │ ): string { 2026-10-24T14:29:51.9491147Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T14:29:51.9491264Z ·  ────── 2026-10-24T14:29:51.9491401Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T14:29:51.9491455Z ╰──── 2026-10-24T14:29:51.9491629Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T14:29:51.9491632Z 2026-10-24T14:29:51.9492141Z ⚠ 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-24T14:29:51.9492341Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T14:29:51.9492421Z 222 │ let idlePasses = 0; 2026-10-24T14:29:51.9492568Z 223 │ ╭─▶ for (;;) { 2026-10-24T14:29:51.9492712Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T14:29:51.9492862Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T14:29:51.9492964Z 226 │ │ if (!pending) { 2026-10-24T14:29:51.9493065Z 227 │ │ idlePasses++; 2026-10-24T14:29:51.9493171Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T14:29:51.9493262Z 229 │ │ return; 2026-10-24T14:29:51.9493344Z 230 │ │ } 2026-10-24T14:29:51.9493433Z 231 │ │ continue; 2026-10-24T14:29:51.9493576Z 232 │ │ } 2026-10-24T14:29:51.9493735Z 233 │ │ idlePasses = 0; 2026-10-24T14:29:51.9493859Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T14:29:51.9494076Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T14:29:51.9494158Z 236 │ │ ); 2026-10-24T14:29:51.9494271Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T14:29:51.9494429Z 238 │ │ pending.resolve(exit); 2026-10-24T14:29:51.9494529Z 239 │ │ }); 2026-10-24T14:29:51.9494662Z 240 │ ╰─▶ } 2026-10-24T14:29:51.9494724Z 241 │ }, 2026-10-24T14:29:51.9494781Z ╰──── 2026-10-24T14:29:51.9494790Z 2026-10-24T14:29:51.9495058Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9495213Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T14:29:51.9495275Z 568 │ }, []); 2026-10-24T14:29:51.9495346Z 569 │ useEffect(() => { 2026-10-24T14:29:51.9495424Z ·  ────┬──── 2026-10-24T14:29:51.9495557Z · ╰── This is the containing effect 2026-10-24T14:29:51.9495644Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T14:29:51.9495738Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9495918Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9496030Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T14:29:51.9496089Z ╰──── 2026-10-24T14:29:51.9496689Z  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-24T14:29:51.9497015Z  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-24T14:29:51.9497018Z 2026-10-24T14:29:51.9497278Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9497432Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T14:29:51.9497594Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T14:29:51.9497662Z 964 │ useEffect(() => { 2026-10-24T14:29:51.9497738Z ·  ────┬──── 2026-10-24T14:29:51.9497869Z · ╰── This is the containing effect 2026-10-24T14:29:51.9498031Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T14:29:51.9498146Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T14:29:51.9498249Z ·  ─────────────┬──────────── 2026-10-24T14:29:51.9498427Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9498484Z 967 │ } 2026-10-24T14:29:51.9498537Z ╰──── 2026-10-24T14:29:51.9499192Z  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-24T14:29:51.9499574Z  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-24T14:29:51.9499578Z 2026-10-24T14:29:51.9499834Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9499998Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T14:29:51.9500086Z 1220 │ 2026-10-24T14:29:51.9500197Z 1221 │ useEffect(() => { 2026-10-24T14:29:51.9500273Z ·  ────┬──── 2026-10-24T14:29:51.9500411Z · ╰── This is the containing effect 2026-10-24T14:29:51.9500495Z 1222 │ setAnchorMessageId(null); 2026-10-24T14:29:51.9500582Z ·  ─────────┬──────── 2026-10-24T14:29:51.9500756Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9500840Z 1223 │ setSubmittedMessageId(null); 2026-10-24T14:29:51.9500894Z ╰──── 2026-10-24T14:29:51.9501489Z  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-24T14:29:51.9501813Z  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-24T14:29:51.9501820Z 2026-10-24T14:29:51.9502022Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9502211Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T14:29:51.9502298Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T14:29:51.9502400Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T14:29:51.9502546Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T14:29:51.9502755Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T14:29:51.9502977Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T14:29:51.9503165Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T14:29:51.9503217Z ╰──── 2026-10-24T14:29:51.9503512Z  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-24T14:29:51.9503854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9503858Z 2026-10-24T14:29:51.9504102Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9504260Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T14:29:51.9504347Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T14:29:51.9504518Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T14:29:51.9504619Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9504802Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T14:29:51.9504910Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T14:29:51.9504965Z ╰──── 2026-10-24T14:29:51.9505261Z  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-24T14:29:51.9505571Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9505573Z 2026-10-24T14:29:51.9505778Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9505941Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T14:29:51.9506013Z 1227 │ freeze.set(false); 2026-10-24T14:29:51.9506097Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T14:29:51.9506192Z ·  ────────┬──────── 2026-10-24T14:29:51.9506454Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T14:29:51.9506514Z 1229 │ 2026-10-24T14:29:51.9506569Z ╰──── 2026-10-24T14:29:51.9506858Z  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-24T14:29:51.9507175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9507182Z 2026-10-24T14:29:51.9507342Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9507495Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T14:29:51.9507610Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T14:29:51.9507718Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T14:29:51.9507817Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9507982Z · ╰── `floatingControlCoverage` originates here 2026-10-24T14:29:51.9508113Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T14:29:51.9508169Z 1056 │ ); 2026-10-24T14:29:51.9508240Z 1057 │ useEffect(() => { 2026-10-24T14:29:51.9508419Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T14:29:51.9508578Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9508744Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T14:29:51.9508875Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T14:29:51.9508929Z ╰──── 2026-10-24T14:29:51.9509199Z  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-24T14:29:51.9509580Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9509583Z 2026-10-24T14:29:51.9509743Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9509901Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T14:29:51.9510094Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T14:29:51.9510222Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T14:29:51.9510337Z ·  ────────────────┬──────────────── 2026-10-24T14:29:51.9510527Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T14:29:51.9510663Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T14:29:51.9510720Z 1069 │ ); 2026-10-24T14:29:51.9510792Z 1070 │ useAnimatedReaction( 2026-10-24T14:29:51.9510856Z 1071 │ () => 2026-10-24T14:29:51.9510953Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T14:29:51.9511048Z 1073 │ floatingControlCoverage.value + 2026-10-24T14:29:51.9511252Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T14:29:51.9511319Z 1075 │ (value) => { 2026-10-24T14:29:51.9511436Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T14:29:51.9511549Z ·  ────────────────┬──────────────── 2026-10-24T14:29:51.9511742Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T14:29:51.9511801Z 1077 │ }, 2026-10-24T14:29:51.9511854Z ╰──── 2026-10-24T14:29:51.9512165Z  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-24T14:29:51.9512479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9512485Z 2026-10-24T14:29:51.9512645Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9512812Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T14:29:51.9512871Z 107 │ ); 2026-10-24T14:29:51.9513025Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T14:29:51.9513117Z ·  ─────────┬──────── 2026-10-24T14:29:51.9513272Z · ╰── `separationProgress` originates here 2026-10-24T14:29:51.9513329Z 109 │ 2026-10-24T14:29:51.9513394Z 110 │ useEffect(() => { 2026-10-24T14:29:51.9513624Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T14:29:51.9513771Z ·  ─────────┬──────── 2026-10-24T14:29:51.9513928Z · ╰── `separationProgress` cannot be modified 2026-10-24T14:29:51.9514037Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T14:29:51.9514092Z ╰──── 2026-10-24T14:29:51.9514360Z  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-24T14:29:51.9514741Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9514744Z 2026-10-24T14:29:51.9514898Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9515067Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T14:29:51.9515185Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T14:29:51.9515304Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T14:29:51.9515388Z ·  ──────┬───── 2026-10-24T14:29:51.9515526Z · ╰── `capsuleWidth` originates here 2026-10-24T14:29:51.9515641Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T14:29:51.9515760Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9515866Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T14:29:51.9515963Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T14:29:51.9516029Z 134 │ return; 2026-10-24T14:29:51.9516086Z 135 │ } 2026-10-24T14:29:51.9516198Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T14:29:51.9516289Z 137 │ measuredWidthRef.current = width; 2026-10-24T14:29:51.9516435Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T14:29:51.9516514Z ·  ──────┬───── 2026-10-24T14:29:51.9516655Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T14:29:51.9516713Z 139 │ }; 2026-10-24T14:29:51.9516766Z ╰──── 2026-10-24T14:29:51.9517031Z  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-24T14:29:51.9517337Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9517340Z 2026-10-24T14:29:51.9517501Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9517667Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T14:29:51.9517782Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T14:29:51.9517900Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T14:29:51.9517980Z ·  ──────┬───── 2026-10-24T14:29:51.9518119Z · ╰── `capsuleWidth` originates here 2026-10-24T14:29:51.9518233Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T14:29:51.9518352Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9518456Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T14:29:51.9518554Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T14:29:51.9518670Z 134 │ return; 2026-10-24T14:29:51.9518783Z 135 │ } 2026-10-24T14:29:51.9518889Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T14:29:51.9518978Z 137 │ measuredWidthRef.current = width; 2026-10-24T14:29:51.9519122Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T14:29:51.9519178Z 139 │ }; 2026-10-24T14:29:51.9519269Z 140 │ const hasStatus = props.status !== null; 2026-10-24T14:29:51.9519411Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T14:29:51.9519478Z 142 │ useEffect(() => { 2026-10-24T14:29:51.9519584Z 143 │ if (!hasStatus) { 2026-10-24T14:29:51.9519699Z 144 │ measuredWidthRef.current = null; 2026-10-24T14:29:51.9519779Z 145 │ capsuleWidth.value = null; 2026-10-24T14:29:51.9519859Z ·  ──────┬───── 2026-10-24T14:29:51.9520010Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T14:29:51.9520068Z 146 │ } 2026-10-24T14:29:51.9520121Z ╰──── 2026-10-24T14:29:51.9520383Z  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-24T14:29:51.9520688Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9520691Z 2026-10-24T14:29:51.9520893Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:29:51.9521058Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T14:29:51.9521193Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T14:29:51.9521263Z 142 │ useEffect(() => { 2026-10-24T14:29:51.9521344Z ·  ───┬─── 2026-10-24T14:29:51.9521571Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T14:29:51.9521639Z 143 │ if (!hasStatus) { 2026-10-24T14:29:51.9521726Z 144 │ measuredWidthRef.current = null; 2026-10-24T14:29:51.9521803Z 145 │ capsuleWidth.value = null; 2026-10-24T14:29:51.9521882Z ·  ──────┬───── 2026-10-24T14:29:51.9522020Z · ╰── This modifies `capsuleWidth` 2026-10-24T14:29:51.9522088Z 146 │ } 2026-10-24T14:29:51.9522141Z ╰──── 2026-10-24T14:29:51.9522574Z  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-24T14:29:51.9522939Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9522942Z 2026-10-24T14:29:51.9523141Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:29:51.9523305Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T14:29:51.9523482Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T14:29:51.9523602Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9523731Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9523978Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T14:29:51.9524086Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T14:29:51.9524188Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T14:29:51.9524253Z 134 │ return; 2026-10-24T14:29:51.9524312Z 135 │ } 2026-10-24T14:29:51.9524417Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T14:29:51.9524506Z 137 │ measuredWidthRef.current = width; 2026-10-24T14:29:51.9524650Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T14:29:51.9524730Z ·  ──────┬───── 2026-10-24T14:29:51.9524865Z · ╰── This modifies `capsuleWidth` 2026-10-24T14:29:51.9524924Z 139 │ }; 2026-10-24T14:29:51.9524979Z ╰──── 2026-10-24T14:29:51.9525323Z  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-24T14:29:51.9525628Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9525631Z 2026-10-24T14:29:51.9525839Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T14:29:51.9525974Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T14:29:51.9526053Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T14:29:51.9526124Z 3 │ type AuthSessionState, 2026-10-24T14:29:51.9526210Z ·  ────────┬─────── 2026-10-24T14:29:51.9526365Z · ╰── 'AuthSessionState' is imported here 2026-10-24T14:29:51.9526438Z 4 │ sessionGrantsScope, 2026-10-24T14:29:51.9526491Z ╰──── 2026-10-24T14:29:51.9526594Z  help: Consider removing this import. 2026-10-24T14:29:51.9526598Z 2026-10-24T14:29:51.9526802Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9526938Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T14:29:51.9526994Z 81 │ }, 2026-10-24T14:29:51.9527061Z 82 │ [draftKey], 2026-10-24T14:29:51.9527137Z ·  ────┬─── 2026-10-24T14:29:51.9527280Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T14:29:51.9527336Z 83 │ ); 2026-10-24T14:29:51.9527390Z ╰──── 2026-10-24T14:29:51.9527736Z  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-24T14:29:51.9528108Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9528110Z 2026-10-24T14:29:51.9528370Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9528544Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T14:29:51.9528631Z 118 │ 2026-10-24T14:29:51.9528738Z 119 │ useEffect(() => { 2026-10-24T14:29:51.9528813Z ·  ────┬──── 2026-10-24T14:29:51.9528944Z · ╰── This is the containing effect 2026-10-24T14:29:51.9529031Z 120 │ if (orientationSettled) return; 2026-10-24T14:29:51.9529152Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T14:29:51.9529234Z 122 │ if (orientation === null) { 2026-10-24T14:29:51.9529316Z 123 │ setOrientationSettled(true); 2026-10-24T14:29:51.9529413Z ·  ──────────┬────────── 2026-10-24T14:29:51.9529592Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9529658Z 124 │ return; 2026-10-24T14:29:51.9529711Z ╰──── 2026-10-24T14:29:51.9530311Z  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-24T14:29:51.9530636Z  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-24T14:29:51.9530641Z 2026-10-24T14:29:51.9530898Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9531069Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T14:29:51.9531123Z 292 │ 2026-10-24T14:29:51.9531191Z 293 │ useEffect(() => { 2026-10-24T14:29:51.9531266Z ·  ────┬──── 2026-10-24T14:29:51.9531395Z · ╰── This is the containing effect 2026-10-24T14:29:51.9531457Z 294 │ if ( 2026-10-24T14:29:51.9531529Z 295 │ scene === null || 2026-10-24T14:29:51.9531609Z 296 │ requestedScene === null || 2026-10-24T14:29:51.9531691Z 297 │ scene !== requestedScene || 2026-10-24T14:29:51.9531760Z 298 │ !hasFixture || 2026-10-24T14:29:51.9531837Z 299 │ !orientationSettled || 2026-10-24T14:29:51.9531908Z 300 │ !themeApplied || 2026-10-24T14:29:51.9532029Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T14:29:51.9532206Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T14:29:51.9532266Z 303 │ ) { 2026-10-24T14:29:51.9532341Z 304 │ setReadyScene(null); 2026-10-24T14:29:51.9532423Z ·  ──────┬────── 2026-10-24T14:29:51.9532600Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9532668Z 305 │ return; 2026-10-24T14:29:51.9532723Z ╰──── 2026-10-24T14:29:51.9533384Z  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-24T14:29:51.9533773Z  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-24T14:29:51.9533776Z 2026-10-24T14:29:51.9534057Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9534558Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T14:29:51.9534635Z 127 │ let cancelled = false; 2026-10-24T14:29:51.9534731Z 128 │ let lastOutcome: string | null = null; 2026-10-24T14:29:51.9534817Z ·  ─────┬───── 2026-10-24T14:29:51.9534958Z · ╰── 'lastOutcome' is declared here 2026-10-24T14:29:51.9535143Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T14:29:51.9535197Z ╰──── 2026-10-24T14:29:51.9535309Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9535312Z 2026-10-24T14:29:51.9535574Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9535737Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T14:29:51.9535803Z 259 │ .join("|"); 2026-10-24T14:29:51.9535869Z 260 │ useEffect(() => { 2026-10-24T14:29:51.9535953Z ·  ────┬──── 2026-10-24T14:29:51.9536090Z · ╰── This is the containing effect 2026-10-24T14:29:51.9536154Z 261 │ stop(); 2026-10-24T14:29:51.9536229Z ·  ──┬─ 2026-10-24T14:29:51.9536398Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9536469Z 262 │ }, [orderVersion]); 2026-10-24T14:29:51.9536521Z ╰──── 2026-10-24T14:29:51.9537123Z  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-24T14:29:51.9537454Z  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-24T14:29:51.9537459Z 2026-10-24T14:29:51.9537681Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9537844Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T14:29:51.9537911Z 260 │ useEffect(() => { 2026-10-24T14:29:51.9537975Z 261 │ stop(); 2026-10-24T14:29:51.9538048Z ·  ──┬─ 2026-10-24T14:29:51.9538178Z · ╰── Missing dependency `stop` 2026-10-24T14:29:51.9538246Z 262 │ }, [orderVersion]); 2026-10-24T14:29:51.9538331Z ·  ──────┬───── 2026-10-24T14:29:51.9538483Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T14:29:51.9538603Z 263 │ useEffect( 2026-10-24T14:29:51.9538723Z ╰──── 2026-10-24T14:29:51.9539158Z  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-24T14:29:51.9539525Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9539530Z 2026-10-24T14:29:51.9539706Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9539870Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T14:29:51.9539950Z 95 │ const latest = useRef(props); 2026-10-24T14:29:51.9540026Z 96 │ latest.current = props; 2026-10-24T14:29:51.9540140Z ·  ───┬──────┬─── 2026-10-24T14:29:51.9540327Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9540446Z · ╰── This value is a ref 2026-10-24T14:29:51.9540520Z 97 │ const gesture = useMemo( 2026-10-24T14:29:51.9540575Z ╰──── 2026-10-24T14:29:51.9541054Z  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-24T14:29:51.9541349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9541354Z 2026-10-24T14:29:51.9541506Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9541672Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T14:29:51.9541743Z 103 │ .runOnJS(true) 2026-10-24T14:29:51.9541849Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T14:29:51.9541968Z ·  ───────────────┬────────────── 2026-10-24T14:29:51.9542219Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9542362Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9542417Z ╰──── 2026-10-24T14:29:51.9542903Z  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-24T14:29:51.9543209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9543212Z 2026-10-24T14:29:51.9543365Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9543528Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T14:29:51.9543634Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T14:29:51.9543771Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9543925Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T14:29:51.9544225Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9544423Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9544478Z ╰──── 2026-10-24T14:29:51.9544963Z  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-24T14:29:51.9545342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9545345Z 2026-10-24T14:29:51.9545498Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9545667Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T14:29:51.9545804Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9545934Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9546085Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T14:29:51.9546408Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9546573Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T14:29:51.9546631Z ╰──── 2026-10-24T14:29:51.9547114Z  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-24T14:29:51.9547415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9547418Z 2026-10-24T14:29:51.9547570Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9547731Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T14:29:51.9547863Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9547994Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T14:29:51.9548142Z ·  ───────────────────────┬────────────────────── 2026-10-24T14:29:51.9548424Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9548563Z 108 │ [props.disabled], 2026-10-24T14:29:51.9548619Z ╰──── 2026-10-24T14:29:51.9549101Z  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-24T14:29:51.9549478Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9549486Z 2026-10-24T14:29:51.9549635Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9549799Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T14:29:51.9549927Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T14:29:51.9550042Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T14:29:51.9550152Z ·  ───┬──────┬─── 2026-10-24T14:29:51.9550341Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9550464Z · ╰── This value is a ref 2026-10-24T14:29:51.9550523Z 250 │ 2026-10-24T14:29:51.9550577Z ╰──── 2026-10-24T14:29:51.9551053Z  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-24T14:29:51.9551356Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9551362Z 2026-10-24T14:29:51.9551514Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9551678Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T14:29:51.9551802Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T14:29:51.9551926Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T14:29:51.9552060Z ·  ──────────────────┬────────────────── 2026-10-24T14:29:51.9552273Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9552388Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T14:29:51.9552445Z ╰──── 2026-10-24T14:29:51.9552930Z  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-24T14:29:51.9553233Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9553236Z 2026-10-24T14:29:51.9553414Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:51.9553578Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T14:29:51.9553648Z 323 │ update(0); 2026-10-24T14:29:51.9553735Z 324 │ let last = performance.now(); 2026-10-24T14:29:51.9553839Z ·  ────────┬──────── 2026-10-24T14:29:51.9554037Z · ╰── Cannot call impure function 2026-10-24T14:29:51.9554175Z 325 │ const tick = () => { 2026-10-24T14:29:51.9554233Z ╰──── 2026-10-24T14:29:51.9554546Z  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-24T14:29:51.9554856Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:51.9554858Z 2026-10-24T14:29:51.9555130Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T14:29:51.9555298Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T14:29:51.9555363Z  98 │ () => 2026-10-24T14:29:51.9555437Z  99 │ Gesture.Pan() 2026-10-24T14:29:51.9555521Z ·  ─┬─ 2026-10-24T14:29:51.9555660Z · ╰── `Pan` may be a component 2026-10-24T14:29:51.9555747Z 100 │ .enabled(!props.disabled) 2026-10-24T14:29:51.9555802Z ╰──── 2026-10-24T14:29:51.9556089Z  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-24T14:29:51.9556549Z  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-24T14:29:51.9556552Z 2026-10-24T14:29:51.9556753Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:29:51.9556920Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T14:29:51.9556991Z 103 │ .runOnJS(true) 2026-10-24T14:29:51.9557098Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T14:29:51.9557194Z ·  ───┬── 2026-10-24T14:29:51.9557642Z · ╰── 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-24T14:29:51.9557780Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9557912Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T14:29:51.9558052Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T14:29:51.9558128Z 108 │ [props.disabled], 2026-10-24T14:29:51.9558214Z ·  ────────┬─────── 2026-10-24T14:29:51.9558412Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9558473Z 109 │ ); 2026-10-24T14:29:51.9558528Z ╰──── 2026-10-24T14:29:51.9558741Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:29:51.9559068Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9559071Z 2026-10-24T14:29:51.9559236Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9559444Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T14:29:51.9559660Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T14:29:51.9559804Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T14:29:51.9559887Z ·  ────┬─── 2026-10-24T14:29:51.9560027Z · ╰── `rotation` originates here 2026-10-24T14:29:51.9560085Z 172 │ 2026-10-24T14:29:51.9560158Z 173 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9560335Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T14:29:51.9560453Z ·  ────┬─── 2026-10-24T14:29:51.9560593Z · ╰── `rotation` cannot be modified 2026-10-24T14:29:51.9560697Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T14:29:51.9560753Z ╰──── 2026-10-24T14:29:51.9561038Z  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-24T14:29:51.9561358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9561361Z 2026-10-24T14:29:51.9561563Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9561722Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T14:29:51.9561795Z 1245 │ 0) break; 2026-10-24T14:29:51.9600908Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9601043Z 181 │ ╰─▶ } 2026-10-24T14:29:51.9601099Z 182 │ 2026-10-24T14:29:51.9601151Z ╰──── 2026-10-24T14:29:51.9601155Z 2026-10-24T14:29:51.9601713Z ⚠ 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-24T14:29:51.9601864Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T14:29:51.9601998Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T14:29:51.9602232Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T14:29:51.9602355Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T14:29:51.9602550Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T14:29:51.9602640Z 310 │ │ break; 2026-10-24T14:29:51.9602720Z 311 │ │ } 2026-10-24T14:29:51.9602825Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9602959Z 313 │ ╰─▶ } 2026-10-24T14:29:51.9603014Z 314 │ 2026-10-24T14:29:51.9603065Z ╰──── 2026-10-24T14:29:51.9603069Z 2026-10-24T14:29:51.9603535Z ⚠ 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-24T14:29:51.9603662Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T14:29:51.9603738Z 138 │ Effect.gen(function* () { 2026-10-24T14:29:51.9603926Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T14:29:51.9604049Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T14:29:51.9604372Z 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-24T14:29:51.9604563Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T14:29:51.9604696Z 143 │ ╰─▶ } 2026-10-24T14:29:51.9604781Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T14:29:51.9604834Z ╰──── 2026-10-24T14:29:51.9604836Z 2026-10-24T14:29:51.9605096Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9605225Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T14:29:51.9605334Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T14:29:51.9605399Z 84 │ useEffect(() => { 2026-10-24T14:29:51.9605477Z ·  ────┬──── 2026-10-24T14:29:51.9605607Z · ╰── This is the containing effect 2026-10-24T14:29:51.9605748Z 85 │ if (!actionState.isRunning) return; 2026-10-24T14:29:51.9605878Z 86 │ setNowMs(Date.now()); 2026-10-24T14:29:51.9605951Z ·  ────┬─── 2026-10-24T14:29:51.9606118Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9606245Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T14:29:51.9606295Z ╰──── 2026-10-24T14:29:51.9606978Z  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-24T14:29:51.9607316Z  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-24T14:29:51.9607321Z 2026-10-24T14:29:51.9607537Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9607714Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T14:29:51.9607794Z 248 │ mountedRef.current = false; 2026-10-24T14:29:51.9607869Z 249 │ flow.setBranchQuery(""); 2026-10-24T14:29:51.9607936Z ·  ──┬─ 2026-10-24T14:29:51.9608064Z · ╰── Missing dependency `flow` 2026-10-24T14:29:51.9608120Z 250 │ }; 2026-10-24T14:29:51.9608194Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T14:29:51.9608283Z ·  ─────────┬───────── 2026-10-24T14:29:51.9608495Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T14:29:51.9608552Z 252 │ 2026-10-24T14:29:51.9608603Z ╰──── 2026-10-24T14:29:51.9609025Z  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-24T14:29:51.9609342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9609345Z 2026-10-24T14:29:51.9609501Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9609656Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T14:29:51.9609755Z 83 │ 2026-10-24T14:29:51.9609903Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T14:29:51.9609981Z ·  ──────┬───── 2026-10-24T14:29:51.9610119Z · ╰── `cardCoverage` originates here 2026-10-24T14:29:51.9610199Z 85 │ const barHeightRef = useRef(0); 2026-10-24T14:29:51.9610277Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T14:29:51.9610360Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T14:29:51.9610450Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T14:29:51.9610522Z 89 │ if (!cardCoverage) { 2026-10-24T14:29:51.9610588Z 90 │ return; 2026-10-24T14:29:51.9610676Z 91 │ } 2026-10-24T14:29:51.9610871Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T14:29:51.9610982Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T14:29:51.9611145Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:29:51.9611218Z ·  ──────┬───── 2026-10-24T14:29:51.9611355Z · ╰── `cardCoverage` cannot be modified 2026-10-24T14:29:51.9611421Z 95 │ }, [cardCoverage]); 2026-10-24T14:29:51.9611472Z ╰──── 2026-10-24T14:29:51.9611766Z  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-24T14:29:51.9612106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9612109Z 2026-10-24T14:29:51.9612269Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9612428Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T14:29:51.9612509Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T14:29:51.9612596Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T14:29:51.9612676Z ·  ─────┬──── 2026-10-24T14:29:51.9612809Z · ╰── `cardHeight` originates here 2026-10-24T14:29:51.9612902Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T14:29:51.9612970Z  89 │ if (!cardCoverage) { 2026-10-24T14:29:51.9613032Z  90 │ return; 2026-10-24T14:29:51.9613085Z  91 │ } 2026-10-24T14:29:51.9613245Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T14:29:51.9613346Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T14:29:51.9613508Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:29:51.9613577Z  95 │ }, [cardCoverage]); 2026-10-24T14:29:51.9613659Z  96 │ const handleBarLayout = useCallback( 2026-10-24T14:29:51.9613739Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9613862Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:29:51.9613928Z  99 │ notifyCoverage(); 2026-10-24T14:29:51.9613982Z 100 │ }, 2026-10-24T14:29:51.9614049Z 101 │ [notifyCoverage], 2026-10-24T14:29:51.9614102Z 102 │ ); 2026-10-24T14:29:51.9614188Z 103 │ const handleCardLayout = useCallback( 2026-10-24T14:29:51.9614267Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9614394Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:29:51.9614556Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T14:29:51.9614696Z ·  ─────┬──── 2026-10-24T14:29:51.9614832Z · ╰── `cardHeight` cannot be modified 2026-10-24T14:29:51.9614899Z 107 │ notifyCoverage(); 2026-10-24T14:29:51.9614949Z ╰──── 2026-10-24T14:29:51.9615213Z  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-24T14:29:51.9615591Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9615595Z 2026-10-24T14:29:51.9615794Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:29:51.9615953Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T14:29:51.9616040Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T14:29:51.9616129Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T14:29:51.9616232Z ·  ───┬─── 2026-10-24T14:29:51.9616472Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T14:29:51.9616538Z 89 │ if (!cardCoverage) { 2026-10-24T14:29:51.9616596Z 90 │ return; 2026-10-24T14:29:51.9616649Z 91 │ } 2026-10-24T14:29:51.9616812Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T14:29:51.9616914Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T14:29:51.9617074Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:29:51.9617153Z ·  ──────┬───── 2026-10-24T14:29:51.9617283Z · ╰── This modifies `cardCoverage` 2026-10-24T14:29:51.9617349Z 95 │ }, [cardCoverage]); 2026-10-24T14:29:51.9617400Z ╰──── 2026-10-24T14:29:51.9617739Z  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-24T14:29:51.9618039Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9618042Z 2026-10-24T14:29:51.9618238Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:29:51.9618396Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T14:29:51.9618497Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T14:29:51.9618652Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T14:29:51.9618727Z ·  ──────┬───── 2026-10-24T14:29:51.9618857Z · ╰── This modifies `cardCoverage` 2026-10-24T14:29:51.9618920Z 95 │ }, [cardCoverage]); 2026-10-24T14:29:51.9619005Z 96 │ const handleBarLayout = useCallback( 2026-10-24T14:29:51.9619085Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9619188Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9619408Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T14:29:51.9619577Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:29:51.9619684Z ╰──── 2026-10-24T14:29:51.9620018Z  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-24T14:29:51.9620323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9620328Z 2026-10-24T14:29:51.9620595Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:29:51.9620749Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T14:29:51.9620835Z 103 │ const handleCardLayout = useCallback( 2026-10-24T14:29:51.9620916Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T14:29:51.9621025Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9621248Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T14:29:51.9621372Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T14:29:51.9621485Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T14:29:51.9621559Z ·  ─────┬──── 2026-10-24T14:29:51.9621690Z · ╰── This modifies `cardHeight` 2026-10-24T14:29:51.9621756Z 107 │ notifyCoverage(); 2026-10-24T14:29:51.9621807Z ╰──── 2026-10-24T14:29:51.9622178Z  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-24T14:29:51.9622490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9622495Z 2026-10-24T14:29:51.9622705Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:29:51.9622843Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T14:29:51.9622966Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T14:29:51.9623071Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T14:29:51.9623181Z ·  ─────── 2026-10-24T14:29:51.9623291Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T14:29:51.9623342Z ╰──── 2026-10-24T14:29:51.9623602Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:29:51.9623607Z 2026-10-24T14:29:51.9623805Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9623947Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T14:29:51.9624028Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T14:29:51.9624090Z 1321 │ retryTick, 2026-10-24T14:29:51.9624164Z ·  ────┬──── 2026-10-24T14:29:51.9624304Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T14:29:51.9624377Z 1322 │ restoreQueuedMessage, 2026-10-24T14:29:51.9624428Z ╰──── 2026-10-24T14:29:51.9624786Z  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-24T14:29:51.9625148Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9625151Z 2026-10-24T14:29:51.9625406Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9625569Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T14:29:51.9625655Z 434 │ : null; 2026-10-24T14:29:51.9625762Z 435 │ useEffect(() => { 2026-10-24T14:29:51.9625836Z ·  ────┬──── 2026-10-24T14:29:51.9625966Z · ╰── This is the containing effect 2026-10-24T14:29:51.9626023Z 436 │ if ( 2026-10-24T14:29:51.9626103Z 437 │ props.active === false || 2026-10-24T14:29:51.9626184Z 438 │ activeDraftKey !== null || 2026-10-24T14:29:51.9626304Z 439 │ editingPendingTask !== null || 2026-10-24T14:29:51.9626490Z 440 │ selectedProject === null 2026-10-24T14:29:51.9626546Z 441 │ ) { 2026-10-24T14:29:51.9626605Z 442 │ return; 2026-10-24T14:29:51.9626658Z 443 │ } 2026-10-24T14:29:51.9626726Z 444 │ setActiveDraftKey( 2026-10-24T14:29:51.9626807Z ·  ────────┬──────── 2026-10-24T14:29:51.9626978Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9627047Z 445 │ createNewTaskDraft({ 2026-10-24T14:29:51.9627099Z ╰──── 2026-10-24T14:29:51.9627705Z  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-24T14:29:51.9628023Z  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-24T14:29:51.9628026Z 2026-10-24T14:29:51.9628264Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:29:51.9628427Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T14:29:51.9628534Z 1243 │ 2026-10-24T14:29:51.9628724Z 1244 │ {props.children} 2026-10-24T14:29:51.9628839Z ·  ───────────── 2026-10-24T14:29:51.9628913Z 1245 │ 2026-10-24T14:29:51.9628965Z ╰──── 2026-10-24T14:29:51.9629187Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:29:51.9629327Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:29:51.9629329Z 2026-10-24T14:29:51.9629516Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T14:29:51.9629649Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T14:29:51.9629765Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T14:29:51.9629846Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T14:29:51.9629989Z ·  ─┬─ 2026-10-24T14:29:51.9630178Z · ╰── 'Arr' is imported here 2026-10-24T14:29:51.9630261Z 5 │ import * as Order from "effect/Order"; 2026-10-24T14:29:51.9630313Z ╰──── 2026-10-24T14:29:51.9630410Z  help: Consider removing this import. 2026-10-24T14:29:51.9630414Z 2026-10-24T14:29:51.9630603Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T14:29:51.9630739Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T14:29:51.9630869Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T14:29:51.9630966Z 5 │ import * as Order from "effect/Order"; 2026-10-24T14:29:51.9631038Z ·  ──┬── 2026-10-24T14:29:51.9631167Z · ╰── 'Order' is imported here 2026-10-24T14:29:51.9631226Z 6 │ 2026-10-24T14:29:51.9631277Z ╰──── 2026-10-24T14:29:51.9631372Z  help: Consider removing this import. 2026-10-24T14:29:51.9631375Z 2026-10-24T14:29:51.9631627Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9631800Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T14:29:51.9631852Z 58 │ 2026-10-24T14:29:51.9631917Z 59 │ useEffect(() => { 2026-10-24T14:29:51.9631988Z ·  ────┬──── 2026-10-24T14:29:51.9632154Z · ╰── This is the containing effect 2026-10-24T14:29:51.9632248Z 60 │ setMountedModes((current) => { 2026-10-24T14:29:51.9632326Z ·  ───────┬─────── 2026-10-24T14:29:51.9632499Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9632584Z 61 │ if (current.has(props.mode)) { 2026-10-24T14:29:51.9632635Z ╰──── 2026-10-24T14:29:51.9633220Z  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-24T14:29:51.9633539Z  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-24T14:29:51.9633541Z 2026-10-24T14:29:51.9633744Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T14:29:51.9633963Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T14:29:51.9634114Z 14 │ } from "@t3tools/contracts"; 2026-10-24T14:29:51.9634204Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T14:29:51.9634274Z ·  ── 2026-10-24T14:29:51.9634326Z 16 │ 2026-10-24T14:29:51.9634375Z ╰──── 2026-10-24T14:29:51.9634457Z  help: Remove empty braces 2026-10-24T14:29:51.9634459Z 2026-10-24T14:29:51.9634626Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:51.9634753Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T14:29:51.9634821Z 265 │ 2026-10-24T14:29:51.9634978Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T14:29:51.9635053Z ·  ── 2026-10-24T14:29:51.9635107Z 267 │ } 2026-10-24T14:29:51.9635163Z ╰──── 2026-10-24T14:29:51.9635393Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:51.9635395Z 2026-10-24T14:29:51.9635648Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9635811Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T14:29:51.9635865Z 213 │ }; 2026-10-24T14:29:51.9635929Z 214 │ useEffect(() => { 2026-10-24T14:29:51.9636001Z ·  ────┬──── 2026-10-24T14:29:51.9636132Z · ╰── This is the containing effect 2026-10-24T14:29:51.9636304Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T14:29:51.9636373Z 216 │ if (inserted) { 2026-10-24T14:29:51.9636452Z 217 │ setSelection((current) => 2026-10-24T14:29:51.9636531Z ·  ──────┬───── 2026-10-24T14:29:51.9636699Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9636870Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T14:29:51.9636924Z ╰──── 2026-10-24T14:29:51.9637520Z  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-24T14:29:51.9637840Z  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-24T14:29:51.9637845Z 2026-10-24T14:29:51.9638096Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9638257Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T14:29:51.9638333Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T14:29:51.9638396Z 287 │ useEffect(() => { 2026-10-24T14:29:51.9638466Z ·  ────┬──── 2026-10-24T14:29:51.9638596Z · ╰── This is the containing effect 2026-10-24T14:29:51.9638742Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T14:29:51.9638891Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T14:29:51.9639011Z 290 │ const now = Date.now(); 2026-10-24T14:29:51.9639185Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T14:29:51.9639244Z 292 │ if ( 2026-10-24T14:29:51.9639321Z 293 │ lastRequest?.key === key && 2026-10-24T14:29:51.9639457Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T14:29:51.9639513Z 295 │ ) 2026-10-24T14:29:51.9639573Z 296 │ return; 2026-10-24T14:29:51.9639752Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T14:29:51.9639843Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T14:29:51.9639995Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9640175Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9640243Z 299 │ return; 2026-10-24T14:29:51.9640298Z ╰──── 2026-10-24T14:29:51.9640888Z  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-24T14:29:51.9641205Z  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-24T14:29:51.9641207Z 2026-10-24T14:29:51.9641406Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9641568Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T14:29:51.9641626Z 327 │ }, [ 2026-10-24T14:29:51.9641694Z 328 │ draftMessage, 2026-10-24T14:29:51.9641771Z ·  ──────┬───── 2026-10-24T14:29:51.9641915Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T14:29:51.9641979Z 329 │ environmentId, 2026-10-24T14:29:51.9642031Z ╰──── 2026-10-24T14:29:51.9642385Z  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-24T14:29:51.9642699Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9642701Z 2026-10-24T14:29:51.9643158Z ⚠ 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-24T14:29:51.9643291Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T14:29:51.9643464Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T14:29:51.9643652Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T14:29:51.9643768Z ·  ─────────────────── 2026-10-24T14:29:51.9643879Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T14:29:51.9643935Z ╰──── 2026-10-24T14:29:51.9643937Z 2026-10-24T14:29:51.9644431Z ⚠ 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-24T14:29:51.9644616Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T14:29:51.9644802Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T14:29:51.9644910Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T14:29:51.9645028Z ·  ─────────────────── 2026-10-24T14:29:51.9645148Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T14:29:51.9645207Z ╰──── 2026-10-24T14:29:51.9645210Z 2026-10-24T14:29:51.9645447Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T14:29:51.9645605Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1483:12] 2026-10-24T14:29:51.9645660Z 1482 │ 2026-10-24T14:29:51.9645732Z 1483 │ for (const [] of [ 2026-10-24T14:29:51.9645807Z ·  ── 2026-10-24T14:29:51.9645880Z 1484 │ ["github", "github.com"], 2026-10-24T14:29:51.9645933Z ╰──── 2026-10-24T14:29:51.9646214Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T14:29:51.9646217Z 2026-10-24T14:29:51.9646688Z ⚠ 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-24T14:29:51.9646838Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T14:29:51.9646972Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T14:29:51.9647124Z 133 │ ╭─▶ for ( 2026-10-24T14:29:51.9647231Z 134 │ │ let attempt = 0; 2026-10-24T14:29:51.9647397Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T14:29:51.9647497Z 136 │ │ attempt += 1 2026-10-24T14:29:51.9647580Z 137 │ │ ) { 2026-10-24T14:29:51.9647692Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9647828Z 139 │ ╰─▶ } 2026-10-24T14:29:51.9647954Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T14:29:51.9648007Z ╰──── 2026-10-24T14:29:51.9648010Z 2026-10-24T14:29:51.9648165Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9648326Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T14:29:51.9648382Z 276 │ 2026-10-24T14:29:51.9648563Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T14:29:51.9648657Z 278 │ │ ...nativeProps, 2026-10-24T14:29:51.9648803Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T14:29:51.9648898Z 280 │ │ ref: nativeRef, 2026-10-24T14:29:51.9649028Z 281 │ ├─▶ }); 2026-10-24T14:29:51.9649269Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9649376Z 282 │ } 2026-10-24T14:29:51.9649485Z ╰──── 2026-10-24T14:29:51.9649960Z  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-24T14:29:51.9650303Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9650307Z 2026-10-24T14:29:51.9650554Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:29:51.9650690Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T14:29:51.9650756Z 20 │ [instanceId]: { 2026-10-24T14:29:51.9650841Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T14:29:51.9650946Z ·  ──────────────────────────── 2026-10-24T14:29:51.9651014Z 22 │ [model]: options, 2026-10-24T14:29:51.9651068Z ╰──── 2026-10-24T14:29:51.9651335Z  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-24T14:29:51.9651338Z 2026-10-24T14:29:51.9651558Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:29:51.9651687Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T14:29:51.9651758Z 113 │ const declared = { 2026-10-24T14:29:51.9651851Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T14:29:51.9651965Z ·  ──────────────────────────────── 2026-10-24T14:29:51.9652109Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T14:29:51.9652165Z ╰──── 2026-10-24T14:29:51.9652434Z  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-24T14:29:51.9652437Z 2026-10-24T14:29:51.9652661Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:29:51.9652793Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T14:29:51.9652885Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T14:29:51.9652990Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T14:29:51.9653117Z ·  ──────────────────────────────────────── 2026-10-24T14:29:51.9653218Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T14:29:51.9653276Z ╰──── 2026-10-24T14:29:51.9653550Z  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-24T14:29:51.9653552Z 2026-10-24T14:29:51.9653774Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:29:51.9653902Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T14:29:51.9654007Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T14:29:51.9654107Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T14:29:51.9654226Z ·  ──────────────────────────────────── 2026-10-24T14:29:51.9654289Z 117 │ }; 2026-10-24T14:29:51.9654340Z ╰──── 2026-10-24T14:29:51.9654663Z  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-24T14:29:51.9654708Z 2026-10-24T14:29:51.9654935Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9655052Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T14:29:51.9655127Z 28 │ getPendingThreadOrder(); 2026-10-24T14:29:51.9655211Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T14:29:51.9655335Z ·  ────┬──── ───────┬────── 2026-10-24T14:29:51.9655568Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T14:29:51.9655750Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T14:29:51.9655818Z 30 │ return pending; 2026-10-24T14:29:51.9655871Z ╰──── 2026-10-24T14:29:51.9656179Z  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-24T14:29:51.9656501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9656503Z 2026-10-24T14:29:51.9656726Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T14:29:51.9656864Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T14:29:51.9656934Z 1021 │ instanceId, 2026-10-24T14:29:51.9657081Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T14:29:51.9657230Z ·  ────────────────────────────────────────────────── 2026-10-24T14:29:51.9657297Z 1023 │ ]), 2026-10-24T14:29:51.9657351Z ╰──── 2026-10-24T14:29:51.9657619Z  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-24T14:29:51.9657622Z 2026-10-24T14:29:51.9657895Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9658007Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T14:29:51.9658061Z 35 │ 2026-10-24T14:29:51.9658197Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T14:29:51.9658273Z ·  ─────┬──── 2026-10-24T14:29:51.9658414Z · ╰── 'claudeCaps' is declared here 2026-10-24T14:29:51.9658540Z 37 │ optionDescriptors: [ 2026-10-24T14:29:51.9658648Z ╰──── 2026-10-24T14:29:51.9658754Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9658757Z 2026-10-24T14:29:51.9659137Z ⚠ 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-24T14:29:51.9659265Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T14:29:51.9659330Z 145 │ name, 2026-10-24T14:29:51.9659544Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T14:29:51.9659653Z ·  ────────────────────────── 2026-10-24T14:29:51.9659780Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T14:29:51.9659833Z ╰──── 2026-10-24T14:29:51.9659836Z 2026-10-24T14:29:51.9660027Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:29:51.9660218Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T14:29:51.9660290Z 115 │ return [...commands]; 2026-10-24T14:29:51.9660427Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T14:29:51.9660543Z ·  ─────────┬───────── 2026-10-24T14:29:51.9660732Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T14:29:51.9660787Z 117 │ 2026-10-24T14:29:51.9660839Z ╰──── 2026-10-24T14:29:51.9661170Z  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-24T14:29:51.9661492Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9661494Z 2026-10-24T14:29:51.9661685Z ⚠ react(static-components): Cannot create components during render 2026-10-24T14:29:51.9661850Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T14:29:51.9661941Z 196 │ const { onInput, onResize } = props; 2026-10-24T14:29:51.9662124Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T14:29:51.9662266Z ·  ────────────────┬─────────────── 2026-10-24T14:29:51.9662466Z · ╰── The component is created during render here 2026-10-24T14:29:51.9662601Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T14:29:51.9662655Z 199 │ 2026-10-24T14:29:51.9662722Z 200 │ useEffect(() => { 2026-10-24T14:29:51.9662814Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T14:29:51.9662903Z 202 │ terminalKey: props.terminalKey, 2026-10-24T14:29:51.9662982Z 203 │ native: hasNativeSurface, 2026-10-24T14:29:51.9663116Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T14:29:51.9663203Z 205 │ bufferLen: props.buffer.length, 2026-10-24T14:29:51.9663285Z 206 │ isRunning: props.isRunning, 2026-10-24T14:29:51.9663341Z 207 │ }); 2026-10-24T14:29:51.9663504Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T14:29:51.9663595Z 209 │ const handleNativeInput = useCallback( 2026-10-24T14:29:51.9663767Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T14:29:51.9663929Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T14:29:51.9663995Z 212 │ return; 2026-10-24T14:29:51.9664052Z 213 │ } 2026-10-24T14:29:51.9664145Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T14:29:51.9664300Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T14:29:51.9664360Z 216 │ }); 2026-10-24T14:29:51.9664450Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T14:29:51.9664517Z 218 │ }, 2026-10-24T14:29:51.9664679Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T14:29:51.9664736Z 220 │ ); 2026-10-24T14:29:51.9664829Z 221 │ const handleNativeResize = useCallback( 2026-10-24T14:29:51.9664953Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T14:29:51.9665018Z 223 │ onResize({ 2026-10-24T14:29:51.9665105Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T14:29:51.9665190Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T14:29:51.9665249Z 226 │ }); 2026-10-24T14:29:51.9665304Z 227 │ }, 2026-10-24T14:29:51.9665368Z 228 │ [onResize], 2026-10-24T14:29:51.9665424Z 229 │ ); 2026-10-24T14:29:51.9665476Z 230 │ 2026-10-24T14:29:51.9665562Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T14:29:51.9665623Z 232 │ return ( 2026-10-24T14:29:51.9665703Z 233 │ 2026-10-24T14:29:51.9665786Z 234 │ { 2026-10-24T14:29:51.9668722Z ·  ───┬── 2026-10-24T14:29:51.9668924Z · ╰── For this reduce 2026-10-24T14:29:51.9669082Z 449 │ const exists = current.some( 2026-10-24T14:29:51.9669260Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T14:29:51.9669318Z 451 │ ); 2026-10-24T14:29:51.9669394Z 452 │ return change.favorite 2026-10-24T14:29:51.9669456Z 453 │ ? exists 2026-10-24T14:29:51.9669520Z 454 │ ? current 2026-10-24T14:29:51.9669664Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T14:29:51.9669802Z ·  ─────┬──── 2026-10-24T14:29:51.9669939Z · ╰── From this spread 2026-10-24T14:29:51.9670012Z 456 │ : current.filter( 2026-10-24T14:29:51.9670065Z ╰──── 2026-10-24T14:29:51.9670283Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T14:29:51.9670450Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T14:29:51.9670452Z 2026-10-24T14:29:51.9670649Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T14:29:51.9670772Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T14:29:51.9670833Z 464 │ null; 2026-10-24T14:29:51.9670952Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T14:29:51.9671047Z ·  ──────────┬───────── 2026-10-24T14:29:51.9671180Z · ╰── From this accumulator 2026-10-24T14:29:51.9671284Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T14:29:51.9671356Z ·  ─┬─ 2026-10-24T14:29:51.9671468Z · ╰── For this loop 2026-10-24T14:29:51.9671610Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T14:29:51.9671681Z 468 │ hiddenModels: [], 2026-10-24T14:29:51.9671749Z 469 │ modelOrder: [], 2026-10-24T14:29:51.9671806Z 470 │ }; 2026-10-24T14:29:51.9671990Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T14:29:51.9672135Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T14:29:51.9672221Z 473 │ nextModelPreferences = { 2026-10-24T14:29:51.9672303Z 474 │ ...nextModelPreferences, 2026-10-24T14:29:51.9672402Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9672529Z · ╰── From this spread 2026-10-24T14:29:51.9672650Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T14:29:51.9672707Z ╰──── 2026-10-24T14:29:51.9672867Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T14:29:51.9673028Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T14:29:51.9673031Z 2026-10-24T14:29:51.9673180Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9673354Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T14:29:51.9673441Z 26 │ const latestInput = useRef(input); 2026-10-24T14:29:51.9673521Z 27 │ latestInput.current = input; 2026-10-24T14:29:51.9673634Z ·  ─────┬─────────┬─── 2026-10-24T14:29:51.9673888Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9674066Z · ╰── This value is a ref 2026-10-24T14:29:51.9674145Z 28 │ const mounted = useRef(true); 2026-10-24T14:29:51.9674197Z ╰──── 2026-10-24T14:29:51.9674689Z  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-24T14:29:51.9675070Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9675073Z 2026-10-24T14:29:51.9675246Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:51.9675403Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T14:29:51.9675518Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T14:29:51.9675688Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T14:29:51.9675814Z ·  ─────┬──── 2026-10-24T14:29:51.9675991Z · ╰── Cannot call impure function 2026-10-24T14:29:51.9676045Z 179 │ } 2026-10-24T14:29:51.9676098Z ╰──── 2026-10-24T14:29:51.9676386Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:29:51.9676697Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:51.9676703Z 2026-10-24T14:29:51.9676862Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9677036Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T14:29:51.9677092Z 90 │ }) { 2026-10-24T14:29:51.9677209Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T14:29:51.9677286Z ·  ────┬─── 2026-10-24T14:29:51.9677421Z · ╰── `rotation` originates here 2026-10-24T14:29:51.9677494Z 92 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9677640Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T14:29:51.9677715Z ·  ────┬─── 2026-10-24T14:29:51.9677903Z · ╰── `rotation` cannot be modified 2026-10-24T14:29:51.9678038Z 94 │ }, [props.hidden, rotation]); 2026-10-24T14:29:51.9678092Z ╰──── 2026-10-24T14:29:51.9678367Z  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-24T14:29:51.9678687Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9678690Z 2026-10-24T14:29:51.9678921Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9679096Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T14:29:51.9679193Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T14:29:51.9679335Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T14:29:51.9679428Z ·  ────────┬──────── 2026-10-24T14:29:51.9679581Z · ╰── `loadingVisibility` originates here 2026-10-24T14:29:51.9679653Z 268 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9679817Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T14:29:51.9679902Z ·  ────────┬──────── 2026-10-24T14:29:51.9680056Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T14:29:51.9680152Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T14:29:51.9680205Z ╰──── 2026-10-24T14:29:51.9680476Z  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-24T14:29:51.9680797Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9680803Z 2026-10-24T14:29:51.9680963Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9681137Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T14:29:51.9681192Z 325 │ }) { 2026-10-24T14:29:51.9681358Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T14:29:51.9681449Z ·  ─────────┬───────── 2026-10-24T14:29:51.9681608Z · ╰── `recordingVisibility` originates here 2026-10-24T14:29:51.9681680Z 327 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9681879Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T14:29:51.9681971Z ·  ─────────┬───────── 2026-10-24T14:29:51.9682163Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T14:29:51.9682257Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T14:29:51.9682311Z ╰──── 2026-10-24T14:29:51.9682580Z  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-24T14:29:51.9682894Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9682897Z 2026-10-24T14:29:51.9683161Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T14:29:51.9683376Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T14:29:51.9683434Z 236 │ 2026-10-24T14:29:51.9683555Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T14:29:51.9683643Z ·  ───────┬────── 2026-10-24T14:29:51.9683787Z · ╰── 'nonEmptyString' is declared here 2026-10-24T14:29:51.9683941Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T14:29:51.9683998Z ╰──── 2026-10-24T14:29:51.9684170Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9684173Z 2026-10-24T14:29:51.9684439Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9684620Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T14:29:51.9684680Z 638 │ 2026-10-24T14:29:51.9684753Z 639 │ useEffect(() => { 2026-10-24T14:29:51.9684826Z ·  ────┬──── 2026-10-24T14:29:51.9684962Z · ╰── This is the containing effect 2026-10-24T14:29:51.9685078Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T14:29:51.9685143Z 641 │ return; 2026-10-24T14:29:51.9685198Z 642 │ } 2026-10-24T14:29:51.9685279Z 643 │ setPendingLaunchEntry({ 2026-10-24T14:29:51.9685370Z ·  ──────────┬────────── 2026-10-24T14:29:51.9685550Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9685623Z 644 │ key: launchTargetKey, 2026-10-24T14:29:51.9685677Z ╰──── 2026-10-24T14:29:51.9686309Z  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-24T14:29:51.9686645Z  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-24T14:29:51.9686648Z 2026-10-24T14:29:51.9686913Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9687084Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T14:29:51.9687139Z 648 │ 2026-10-24T14:29:51.9687212Z 649 │ useEffect(() => { 2026-10-24T14:29:51.9687288Z ·  ────┬──── 2026-10-24T14:29:51.9687420Z · ╰── This is the containing effect 2026-10-24T14:29:51.9687538Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T14:29:51.9687602Z 651 │ return; 2026-10-24T14:29:51.9687658Z 652 │ } 2026-10-24T14:29:51.9687743Z 653 │ setInitialAttachGridEntry({ 2026-10-24T14:29:51.9687840Z ·  ────────────┬──────────── 2026-10-24T14:29:51.9688019Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9688092Z 654 │ key: launchTargetKey, 2026-10-24T14:29:51.9688147Z ╰──── 2026-10-24T14:29:51.9688813Z  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-24T14:29:51.9689212Z  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-24T14:29:51.9689214Z 2026-10-24T14:29:51.9689478Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9689665Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T14:29:51.9689756Z 743 │ 2026-10-24T14:29:51.9689844Z 744 │ useEffect(() => { 2026-10-24T14:29:51.9689919Z ·  ────┬──── 2026-10-24T14:29:51.9690054Z · ╰── This is the containing effect 2026-10-24T14:29:51.9690164Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T14:29:51.9690235Z 746 │ setLastGridSize({ 2026-10-24T14:29:51.9690322Z ·  ───────┬─────── 2026-10-24T14:29:51.9690496Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9690582Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T14:29:51.9690637Z ╰──── 2026-10-24T14:29:51.9691255Z  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-24T14:29:51.9691592Z  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-24T14:29:51.9691598Z 2026-10-24T14:29:51.9691807Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9691985Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T14:29:51.9692043Z 537 │ }); 2026-10-24T14:29:51.9692207Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T14:29:51.9692320Z ·  ───────────┬────────── 2026-10-24T14:29:51.9692574Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T14:29:51.9692747Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T14:29:51.9692802Z ╰──── 2026-10-24T14:29:51.9693105Z  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-24T14:29:51.9693424Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9693426Z 2026-10-24T14:29:51.9693631Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9693802Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T14:29:51.9693904Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T14:29:51.9693972Z 709 │ }, [terminalKey]); 2026-10-24T14:29:51.9694103Z ·  ─────┬───── 2026-10-24T14:29:51.9694314Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T14:29:51.9694369Z 710 │ 2026-10-24T14:29:51.9694421Z ╰──── 2026-10-24T14:29:51.9694722Z  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-24T14:29:51.9695116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9695119Z 2026-10-24T14:29:51.9695323Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9695498Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T14:29:51.9695559Z 799 │ }; 2026-10-24T14:29:51.9695746Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T14:29:51.9695930Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T14:29:51.9696166Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T14:29:51.9696379Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T14:29:51.9696435Z 801 │ 2026-10-24T14:29:51.9696487Z ╰──── 2026-10-24T14:29:51.9696792Z  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-24T14:29:51.9697113Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9697117Z 2026-10-24T14:29:51.9697267Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9697444Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T14:29:51.9697500Z 792 │ } 2026-10-24T14:29:51.9697611Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T14:29:51.9697726Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9697894Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9697949Z 794 │ 2026-10-24T14:29:51.9698001Z ╰──── 2026-10-24T14:29:51.9698534Z  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-24T14:29:51.9698892Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9698895Z 2026-10-24T14:29:51.9699095Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9699261Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T14:29:51.9699329Z 71 │ (VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T14:29:51.9700464Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T14:29:51.9700591Z ·  ───────────┬────────── 2026-10-24T14:29:51.9700775Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9700904Z 123 │ const sessionRef = useRef(null); 2026-10-24T14:29:51.9700956Z ╰──── 2026-10-24T14:29:51.9701437Z  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-24T14:29:51.9701736Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9701739Z 2026-10-24T14:29:51.9701886Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9702050Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T14:29:51.9702141Z 125 │ 2026-10-24T14:29:51.9702264Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:29:51.9702355Z ·  ─────────┬──────── 2026-10-24T14:29:51.9702512Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9702618Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:29:51.9702671Z ╰──── 2026-10-24T14:29:51.9703152Z  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-24T14:29:51.9703448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9703451Z 2026-10-24T14:29:51.9703645Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9703870Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T14:29:51.9703928Z 125 │ 2026-10-24T14:29:51.9704038Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:29:51.9704126Z ·  ─────────┬───────── 2026-10-24T14:29:51.9704280Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9704390Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:29:51.9704443Z ╰──── 2026-10-24T14:29:51.9705002Z  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-24T14:29:51.9705304Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9705306Z 2026-10-24T14:29:51.9705453Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9705616Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T14:29:51.9705670Z 125 │ 2026-10-24T14:29:51.9705778Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:29:51.9705897Z ·  ─────────┬───────── 2026-10-24T14:29:51.9706070Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9706175Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:29:51.9706370Z ╰──── 2026-10-24T14:29:51.9706912Z  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-24T14:29:51.9707209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9707212Z 2026-10-24T14:29:51.9707360Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9707521Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T14:29:51.9707574Z 125 │ 2026-10-24T14:29:51.9707684Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:29:51.9707805Z ·  ──────────┬───────── 2026-10-24T14:29:51.9707978Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9708081Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:29:51.9708134Z ╰──── 2026-10-24T14:29:51.9708610Z  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-24T14:29:51.9708906Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9708909Z 2026-10-24T14:29:51.9709133Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9709365Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T14:29:51.9709481Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:29:51.9709681Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:29:51.9709860Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T14:29:51.9710012Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T14:29:51.9710231Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T14:29:51.9710355Z 131 │ │ isFinished: status.isFinished, 2026-10-24T14:29:51.9710545Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T14:29:51.9710654Z 133 │ │ error: status.error, 2026-10-24T14:29:51.9710756Z 134 │ │ url: status.url, 2026-10-24T14:29:51.9710841Z 135 │ │ }); 2026-10-24T14:29:51.9710924Z 136 │ │ }, 2026-10-24T14:29:51.9711126Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T14:29:51.9711240Z 138 │ │ selectInput: (inputs) => { 2026-10-24T14:29:51.9711401Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T14:29:51.9711552Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T14:29:51.9711729Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T14:29:51.9711877Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T14:29:51.9711984Z 143 │ │ if (order !== known) { 2026-10-24T14:29:51.9712163Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T14:29:51.9712283Z 145 │ │ transform: (current) => ({ 2026-10-24T14:29:51.9712493Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T14:29:51.9712582Z 147 │ │ }), 2026-10-24T14:29:51.9712668Z 148 │ │ }); 2026-10-24T14:29:51.9712749Z 149 │ │ } 2026-10-24T14:29:51.9712898Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T14:29:51.9712983Z 151 │ │ }, 2026-10-24T14:29:51.9713120Z 152 │ ├─▶ }); 2026-10-24T14:29:51.9713366Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9713454Z 153 │ recorderRef.current = recorder; 2026-10-24T14:29:51.9713510Z ╰──── 2026-10-24T14:29:51.9713990Z  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-24T14:29:51.9714342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9714382Z 2026-10-24T14:29:51.9714559Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9714721Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T14:29:51.9714783Z 152 │ }); 2026-10-24T14:29:51.9714868Z 153 │ recorderRef.current = recorder; 2026-10-24T14:29:51.9714986Z ·  ─────┬─────────┬─── 2026-10-24T14:29:51.9715179Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9715371Z · ╰── This value is a ref 2026-10-24T14:29:51.9715484Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:29:51.9715539Z ╰──── 2026-10-24T14:29:51.9716019Z  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-24T14:29:51.9716321Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9716324Z 2026-10-24T14:29:51.9716471Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9716634Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T14:29:51.9716724Z 153 │ recorderRef.current = recorder; 2026-10-24T14:29:51.9716922Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:29:51.9717014Z 155 │ │ recorder, 2026-10-24T14:29:51.9717149Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T14:29:51.9717270Z 157 │ │ requestPermission: async () => { 2026-10-24T14:29:51.9717439Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T14:29:51.9717639Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T14:29:51.9717720Z 160 │ │ }, 2026-10-24T14:29:51.9717865Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T14:29:51.9718003Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T14:29:51.9718148Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T14:29:51.9718268Z 164 │ │ onStateChange: (nextState) => 2026-10-24T14:29:51.9718364Z 165 │ │ setState({ 2026-10-24T14:29:51.9718467Z 166 │ │ state: nextState, 2026-10-24T14:29:51.9718611Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T14:29:51.9718744Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T14:29:51.9718828Z 169 │ │ }), 2026-10-24T14:29:51.9718960Z 170 │ ├─▶ }); 2026-10-24T14:29:51.9719164Z · ╰──── Cannot access ref value during render 2026-10-24T14:29:51.9719226Z 171 │ } 2026-10-24T14:29:51.9719279Z ╰──── 2026-10-24T14:29:51.9719814Z  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-24T14:29:51.9720181Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9720184Z 2026-10-24T14:29:51.9720332Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9720495Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T14:29:51.9720585Z 153 │ recorderRef.current = recorder; 2026-10-24T14:29:51.9720717Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:29:51.9720878Z ·  ─────┬────────┬─── 2026-10-24T14:29:51.9721066Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9721187Z · ╰── This value is a ref 2026-10-24T14:29:51.9721252Z 155 │ recorder, 2026-10-24T14:29:51.9721306Z ╰──── 2026-10-24T14:29:51.9721783Z  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-24T14:29:51.9722116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9722119Z 2026-10-24T14:29:51.9722282Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9722447Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T14:29:51.9722537Z 184 │ return () => subscription.remove(); 2026-10-24T14:29:51.9722608Z 185 │ }, [controller]); 2026-10-24T14:29:51.9722687Z ·  ─────┬──── 2026-10-24T14:29:51.9722836Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9722891Z 186 │ 2026-10-24T14:29:51.9722944Z ╰──── 2026-10-24T14:29:51.9723420Z  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-24T14:29:51.9723722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9723728Z 2026-10-24T14:29:51.9723874Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9724036Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T14:29:51.9724126Z 184 │ return () => subscription.remove(); 2026-10-24T14:29:51.9724191Z 185 │ }, [controller]); 2026-10-24T14:29:51.9724270Z ·  ──────┬───── 2026-10-24T14:29:51.9724419Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9724475Z 186 │ 2026-10-24T14:29:51.9724525Z ╰──── 2026-10-24T14:29:51.9725058Z  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-24T14:29:51.9725423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9725426Z 2026-10-24T14:29:51.9725576Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9725735Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T14:29:51.9725792Z 191 │ }, 2026-10-24T14:29:51.9725907Z 192 │ [controller, recorder], 2026-10-24T14:29:51.9726014Z ·  ─────┬──── 2026-10-24T14:29:51.9726162Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9726222Z 193 │ ); 2026-10-24T14:29:51.9726278Z ╰──── 2026-10-24T14:29:51.9726754Z  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-24T14:29:51.9727052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9727055Z 2026-10-24T14:29:51.9727200Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9727361Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T14:29:51.9727456Z 174 │ const controller = session.controller; 2026-10-24T14:29:51.9727546Z 175 │ const recorder = recorderRef.current; 2026-10-24T14:29:51.9727657Z ·  ─────────┬───────── 2026-10-24T14:29:51.9727822Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9727876Z 176 │ 2026-10-24T14:29:51.9727930Z ╰──── 2026-10-24T14:29:51.9728407Z  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-24T14:29:51.9728702Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9728704Z 2026-10-24T14:29:51.9728849Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9729066Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T14:29:51.9729187Z 191 │ }, 2026-10-24T14:29:51.9729259Z 192 │ [controller, recorder], 2026-10-24T14:29:51.9729351Z ·  ───────────┬────────── 2026-10-24T14:29:51.9729507Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9729564Z 193 │ ); 2026-10-24T14:29:51.9729615Z ╰──── 2026-10-24T14:29:51.9730175Z  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-24T14:29:51.9730481Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9730486Z 2026-10-24T14:29:51.9730636Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9730800Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T14:29:51.9730893Z 245 │ return () => clearInterval(intervalId); 2026-10-24T14:29:51.9731013Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T14:29:51.9731107Z ·  ─────┬──── 2026-10-24T14:29:51.9731270Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9731325Z 247 │ 2026-10-24T14:29:51.9731383Z ╰──── 2026-10-24T14:29:51.9731868Z  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-24T14:29:51.9732213Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9732216Z 2026-10-24T14:29:51.9732365Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9732526Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T14:29:51.9732623Z 245 │ return () => clearInterval(intervalId); 2026-10-24T14:29:51.9732739Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T14:29:51.9732876Z ·  ────────────────────────┬─────────────────────── 2026-10-24T14:29:51.9733046Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9733109Z 247 │ 2026-10-24T14:29:51.9733164Z ╰──── 2026-10-24T14:29:51.9733645Z  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-24T14:29:51.9733943Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9733949Z 2026-10-24T14:29:51.9734096Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9734260Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T14:29:51.9734335Z 260 │ setOwnerFocused, 2026-10-24T14:29:51.9734454Z 261 │ session, 2026-10-24T14:29:51.9734592Z ·  ───┬─── 2026-10-24T14:29:51.9734739Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9734804Z 262 │ stop, 2026-10-24T14:29:51.9734856Z ╰──── 2026-10-24T14:29:51.9735369Z  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-24T14:29:51.9735720Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9735723Z 2026-10-24T14:29:51.9735873Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9736045Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T14:29:51.9736104Z 250 │ 2026-10-24T14:29:51.9736254Z 251 │ ╭─▶ return { 2026-10-24T14:29:51.9736474Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T14:29:51.9736562Z 253 │ │ state, 2026-10-24T14:29:51.9736652Z 254 │ │ audioLevels, 2026-10-24T14:29:51.9736754Z 255 │ │ elapsedSeconds, 2026-10-24T14:29:51.9736894Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T14:29:51.9736981Z 257 │ │ ownerKey, 2026-10-24T14:29:51.9737062Z 258 │ │ label, 2026-10-24T14:29:51.9737193Z 259 │ │ focusedOwners, 2026-10-24T14:29:51.9737327Z 260 │ │ setOwnerFocused, 2026-10-24T14:29:51.9737447Z 261 │ │ session, 2026-10-24T14:29:51.9737543Z 262 │ │ stop, 2026-10-24T14:29:51.9737717Z 263 │ │ cancel, 2026-10-24T14:29:51.9737884Z 264 │ ├─▶ }; 2026-10-24T14:29:51.9738127Z · ╰──── Cannot access ref value during render 2026-10-24T14:29:51.9738243Z 265 │ } 2026-10-24T14:29:51.9738334Z ╰──── 2026-10-24T14:29:51.9738862Z  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-24T14:29:51.9739196Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9739199Z 2026-10-24T14:29:51.9739373Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9739559Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T14:29:51.9739771Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T14:29:51.9739934Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T14:29:51.9740049Z ·  ─────┬───── 2026-10-24T14:29:51.9740204Z · ╰── `audioLevels` originates here 2026-10-24T14:29:51.9740421Z 123 │ const sessionRef = useRef(null); 2026-10-24T14:29:51.9740705Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T14:29:51.9740793Z 125 │ 2026-10-24T14:29:51.9740919Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T14:29:51.9741045Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T14:29:51.9741255Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T14:29:51.9741433Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T14:29:51.9741657Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T14:29:51.9741778Z 131 │ isFinished: status.isFinished, 2026-10-24T14:29:51.9741970Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T14:29:51.9742342Z 133 │ error: status.error, 2026-10-24T14:29:51.9742615Z 134 │ url: status.url, 2026-10-24T14:29:51.9742738Z 135 │ }); 2026-10-24T14:29:51.9742834Z 136 │ }, 2026-10-24T14:29:51.9743197Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T14:29:51.9743323Z 138 │ selectInput: (inputs) => { 2026-10-24T14:29:51.9743527Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T14:29:51.9743711Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T14:29:51.9743927Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T14:29:51.9744089Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T14:29:51.9744219Z 143 │ if (order !== known) { 2026-10-24T14:29:51.9744386Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T14:29:51.9744531Z 145 │ transform: (current) => ({ 2026-10-24T14:29:51.9744781Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T14:29:51.9744905Z 147 │ }), 2026-10-24T14:29:51.9745073Z 148 │ }); 2026-10-24T14:29:51.9745186Z 149 │ } 2026-10-24T14:29:51.9745330Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T14:29:51.9745458Z 151 │ }, 2026-10-24T14:29:51.9745560Z 152 │ }); 2026-10-24T14:29:51.9745704Z 153 │ recorderRef.current = recorder; 2026-10-24T14:29:51.9745851Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T14:29:51.9745969Z 155 │ recorder, 2026-10-24T14:29:51.9746132Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T14:29:51.9746439Z 157 │ requestPermission: async () => { 2026-10-24T14:29:51.9746661Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T14:29:51.9746889Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T14:29:51.9747022Z 160 │ }, 2026-10-24T14:29:51.9747196Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T14:29:51.9747350Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T14:29:51.9747511Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T14:29:51.9747650Z 164 │ onStateChange: (nextState) => 2026-10-24T14:29:51.9747774Z 165 │ setState({ 2026-10-24T14:29:51.9747938Z 166 │ state: nextState, 2026-10-24T14:29:51.9748110Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T14:29:51.9748259Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T14:29:51.9748391Z 169 │ }), 2026-10-24T14:29:51.9748677Z 170 │ }); 2026-10-24T14:29:51.9748891Z 171 │ } 2026-10-24T14:29:51.9749002Z 172 │ 2026-10-24T14:29:51.9749153Z 173 │ const session = sessionRef.current; 2026-10-24T14:29:51.9749293Z 174 │ const controller = session.controller; 2026-10-24T14:29:51.9749437Z 175 │ const recorder = recorderRef.current; 2026-10-24T14:29:51.9749536Z 176 │ 2026-10-24T14:29:51.9749644Z 177 │ useEffect(() => { 2026-10-24T14:29:51.9749864Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T14:29:51.9750085Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T14:29:51.9750296Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T14:29:51.9750458Z 181 │ // calls and route interruptions during capture. 2026-10-24T14:29:51.9750639Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T14:29:51.9750832Z 183 │ }); 2026-10-24T14:29:51.9750972Z 184 │ return () => subscription.remove(); 2026-10-24T14:29:51.9751088Z 185 │ }, [controller]); 2026-10-24T14:29:51.9751166Z 186 │ 2026-10-24T14:29:51.9751286Z 187 │ useEffect( 2026-10-24T14:29:51.9751409Z 188 │ () => () => { 2026-10-24T14:29:51.9751537Z 189 │ controller.dispose(); 2026-10-24T14:29:51.9751638Z 190 │ recorder.release(); 2026-10-24T14:29:51.9751737Z 191 │ }, 2026-10-24T14:29:51.9751880Z 192 │ [controller, recorder], 2026-10-24T14:29:51.9751983Z 193 │ ); 2026-10-24T14:29:51.9752060Z 194 │ 2026-10-24T14:29:51.9752232Z 195 │ useEffect(() => { 2026-10-24T14:29:51.9752387Z 196 │ if (state.phase !== "recording") return; 2026-10-24T14:29:51.9752492Z 197 │ 2026-10-24T14:29:51.9752701Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T14:29:51.9752864Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T14:29:51.9752993Z 200 │ void activation.catch(() => {}); 2026-10-24T14:29:51.9753202Z 201 │ return () => { 2026-10-24T14:29:51.9753403Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T14:29:51.9753611Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T14:29:51.9753713Z 204 │ }; 2026-10-24T14:29:51.9753858Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T14:29:51.9753947Z 206 │ 2026-10-24T14:29:51.9754041Z 207 │ useEffect(() => { 2026-10-24T14:29:51.9754206Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T14:29:51.9754269Z 209 │ 2026-10-24T14:29:51.9754432Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T14:29:51.9754626Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T14:29:51.9754761Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T14:29:51.9754880Z ·  ─────┬───── 2026-10-24T14:29:51.9755051Z · ╰── `audioLevels` cannot be modified 2026-10-24T14:29:51.9755160Z 213 │ } 2026-10-24T14:29:51.9755243Z ╰──── 2026-10-24T14:29:51.9755552Z  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-24T14:29:51.9755886Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9755892Z 2026-10-24T14:29:51.9756260Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T14:29:51.9756536Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T14:29:51.9756619Z 206 │ 2026-10-24T14:29:51.9756699Z 207 │ useEffect(() => { 2026-10-24T14:29:51.9756802Z ·  ───┬─── 2026-10-24T14:29:51.9757084Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T14:29:51.9757254Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T14:29:51.9757321Z 209 │ 2026-10-24T14:29:51.9757473Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T14:29:51.9757659Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T14:29:51.9757811Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T14:29:51.9757920Z ·  ─────┬───── 2026-10-24T14:29:51.9758069Z · ╰── This modifies `audioLevels` 2026-10-24T14:29:51.9758147Z 213 │ } 2026-10-24T14:29:51.9758251Z ╰──── 2026-10-24T14:29:51.9758615Z  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-24T14:29:51.9758937Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9758941Z 2026-10-24T14:29:51.9759195Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9759403Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T14:29:51.9759544Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T14:29:51.9759641Z 66 │ const progress = useSharedValue(0); 2026-10-24T14:29:51.9759744Z ·  ────┬─── 2026-10-24T14:29:51.9759905Z · ╰── `progress` originates here 2026-10-24T14:29:51.9760020Z 67 │ useEffect(() => { 2026-10-24T14:29:51.9760157Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T14:29:51.9760259Z ·  ────┬─── 2026-10-24T14:29:51.9760429Z · ╰── `progress` cannot be modified 2026-10-24T14:29:51.9760535Z 69 │ }, [expanded, progress]); 2026-10-24T14:29:51.9760623Z ╰──── 2026-10-24T14:29:51.9760906Z  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-24T14:29:51.9761242Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9761245Z 2026-10-24T14:29:51.9761529Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9761738Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T14:29:51.9761920Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T14:29:51.9762109Z 113 │ useEffect(() => { 2026-10-24T14:29:51.9762219Z ·  ────┬──── 2026-10-24T14:29:51.9762444Z · ╰── This is the containing effect 2026-10-24T14:29:51.9762722Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T14:29:51.9762803Z 115 │ return; 2026-10-24T14:29:51.9762886Z 116 │ } 2026-10-24T14:29:51.9763025Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T14:29:51.9763146Z ·  ────┬─── 2026-10-24T14:29:51.9763332Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9763481Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T14:29:51.9763562Z ╰──── 2026-10-24T14:29:51.9764193Z  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-24T14:29:51.9764535Z  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-24T14:29:51.9764559Z 2026-10-24T14:29:51.9764795Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T14:29:51.9764996Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T14:29:51.9765085Z 1997 │ assert.equal( 2026-10-24T14:29:51.9765293Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T14:29:51.9765443Z ·  ────── 2026-10-24T14:29:51.9765548Z 1999 │ "authoritative answer", 2026-10-24T14:29:51.9765634Z ╰──── 2026-10-24T14:29:51.9765838Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T14:29:51.9765841Z 2026-10-24T14:29:51.9766328Z ⚠ 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-24T14:29:51.9766527Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T14:29:51.9766735Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T14:29:51.9766960Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T14:29:51.9767124Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9767271Z 3953 │ ╰─▶ } 2026-10-24T14:29:51.9767423Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T14:29:51.9767503Z ╰──── 2026-10-24T14:29:51.9767507Z 2026-10-24T14:29:51.9767993Z ⚠ 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-24T14:29:51.9768198Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T14:29:51.9768300Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T14:29:51.9768512Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T14:29:51.9768707Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9769010Z 6064 │ ╰─▶ } 2026-10-24T14:29:51.9769190Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T14:29:51.9769269Z ╰──── 2026-10-24T14:29:51.9769272Z 2026-10-24T14:29:51.9769755Z ⚠ 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-24T14:29:51.9769952Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T14:29:51.9770076Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T14:29:51.9770274Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T14:29:51.9770421Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9770576Z 6199 │ ╰─▶ } 2026-10-24T14:29:51.9770784Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T14:29:51.9770850Z ╰──── 2026-10-24T14:29:51.9770852Z 2026-10-24T14:29:51.9771143Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9771337Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T14:29:51.9771424Z 10577 │ 2026-10-24T14:29:51.9771518Z 10578 │ const layer: Layer.Layer< 2026-10-24T14:29:51.9771632Z ·  ──┬── 2026-10-24T14:29:51.9771790Z · ╰── 'layer' is declared here 2026-10-24T14:29:51.9771956Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T14:29:51.9772032Z ╰──── 2026-10-24T14:29:51.9772225Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9772228Z 2026-10-24T14:29:51.9772511Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T14:29:51.9772719Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T14:29:51.9772808Z 959 │ 2026-10-24T14:29:51.9772938Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T14:29:51.9773089Z ·  ──────────────────┬───────────────── 2026-10-24T14:29:51.9773370Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T14:29:51.9773571Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T14:29:51.9773653Z ╰──── 2026-10-24T14:29:51.9773792Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9773795Z 2026-10-24T14:29:51.9774146Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9774335Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T14:29:51.9774394Z 1443 │ 2026-10-24T14:29:51.9774564Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T14:29:51.9774708Z ·  ───────────────────┬─────────────────── 2026-10-24T14:29:51.9775003Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T14:29:51.9775153Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T14:29:51.9775227Z ╰──── 2026-10-24T14:29:51.9775362Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9775365Z 2026-10-24T14:29:51.9775645Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9775837Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T14:29:51.9775895Z 1679 │ 2026-10-24T14:29:51.9776015Z 1680 │ const layer: Layer.Layer< 2026-10-24T14:29:51.9776114Z ·  ──┬── 2026-10-24T14:29:51.9776268Z · ╰── 'layer' is declared here 2026-10-24T14:29:51.9776384Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T14:29:51.9776472Z ╰──── 2026-10-24T14:29:51.9776608Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9776610Z 2026-10-24T14:29:51.9776838Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9777000Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T14:29:51.9777118Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T14:29:51.9777253Z 257 │ }, [props.path, targetIndex]); 2026-10-24T14:29:51.9777357Z ·  ─────┬──── 2026-10-24T14:29:51.9777569Z · ╰── Unnecessary dependency `props.path` 2026-10-24T14:29:51.9777655Z 258 │ 2026-10-24T14:29:51.9777745Z ╰──── 2026-10-24T14:29:51.9778077Z  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-24T14:29:51.9778423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9778426Z 2026-10-24T14:29:51.9778631Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9778801Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T14:29:51.9778921Z 292 │ 2026-10-24T14:29:51.9784005Z ·  ─────────── 2026-10-24T14:29:51.9784071Z 310 │ {body} 2026-10-24T14:29:51.9784121Z ╰──── 2026-10-24T14:29:51.9784268Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T14:29:51.9784271Z 2026-10-24T14:29:51.9784509Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T14:29:51.9784640Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T14:29:51.9784819Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T14:29:51.9784915Z 35 │ instanceId === configured ? true : false, 2026-10-24T14:29:51.9785033Z ·  ──────────────────────────────────────── 2026-10-24T14:29:51.9785088Z 36 │ ); 2026-10-24T14:29:51.9785137Z ╰──── 2026-10-24T14:29:51.9785234Z  help: Remove this ternary operator 2026-10-24T14:29:51.9785236Z 2026-10-24T14:29:51.9785427Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T14:29:51.9785573Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T14:29:51.9785712Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T14:29:51.9785824Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T14:29:51.9785898Z ·  ──┬── 2026-10-24T14:29:51.9786026Z · ╰── 'Image' is imported here 2026-10-24T14:29:51.9786078Z 18 │ 2026-10-24T14:29:51.9786127Z ╰──── 2026-10-24T14:29:51.9786241Z  help: Consider removing this import. 2026-10-24T14:29:51.9786244Z 2026-10-24T14:29:51.9786526Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:29:51.9786667Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T14:29:51.9786834Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T14:29:51.9786927Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9787019Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9787475Z · ╰── 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-24T14:29:51.9787546Z 227 │ mostRecentEventCount, 2026-10-24T14:29:51.9787602Z 228 │ ); 2026-10-24T14:29:51.9787726Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T14:29:51.9787864Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T14:29:51.9788060Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9788253Z 230 │ const assumedValue = props.value; 2026-10-24T14:29:51.9788388Z ╰──── 2026-10-24T14:29:51.9788606Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:29:51.9788918Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9788924Z 2026-10-24T14:29:51.9789135Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9789277Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T14:29:51.9789420Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T14:29:51.9789509Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9789603Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9790056Z · ╰── 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-24T14:29:51.9790130Z 238 │ controlledEventCount, 2026-10-24T14:29:51.9790196Z 239 │ assumedValue, 2026-10-24T14:29:51.9790249Z 240 │ ); 2026-10-24T14:29:51.9790406Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T14:29:51.9790542Z ·  ───────────┬────────── 2026-10-24T14:29:51.9790749Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T14:29:51.9790843Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T14:29:51.9790898Z ╰──── 2026-10-24T14:29:51.9791318Z  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-24T14:29:51.9791624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9791627Z 2026-10-24T14:29:51.9791772Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9791913Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T14:29:51.9792039Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:29:51.9792255Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:29:51.9792433Z ·  ─────────────┬──────────── 2026-10-24T14:29:51.9792596Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9792653Z 163 │ }); 2026-10-24T14:29:51.9792705Z ╰──── 2026-10-24T14:29:51.9793167Z  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-24T14:29:51.9793453Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9793455Z 2026-10-24T14:29:51.9793601Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9793746Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T14:29:51.9793867Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:29:51.9793977Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:29:51.9794091Z ·  ─────────────┬──────────── 2026-10-24T14:29:51.9794294Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9794351Z 163 │ }); 2026-10-24T14:29:51.9794404Z ╰──── 2026-10-24T14:29:51.9794863Z  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-24T14:29:51.9795149Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9795152Z 2026-10-24T14:29:51.9795296Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9795438Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T14:29:51.9795495Z 163 │ }); 2026-10-24T14:29:51.9795583Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T14:29:51.9795708Z ·  ─────────┬────────────┬─── 2026-10-24T14:29:51.9795897Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9796020Z · ╰── This value is a ref 2026-10-24T14:29:51.9796093Z 165 │ return JSON.stringify( 2026-10-24T14:29:51.9796147Z ╰──── 2026-10-24T14:29:51.9796604Z  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-24T14:29:51.9796888Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9796891Z 2026-10-24T14:29:51.9797033Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9797171Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T14:29:51.9797293Z 205 │ mostRecentEventCount, 2026-10-24T14:29:51.9797447Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9797554Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9797738Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9797796Z 207 │ ); 2026-10-24T14:29:51.9797849Z ╰──── 2026-10-24T14:29:51.9798303Z  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-24T14:29:51.9798585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9798587Z 2026-10-24T14:29:51.9798735Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9798878Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T14:29:51.9798951Z 211 │ mostRecentEventCount, 2026-10-24T14:29:51.9799037Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9799140Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9799326Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9799380Z 213 │ ); 2026-10-24T14:29:51.9799429Z ╰──── 2026-10-24T14:29:51.9799888Z  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-24T14:29:51.9800177Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9800180Z 2026-10-24T14:29:51.9800365Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:29:51.9800503Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T14:29:51.9800624Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:29:51.9800736Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:29:51.9800846Z ·  ─────────┬──────── 2026-10-24T14:29:51.9801309Z · ╰── 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-24T14:29:51.9801368Z 163 │ }); 2026-10-24T14:29:51.9801456Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T14:29:51.9801527Z 165 │ return JSON.stringify( 2026-10-24T14:29:51.9801692Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T14:29:51.9801757Z 167 │ const record = 2026-10-24T14:29:51.9801837Z 168 │ token.type === "context" 2026-10-24T14:29:51.9802001Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T14:29:51.9802103Z 170 │ : undefined; 2026-10-24T14:29:51.9802211Z 171 │ const presentation = contextChipPresentation( 2026-10-24T14:29:51.9802371Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T14:29:51.9802493Z 173 │ record, 2026-10-24T14:29:51.9802553Z 174 │ ); 2026-10-24T14:29:51.9802638Z 175 │ const icon = contextChipIcon( 2026-10-24T14:29:51.9802707Z 176 │ presentation, 2026-10-24T14:29:51.9802849Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T14:29:51.9802910Z 178 │ ); 2026-10-24T14:29:51.9802971Z 179 │ return { 2026-10-24T14:29:51.9803042Z 180 │ type: token.type, 2026-10-24T14:29:51.9803117Z 181 │ source: token.source, 2026-10-24T14:29:51.9803190Z 182 │ start: token.start, 2026-10-24T14:29:51.9803255Z 183 │ end: token.end, 2026-10-24T14:29:51.9803405Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T14:29:51.9803469Z 185 │ label: 2026-10-24T14:29:51.9803553Z 186 │ token.type === "skill" 2026-10-24T14:29:51.9803661Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T14:29:51.9803746Z 188 │ : token.type === "context" 2026-10-24T14:29:51.9803981Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T14:29:51.9804064Z 190 │ : basename(token.value), 2026-10-24T14:29:51.9804204Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T14:29:51.9804297Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T14:29:51.9804387Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T14:29:51.9804446Z 194 │ }; 2026-10-24T14:29:51.9804502Z 195 │ }), 2026-10-24T14:29:51.9804558Z 196 │ ); 2026-10-24T14:29:51.9804696Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T14:29:51.9804855Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T14:29:51.9805055Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9805196Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T14:29:51.9805247Z ╰──── 2026-10-24T14:29:51.9805453Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:29:51.9805760Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9805762Z 2026-10-24T14:29:51.9805954Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:29:51.9806098Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T14:29:51.9806229Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T14:29:51.9806331Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T14:29:51.9806421Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9806874Z · ╰── 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-24T14:29:51.9806966Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T14:29:51.9807027Z 254 │ value, 2026-10-24T14:29:51.9807104Z 255 │ selection: nextSelection, 2026-10-24T14:29:51.9807216Z 256 │ }); 2026-10-24T14:29:51.9807369Z 257 │ return acknowledgedEventCount; 2026-10-24T14:29:51.9807426Z 258 │ }, 2026-10-24T14:29:51.9807481Z 259 │ [], 2026-10-24T14:29:51.9807549Z ·  ─┬ 2026-10-24T14:29:51.9807729Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9807783Z 260 │ ); 2026-10-24T14:29:51.9807833Z ╰──── 2026-10-24T14:29:51.9808037Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:29:51.9808343Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9808346Z 2026-10-24T14:29:51.9808596Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T14:29:51.9808709Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T14:29:51.9808762Z 55 │ 2026-10-24T14:29:51.9808863Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T14:29:51.9808973Z ·  ────────────────┬──────────────── 2026-10-24T14:29:51.9809160Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T14:29:51.9809248Z 57 │ selection: TerminalContextSelection, 2026-10-24T14:29:51.9809300Z ╰──── 2026-10-24T14:29:51.9809406Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9809409Z 2026-10-24T14:29:51.9809607Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T14:29:51.9809751Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T14:29:51.9809917Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T14:29:51.9810007Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9810096Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9810548Z · ╰── 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-24T14:29:51.9810622Z 229 │ mostRecentEventCount, 2026-10-24T14:29:51.9810678Z 230 │ ); 2026-10-24T14:29:51.9810800Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T14:29:51.9811060Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T14:29:51.9811385Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9811471Z 232 │ const assumedValue = props.value; 2026-10-24T14:29:51.9811523Z ╰──── 2026-10-24T14:29:51.9811688Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T14:29:51.9811995Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9811998Z 2026-10-24T14:29:51.9812250Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9812386Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T14:29:51.9812533Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T14:29:51.9812626Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9812718Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9813165Z · ╰── 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-24T14:29:51.9813240Z 240 │ controlledEventCount, 2026-10-24T14:29:51.9813304Z 241 │ assumedValue, 2026-10-24T14:29:51.9813360Z 242 │ ); 2026-10-24T14:29:51.9813514Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T14:29:51.9813648Z ·  ───────────┬────────── 2026-10-24T14:29:51.9813860Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T14:29:51.9813954Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T14:29:51.9814006Z ╰──── 2026-10-24T14:29:51.9814424Z  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-24T14:29:51.9814728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9814730Z 2026-10-24T14:29:51.9814875Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9815015Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T14:29:51.9815143Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:29:51.9815251Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:29:51.9815368Z ·  ─────────────┬──────────── 2026-10-24T14:29:51.9815534Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9815591Z 165 │ }); 2026-10-24T14:29:51.9815640Z ╰──── 2026-10-24T14:29:51.9816098Z  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-24T14:29:51.9816437Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9816473Z 2026-10-24T14:29:51.9816646Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9816781Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T14:29:51.9816899Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:29:51.9817011Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:29:51.9817131Z ·  ─────────────┬──────────── 2026-10-24T14:29:51.9817336Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9817391Z 165 │ }); 2026-10-24T14:29:51.9817444Z ╰──── 2026-10-24T14:29:51.9817908Z  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-24T14:29:51.9818198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9818200Z 2026-10-24T14:29:51.9818344Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9818478Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T14:29:51.9818534Z 165 │ }); 2026-10-24T14:29:51.9818624Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T14:29:51.9818750Z ·  ─────────┬────────────┬─── 2026-10-24T14:29:51.9818939Z · │ ╰── Cannot update ref value during render 2026-10-24T14:29:51.9819058Z · ╰── This value is a ref 2026-10-24T14:29:51.9819133Z 167 │ return JSON.stringify( 2026-10-24T14:29:51.9819183Z ╰──── 2026-10-24T14:29:51.9819637Z  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-24T14:29:51.9819923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9819925Z 2026-10-24T14:29:51.9820074Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9820211Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T14:29:51.9820283Z 207 │ mostRecentEventCount, 2026-10-24T14:29:51.9820369Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9820476Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9820662Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9820717Z 209 │ ); 2026-10-24T14:29:51.9820766Z ╰──── 2026-10-24T14:29:51.9821229Z  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-24T14:29:51.9821566Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9821600Z 2026-10-24T14:29:51.9821775Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9821909Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T14:29:51.9821979Z 213 │ mostRecentEventCount, 2026-10-24T14:29:51.9822065Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T14:29:51.9822212Z ·  ───────────────┬─────────────── 2026-10-24T14:29:51.9822398Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9822452Z 215 │ ); 2026-10-24T14:29:51.9822503Z ╰──── 2026-10-24T14:29:51.9822963Z  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-24T14:29:51.9823254Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9823256Z 2026-10-24T14:29:51.9823439Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:29:51.9823574Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T14:29:51.9823695Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T14:29:51.9823806Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T14:29:51.9823916Z ·  ─────────┬──────── 2026-10-24T14:29:51.9824374Z · ╰── 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-24T14:29:51.9824435Z 165 │ }); 2026-10-24T14:29:51.9824526Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T14:29:51.9824597Z 167 │ return JSON.stringify( 2026-10-24T14:29:51.9824757Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T14:29:51.9824827Z 169 │ const record = 2026-10-24T14:29:51.9824905Z 170 │ token.type === "context" 2026-10-24T14:29:51.9825069Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T14:29:51.9825134Z 172 │ : undefined; 2026-10-24T14:29:51.9825246Z 173 │ const presentation = contextChipPresentation( 2026-10-24T14:29:51.9825357Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T14:29:51.9825423Z 175 │ record, 2026-10-24T14:29:51.9825480Z 176 │ ); 2026-10-24T14:29:51.9825569Z 177 │ const icon = contextChipIcon( 2026-10-24T14:29:51.9825638Z 178 │ presentation, 2026-10-24T14:29:51.9825780Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T14:29:51.9825837Z 180 │ ); 2026-10-24T14:29:51.9825900Z 181 │ return { 2026-10-24T14:29:51.9825972Z 182 │ type: token.type, 2026-10-24T14:29:51.9826045Z 183 │ source: token.source, 2026-10-24T14:29:51.9826117Z 184 │ start: token.start, 2026-10-24T14:29:51.9826182Z 185 │ end: token.end, 2026-10-24T14:29:51.9826505Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T14:29:51.9826650Z 187 │ label: 2026-10-24T14:29:51.9826750Z 188 │ token.type === "skill" 2026-10-24T14:29:51.9826857Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T14:29:51.9826939Z 190 │ : token.type === "context" 2026-10-24T14:29:51.9827167Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T14:29:51.9827249Z 192 │ : basename(token.value), 2026-10-24T14:29:51.9827394Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T14:29:51.9827486Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T14:29:51.9827570Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T14:29:51.9827631Z 196 │ }; 2026-10-24T14:29:51.9827689Z 197 │ }), 2026-10-24T14:29:51.9827742Z 198 │ ); 2026-10-24T14:29:51.9827870Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T14:29:51.9828023Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T14:29:51.9828224Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9828365Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T14:29:51.9828415Z ╰──── 2026-10-24T14:29:51.9828620Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:29:51.9828936Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9828941Z 2026-10-24T14:29:51.9829126Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T14:29:51.9829262Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T14:29:51.9829389Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T14:29:51.9829489Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T14:29:51.9829579Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9830028Z · ╰── 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-24T14:29:51.9830121Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T14:29:51.9830186Z 256 │ value, 2026-10-24T14:29:51.9830264Z 257 │ selection: nextSelection, 2026-10-24T14:29:51.9830319Z 258 │ }); 2026-10-24T14:29:51.9830400Z 259 │ return acknowledgedEventCount; 2026-10-24T14:29:51.9830453Z 260 │ }, 2026-10-24T14:29:51.9830507Z 261 │ [], 2026-10-24T14:29:51.9830575Z ·  ─┬ 2026-10-24T14:29:51.9830752Z · ╰── This dependency list is missing values used by the callback 2026-10-24T14:29:51.9830806Z 262 │ ); 2026-10-24T14:29:51.9830856Z ╰──── 2026-10-24T14:29:51.9831058Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T14:29:51.9831415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9831453Z 2026-10-24T14:29:51.9831744Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9831886Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T14:29:51.9831938Z 150 │ 2026-10-24T14:29:51.9832000Z 151 │ useEffect(() => { 2026-10-24T14:29:51.9832101Z ·  ────┬──── 2026-10-24T14:29:51.9832243Z · ╰── This is the containing effect 2026-10-24T14:29:51.9832326Z 152 │ if (!controlledSelectedPath) { 2026-10-24T14:29:51.9832385Z 153 │ return; 2026-10-24T14:29:51.9832440Z 154 │ } 2026-10-24T14:29:51.9832521Z 155 │ setExpandedPaths((current) => { 2026-10-24T14:29:51.9832609Z ·  ────────┬─────── 2026-10-24T14:29:51.9832780Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9832905Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T14:29:51.9832956Z ╰──── 2026-10-24T14:29:51.9833553Z  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-24T14:29:51.9833872Z  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-24T14:29:51.9833875Z 2026-10-24T14:29:51.9834134Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9834287Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T14:29:51.9834426Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T14:29:51.9834491Z 356 │ useEffect(() => { 2026-10-24T14:29:51.9834560Z ·  ────┬──── 2026-10-24T14:29:51.9834689Z · ╰── This is the containing effect 2026-10-24T14:29:51.9834777Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T14:29:51.9834836Z 358 │ return; 2026-10-24T14:29:51.9834888Z 359 │ } 2026-10-24T14:29:51.9835007Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T14:29:51.9835098Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T14:29:51.9835253Z ·  ──────────────┬────────────── 2026-10-24T14:29:51.9835488Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9835546Z 362 │ return; 2026-10-24T14:29:51.9835596Z ╰──── 2026-10-24T14:29:51.9836183Z  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-24T14:29:51.9836500Z  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-24T14:29:51.9836502Z 2026-10-24T14:29:51.9836758Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9836913Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T14:29:51.9836965Z 447 │ 2026-10-24T14:29:51.9837030Z 448 │ useEffect(() => { 2026-10-24T14:29:51.9837099Z ·  ────┬──── 2026-10-24T14:29:51.9837227Z · ╰── This is the containing effect 2026-10-24T14:29:51.9837328Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T14:29:51.9837387Z 450 │ return; 2026-10-24T14:29:51.9837439Z 451 │ } 2026-10-24T14:29:51.9837580Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T14:29:51.9837711Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T14:29:51.9837824Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T14:29:51.9837880Z 455 │ } 2026-10-24T14:29:51.9838022Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T14:29:51.9838150Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T14:29:51.9838254Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T14:29:51.9838325Z 459 │ const directProject = 2026-10-24T14:29:51.9838392Z 460 │ projects.find( 2026-10-24T14:29:51.9838456Z 461 │ (project) => 2026-10-24T14:29:51.9838629Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T14:29:51.9838690Z 463 │ ) ?? null; 2026-10-24T14:29:51.9838741Z 464 │ 2026-10-24T14:29:51.9838810Z 465 │ if (directProject) { 2026-10-24T14:29:51.9838947Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T14:29:51.9839091Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T14:29:51.9839255Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T14:29:51.9839388Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T14:29:51.9839450Z 470 │ return; 2026-10-24T14:29:51.9839506Z 471 │ } 2026-10-24T14:29:51.9839601Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T14:29:51.9839662Z 473 │ if ( 2026-10-24T14:29:51.9839803Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T14:29:51.9839901Z 475 │ selectedProject.id !== directProject.id 2026-10-24T14:29:51.9839959Z 476 │ ) { 2026-10-24T14:29:51.9840045Z 477 │ setProject(directProject); 2026-10-24T14:29:51.9840159Z 478 │ return; 2026-10-24T14:29:51.9840288Z 479 │ } 2026-10-24T14:29:51.9840372Z 480 │ if (!flow.draftKey) return; 2026-10-24T14:29:51.9840510Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T14:29:51.9840651Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T14:29:51.9840764Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T14:29:51.9840842Z 484 │ workspaceSelection: { 2026-10-24T14:29:51.9840912Z 485 │ mode: "local", 2026-10-24T14:29:51.9841014Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T14:29:51.9841152Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T14:29:51.9841234Z 488 │ startFromOrigin: false, 2026-10-24T14:29:51.9841300Z 489 │ }, 2026-10-24T14:29:51.9841360Z 490 │ }); 2026-10-24T14:29:51.9841417Z 491 │ } 2026-10-24T14:29:51.9841544Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T14:29:51.9841602Z 493 │ if ( 2026-10-24T14:29:51.9841741Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T14:29:51.9841837Z 495 │ selectedProject.id === directProject.id 2026-10-24T14:29:51.9841894Z 496 │ ) { 2026-10-24T14:29:51.9841956Z 497 │ return; 2026-10-24T14:29:51.9842010Z 498 │ } 2026-10-24T14:29:51.9842121Z 499 │ setProject(directProject); 2026-10-24T14:29:51.9842184Z 500 │ return; 2026-10-24T14:29:51.9842236Z 501 │ } 2026-10-24T14:29:51.9842288Z 502 │ 2026-10-24T14:29:51.9842367Z 503 │ if (projects.length > 0) { 2026-10-24T14:29:51.9842469Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T14:29:51.9842578Z ·  ──────────────┬────────────── 2026-10-24T14:29:51.9842761Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9842815Z 505 │ } 2026-10-24T14:29:51.9842866Z ╰──── 2026-10-24T14:29:51.9843460Z  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-24T14:29:51.9843783Z  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-24T14:29:51.9843786Z 2026-10-24T14:29:51.9844048Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9844205Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T14:29:51.9844258Z 545 │ 2026-10-24T14:29:51.9844321Z 546 │ useEffect(() => { 2026-10-24T14:29:51.9844393Z ·  ────┬──── 2026-10-24T14:29:51.9844525Z · ╰── This is the containing effect 2026-10-24T14:29:51.9844620Z 547 │ const shareId = props.incomingShareId; 2026-10-24T14:29:51.9844701Z 548 │ const draftKey = flow.draftKey; 2026-10-24T14:29:51.9844802Z 549 │ const destinationProject = selectedProject; 2026-10-24T14:29:51.9844944Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T14:29:51.9845127Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T14:29:51.9845283Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T14:29:51.9845361Z 553 │ !initialEnvironmentId || 2026-10-24T14:29:51.9845432Z 554 │ !initialProjectId || 2026-10-24T14:29:51.9845565Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T14:29:51.9845669Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T14:29:51.9845728Z 557 │ if ( 2026-10-24T14:29:51.9845792Z 558 │ !shareId || 2026-10-24T14:29:51.9845855Z 559 │ !draftKey || 2026-10-24T14:29:51.9845928Z 560 │ !destinationProject || 2026-10-24T14:29:51.9846014Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T14:29:51.9846105Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T14:29:51.9846159Z 563 │ ) { 2026-10-24T14:29:51.9846224Z 564 │ return; 2026-10-24T14:29:51.9846280Z 565 │ } 2026-10-24T14:29:51.9846377Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T14:29:51.9846431Z 567 │ if ( 2026-10-24T14:29:51.9846544Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T14:29:51.9846654Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T14:29:51.9846711Z 570 │ ) { 2026-10-24T14:29:51.9846768Z 571 │ return; 2026-10-24T14:29:51.9846823Z 572 │ } 2026-10-24T14:29:51.9846876Z 573 │ 2026-10-24T14:29:51.9846944Z 574 │ if (!incomingShare) { 2026-10-24T14:29:51.9847139Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T14:29:51.9847270Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T14:29:51.9847337Z 577 │ Dialog.alert( 2026-10-24T14:29:51.9847427Z 578 │ "Shared content unavailable", 2026-10-24T14:29:51.9847604Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T14:29:51.9847664Z 580 │ ); 2026-10-24T14:29:51.9847721Z 581 │ } 2026-10-24T14:29:51.9847779Z 582 │ return; 2026-10-24T14:29:51.9847832Z 583 │ } 2026-10-24T14:29:51.9847884Z 584 │ 2026-10-24T14:29:51.9847940Z 585 │ if ( 2026-10-24T14:29:51.9848100Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T14:29:51.9848201Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T14:29:51.9848255Z 588 │ ) { 2026-10-24T14:29:51.9848315Z 589 │ return; 2026-10-24T14:29:51.9848366Z 590 │ } 2026-10-24T14:29:51.9848418Z 591 │ 2026-10-24T14:29:51.9848564Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T14:29:51.9848687Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T14:29:51.9848739Z 594 │ } 2026-10-24T14:29:51.9848881Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T14:29:51.9848987Z 596 │ const draftBackup = 2026-10-24T14:29:51.9849175Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T14:29:51.9849311Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T14:29:51.9849402Z 599 │ const importToken = Symbol(importKey); 2026-10-24T14:29:51.9849481Z 600 │ let didReserveShare = false; 2026-10-24T14:29:51.9849558Z 601 │ let didConsumeShare = false; 2026-10-24T14:29:51.9849635Z 602 │ let needsDraftRestore = false; 2026-10-24T14:29:51.9849748Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T14:29:51.9849889Z 604 │ setImportingShareKey(importKey); 2026-10-24T14:29:51.9850061Z ·  ──────────┬───────── 2026-10-24T14:29:51.9850259Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9850327Z 605 │ void (async () => { 2026-10-24T14:29:51.9850380Z ╰──── 2026-10-24T14:29:51.9850975Z  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-24T14:29:51.9851299Z  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-24T14:29:51.9851307Z 2026-10-24T14:29:51.9851512Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9851665Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T14:29:51.9851740Z 523 │ props.initialProjectRef, 2026-10-24T14:29:51.9851812Z 524 │ props.incomingShareId, 2026-10-24T14:29:51.9851899Z ·  ──────────┬────────── 2026-10-24T14:29:51.9852102Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T14:29:51.9852173Z 525 │ props.pendingTaskId, 2026-10-24T14:29:51.9852224Z ╰──── 2026-10-24T14:29:51.9852519Z  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-24T14:29:51.9852838Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9852845Z 2026-10-24T14:29:51.9853061Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9853215Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T14:29:51.9853331Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T14:29:51.9853399Z 543 │ flow.loadBranches(); 2026-10-24T14:29:51.9853469Z ·  ──┬─ 2026-10-24T14:29:51.9853597Z · ╰── Missing dependency `flow` 2026-10-24T14:29:51.9853691Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T14:29:51.9853783Z ·  ────────┬──────── 2026-10-24T14:29:51.9853989Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T14:29:51.9854042Z 545 │ 2026-10-24T14:29:51.9854092Z ╰──── 2026-10-24T14:29:51.9854517Z  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-24T14:29:51.9854829Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9854832Z 2026-10-24T14:29:51.9855032Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9855235Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T14:29:51.9855360Z 765 │ flow.draftKey, 2026-10-24T14:29:51.9855438Z 766 │ hasImportedIncomingShare, 2026-10-24T14:29:51.9855531Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9855708Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T14:29:51.9855772Z 767 │ incomingShare, 2026-10-24T14:29:51.9855853Z 768 │ isIncomingShareInboxLoading, 2026-10-24T14:29:51.9855950Z ·  ─────────────┬───────────── 2026-10-24T14:29:51.9856136Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T14:29:51.9856215Z 769 │ isIncomingShareUnavailable, 2026-10-24T14:29:51.9856288Z 770 │ props.incomingShareId, 2026-10-24T14:29:51.9856391Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T14:29:51.9856483Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T14:29:51.9856557Z 773 │ releaseShareReservation, 2026-10-24T14:29:51.9856621Z 774 │ reserveShare, 2026-10-24T14:29:51.9856707Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T14:29:51.9856775Z 776 │ selectedProject, 2026-10-24T14:29:51.9856843Z 777 │ shareImportAttempt, 2026-10-24T14:29:51.9856929Z ·  ─────────┬──────── 2026-10-24T14:29:51.9857096Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T14:29:51.9857152Z 778 │ ]); 2026-10-24T14:29:51.9857201Z ╰──── 2026-10-24T14:29:51.9857496Z  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-24T14:29:51.9857813Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9857819Z 2026-10-24T14:29:51.9858104Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9858253Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T14:29:51.9858308Z 12379 │ 2026-10-24T14:29:51.9858453Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T14:29:51.9858540Z ·  ────────┬─────── 2026-10-24T14:29:51.9858693Z · ╰── 'layerUnavailable' is declared here 2026-10-24T14:29:51.9858760Z 12381 │ OrchestratorV2, 2026-10-24T14:29:51.9858813Z ╰──── 2026-10-24T14:29:51.9858975Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9859015Z 2026-10-24T14:29:51.9859234Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T14:29:51.9859351Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T14:29:51.9859409Z 7 │ () => 2026-10-24T14:29:51.9859474Z 8 │ Gesture.Hover() 2026-10-24T14:29:51.9859553Z ·  ──┬── 2026-10-24T14:29:51.9859687Z · ╰── `Hover` may be a component 2026-10-24T14:29:51.9859762Z 9 │ .manualActivation(true) 2026-10-24T14:29:51.9859814Z ╰──── 2026-10-24T14:29:51.9860096Z  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-24T14:29:51.9860554Z  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-24T14:29:51.9860559Z 2026-10-24T14:29:51.9861035Z ⚠ 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-24T14:29:51.9861212Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T14:29:51.9861316Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T14:29:51.9861517Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T14:29:51.9861623Z 567 │ │ const nextEvent = { 2026-10-24T14:29:51.9861786Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T14:29:51.9861920Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T14:29:51.9862013Z 570 │ │ threadId, 2026-10-24T14:29:51.9862151Z 571 │ │ providerInstanceId, 2026-10-24T14:29:51.9862253Z 572 │ │ occurredAt: now, 2026-10-24T14:29:51.9862405Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T14:29:51.9862535Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T14:29:51.9862650Z 575 │ │ const reader = yield* eventSink 2026-10-24T14:29:51.9862778Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T14:29:51.9862916Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T14:29:51.9863023Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9863188Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T14:29:51.9863320Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T14:29:51.9863437Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T14:29:51.9863644Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T14:29:51.9863723Z 583 │ │ } 2026-10-24T14:29:51.9863945Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T14:29:51.9864158Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T14:29:51.9864291Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T14:29:51.9864426Z 587 │ ╰─▶ } 2026-10-24T14:29:51.9864485Z 588 │ }), 2026-10-24T14:29:51.9864538Z ╰──── 2026-10-24T14:29:51.9864541Z 2026-10-24T14:29:51.9865013Z ⚠ 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-24T14:29:51.9865189Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T14:29:51.9865273Z 2326 │ let settled = false; 2026-10-24T14:29:51.9865440Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T14:29:51.9865602Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T14:29:51.9865737Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T14:29:51.9865821Z 2330 │ │ ); 2026-10-24T14:29:51.9865951Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T14:29:51.9866089Z 2332 │ ╰─▶ } 2026-10-24T14:29:51.9866208Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T14:29:51.9866299Z ╰──── 2026-10-24T14:29:51.9866303Z 2026-10-24T14:29:51.9866641Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9866799Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T14:29:51.9866851Z 55 │ 2026-10-24T14:29:51.9866915Z 56 │ useEffect(() => { 2026-10-24T14:29:51.9866989Z ·  ────┬──── 2026-10-24T14:29:51.9867119Z · ╰── This is the containing effect 2026-10-24T14:29:51.9867190Z 57 │ setDecodedSize(null); 2026-10-24T14:29:51.9867268Z ·  ───────┬────── 2026-10-24T14:29:51.9867445Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9867515Z 58 │ }, [props.sourceKey]); 2026-10-24T14:29:51.9867567Z ╰──── 2026-10-24T14:29:51.9868178Z  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-24T14:29:51.9868509Z  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-24T14:29:51.9868511Z 2026-10-24T14:29:51.9868772Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9868926Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T14:29:51.9868978Z 59 │ 2026-10-24T14:29:51.9869043Z 60 │ useEffect(() => { 2026-10-24T14:29:51.9869179Z ·  ────┬──── 2026-10-24T14:29:51.9869398Z · ╰── This is the containing effect 2026-10-24T14:29:51.9869474Z 61 │ setFailedUri(null); 2026-10-24T14:29:51.9869574Z ·  ──────┬───── 2026-10-24T14:29:51.9869840Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9869947Z 62 │ }, [props.uri]); 2026-10-24T14:29:51.9870030Z ╰──── 2026-10-24T14:29:51.9870646Z  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-24T14:29:51.9870979Z  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-24T14:29:51.9870985Z 2026-10-24T14:29:51.9871203Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T14:29:51.9871356Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T14:29:51.9871483Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T14:29:51.9871662Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T14:29:51.9871753Z ·  ────────┬──────── 2026-10-24T14:29:51.9871904Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T14:29:51.9871957Z 8 │ 2026-10-24T14:29:51.9872008Z ╰──── 2026-10-24T14:29:51.9872150Z  help: Consider removing this import. 2026-10-24T14:29:51.9872155Z 2026-10-24T14:29:51.9872359Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9872511Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T14:29:51.9872578Z 57 │ setDecodedSize(null); 2026-10-24T14:29:51.9872648Z 58 │ }, [props.sourceKey]); 2026-10-24T14:29:51.9872731Z ·  ───────┬─────── 2026-10-24T14:29:51.9872887Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T14:29:51.9872937Z 59 │ 2026-10-24T14:29:51.9872988Z ╰──── 2026-10-24T14:29:51.9873287Z  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-24T14:29:51.9873608Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9873614Z 2026-10-24T14:29:51.9873818Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9873966Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T14:29:51.9874035Z 61 │ setFailedUri(null); 2026-10-24T14:29:51.9874100Z 62 │ }, [props.uri]); 2026-10-24T14:29:51.9874174Z ·  ────┬──── 2026-10-24T14:29:51.9874315Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T14:29:51.9874368Z 63 │ 2026-10-24T14:29:51.9874418Z ╰──── 2026-10-24T14:29:51.9874772Z  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-24T14:29:51.9875153Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9875155Z 2026-10-24T14:29:51.9875364Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T14:29:51.9875527Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T14:29:51.9875616Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T14:29:51.9875734Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T14:29:51.9875818Z ·  ─────┬───── 2026-10-24T14:29:51.9875960Z · ╰── 'HostProcess' is imported here 2026-10-24T14:29:51.9876019Z 26 │ 2026-10-24T14:29:51.9876070Z ╰──── 2026-10-24T14:29:51.9876168Z  help: Consider removing this import. 2026-10-24T14:29:51.9876171Z 2026-10-24T14:29:51.9876446Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9876613Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T14:29:51.9876696Z 123 │ const path = yield* Path.Path; 2026-10-24T14:29:51.9876813Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T14:29:51.9876896Z ·  ──────┬───── 2026-10-24T14:29:51.9877038Z · ╰── 'serverConfig' is declared here 2026-10-24T14:29:51.9877187Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T14:29:51.9877240Z ╰──── 2026-10-24T14:29:51.9877344Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9877347Z 2026-10-24T14:29:51.9877624Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9877790Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T14:29:51.9877904Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T14:29:51.9878046Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T14:29:51.9878131Z ·  ───────┬────── 2026-10-24T14:29:51.9878278Z · ╰── 'serverSettings' is declared here 2026-10-24T14:29:51.9878420Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T14:29:51.9878475Z ╰──── 2026-10-24T14:29:51.9878577Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9878580Z 2026-10-24T14:29:51.9878767Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9878873Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T14:29:51.9878939Z 457 │ ): Array { 2026-10-24T14:29:51.9879045Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T14:29:51.9879146Z ·  ┬ 2026-10-24T14:29:51.9879291Z · ╰── '_' is declared here 2026-10-24T14:29:51.9879363Z 459 │ for (const b of data) { 2026-10-24T14:29:51.9879414Z ╰──── 2026-10-24T14:29:51.9879573Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9879608Z 2026-10-24T14:29:51.9879789Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9879911Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T14:29:51.9879976Z 184 │ "options", 2026-10-24T14:29:51.9880072Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T14:29:51.9880182Z ·  ────────────────┬─────────────── 2026-10-24T14:29:51.9880377Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9880476Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T14:29:51.9880527Z ╰──── 2026-10-24T14:29:51.9881005Z  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-24T14:29:51.9881300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9881303Z 2026-10-24T14:29:51.9881449Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9881570Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T14:29:51.9881664Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T14:29:51.9881758Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T14:29:51.9881871Z ·  ────────────────┬──────────────── 2026-10-24T14:29:51.9882083Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T14:29:51.9882213Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T14:29:51.9882265Z ╰──── 2026-10-24T14:29:51.9882735Z  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-24T14:29:51.9883027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9883030Z 2026-10-24T14:29:51.9883175Z ⚠ react(refs): Cannot access refs during render 2026-10-24T14:29:51.9883329Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T14:29:51.9883388Z 493 │ > 2026-10-24T14:29:51.9883472Z 494 │ {props.children(close)} 2026-10-24T14:29:51.9883566Z ·  ──┬── 2026-10-24T14:29:51.9883725Z · ╰── Cannot access ref value during render 2026-10-24T14:29:51.9883802Z 495 │ 2026-10-24T14:29:51.9883853Z ╰──── 2026-10-24T14:29:51.9884317Z  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-24T14:29:51.9884609Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T14:29:51.9884611Z 2026-10-24T14:29:51.9884926Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:51.9885124Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T14:29:51.9885178Z 407 │ 2026-10-24T14:29:51.9885249Z 408 │ const layer: Layer.Layer< 2026-10-24T14:29:51.9885320Z ·  ──┬── 2026-10-24T14:29:51.9885443Z · ╰── 'layer' is declared here 2026-10-24T14:29:51.9885533Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T14:29:51.9885585Z ╰──── 2026-10-24T14:29:51.9885690Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9885692Z 2026-10-24T14:29:51.9885949Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T14:29:51.9886111Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T14:29:51.9886169Z 1619 │ 2026-10-24T14:29:51.9886385Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T14:29:51.9886503Z ·  ──────────────────┬────────────────── 2026-10-24T14:29:51.9886706Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T14:29:51.9886784Z 1621 │ const meta = response._meta; 2026-10-24T14:29:51.9886837Z ╰──── 2026-10-24T14:29:51.9886939Z  help: Consider removing this declaration. 2026-10-24T14:29:51.9886941Z 2026-10-24T14:29:51.9887200Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9887344Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2146:5] 2026-10-24T14:29:51.9887403Z 2144 │ ); 2026-10-24T14:29:51.9887470Z 2145 │ useEffect(() => { 2026-10-24T14:29:51.9887543Z ·  ────┬──── 2026-10-24T14:29:51.9887675Z · ╰── This is the containing effect 2026-10-24T14:29:51.9887750Z 2146 │ setExpandedVideo(null); 2026-10-24T14:29:51.9887832Z ·  ────────┬─────── 2026-10-24T14:29:51.9888004Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9888077Z 2147 │ setExpandedFile(null); 2026-10-24T14:29:51.9888128Z ╰──── 2026-10-24T14:29:51.9888838Z  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-24T14:29:51.9889234Z  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-24T14:29:51.9889237Z 2026-10-24T14:29:51.9889495Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9889632Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2647:9] 2026-10-24T14:29:51.9889771Z 2638 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T14:29:51.9889836Z 2639 │ useEffect(() => { 2026-10-24T14:29:51.9889909Z ·  ────┬──── 2026-10-24T14:29:51.9890046Z · ╰── This is the containing effect 2026-10-24T14:29:51.9890177Z 2640 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T14:29:51.9890273Z 2641 │ const index = presentedFeed.findIndex( 2026-10-24T14:29:51.9890412Z 2642 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T14:29:51.9890470Z 2643 │ ); 2026-10-24T14:29:51.9890543Z 2644 │ if (index === -1) { 2026-10-24T14:29:51.9890672Z 2645 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T14:29:51.9890776Z 2646 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T14:29:51.9890870Z 2647 │ setInteractionState((current) => ({ 2026-10-24T14:29:51.9890962Z ·  ─────────┬───────── 2026-10-24T14:29:51.9891145Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9891213Z 2648 │ ...current, 2026-10-24T14:29:51.9891266Z ╰──── 2026-10-24T14:29:51.9891866Z  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-24T14:29:51.9892234Z  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-24T14:29:51.9892237Z 2026-10-24T14:29:51.9892466Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T14:29:51.9892604Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T14:29:51.9892747Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T14:29:51.9892887Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T14:29:51.9892986Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9893153Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T14:29:51.9893310Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T14:29:51.9893363Z ╰──── 2026-10-24T14:29:51.9893460Z  help: Consider removing this import. 2026-10-24T14:29:51.9893463Z 2026-10-24T14:29:51.9893672Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T14:29:51.9893857Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T14:29:51.9893975Z 91 │ import { 2026-10-24T14:29:51.9894039Z 92 │ createContext, 2026-10-24T14:29:51.9894115Z ·  ──────┬────── 2026-10-24T14:29:51.9894252Z · ╰── 'createContext' is imported here 2026-10-24T14:29:51.9894309Z 93 │ memo, 2026-10-24T14:29:51.9894360Z ╰──── 2026-10-24T14:29:51.9894459Z  help: Consider removing this import. 2026-10-24T14:29:51.9894461Z 2026-10-24T14:29:51.9894674Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T14:29:51.9894809Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T14:29:51.9894867Z 107 │ import { 2026-10-24T14:29:51.9894935Z 108 │ ActivityIndicator, 2026-10-24T14:29:51.9895017Z ·  ────────┬──────── 2026-10-24T14:29:51.9895170Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T14:29:51.9895230Z 109 │ Image, 2026-10-24T14:29:51.9895281Z ╰──── 2026-10-24T14:29:51.9895376Z  help: Consider removing this import. 2026-10-24T14:29:51.9895378Z 2026-10-24T14:29:51.9895580Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T14:29:51.9895712Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T14:29:51.9895775Z 114 │ Pressable, 2026-10-24T14:29:51.9895837Z 115 │ ScrollView, 2026-10-24T14:29:51.9895910Z ·  ─────┬──── 2026-10-24T14:29:51.9896042Z · ╰── 'ScrollView' is imported here 2026-10-24T14:29:51.9896105Z 116 │ StyleSheet, 2026-10-24T14:29:51.9896162Z ╰──── 2026-10-24T14:29:51.9896264Z  help: Consider removing this import. 2026-10-24T14:29:51.9896266Z 2026-10-24T14:29:51.9896466Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T14:29:51.9896601Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T14:29:51.9896662Z 116 │ StyleSheet, 2026-10-24T14:29:51.9896730Z 117 │ Text as NativeText, 2026-10-24T14:29:51.9896810Z ·  ─────┬──── 2026-10-24T14:29:51.9896950Z · ╰── 'NativeText' is imported here 2026-10-24T14:29:51.9897017Z 118 │ type ColorValue, 2026-10-24T14:29:51.9897068Z ╰──── 2026-10-24T14:29:51.9897163Z  help: Consider removing this import. 2026-10-24T14:29:51.9897166Z 2026-10-24T14:29:51.9897386Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T14:29:51.9897522Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T14:29:51.9897661Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T14:29:51.9897789Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T14:29:51.9897879Z ·  ─────────┬──────── 2026-10-24T14:29:51.9898034Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T14:29:51.9898185Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T14:29:51.9898238Z ╰──── 2026-10-24T14:29:51.9898332Z  help: Consider removing this import. 2026-10-24T14:29:51.9898334Z 2026-10-24T14:29:51.9898609Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T14:29:51.9898816Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T14:29:51.9898951Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T14:29:51.9899076Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T14:29:51.9899166Z ·  ─────────┬───────── 2026-10-24T14:29:51.9899321Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T14:29:51.9899380Z 144 │ import { 2026-10-24T14:29:51.9899429Z ╰──── 2026-10-24T14:29:51.9899527Z  help: Consider removing this import. 2026-10-24T14:29:51.9899529Z 2026-10-24T14:29:51.9899750Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T14:29:51.9899885Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T14:29:51.9900033Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T14:29:51.9900170Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T14:29:51.9900258Z ·  ────────┬─────── 2026-10-24T14:29:51.9900408Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T14:29:51.9900547Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T14:29:51.9900598Z ╰──── 2026-10-24T14:29:51.9900693Z  help: Consider removing this import. 2026-10-24T14:29:51.9900696Z 2026-10-24T14:29:51.9900917Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T14:29:51.9901053Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T14:29:51.9901139Z 160 │ attachmentVideoPreviewSource, 2026-10-24T14:29:51.9901210Z 161 │ mediaVideoPreviewUri, 2026-10-24T14:29:51.9901295Z ·  ──────────┬───────── 2026-10-24T14:29:51.9901448Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T14:29:51.9901520Z 162 │ mediaVideoThumbnailKey, 2026-10-24T14:29:51.9901570Z ╰──── 2026-10-24T14:29:51.9901666Z  help: Consider removing this import. 2026-10-24T14:29:51.9901668Z 2026-10-24T14:29:51.9901893Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T14:29:51.9902027Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T14:29:51.9902134Z 161 │ mediaVideoPreviewUri, 2026-10-24T14:29:51.9902215Z 162 │ mediaVideoThumbnailKey, 2026-10-24T14:29:51.9902302Z ·  ───────────┬────────── 2026-10-24T14:29:51.9902462Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T14:29:51.9902542Z 163 │ type MediaVideoPreviewSource, 2026-10-24T14:29:51.9902594Z ╰──── 2026-10-24T14:29:51.9902688Z  help: Consider removing this import. 2026-10-24T14:29:51.9902691Z 2026-10-24T14:29:51.9902907Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T14:29:51.9903041Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T14:29:51.9903111Z 162 │ mediaVideoThumbnailKey, 2026-10-24T14:29:51.9903191Z 163 │ type MediaVideoPreviewSource, 2026-10-24T14:29:51.9903338Z ·  ───────────┬─────────── 2026-10-24T14:29:51.9903561Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T14:29:51.9903650Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T14:29:51.9903701Z ╰──── 2026-10-24T14:29:51.9903796Z  help: Consider removing this import. 2026-10-24T14:29:51.9903799Z 2026-10-24T14:29:51.9903999Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T14:29:51.9904131Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T14:29:51.9904309Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T14:29:51.9904449Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T14:29:51.9904548Z ·  ───────┬─────── 2026-10-24T14:29:51.9904702Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T14:29:51.9904762Z 172 │ import { 2026-10-24T14:29:51.9904812Z ╰──── 2026-10-24T14:29:51.9904908Z  help: Consider removing this import. 2026-10-24T14:29:51.9904910Z 2026-10-24T14:29:51.9905144Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T14:29:51.9905276Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T14:29:51.9905333Z 185 │ import { 2026-10-24T14:29:51.9905410Z 186 │ resolveMarkdownFontSizes, 2026-10-24T14:29:51.9905502Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9905669Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T14:29:51.9905758Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T14:29:51.9905809Z ╰──── 2026-10-24T14:29:51.9905905Z  help: Consider removing this import. 2026-10-24T14:29:51.9905907Z 2026-10-24T14:29:51.9906170Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T14:29:51.9906378Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:193:3] 2026-10-24T14:29:51.9906458Z 192 │ normalizeNativeMarkdownUrl, 2026-10-24T14:29:51.9906554Z 193 │ resolveMarkdownInlineCodePresentation, 2026-10-24T14:29:51.9906668Z ·  ──────────────────┬────────────────── 2026-10-24T14:29:51.9906862Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T14:29:51.9907018Z 194 │ resolveMarkdownLinkPresentation, 2026-10-24T14:29:51.9907149Z ╰──── 2026-10-24T14:29:51.9907283Z  help: Consider removing this import. 2026-10-24T14:29:51.9907286Z 2026-10-24T14:29:51.9907514Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T14:29:51.9907648Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:10] 2026-10-24T14:29:51.9907752Z 232 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T14:29:51.9907899Z 233 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T14:29:51.9907999Z ·  ────────────┬─────────── 2026-10-24T14:29:51.9908168Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T14:29:51.9908227Z 234 │ import { 2026-10-24T14:29:51.9908279Z ╰──── 2026-10-24T14:29:51.9908380Z  help: Consider removing this import. 2026-10-24T14:29:51.9908387Z 2026-10-24T14:29:51.9908598Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T14:29:51.9908729Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:3] 2026-10-24T14:29:51.9908794Z 236 │ useAssetUrl, 2026-10-24T14:29:51.9908863Z 237 │ useAssetUrlState, 2026-10-24T14:29:51.9908943Z ·  ────────┬─────── 2026-10-24T14:29:51.9909088Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T14:29:51.9909157Z 238 │ useRefreshAssetUrl, 2026-10-24T14:29:51.9909207Z ╰──── 2026-10-24T14:29:51.9909304Z  help: Consider removing this import. 2026-10-24T14:29:51.9909306Z 2026-10-24T14:29:51.9909513Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9909652Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2148:7] 2026-10-24T14:29:51.9909727Z 2147 │ setExpandedFile(null); 2026-10-24T14:29:51.9909886Z 2148 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T14:29:51.9910115Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T14:29:51.9910412Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T14:29:51.9910613Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T14:29:51.9910785Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T14:29:51.9910932Z 2149 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T14:29:51.9910985Z ╰──── 2026-10-24T14:29:51.9911283Z  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-24T14:29:51.9911605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9911609Z 2026-10-24T14:29:51.9911811Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9911947Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2616:7] 2026-10-24T14:29:51.9912122Z 2615 │ reportHeaderMaterialVisibility(false); 2026-10-24T14:29:51.9912304Z 2616 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T14:29:51.9912387Z ·  ──────┬────── 2026-10-24T14:29:51.9912540Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T14:29:51.9912596Z 2617 │ 2026-10-24T14:29:51.9912648Z ╰──── 2026-10-24T14:29:51.9912940Z  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-24T14:29:51.9913254Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9913257Z 2026-10-24T14:29:51.9913463Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9913602Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2632:7] 2026-10-24T14:29:51.9913659Z 2631 │ } 2026-10-24T14:29:51.9913791Z 2632 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T14:29:51.9913871Z ·  ──────┬───── 2026-10-24T14:29:51.9914022Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T14:29:51.9914168Z 2633 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T14:29:51.9914220Z ╰──── 2026-10-24T14:29:51.9914515Z  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-24T14:29:51.9914835Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9914841Z 2026-10-24T14:29:51.9915045Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9915180Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2828:7] 2026-10-24T14:29:51.9915238Z 2827 │ } 2026-10-24T14:29:51.9915422Z 2828 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T14:29:51.9915640Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T14:29:51.9915894Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T14:29:51.9916107Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T14:29:51.9916265Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T14:29:51.9916319Z 2829 │ 2026-10-24T14:29:51.9916373Z ╰──── 2026-10-24T14:29:51.9916666Z  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-24T14:29:51.9916980Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9916983Z 2026-10-24T14:29:51.9917168Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T14:29:51.9917367Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:618:9] 2026-10-24T14:29:51.9917504Z 617 │ }; 2026-10-24T14:29:51.9917656Z 618 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T14:29:51.9917850Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T14:29:51.9918093Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T14:29:51.9918292Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T14:29:51.9918457Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T14:29:51.9918515Z 619 │ ); 2026-10-24T14:29:51.9918566Z ╰──── 2026-10-24T14:29:51.9918892Z  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-24T14:29:51.9919210Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9919212Z 2026-10-24T14:29:51.9919426Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:29:51.9919562Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T14:29:51.9919638Z 89 │ let cursor = prompt.length; 2026-10-24T14:29:51.9919746Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T14:29:51.9919852Z ·  ─────── 2026-10-24T14:29:51.9919940Z 91 │ let { start, end } = occurrence; 2026-10-24T14:29:51.9919998Z ╰──── 2026-10-24T14:29:51.9920258Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:29:51.9920262Z 2026-10-24T14:29:51.9920523Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9920686Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T14:29:51.9920800Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T14:29:51.9920871Z 38 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9920951Z ·  ───────┬─────── 2026-10-24T14:29:51.9921086Z · ╰── This is the containing effect 2026-10-24T14:29:51.9921202Z 39 │ reset(); 2026-10-24T14:29:51.9921303Z 40 │ setInitialized(true); 2026-10-24T14:29:51.9921379Z ·  ───────┬────── 2026-10-24T14:29:51.9921551Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9921614Z 41 │ }, [reset]); 2026-10-24T14:29:51.9921666Z ╰──── 2026-10-24T14:29:51.9922299Z  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-24T14:29:51.9922629Z  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-24T14:29:51.9922634Z 2026-10-24T14:29:51.9922894Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9923056Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T14:29:51.9923108Z 88 │ 2026-10-24T14:29:51.9923172Z 89 │ useEffect(() => { 2026-10-24T14:29:51.9923244Z ·  ────┬──── 2026-10-24T14:29:51.9923374Z · ╰── This is the containing effect 2026-10-24T14:29:51.9923536Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T14:29:51.9923640Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T14:29:51.9923707Z 92 │ let active = true; 2026-10-24T14:29:51.9923804Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T14:29:51.9923897Z ·  ─────────┬───────── 2026-10-24T14:29:51.9924072Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9924229Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T14:29:51.9924282Z ╰──── 2026-10-24T14:29:51.9924881Z  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-24T14:29:51.9925205Z  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-24T14:29:51.9925213Z 2026-10-24T14:29:51.9925445Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T14:29:51.9925575Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T14:29:51.9925646Z 14 │ threadSearchMatchKey, 2026-10-24T14:29:51.9925732Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T14:29:51.9925836Z ·  ──────────────┬───────────── 2026-10-24T14:29:51.9926014Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T14:29:51.9926125Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T14:29:51.9926176Z ╰──── 2026-10-24T14:29:51.9926273Z  help: Consider removing this import. 2026-10-24T14:29:51.9926275Z 2026-10-24T14:29:51.9926525Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9926690Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T14:29:51.9926822Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T14:29:51.9926912Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T14:29:51.9927017Z ·  ───────┬────── 2026-10-24T14:29:51.9927186Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T14:29:51.9927326Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T14:29:51.9927376Z ╰──── 2026-10-24T14:29:51.9927673Z  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-24T14:29:51.9927991Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9927997Z 2026-10-24T14:29:51.9928167Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:51.9928295Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T14:29:51.9928380Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T14:29:51.9928542Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T14:29:51.9928664Z ·  ─────┬──── 2026-10-24T14:29:51.9928833Z · ╰── Cannot call impure function 2026-10-24T14:29:51.9928917Z 519 │ const id = setTimeout(() => { 2026-10-24T14:29:51.9928971Z ╰──── 2026-10-24T14:29:51.9929259Z  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-24T14:29:51.9929555Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:51.9929557Z 2026-10-24T14:29:51.9929743Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9929919Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T14:29:51.9930001Z 554 │ assert.deepStrictEqual( 2026-10-24T14:29:51.9930170Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T14:29:51.9930296Z ·  ┬ 2026-10-24T14:29:51.9930462Z · ╰── '_' is declared here 2026-10-24T14:29:51.9930525Z 556 │ [ 2026-10-24T14:29:51.9930578Z ╰──── 2026-10-24T14:29:51.9930683Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9930686Z 2026-10-24T14:29:51.9930869Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9931047Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T14:29:51.9931131Z 1154 │ assert.deepStrictEqual( 2026-10-24T14:29:51.9931296Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T14:29:51.9931468Z ·  ┬ 2026-10-24T14:29:51.9931664Z · ╰── '_' is declared here 2026-10-24T14:29:51.9931727Z 1156 │ [ 2026-10-24T14:29:51.9931780Z ╰──── 2026-10-24T14:29:51.9931880Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9931883Z 2026-10-24T14:29:51.9932106Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:51.9932254Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T14:29:51.9932343Z 35 │ { 2026-10-24T14:29:51.9933468Z ·  ────┬──── 2026-10-24T14:29:51.9933601Z · ╰── This is the containing effect 2026-10-24T14:29:51.9933687Z 279 │ setNow(new Date().toISOString()); 2026-10-24T14:29:51.9933762Z ·  ───┬── 2026-10-24T14:29:51.9933934Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9934075Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T14:29:51.9934126Z ╰──── 2026-10-24T14:29:51.9934734Z  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-24T14:29:51.9935059Z  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-24T14:29:51.9935061Z 2026-10-24T14:29:51.9935296Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T14:29:51.9935461Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T14:29:51.9935531Z 12 │ threadSearchMatchKey, 2026-10-24T14:29:51.9935617Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T14:29:51.9935723Z ·  ──────────────┬───────────── 2026-10-24T14:29:51.9935901Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T14:29:51.9936011Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T14:29:51.9936062Z ╰──── 2026-10-24T14:29:51.9936162Z  help: Consider removing this import. 2026-10-24T14:29:51.9936164Z 2026-10-24T14:29:51.9936423Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9936620Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T14:29:51.9936754Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T14:29:51.9936844Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T14:29:51.9936948Z ·  ───────┬────── 2026-10-24T14:29:51.9937115Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T14:29:51.9937230Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T14:29:51.9937281Z ╰──── 2026-10-24T14:29:51.9937580Z  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-24T14:29:51.9937900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9937905Z 2026-10-24T14:29:51.9938076Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:51.9938239Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T14:29:51.9938327Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T14:29:51.9938486Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T14:29:51.9938607Z ·  ─────┬──── 2026-10-24T14:29:51.9938774Z · ╰── Cannot call impure function 2026-10-24T14:29:51.9938857Z 351 │ const id = setTimeout(() => { 2026-10-24T14:29:51.9938911Z ╰──── 2026-10-24T14:29:51.9939200Z  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-24T14:29:51.9939501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:51.9939503Z 2026-10-24T14:29:51.9939762Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9939937Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T14:29:51.9939990Z 76 │ 2026-10-24T14:29:51.9940056Z 77 │ useEffect(() => { 2026-10-24T14:29:51.9940126Z ·  ────┬──── 2026-10-24T14:29:51.9940262Z · ╰── This is the containing effect 2026-10-24T14:29:51.9940395Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T14:29:51.9940464Z 79 │ setHostInput(host); 2026-10-24T14:29:51.9940539Z ·  ──────┬───── 2026-10-24T14:29:51.9940709Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9940777Z 80 │ setCodeInput(code); 2026-10-24T14:29:51.9940828Z ╰──── 2026-10-24T14:29:51.9941430Z  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-24T14:29:51.9941808Z  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-24T14:29:51.9941839Z 2026-10-24T14:29:51.9942123Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9942301Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T14:29:51.9942355Z 82 │ 2026-10-24T14:29:51.9942418Z 83 │ useEffect(() => { 2026-10-24T14:29:51.9942491Z ·  ────┬──── 2026-10-24T14:29:51.9942621Z · ╰── This is the containing effect 2026-10-24T14:29:51.9942711Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T14:29:51.9942771Z 85 │ return; 2026-10-24T14:29:51.9942831Z 86 │ } 2026-10-24T14:29:51.9942886Z 87 │ 2026-10-24T14:29:51.9943002Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T14:29:51.9943068Z 89 │ setHostInput(host); 2026-10-24T14:29:51.9943145Z ·  ──────┬───── 2026-10-24T14:29:51.9943314Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9943380Z 90 │ setCodeInput(code); 2026-10-24T14:29:51.9943429Z ╰──── 2026-10-24T14:29:51.9944033Z  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-24T14:29:51.9944365Z  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-24T14:29:51.9944370Z 2026-10-24T14:29:51.9944629Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9944800Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T14:29:51.9944851Z 92 │ 2026-10-24T14:29:51.9944917Z 93 │ useEffect(() => { 2026-10-24T14:29:51.9944986Z ·  ────┬──── 2026-10-24T14:29:51.9945118Z · ╰── This is the containing effect 2026-10-24T14:29:51.9945202Z 94 │ if (pairingConnectionError) { 2026-10-24T14:29:51.9945276Z 95 │ setIsSubmitting(false); 2026-10-24T14:29:51.9945360Z ·  ───────┬─────── 2026-10-24T14:29:51.9945583Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9945667Z 96 │ } 2026-10-24T14:29:51.9945718Z ╰──── 2026-10-24T14:29:51.9947803Z  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-24T14:29:51.9948146Z  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-24T14:29:51.9948149Z 2026-10-24T14:29:51.9948365Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:29:51.9948497Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T14:29:51.9948553Z 40 │ 2026-10-24T14:29:51.9948664Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T14:29:51.9948776Z ·  ─────── 2026-10-24T14:29:51.9948875Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T14:29:51.9948927Z ╰──── 2026-10-24T14:29:51.9949191Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:29:51.9949194Z 2026-10-24T14:29:51.9949410Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T14:29:51.9949555Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T14:29:51.9949665Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T14:29:51.9949801Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T14:29:51.9949899Z ·  ────────────┬──────────── 2026-10-24T14:29:51.9950073Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T14:29:51.9950129Z 774 │ } 2026-10-24T14:29:51.9950337Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T14:29:51.9950449Z ·  ────────────────┬──────────────── 2026-10-24T14:29:51.9950733Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T14:29:51.9950787Z 776 │ 2026-10-24T14:29:51.9950839Z ╰──── 2026-10-24T14:29:51.9951275Z  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-24T14:29:51.9951594Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9951598Z 2026-10-24T14:29:51.9951756Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9951901Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T14:29:51.9952066Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T14:29:51.9952247Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T14:29:51.9952426Z ·  ──────────┬───────── 2026-10-24T14:29:51.9952633Z · ╰── `animatedBorderRadius` originates here 2026-10-24T14:29:51.9952796Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T14:29:51.9952868Z 390 │ useLayoutEffect(() => { 2026-10-24T14:29:51.9952970Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T14:29:51.9953060Z ·  ──────────┬───────── 2026-10-24T14:29:51.9953221Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T14:29:51.9953311Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T14:29:51.9953363Z ╰──── 2026-10-24T14:29:51.9953633Z  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-24T14:29:51.9953953Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9953958Z 2026-10-24T14:29:51.9954120Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9954281Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T14:29:51.9954382Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T14:29:51.9954478Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T14:29:51.9954563Z ·  ──────┬────── 2026-10-24T14:29:51.9954704Z · ╰── `pulseProgress` originates here 2026-10-24T14:29:51.9954756Z 55 │ 2026-10-24T14:29:51.9954822Z 56 │ useEffect(() => { 2026-10-24T14:29:51.9954892Z 57 │ if (pulse) { 2026-10-24T14:29:51.9954982Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T14:29:51.9955063Z ·  ──────┬────── 2026-10-24T14:29:51.9955208Z · ╰── `pulseProgress` cannot be modified 2026-10-24T14:29:51.9955276Z 59 │ withTiming(1, { 2026-10-24T14:29:51.9955327Z ╰──── 2026-10-24T14:29:51.9955592Z  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-24T14:29:51.9955903Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9955906Z 2026-10-24T14:29:51.9956122Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:29:51.9956255Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T14:29:51.9956360Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T14:29:51.9956448Z 259 │ for (const edit of edits.reverse()) 2026-10-24T14:29:51.9956546Z ·  ─────── 2026-10-24T14:29:51.9956715Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T14:29:51.9956765Z ╰──── 2026-10-24T14:29:51.9957031Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:29:51.9957033Z 2026-10-24T14:29:51.9957252Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:29:51.9957427Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T14:29:51.9957538Z 289 │ visit(parser.parse(markdown)); 2026-10-24T14:29:51.9957625Z 290 │ for (const edit of edits.reverse()) 2026-10-24T14:29:51.9957719Z ·  ─────── 2026-10-24T14:29:51.9957884Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T14:29:51.9957935Z ╰──── 2026-10-24T14:29:51.9958196Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:29:51.9958199Z 2026-10-24T14:29:51.9958410Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T14:29:51.9958534Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T14:29:51.9958613Z 343 │ visit(parser.parse(markdown)); 2026-10-24T14:29:51.9958725Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T14:29:51.9958833Z ·  ─────── 2026-10-24T14:29:51.9959002Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T14:29:51.9959052Z ╰──── 2026-10-24T14:29:51.9959315Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T14:29:51.9959317Z 2026-10-24T14:29:51.9959522Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T14:29:51.9959686Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T14:29:51.9959742Z 154 │ } 2026-10-24T14:29:51.9959811Z 155 │ }, [wrappedRender]); 2026-10-24T14:29:51.9959899Z ·  ──────┬────── 2026-10-24T14:29:51.9960056Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T14:29:51.9960111Z 156 │ 2026-10-24T14:29:51.9960161Z ╰──── 2026-10-24T14:29:51.9960462Z  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-24T14:29:51.9960783Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T14:29:51.9960786Z 2026-10-24T14:29:51.9961031Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:29:51.9961194Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T14:29:51.9961253Z 799 │ > 2026-10-24T14:29:51.9961385Z 800 │ 2026-10-24T14:29:51.9961511Z ·  ──────────────────── 2026-10-24T14:29:51.9961611Z 801 │ 2026-10-24T14:29:51.9961663Z ╰──── 2026-10-24T14:29:51.9961891Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:29:51.9962035Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:29:51.9962038Z 2026-10-24T14:29:51.9962349Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9962557Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T14:29:51.9962826Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T14:29:51.9962891Z 29 │ useEffect(() => { 2026-10-24T14:29:51.9962965Z ·  ────┬──── 2026-10-24T14:29:51.9963095Z · ╰── This is the containing effect 2026-10-24T14:29:51.9963222Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T14:29:51.9963329Z ·  ───┬─── 2026-10-24T14:29:51.9963526Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9963599Z 31 │ }, [key, live, snapshot]); 2026-10-24T14:29:51.9963651Z ╰──── 2026-10-24T14:29:51.9964268Z  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-24T14:29:51.9964597Z  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-24T14:29:51.9964600Z 2026-10-24T14:29:51.9964882Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T14:29:51.9965014Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T14:29:51.9965069Z 248 │ }, 2026-10-24T14:29:51.9965155Z 249 │ (effect, flow, stopSessions) => 2026-10-24T14:29:51.9965252Z ·  ──────┬───── 2026-10-24T14:29:51.9965404Z · ╰── 'stopSessions' is declared here 2026-10-24T14:29:51.9965472Z 250 │ effect.pipe( 2026-10-24T14:29:51.9965524Z ╰──── 2026-10-24T14:29:51.9965628Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9965631Z 2026-10-24T14:29:51.9965890Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9966080Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T14:29:51.9966134Z 117 │ 2026-10-24T14:29:51.9966201Z 118 │ useEffect(() => { 2026-10-24T14:29:51.9966271Z ·  ────┬──── 2026-10-24T14:29:51.9966411Z · ╰── This is the containing effect 2026-10-24T14:29:51.9966494Z 119 │ void refreshNotifications(); 2026-10-24T14:29:51.9966586Z ·  ──────────┬───────── 2026-10-24T14:29:51.9966765Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9966912Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T14:29:51.9966964Z ╰──── 2026-10-24T14:29:51.9967572Z  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-24T14:29:51.9967949Z  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-24T14:29:51.9967981Z 2026-10-24T14:29:51.9968293Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T14:29:51.9968480Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T14:29:51.9968533Z 125 │ 2026-10-24T14:29:51.9968600Z 126 │ useEffect(() => { 2026-10-24T14:29:51.9968671Z ·  ────┬──── 2026-10-24T14:29:51.9968803Z · ╰── This is the containing effect 2026-10-24T14:29:51.9968870Z 127 │ if (!isLoaded) { 2026-10-24T14:29:51.9968962Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T14:29:51.9969051Z ·  ──────────┬────────── 2026-10-24T14:29:51.9969235Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T14:29:51.9969303Z 129 │ return; 2026-10-24T14:29:51.9969354Z ╰──── 2026-10-24T14:29:51.9969953Z  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-24T14:29:51.9970278Z  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-24T14:29:51.9970281Z 2026-10-24T14:29:51.9970439Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9970606Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T14:29:51.9970661Z 35 │ 2026-10-24T14:29:51.9970798Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T14:29:51.9970886Z ·  ────────┬──────── 2026-10-24T14:29:51.9971037Z · ╰── `inspectorProgress` originates here 2026-10-24T14:29:51.9971132Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T14:29:51.9971266Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T14:29:51.9971318Z 39 │ 2026-10-24T14:29:51.9971399Z 40 │ const onClosed = props.onClosed; 2026-10-24T14:29:51.9971463Z 41 │ useEffect(() => { 2026-10-24T14:29:51.9971552Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T14:29:51.9971635Z ·  ────────┬──────── 2026-10-24T14:29:51.9971840Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T14:29:51.9971956Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T14:29:51.9972006Z ╰──── 2026-10-24T14:29:51.9972315Z  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-24T14:29:51.9972625Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9972628Z 2026-10-24T14:29:51.9972786Z ⚠ react(immutability): This value cannot be modified 2026-10-24T14:29:51.9972946Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T14:29:51.9973039Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T14:29:51.9973176Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T14:29:51.9973268Z ·  ──────────┬───────── 2026-10-24T14:29:51.9973424Z · ╰── `renderedContentWidth` originates here 2026-10-24T14:29:51.9973476Z 39 │ 2026-10-24T14:29:51.9973558Z 40 │ const onClosed = props.onClosed; 2026-10-24T14:29:51.9973624Z 41 │ useEffect(() => { 2026-10-24T14:29:51.9973711Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T14:29:51.9973790Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T14:29:51.9973862Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T14:29:51.9973929Z 45 │ (finished) => { 2026-10-24T14:29:51.9974071Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T14:29:51.9974146Z 47 │ runOnJS(onClosed)(); 2026-10-24T14:29:51.9974209Z 48 │ } 2026-10-24T14:29:51.9974269Z 49 │ }, 2026-10-24T14:29:51.9974322Z 50 │ ); 2026-10-24T14:29:51.9974456Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T14:29:51.9974536Z 52 │ renderedInspectorWidth.set( 2026-10-24T14:29:51.9974682Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T14:29:51.9974736Z 54 │ ); 2026-10-24T14:29:51.9974791Z 55 │ }, [ 2026-10-24T14:29:51.9974860Z 56 │ inspectorProgress, 2026-10-24T14:29:51.9974926Z 57 │ inspectorVisible, 2026-10-24T14:29:51.9974989Z 58 │ inspectorWidth, 2026-10-24T14:29:51.9975049Z 59 │ onClosed, 2026-10-24T14:29:51.9975122Z 60 │ renderedInspectorWidth, 2026-10-24T14:29:51.9975181Z 61 │ resizing, 2026-10-24T14:29:51.9975235Z 62 │ ]); 2026-10-24T14:29:51.9975287Z 63 │ 2026-10-24T14:29:51.9975357Z 64 │ useEffect(() => { 2026-10-24T14:29:51.9975452Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T14:29:51.9975538Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T14:29:51.9975637Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T14:29:51.9975725Z ·  ──────────┬───────── 2026-10-24T14:29:51.9975887Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T14:29:51.9975948Z 68 │ return; 2026-10-24T14:29:51.9975999Z ╰──── 2026-10-24T14:29:51.9976264Z  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-24T14:29:51.9976570Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T14:29:51.9976626Z 2026-10-24T14:29:51.9976910Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:29:51.9977068Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T14:29:51.9977129Z 289 │ return ( 2026-10-24T14:29:51.9977265Z 290 │ 2026-10-24T14:29:51.9977388Z ·  ───────────── 2026-10-24T14:29:51.9977458Z 291 │ {props.children} 2026-10-24T14:29:51.9977510Z ╰──── 2026-10-24T14:29:51.9977734Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:29:51.9977883Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:29:51.9977888Z 2026-10-24T14:29:51.9978131Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:29:51.9978288Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T14:29:51.9978347Z 653 │ return ( 2026-10-24T14:29:51.9978468Z 654 │ 2026-10-24T14:29:51.9978584Z ·  ───────────── 2026-10-24T14:29:51.9978652Z 655 │ {props.children} 2026-10-24T14:29:51.9978704Z ╰──── 2026-10-24T14:29:51.9978923Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T14:29:51.9979065Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T14:29:51.9979070Z 2026-10-24T14:29:51.9979310Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T14:29:51.9979470Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T14:29:51.9979530Z 1461 │ return ( 2026-10-24T14:29:51.9979694Z 1462 │ 2026-10-24T14:29:51.9979827Z ·  ──────────────────── 2026-10-24T14:29:51.9979926Z 1463 │ ) { 2026-10-24T14:29:51.9982351Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T14:29:51.9982427Z 161 │ │ } 2026-10-24T14:29:51.9982557Z 162 │ ╰─▶ }, 2026-10-24T14:29:51.9982622Z 163 │ clipboard: { 2026-10-24T14:29:51.9982673Z ╰──── 2026-10-24T14:29:51.9982851Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T14:29:51.9982856Z 2026-10-24T14:29:51.9983045Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9983185Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T14:29:51.9983349Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T14:29:51.9983438Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T14:29:51.9983524Z ·  ┬ 2026-10-24T14:29:51.9983658Z · ╰── '_' is declared here 2026-10-24T14:29:51.9983760Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T14:29:51.9983812Z ╰──── 2026-10-24T14:29:51.9983926Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9983931Z 2026-10-24T14:29:51.9984119Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9984256Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T14:29:51.9984311Z 133 │ ); 2026-10-24T14:29:51.9984420Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T14:29:51.9984520Z ·  ┬ 2026-10-24T14:29:51.9984664Z · ╰── '_' is declared here 2026-10-24T14:29:51.9984732Z 135 │ Effect.succeed( 2026-10-24T14:29:51.9984783Z ╰──── 2026-10-24T14:29:51.9984885Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9984887Z 2026-10-24T14:29:51.9985074Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9985212Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T14:29:51.9985267Z 177 │ }); 2026-10-24T14:29:51.9985367Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T14:29:51.9985454Z ·  ┬ 2026-10-24T14:29:51.9985589Z · ╰── '_' is declared here 2026-10-24T14:29:51.9985691Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T14:29:51.9985742Z ╰──── 2026-10-24T14:29:51.9985841Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9985847Z 2026-10-24T14:29:51.9986029Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9986215Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T14:29:51.9986360Z 202 │ ); 2026-10-24T14:29:51.9986457Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T14:29:51.9986548Z ·  ┬ 2026-10-24T14:29:51.9986686Z · ╰── '_' is declared here 2026-10-24T14:29:51.9986768Z 204 │ options.removeWorktreeFails 2026-10-24T14:29:51.9986818Z ╰──── 2026-10-24T14:29:51.9986918Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9986920Z 2026-10-24T14:29:51.9987102Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9987238Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T14:29:51.9987293Z 207 │ ); 2026-10-24T14:29:51.9987400Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T14:29:51.9987498Z ·  ┬ 2026-10-24T14:29:51.9987640Z · ╰── '_' is declared here 2026-10-24T14:29:51.9987726Z 209 │ options.deleteLocalBranchFails 2026-10-24T14:29:51.9987776Z ╰──── 2026-10-24T14:29:51.9987875Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9987878Z 2026-10-24T14:29:51.9988059Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9988193Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T14:29:51.9988247Z 212 │ ); 2026-10-24T14:29:51.9988361Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T14:29:51.9988465Z ·  ┬ 2026-10-24T14:29:51.9988617Z · ╰── '_' is declared here 2026-10-24T14:29:51.9988705Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T14:29:51.9988756Z ╰──── 2026-10-24T14:29:51.9988857Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9988859Z 2026-10-24T14:29:51.9989039Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9989173Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T14:29:51.9989228Z 253 │ ); 2026-10-24T14:29:51.9989321Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T14:29:51.9989409Z ·  ┬ 2026-10-24T14:29:51.9989542Z · ╰── '_' is declared here 2026-10-24T14:29:51.9989617Z 255 │ Effect.succeed({ 2026-10-24T14:29:51.9989670Z ╰──── 2026-10-24T14:29:51.9989769Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9989771Z 2026-10-24T14:29:51.9989952Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T14:29:51.9990087Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T14:29:51.9990141Z 263 │ ); 2026-10-24T14:29:51.9990295Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T14:29:51.9990384Z ·  ┬ 2026-10-24T14:29:51.9990521Z · ╰── '_' is declared here 2026-10-24T14:29:51.9990671Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T14:29:51.9990792Z ╰──── 2026-10-24T14:29:51.9990925Z  help: Consider removing this parameter. 2026-10-24T14:29:51.9990928Z 2026-10-24T14:29:51.9991399Z ⚠ 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-24T14:29:51.9991534Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T14:29:51.9991671Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T14:29:51.9991854Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T14:29:51.9991961Z ·  ──────────────────────── 2026-10-24T14:29:51.9992027Z 182 │ version: 1, 2026-10-24T14:29:51.9992106Z ╰──── 2026-10-24T14:29:51.9992116Z 2026-10-24T14:29:51.9992578Z ⚠ 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-24T14:29:51.9992705Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T14:29:51.9992772Z 38 │ JSON.stringify( 2026-10-24T14:29:51.9992893Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T14:29:51.9992991Z ·  ──────────────────────── 2026-10-24T14:29:51.9993059Z 40 │ { name: "a" }, 2026-10-24T14:29:51.9993111Z ╰──── 2026-10-24T14:29:51.9993114Z 2026-10-24T14:29:51.9993313Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T14:29:51.9993459Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T14:29:51.9993526Z 1 │ import type { 2026-10-24T14:29:51.9993591Z 2 │ EnvironmentId, 2026-10-24T14:29:51.9993667Z ·  ──────┬────── 2026-10-24T14:29:51.9993808Z · ╰── 'EnvironmentId' is imported here 2026-10-24T14:29:51.9993893Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T14:29:51.9993945Z ╰──── 2026-10-24T14:29:51.9994044Z  help: Consider removing this import. 2026-10-24T14:29:51.9994047Z 2026-10-24T14:29:51.9994238Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T14:29:51.9994393Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T14:29:51.9994574Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T14:29:51.9994656Z 602 │ const gesture = Gesture.Pan() 2026-10-24T14:29:51.9994743Z ·  ─┬─ 2026-10-24T14:29:51.9994883Z · ╰── `Pan` may be a component 2026-10-24T14:29:51.9994959Z 603 │ .enabled(!props.disabled) 2026-10-24T14:29:51.9995010Z ╰──── 2026-10-24T14:29:51.9995291Z  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-24T14:29:51.9995742Z  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-24T14:29:51.9995747Z 2026-10-24T14:29:51.9996273Z ⚠ 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-24T14:29:51.9996441Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T14:29:51.9996498Z 225 │ ) { 2026-10-24T14:29:51.9996710Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:51.9996823Z 227 │ │ const socket = sockets[index]; 2026-10-24T14:29:51.9996913Z 228 │ │ if (socket) { 2026-10-24T14:29:51.9997007Z 229 │ │ return socket; 2026-10-24T14:29:51.9997083Z 230 │ │ } 2026-10-24T14:29:51.9997192Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9997324Z 232 │ ╰─▶ } 2026-10-24T14:29:51.9997501Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T14:29:51.9997558Z ╰──── 2026-10-24T14:29:51.9997561Z 2026-10-24T14:29:51.9998030Z ⚠ 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-24T14:29:51.9998164Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T14:29:51.9998223Z 239 │ ) { 2026-10-24T14:29:51.9998428Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:51.9998651Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T14:29:51.9998747Z 242 │ │ if (request) { 2026-10-24T14:29:51.9998843Z 243 │ │ return request; 2026-10-24T14:29:51.9998918Z 244 │ │ } 2026-10-24T14:29:51.9999021Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:51.9999147Z 246 │ ╰─▶ } 2026-10-24T14:29:51.9999318Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T14:29:51.9999369Z ╰──── 2026-10-24T14:29:51.9999371Z 2026-10-24T14:29:51.9999580Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T14:29:51.9999739Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T14:29:51.9999837Z 296 │ } from "./device.ts"; 2026-10-24T14:29:51.9999930Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T14:29:51.9999999Z ·  ── 2026-10-24T14:29:52.0000057Z 298 │ import { 2026-10-24T14:29:52.0000109Z ╰──── 2026-10-24T14:29:52.0000192Z  help: Remove empty braces 2026-10-24T14:29:52.0000196Z 2026-10-24T14:29:52.0000402Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T14:29:52.0000529Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T14:29:52.0000597Z 37 │ get isConnected() { 2026-10-24T14:29:52.0000692Z 38 │ let current: FakeElement | null = this; 2026-10-24T14:29:52.0000768Z ·  ─────── 2026-10-24T14:29:52.0000847Z 39 │ while (current?.parent) { 2026-10-24T14:29:52.0000902Z ╰──── 2026-10-24T14:29:52.0001184Z  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-24T14:29:52.0001186Z 2026-10-24T14:29:52.0001657Z ⚠ 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-24T14:29:52.0001792Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T14:29:52.0001853Z 130 │ ) { 2026-10-24T14:29:52.0002064Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:52.0002224Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T14:29:52.0002318Z 133 │ │ return; 2026-10-24T14:29:52.0002400Z 134 │ │ } 2026-10-24T14:29:52.0002509Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0002645Z 136 │ ╰─▶ } 2026-10-24T14:29:52.0002813Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T14:29:52.0002864Z ╰──── 2026-10-24T14:29:52.0002866Z 2026-10-24T14:29:52.0003332Z ⚠ 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-24T14:29:52.0003473Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T14:29:52.0003642Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T14:29:52.0003897Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T14:29:52.0004004Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0004138Z 254 │ ╰─▶ } 2026-10-24T14:29:52.0004266Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T14:29:52.0004318Z ╰──── 2026-10-24T14:29:52.0004321Z 2026-10-24T14:29:52.0004835Z ⚠ 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-24T14:29:52.0005003Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T14:29:52.0005058Z 257 │ 2026-10-24T14:29:52.0005310Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T14:29:52.0005415Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0005548Z 260 │ ╰─▶ } 2026-10-24T14:29:52.0005653Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T14:29:52.0005704Z ╰──── 2026-10-24T14:29:52.0005707Z 2026-10-24T14:29:52.0006175Z ⚠ 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-24T14:29:52.0006309Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T14:29:52.0006369Z 321 │ ); 2026-10-24T14:29:52.0006626Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T14:29:52.0006731Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0006861Z 324 │ ╰─▶ } 2026-10-24T14:29:52.0006915Z 325 │ 2026-10-24T14:29:52.0006966Z ╰──── 2026-10-24T14:29:52.0006968Z 2026-10-24T14:29:52.0007439Z ⚠ 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-24T14:29:52.0007574Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T14:29:52.0007737Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T14:29:52.0007986Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T14:29:52.0008090Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0008221Z 332 │ ╰─▶ } 2026-10-24T14:29:52.0008326Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T14:29:52.0008384Z ╰──── 2026-10-24T14:29:52.0008387Z 2026-10-24T14:29:52.0008769Z ⚠ 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-24T14:29:52.0008886Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T14:29:52.0009048Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T14:29:52.0009218Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T14:29:52.0009322Z ·  ──────────────────────── 2026-10-24T14:29:52.0009389Z 18 │ "review:write", 2026-10-24T14:29:52.0009440Z ╰──── 2026-10-24T14:29:52.0009442Z 2026-10-24T14:29:52.0009863Z ⚠ 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-24T14:29:52.0010009Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T14:29:52.0010065Z 19 │ ]); 2026-10-24T14:29:52.0010232Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T14:29:52.0010338Z ·  ──────────────────────── 2026-10-24T14:29:52.0010473Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T14:29:52.0010524Z ╰──── 2026-10-24T14:29:52.0010527Z 2026-10-24T14:29:52.0010891Z ⚠ 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-24T14:29:52.0011003Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T14:29:52.0011181Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T14:29:52.0011310Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T14:29:52.0011417Z ·  ──────────────────────── 2026-10-24T14:29:52.0011487Z 59 │ authenticated: true, 2026-10-24T14:29:52.0011538Z ╰──── 2026-10-24T14:29:52.0011541Z 2026-10-24T14:29:52.0011711Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:52.0011845Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T14:29:52.0011964Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T14:29:52.0012061Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T14:29:52.0012182Z ·  ─────┬──── 2026-10-24T14:29:52.0012336Z · ╰── Cannot call impure function 2026-10-24T14:29:52.0012448Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T14:29:52.0012502Z ╰──── 2026-10-24T14:29:52.0012787Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:29:52.0013092Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:52.0013094Z 2026-10-24T14:29:52.0013285Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T14:29:52.0013411Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T14:29:52.0013522Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T14:29:52.0013594Z 187 │ let next = initial; 2026-10-24T14:29:52.0013669Z ·  ──┬─ 2026-10-24T14:29:52.0013789Z · ╰── From this accumulator 2026-10-24T14:29:52.0013876Z 188 │ let receivedSnapshot = false; 2026-10-24T14:29:52.0013955Z 189 │ for (const item of items) { 2026-10-24T14:29:52.0014025Z ·  ─┬─ 2026-10-24T14:29:52.0014130Z · ╰── For this loop 2026-10-24T14:29:52.0014222Z 190 │ if (item.kind === "synchronized") { 2026-10-24T14:29:52.0014291Z 191 │ waiting = false; 2026-10-24T14:29:52.0014384Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T14:29:52.0014505Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T14:29:52.0014593Z ·  ───┬─── 2026-10-24T14:29:52.0014775Z · ╰── From this spread 2026-10-24T14:29:52.0014866Z 194 │ } 2026-10-24T14:29:52.0014917Z ╰──── 2026-10-24T14:29:52.0015076Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T14:29:52.0015235Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T14:29:52.0015238Z 2026-10-24T14:29:52.0015455Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T14:29:52.0015559Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T14:29:52.0015624Z 1078 │ } 2026-10-24T14:29:52.0015896Z ·  ───────────────────────────────────────────── 2026-10-24T14:29:52.0015987Z 1080 │ screenOptions={({ route }) => 2026-10-24T14:29:52.0016042Z ╰──── 2026-10-24T14:29:52.0016410Z  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-24T14:29:52.0016413Z 2026-10-24T14:29:52.0016697Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T14:29:52.0016827Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T14:29:52.0016885Z 284 │ }, 2026-10-24T14:29:52.0016968Z 285 │ (effect, flow, stopSessions) => 2026-10-24T14:29:52.0017061Z ·  ──────┬───── 2026-10-24T14:29:52.0017282Z · ╰── 'stopSessions' is declared here 2026-10-24T14:29:52.0017353Z 286 │ effect.pipe( 2026-10-24T14:29:52.0017407Z ╰──── 2026-10-24T14:29:52.0017512Z  help: Consider removing this parameter. 2026-10-24T14:29:52.0017515Z 2026-10-24T14:29:52.0017985Z ⚠ 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-24T14:29:52.0018120Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T14:29:52.0018177Z 93 │ ) { 2026-10-24T14:29:52.0018381Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:52.0018564Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T14:29:52.0018687Z 96 │ │ if (predicate(project)) return project; 2026-10-24T14:29:52.0018790Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0018916Z 98 │ ╰─▶ } 2026-10-24T14:29:52.0019069Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T14:29:52.0019120Z ╰──── 2026-10-24T14:29:52.0019123Z 2026-10-24T14:29:52.0019293Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:52.0019431Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T14:29:52.0019566Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T14:29:52.0019765Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T14:29:52.0019923Z ·  ─────┬──── 2026-10-24T14:29:52.0020097Z · ╰── Cannot call impure function 2026-10-24T14:29:52.0020196Z 141 │ onSelect={(selected) => { 2026-10-24T14:29:52.0020247Z ╰──── 2026-10-24T14:29:52.0020531Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:29:52.0020839Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:52.0020842Z 2026-10-24T14:29:52.0021111Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T14:29:52.0021259Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T14:29:52.0021417Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T14:29:52.0021498Z 12 │ this.onmessage = listener; 2026-10-24T14:29:52.0021579Z ·  ───────── 2026-10-24T14:29:52.0021635Z 13 │ } 2026-10-24T14:29:52.0021685Z ╰──── 2026-10-24T14:29:52.0022010Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T14:29:52.0022013Z 2026-10-24T14:29:52.0022258Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T14:29:52.0022410Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T14:29:52.0022482Z 15 │ constructor() { 2026-10-24T14:29:52.0022547Z 16 │ source = this; 2026-10-24T14:29:52.0022621Z ·  ────── 2026-10-24T14:29:52.0022678Z 17 │ } 2026-10-24T14:29:52.0022728Z ╰──── 2026-10-24T14:29:52.0023008Z  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-24T14:29:52.0023010Z 2026-10-24T14:29:52.0023482Z ⚠ 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-24T14:29:52.0023691Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T14:29:52.0023780Z 27 │ ) { 2026-10-24T14:29:52.0023983Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T14:29:52.0024130Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T14:29:52.0024258Z 30 │ │ if (predicate(available)) return available; 2026-10-24T14:29:52.0024358Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0024482Z 32 │ ╰─▶ } 2026-10-24T14:29:52.0024665Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T14:29:52.0024715Z ╰──── 2026-10-24T14:29:52.0024718Z 2026-10-24T14:29:52.0024895Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:52.0025046Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T14:29:52.0025100Z 465 │ 2026-10-24T14:29:52.0025207Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T14:29:52.0025280Z ·  ── 2026-10-24T14:29:52.0025333Z 467 │ } 2026-10-24T14:29:52.0025386Z ╰──── 2026-10-24T14:29:52.0025620Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:52.0025623Z 2026-10-24T14:29:52.0025883Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:52.0026014Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T14:29:52.0026066Z 3404 │ 2026-10-24T14:29:52.0026362Z 3405 │ const layer: Layer.Layer = 2026-10-24T14:29:52.0026439Z ·  ──┬── 2026-10-24T14:29:52.0026568Z · ╰── 'layer' is declared here 2026-10-24T14:29:52.0026632Z 3406 │ Layer.effect( 2026-10-24T14:29:52.0026685Z ╰──── 2026-10-24T14:29:52.0026792Z  help: Consider removing this declaration. 2026-10-24T14:29:52.0026795Z 2026-10-24T14:29:52.0026997Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T14:29:52.0027133Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T14:29:52.0027228Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T14:29:52.0027321Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T14:29:52.0027407Z ·  ────┬─── 2026-10-24T14:29:52.0027543Z · ╰── 'Duration' is imported here 2026-10-24T14:29:52.0027632Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T14:29:52.0027683Z ╰──── 2026-10-24T14:29:52.0027784Z  help: Consider removing this import. 2026-10-24T14:29:52.0027786Z 2026-10-24T14:29:52.0028254Z ⚠ 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-24T14:29:52.0028386Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T14:29:52.0028484Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T14:29:52.0028784Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T14:29:52.0028947Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T14:29:52.0029099Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T14:29:52.0029238Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T14:29:52.0029340Z 2619 │ │ flush: () => { 2026-10-24T14:29:52.0029465Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T14:29:52.0029617Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T14:29:52.0029701Z 2622 │ │ }, 2026-10-24T14:29:52.0029784Z 2623 │ │ }; 2026-10-24T14:29:52.0029861Z 2624 │ │ 2026-10-24T14:29:52.0030027Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T14:29:52.0030134Z 2626 │ │ let requestChecks = 0; 2026-10-24T14:29:52.0030266Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T14:29:52.0030378Z 2628 │ │ executionMode: "async", 2026-10-24T14:29:52.0030499Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T14:29:52.0030614Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T14:29:52.0030750Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T14:29:52.0030858Z 2632 │ │ requestChecks += 1; 2026-10-24T14:29:52.0031008Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T14:29:52.0031128Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T14:29:52.0031229Z 2635 │ │ return true; 2026-10-24T14:29:52.0031314Z 2636 │ │ }, 2026-10-24T14:29:52.0031394Z 2637 │ │ }; 2026-10-24T14:29:52.0031466Z 2638 │ │ 2026-10-24T14:29:52.0031590Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T14:29:52.0031685Z 2640 │ │ ...WINDOW, 2026-10-24T14:29:52.0031814Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T14:29:52.0032006Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T14:29:52.0032105Z 2643 │ │ }; 2026-10-24T14:29:52.0032249Z 2644 │ │ const first = yield* service 2026-10-24T14:29:52.0032355Z 2645 │ │ .readSummary(input) 2026-10-24T14:29:52.0032444Z 2646 │ │ .pipe( 2026-10-24T14:29:52.0032544Z 2647 │ │ Effect.exit, 2026-10-24T14:29:52.0032705Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T14:29:52.0032810Z 2649 │ │ Effect.forkChild, 2026-10-24T14:29:52.0032895Z 2650 │ │ ); 2026-10-24T14:29:52.0033000Z 2651 │ │ requestFiber = first; 2026-10-24T14:29:52.0033109Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0033263Z 2653 │ │ dispatcher.flush(); 2026-10-24T14:29:52.0033366Z 2654 │ │ 2026-10-24T14:29:52.0033520Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T14:29:52.0033620Z 2656 │ │ Effect.match({ 2026-10-24T14:29:52.0033745Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T14:29:52.0033872Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T14:29:52.0033957Z 2659 │ │ }), 2026-10-24T14:29:52.0034114Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T14:29:52.0034216Z 2661 │ │ Effect.forkChild, 2026-10-24T14:29:52.0034297Z 2662 │ │ ); 2026-10-24T14:29:52.0034410Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0034517Z 2664 │ │ dispatcher.flush(); 2026-10-24T14:29:52.0034645Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T14:29:52.0034765Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T14:29:52.0034883Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T14:29:52.0034995Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T14:29:52.0035084Z 2669 │ │ break; 2026-10-24T14:29:52.0035166Z 2670 │ │ } 2026-10-24T14:29:52.0035286Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T14:29:52.0035446Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T14:29:52.0035531Z 2673 │ │ } 2026-10-24T14:29:52.0035689Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T14:29:52.0035826Z 2675 │ ╰─▶ } 2026-10-24T14:29:52.0035881Z 2676 │ 2026-10-24T14:29:52.0035932Z ╰──── 2026-10-24T14:29:52.0035934Z 2026-10-24T14:29:52.0036205Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:52.0036326Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T14:29:52.0036379Z 168 │ 2026-10-24T14:29:52.0036458Z 169 │ const layerTest = Layer.succeed( 2026-10-24T14:29:52.0036534Z ·  ────┬──── 2026-10-24T14:29:52.0036675Z · ╰── 'layerTest' is declared here 2026-10-24T14:29:52.0036744Z 170 │ UsageService, 2026-10-24T14:29:52.0036798Z ╰──── 2026-10-24T14:29:52.0036905Z  help: Consider removing this declaration. 2026-10-24T14:29:52.0036908Z 2026-10-24T14:29:52.0037182Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:52.0037329Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T14:29:52.0037382Z 60 │ ) { 2026-10-24T14:29:52.0037551Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T14:29:52.0037634Z ·  ──────┬────── 2026-10-24T14:29:52.0037776Z · ╰── 'useDragRegion' is declared here 2026-10-24T14:29:52.0037995Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T14:29:52.0038090Z ╰──── 2026-10-24T14:29:52.0038196Z  help: Consider removing this declaration. 2026-10-24T14:29:52.0038199Z 2026-10-24T14:29:52.0038466Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T14:29:52.0038599Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T14:29:52.0038652Z 339 │ 2026-10-24T14:29:52.0038757Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T14:29:52.0038832Z ·  ────┬──── 2026-10-24T14:29:52.0038968Z · ╰── 'layerTest' is declared here 2026-10-24T14:29:52.0039018Z ╰──── 2026-10-24T14:29:52.0039122Z  help: Consider removing this declaration. 2026-10-24T14:29:52.0039129Z 2026-10-24T14:29:52.0039301Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:52.0039453Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T14:29:52.0039633Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T14:29:52.0039766Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T14:29:52.0039892Z ·  ─────┬──── 2026-10-24T14:29:52.0040064Z · ╰── Cannot call impure function 2026-10-24T14:29:52.0040119Z 153 │ } 2026-10-24T14:29:52.0040170Z ╰──── 2026-10-24T14:29:52.0040466Z  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-24T14:29:52.0040768Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:52.0040771Z 2026-10-24T14:29:52.0040940Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:52.0041088Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T14:29:52.0041220Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T14:29:52.0041379Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T14:29:52.0041495Z ·  ─────┬──── 2026-10-24T14:29:52.0041660Z · ╰── Cannot call impure function 2026-10-24T14:29:52.0041725Z 373 │ return ( 2026-10-24T14:29:52.0041777Z ╰──── 2026-10-24T14:29:52.0042059Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:29:52.0042388Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:52.0042390Z 2026-10-24T14:29:52.0042558Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:52.0042707Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T14:29:52.0042803Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T14:29:52.0042980Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T14:29:52.0043127Z ·  ─────┬──── 2026-10-24T14:29:52.0043285Z · ╰── Cannot call impure function 2026-10-24T14:29:52.0043341Z 854 │ } 2026-10-24T14:29:52.0043392Z ╰──── 2026-10-24T14:29:52.0043671Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T14:29:52.0043969Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:52.0043971Z 2026-10-24T14:29:52.0044184Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T14:29:52.0044319Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T14:29:52.0044373Z 78 │ 2026-10-24T14:29:52.0044512Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T14:29:52.0044600Z ·  ────────┬─────── 2026-10-24T14:29:52.0044752Z · ╰── 'describeSchedule' is declared here 2026-10-24T14:29:52.0044861Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T14:29:52.0044914Z ╰──── 2026-10-24T14:29:52.0045019Z  help: Consider removing this declaration. 2026-10-24T14:29:52.0045022Z 2026-10-24T14:29:52.0045499Z ⚠ 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-24T14:29:52.0045687Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T14:29:52.0045760Z 520 │ })).delivery; 2026-10-24T14:29:52.0045961Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T14:29:52.0046080Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T14:29:52.0046228Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T14:29:52.0046329Z 524 │ │ id: task.id, 2026-10-24T14:29:52.0046444Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T14:29:52.0046544Z 526 │ │ })).delivery; 2026-10-24T14:29:52.0046690Z 527 │ ╰─▶ } 2026-10-24T14:29:52.0046808Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T14:29:52.0046860Z ╰──── 2026-10-24T14:29:52.0046863Z 2026-10-24T14:29:52.0047073Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T14:29:52.0047179Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T14:29:52.0047321Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T14:29:52.0047438Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T14:29:52.0047526Z ·  ──────┬────── 2026-10-24T14:29:52.0047672Z · ╰── 'HookForwarder' is imported here 2026-10-24T14:29:52.0047776Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T14:29:52.0047877Z ╰──── 2026-10-24T14:29:52.0048006Z  help: Consider removing this import. 2026-10-24T14:29:52.0048008Z 2026-10-24T14:29:52.0048241Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T14:29:52.0048366Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T14:29:52.0048425Z 730 │ ); 2026-10-24T14:29:52.0048603Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T14:29:52.0048702Z ·  ────── 2026-10-24T14:29:52.0048814Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T14:29:52.0048867Z ╰──── 2026-10-24T14:29:52.0049045Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T14:29:52.0049054Z 2026-10-24T14:29:52.0049257Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T14:29:52.0049430Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T14:29:52.0049495Z 817 │
    file.path === path)!; 2026-10-24T14:29:52.0052940Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T14:29:52.0053063Z ·  ─────────────────── 2026-10-24T14:29:52.0053127Z 1787 │ cwd, 2026-10-24T14:29:52.0053180Z ╰──── 2026-10-24T14:29:52.0053183Z 2026-10-24T14:29:52.0053428Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T14:29:52.0053556Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T14:29:52.0053659Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T14:29:52.0053797Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T14:29:52.0053886Z ·  ─────────────── 2026-10-24T14:29:52.0053943Z 518 │ ) 2026-10-24T14:29:52.0053995Z ╰──── 2026-10-24T14:29:52.0054160Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T14:29:52.0054165Z 2026-10-24T14:29:52.0054351Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T14:29:52.0054490Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T14:29:52.0054577Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T14:29:52.0054670Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T14:29:52.0054752Z ·  ──┬── 2026-10-24T14:29:52.0054887Z · ╰── 'Scope' is imported here 2026-10-24T14:29:52.0054975Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T14:29:52.0055025Z ╰──── 2026-10-24T14:29:52.0055125Z  help: Consider removing this import. 2026-10-24T14:29:52.0055134Z 2026-10-24T14:29:52.0055306Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:52.0055447Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T14:29:52.0055500Z 185 │ 2026-10-24T14:29:52.0055603Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T14:29:52.0055674Z ·  ── 2026-10-24T14:29:52.0055727Z 187 │ } 2026-10-24T14:29:52.0055778Z ╰──── 2026-10-24T14:29:52.0056013Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:52.0056016Z 2026-10-24T14:29:52.0056184Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:52.0056376Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T14:29:52.0056457Z 188 │ 2026-10-24T14:29:52.0056524Z 189 │ for (const {} of [ 2026-10-24T14:29:52.0056595Z ·  ── 2026-10-24T14:29:52.0056688Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T14:29:52.0056738Z ╰──── 2026-10-24T14:29:52.0056967Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:52.0056969Z 2026-10-24T14:29:52.0057136Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:52.0057275Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T14:29:52.0057327Z 310 │ 2026-10-24T14:29:52.0057457Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T14:29:52.0057529Z ·  ── 2026-10-24T14:29:52.0057587Z 312 │ } 2026-10-24T14:29:52.0057640Z ╰──── 2026-10-24T14:29:52.0057870Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:52.0057872Z 2026-10-24T14:29:52.0058038Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T14:29:52.0058175Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T14:29:52.0058227Z 313 │ 2026-10-24T14:29:52.0058292Z 314 │ for (const {} of [ 2026-10-24T14:29:52.0058360Z ·  ── 2026-10-24T14:29:52.0058415Z 315 │ { 2026-10-24T14:29:52.0058464Z ╰──── 2026-10-24T14:29:52.0058691Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T14:29:52.0058693Z 2026-10-24T14:29:52.0058984Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T14:29:52.0059144Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T14:29:52.0059201Z 162 │ keys, 2026-10-24T14:29:52.0059276Z 163 │ overridingProjects = [], 2026-10-24T14:29:52.0059360Z ·  ── 2026-10-24T14:29:52.0059427Z 164 │ onClearOverrides, 2026-10-24T14:29:52.0059477Z ╰──── 2026-10-24T14:29:52.0059802Z  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-24T14:29:52.0059805Z 2026-10-24T14:29:52.0060046Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T14:29:52.0060187Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T14:29:52.0060311Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T14:29:52.0060556Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T14:29:52.0060679Z 986 │ │ (approval) => approval.requestId, 2026-10-24T14:29:52.0060815Z 987 │ ╰─▶ ); 2026-10-24T14:29:52.0060956Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T14:29:52.0061007Z ╰──── 2026-10-24T14:29:52.0061085Z  help: Switch to `Set` 2026-10-24T14:29:52.0061087Z 2026-10-24T14:29:52.0061376Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T14:29:52.0061582Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T14:29:52.0061635Z 1397 │ 2026-10-24T14:29:52.0061726Z 1398 │ function assertUserMessagesExclude( 2026-10-24T14:29:52.0061834Z ·  ────────────┬──────────── 2026-10-24T14:29:52.0062007Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T14:29:52.0062144Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T14:29:52.0062198Z ╰──── 2026-10-24T14:29:52.0062304Z  help: Consider removing this declaration. 2026-10-24T14:29:52.0062306Z 2026-10-24T14:29:52.0062476Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T14:29:52.0062601Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T14:29:52.0062706Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T14:29:52.0062776Z 1136 │ Date.now(), 2026-10-24T14:29:52.0062858Z ·  ─────┬──── 2026-10-24T14:29:52.0062994Z · ╰── Cannot call impure function 2026-10-24T14:29:52.0063137Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T14:29:52.0063189Z ╰──── 2026-10-24T14:29:52.0063478Z  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-24T14:29:52.0063780Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T14:29:52.0063789Z 2026-10-24T14:29:52.0063876Z Found 0 errors and 367 warnings in 5477 files (6.1s, 8 threads) 2026-10-24T14:29:52.0508789Z Post job cleanup. 2026-10-24T14:29:52.1118005Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T14:29:52.1191235Z Post job cleanup. 2026-10-24T14:29:52.1203041Z ##[start-action display=Cache full pnpm store;id=__331fab51-36e9-4e9b-9d1c-da5c89ea4d52.__actions_cache] 2026-10-24T14:29:52.1570541Z Post job cleanup. 2026-10-24T14:29:52.2196693Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T14:29:52.2225620Z ##[end-action id=__331fab51-36e9-4e9b-9d1c-da5c89ea4d52.__actions_cache;outcome=success;conclusion=success;duration_ms=102] 2026-10-24T14:29:52.2227353Z ##[start-action display=Cache Vite+;id=__331fab51-36e9-4e9b-9d1c-da5c89ea4d52.vp_cache] 2026-10-24T14:29:52.2247218Z Post job cleanup. 2026-10-24T14:29:52.2834819Z 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-24T14:29:52.2861847Z ##[end-action id=__331fab51-36e9-4e9b-9d1c-da5c89ea4d52.vp_cache;outcome=success;conclusion=success;duration_ms=63] 2026-10-24T14:29:52.2896950Z Post job cleanup. 2026-10-24T14:29:52.3284057Z [command]/usr/local/bin/git version 2026-10-24T14:29:52.3332803Z git version 2.55.0 2026-10-24T14:29:52.3349734Z Temporarily overriding HOME='/home/runner/_work/_temp/aa483762-5855-4bc6-acde-5c9ddf18e3e5' before making global git config changes 2026-10-24T14:29:52.3350084Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T14:29:52.3352482Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T14:29:52.3378168Z Removing SSH command configuration 2026-10-24T14:29:52.3381054Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T14:29:52.3401802Z [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-24T14:29:52.3514840Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T14:29:52.3534898Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T14:29:52.3571648Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T14:29:52.3598282Z ##[group]Run '/job_completed.sh' 2026-10-24T14:29:52.3611509Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T14:29:52.3611687Z env: 2026-10-24T14:29:52.3611801Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182 2026-10-24T14:29:52.3611950Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 362 2026-10-24T14:29:52.3612106Z BLACKSMITH_CHECK_RUN_ID: 120897908140 2026-10-24T14:29:52.3612321Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T14:29:52.3612497Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T14:29:52.3612633Z ##[endgroup] 2026-10-24T14:29:52.3690755Z Docker container cache not activated, skipping hash computation. 2026-10-24T14:29:52.3951023Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T14:29:52.3993480Z Cleaning up orphan processes