2026-10-25T02:16:00.5796568Z Current runner version: '2.338.1' 2026-10-25T02:16:00.5799893Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-dehsf2ioadbitex5' 2026-10-25T02:16:00.5800528Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-25T02:16:00.5801275Z Machine name: 'ip-172-31-73-130' 2026-10-25T02:16:00.5802776Z ##[group]GITHUB_TOKEN Permissions 2026-10-25T02:16:00.5804030Z Contents: read 2026-10-25T02:16:00.5804424Z Metadata: read 2026-10-25T02:16:00.5804852Z ##[endgroup] 2026-10-25T02:16:00.5806083Z Secret source: Actions 2026-10-25T02:16:00.5806693Z Cache mode: write 2026-10-25T02:16:00.5807210Z Prepare workflow directory 2026-10-25T02:16:00.5979712Z Prepare all required actions 2026-10-25T02:16:00.6004585Z Getting action download info 2026-10-25T02:16:00.7027829Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-25T02:16:00.7316801Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-25T02:16:00.8385622Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-25T02:16:00.8421604Z Complete job name: Lint 2026-10-25T02:16:00.8769716Z A job started hook has been configured by the self-hosted runner administrator 2026-10-25T02:16:00.8842180Z ##[group]Run '/setup.sh' 2026-10-25T02:16:00.8854835Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:16:00.8855240Z env: 2026-10-25T02:16:00.8855448Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:00.8855723Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:00.8855993Z BLACKSMITH_CHECK_RUN_ID: 121050673687 2026-10-25T02:16:00.8856259Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T02:16:00.8856520Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T02:16:00.8856767Z ##[endgroup] 2026-10-25T02:16:00.9070441Z Logging daemon started (blacksmithd for logs) 2026-10-25T02:16:00.9149299Z Results daemon started (blacksmithd for results) 2026-10-25T02:16:00.9256734Z Background adoption and SSH setup started (PID: 3169) 2026-10-25T02:16:00.9259098Z 2026-10-25T02:16:00.9259594Z ---------------------------------------- 2026-10-25T02:16:00.9260451Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40153794193/jobs/121050673687 2026-10-25T02:16:00.9261113Z SSH Access (using your GitHub SSH key): 2026-10-25T02:16:00.9261848Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-dehsf2ioadbitex5.vm.blacksmith.sh 2026-10-25T02:16:00.9262154Z 2026-10-25T02:16:00.9262260Z No GitHub SSH key? Add one at: 2026-10-25T02:16:00.9262749Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-25T02:16:00.9263143Z 2026-10-25T02:16:00.9263245Z ---------------------------------------- 2026-10-25T02:16:00.9263417Z 2026-10-25T02:16:00.9263553Z VM ID: blacksmith-8vcpu-ubuntu-2404-dehsf2ioadbitex5 2026-10-25T02:16:00.9263864Z Host: production-152.236.31.143-x8664 2026-10-25T02:16:00.9264123Z Host Agent PID: 4044613 2026-10-25T02:16:00.9264364Z Host Agent Git SHA: 1637818df 2026-10-25T02:16:00.9264612Z Host CPU Manufacturer: AuthenticAMD 2026-10-25T02:16:00.9264880Z Blacksmith Host Generation: gen 2 2026-10-25T02:16:00.9265153Z Petname: production-suitable-aphid-9e5d0346 2026-10-25T02:16:00.9265427Z Region: us-east 2026-10-25T02:16:00.9265646Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-25T02:16:00.9270312Z OS Version: Ubuntu 24.04.4 LTS 2026-10-25T02:16:00.9270911Z 2026-10-25T02:16:00.9271090Z Enabling Blacksmith transparent cache 2026-10-25T02:16:00.9481798Z ##[group]Run actions/checkout@v6 2026-10-25T02:16:00.9482089Z with: 2026-10-25T02:16:00.9482400Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-25T02:16:00.9482779Z sparse-checkout-cone-mode: false 2026-10-25T02:16:00.9483040Z repository: pingdotgg/t3code 2026-10-25T02:16:00.9484877Z token: *** 2026-10-25T02:16:00.9485076Z ssh-strict: true 2026-10-25T02:16:00.9485286Z ssh-user: git 2026-10-25T02:16:00.9485496Z persist-credentials: true 2026-10-25T02:16:00.9485877Z clean: true 2026-10-25T02:16:00.9486080Z fetch-depth: 1 2026-10-25T02:16:00.9486282Z fetch-tags: false 2026-10-25T02:16:00.9486492Z show-progress: true 2026-10-25T02:16:00.9486703Z lfs: false 2026-10-25T02:16:00.9486898Z submodules: false 2026-10-25T02:16:00.9487110Z set-safe-directory: true 2026-10-25T02:16:00.9487351Z allow-unsafe-pr-checkout: false 2026-10-25T02:16:00.9487602Z env: 2026-10-25T02:16:00.9487827Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:00.9488099Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:00.9488369Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:00.9488617Z ##[endgroup] 2026-10-25T02:16:01.0392919Z Syncing repository: pingdotgg/t3code 2026-10-25T02:16:01.0394081Z ##[group]Getting Git version info 2026-10-25T02:16:01.0394420Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-25T02:16:01.0394887Z [command]/usr/local/bin/git version 2026-10-25T02:16:01.0404949Z git version 2.55.0 2026-10-25T02:16:01.0416743Z ##[endgroup] 2026-10-25T02:16:01.0423762Z Temporarily overriding HOME='/home/runner/_work/_temp/4e7d9c26-45f4-49d3-9b6c-0328c639f209' before making global git config changes 2026-10-25T02:16:01.0424383Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T02:16:01.0427183Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T02:16:01.0458936Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-25T02:16:01.0460542Z ##[group]Determining repository object format 2026-10-25T02:16:01.0461569Z ##[endgroup] 2026-10-25T02:16:01.0461914Z ##[group]Initializing the repository 2026-10-25T02:16:01.0464172Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-25T02:16:01.0497882Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-25T02:16:01.0498332Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-25T02:16:01.0498779Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-25T02:16:01.0499129Z hint: call: 2026-10-25T02:16:01.0499326Z hint: 2026-10-25T02:16:01.0499574Z hint: git config --global init.defaultBranch 2026-10-25T02:16:01.0499893Z hint: 2026-10-25T02:16:01.0500182Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-25T02:16:01.0500617Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-25T02:16:01.0500986Z hint: 2026-10-25T02:16:01.0501186Z hint: git branch -m 2026-10-25T02:16:01.0501413Z hint: 2026-10-25T02:16:01.0501710Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-25T02:16:01.0502167Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-25T02:16:01.0503104Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-25T02:16:01.0527930Z ##[endgroup] 2026-10-25T02:16:01.0528306Z ##[group]Disabling automatic garbage collection 2026-10-25T02:16:01.0529641Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-25T02:16:01.0550968Z ##[endgroup] 2026-10-25T02:16:01.0551308Z ##[group]Setting up auth 2026-10-25T02:16:01.0551692Z Removing SSH command configuration 2026-10-25T02:16:01.0555058Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T02:16:01.0575149Z [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-25T02:16:01.0705673Z Removing HTTP extra header 2026-10-25T02:16:01.0708279Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-25T02:16:01.0731595Z [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-25T02:16:01.0828834Z Removing includeIf entries pointing to credentials config files 2026-10-25T02:16:01.0832853Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-25T02:16:01.0853854Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-25T02:16:01.0954348Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-8fde7c13-ba9c-457c-bc8f-3b2ca95b4b93.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-25T02:16:01.0977624Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-8fde7c13-ba9c-457c-bc8f-3b2ca95b4b93.config 2026-10-25T02:16:01.0999415Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-8fde7c13-ba9c-457c-bc8f-3b2ca95b4b93.config 2026-10-25T02:16:01.1018520Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-8fde7c13-ba9c-457c-bc8f-3b2ca95b4b93.config 2026-10-25T02:16:01.1036402Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-8fde7c13-ba9c-457c-bc8f-3b2ca95b4b93.config 2026-10-25T02:16:01.1052831Z ##[endgroup] 2026-10-25T02:16:01.1053385Z ##[group]Fetching the repository 2026-10-25T02:16:01.1057655Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +e19fe0837b6eaba1c61a779dac335be281a93ded:refs/remotes/origin/main 2026-10-25T02:16:01.3798058Z From https://github.com/pingdotgg/t3code 2026-10-25T02:16:01.3798948Z * [new ref] e19fe0837b6eaba1c61a779dac335be281a93ded -> origin/main 2026-10-25T02:16:01.3820906Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-25T02:16:01.3839366Z origin/main 2026-10-25T02:16:01.3843760Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-25T02:16:01.3861224Z e19fe0837b6eaba1c61a779dac335be281a93ded 2026-10-25T02:16:01.3863260Z ##[endgroup] 2026-10-25T02:16:01.3863989Z ##[group]Determining the checkout info 2026-10-25T02:16:01.3864852Z ##[endgroup] 2026-10-25T02:16:01.3865628Z ##[group]Setting up sparse checkout 2026-10-25T02:16:01.3866358Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-25T02:16:01.3885011Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-25T02:16:01.3899829Z .git/info/sparse-checkout 2026-10-25T02:16:01.3903220Z ##[endgroup] 2026-10-25T02:16:01.3904139Z ##[group]Checking out the ref 2026-10-25T02:16:01.3905321Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-25T02:16:08.0450864Z Updating files: 0% (1/6499) 2026-10-25T02:16:08.0478733Z Updating files: 1% (65/6499) 2026-10-25T02:16:08.0495225Z Updating files: 2% (130/6499) 2026-10-25T02:16:08.0515649Z Updating files: 3% (195/6499) 2026-10-25T02:16:08.0536130Z Updating files: 4% (260/6499) 2026-10-25T02:16:08.0565761Z Updating files: 5% (325/6499) 2026-10-25T02:16:08.0586233Z Updating files: 6% (390/6499) 2026-10-25T02:16:08.0643542Z Updating files: 7% (455/6499) 2026-10-25T02:16:08.0687060Z Updating files: 8% (520/6499) 2026-10-25T02:16:08.0775533Z Updating files: 9% (585/6499) 2026-10-25T02:16:08.0922759Z Updating files: 10% (650/6499) 2026-10-25T02:16:08.1080932Z Updating files: 11% (715/6499) 2026-10-25T02:16:08.1093104Z Updating files: 12% (780/6499) 2026-10-25T02:16:08.1105084Z Updating files: 13% (845/6499) 2026-10-25T02:16:08.1121671Z Updating files: 14% (910/6499) 2026-10-25T02:16:08.1139120Z Updating files: 15% (975/6499) 2026-10-25T02:16:08.1156142Z Updating files: 16% (1040/6499) 2026-10-25T02:16:08.1172963Z Updating files: 17% (1105/6499) 2026-10-25T02:16:08.1189564Z Updating files: 18% (1170/6499) 2026-10-25T02:16:08.1206410Z Updating files: 19% (1235/6499) 2026-10-25T02:16:08.1221139Z Updating files: 20% (1300/6499) 2026-10-25T02:16:08.1247883Z Updating files: 21% (1365/6499) 2026-10-25T02:16:08.1265193Z Updating files: 22% (1430/6499) 2026-10-25T02:16:08.1280208Z Updating files: 23% (1495/6499) 2026-10-25T02:16:08.1294821Z Updating files: 24% (1560/6499) 2026-10-25T02:16:08.1307383Z Updating files: 25% (1625/6499) 2026-10-25T02:16:08.1322503Z Updating files: 26% (1690/6499) 2026-10-25T02:16:08.1336341Z Updating files: 27% (1755/6499) 2026-10-25T02:16:08.1356892Z Updating files: 28% (1820/6499) 2026-10-25T02:16:08.1382052Z Updating files: 29% (1885/6499) 2026-10-25T02:16:08.1403419Z Updating files: 30% (1950/6499) 2026-10-25T02:16:08.1428614Z Updating files: 31% (2015/6499) 2026-10-25T02:16:08.1450497Z Updating files: 32% (2080/6499) 2026-10-25T02:16:08.1485801Z Updating files: 33% (2145/6499) 2026-10-25T02:16:08.1539801Z Updating files: 34% (2210/6499) 2026-10-25T02:16:08.1586574Z Updating files: 35% (2275/6499) 2026-10-25T02:16:08.1626091Z Updating files: 36% (2340/6499) 2026-10-25T02:16:08.1660957Z Updating files: 37% (2405/6499) 2026-10-25T02:16:08.1700629Z Updating files: 38% (2470/6499) 2026-10-25T02:16:08.1733497Z Updating files: 39% (2535/6499) 2026-10-25T02:16:08.1762274Z Updating files: 40% (2600/6499) 2026-10-25T02:16:08.1789625Z Updating files: 41% (2665/6499) 2026-10-25T02:16:08.1807895Z Updating files: 42% (2730/6499) 2026-10-25T02:16:08.1819453Z Updating files: 43% (2795/6499) 2026-10-25T02:16:08.1832883Z Updating files: 44% (2860/6499) 2026-10-25T02:16:08.1864713Z Updating files: 45% (2925/6499) 2026-10-25T02:16:08.1889074Z Updating files: 46% (2990/6499) 2026-10-25T02:16:08.1911787Z Updating files: 47% (3055/6499) 2026-10-25T02:16:08.1940434Z Updating files: 48% (3120/6499) 2026-10-25T02:16:08.1971557Z Updating files: 49% (3185/6499) 2026-10-25T02:16:08.2009365Z Updating files: 50% (3250/6499) 2026-10-25T02:16:08.2025217Z Updating files: 51% (3315/6499) 2026-10-25T02:16:08.2057148Z Updating files: 52% (3380/6499) 2026-10-25T02:16:08.2082765Z Updating files: 53% (3445/6499) 2026-10-25T02:16:08.2102628Z Updating files: 54% (3510/6499) 2026-10-25T02:16:08.2126218Z Updating files: 55% (3575/6499) 2026-10-25T02:16:08.2144267Z Updating files: 56% (3640/6499) 2026-10-25T02:16:08.2160663Z Updating files: 57% (3705/6499) 2026-10-25T02:16:08.2179760Z Updating files: 58% (3770/6499) 2026-10-25T02:16:08.2522307Z Updating files: 59% (3835/6499) 2026-10-25T02:16:08.2540562Z Updating files: 60% (3900/6499) 2026-10-25T02:16:08.2559041Z Updating files: 61% (3965/6499) 2026-10-25T02:16:08.2579800Z Updating files: 62% (4030/6499) 2026-10-25T02:16:08.2604215Z Updating files: 63% (4095/6499) 2026-10-25T02:16:08.2631214Z Updating files: 64% (4160/6499) 2026-10-25T02:16:08.2650936Z Updating files: 65% (4225/6499) 2026-10-25T02:16:08.2668758Z Updating files: 66% (4290/6499) 2026-10-25T02:16:08.2691444Z Updating files: 67% (4355/6499) 2026-10-25T02:16:08.2704150Z Updating files: 68% (4420/6499) 2026-10-25T02:16:08.2723398Z Updating files: 69% (4485/6499) 2026-10-25T02:16:08.2735030Z Updating files: 70% (4550/6499) 2026-10-25T02:16:08.2752243Z Updating files: 71% (4615/6499) 2026-10-25T02:16:08.2766329Z Updating files: 72% (4680/6499) 2026-10-25T02:16:08.2809173Z Updating files: 73% (4745/6499) 2026-10-25T02:16:08.3192808Z Updating files: 74% (4810/6499) 2026-10-25T02:16:08.3218041Z Updating files: 75% (4875/6499) 2026-10-25T02:16:08.3238165Z Updating files: 76% (4940/6499) 2026-10-25T02:16:08.3261119Z Updating files: 77% (5005/6499) 2026-10-25T02:16:08.3283631Z Updating files: 78% (5070/6499) 2026-10-25T02:16:08.3300378Z Updating files: 79% (5135/6499) 2026-10-25T02:16:08.3321616Z Updating files: 80% (5200/6499) 2026-10-25T02:16:08.3337404Z Updating files: 81% (5265/6499) 2026-10-25T02:16:08.3355448Z Updating files: 82% (5330/6499) 2026-10-25T02:16:08.3377268Z Updating files: 83% (5395/6499) 2026-10-25T02:16:08.3397315Z Updating files: 84% (5460/6499) 2026-10-25T02:16:08.3414549Z Updating files: 85% (5525/6499) 2026-10-25T02:16:08.3440597Z Updating files: 86% (5590/6499) 2026-10-25T02:16:08.3507443Z Updating files: 87% (5655/6499) 2026-10-25T02:16:08.3537125Z Updating files: 88% (5720/6499) 2026-10-25T02:16:08.3557027Z Updating files: 89% (5785/6499) 2026-10-25T02:16:08.3580831Z Updating files: 90% (5850/6499) 2026-10-25T02:16:08.3612848Z Updating files: 91% (5915/6499) 2026-10-25T02:16:08.3627240Z Updating files: 92% (5980/6499) 2026-10-25T02:16:08.3648321Z Updating files: 93% (6045/6499) 2026-10-25T02:16:08.3666550Z Updating files: 94% (6110/6499) 2026-10-25T02:16:08.3690503Z Updating files: 95% (6175/6499) 2026-10-25T02:16:08.3746398Z Updating files: 96% (6240/6499) 2026-10-25T02:16:08.3768439Z Updating files: 97% (6305/6499) 2026-10-25T02:16:08.3813574Z Updating files: 98% (6370/6499) 2026-10-25T02:16:08.3832269Z Updating files: 99% (6435/6499) 2026-10-25T02:16:08.3832575Z Updating files: 100% (6499/6499) 2026-10-25T02:16:08.3832766Z Updating files: 100% (6499/6499), done. 2026-10-25T02:16:08.3981753Z Switched to a new branch 'main' 2026-10-25T02:16:08.3982565Z branch 'main' set up to track 'origin/main'. 2026-10-25T02:16:08.3994710Z ##[endgroup] 2026-10-25T02:16:08.4023953Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-25T02:16:08.4040951Z e19fe0837b6eaba1c61a779dac335be281a93ded 2026-10-25T02:16:08.4109427Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-25T02:16:08.4109658Z files="$(git ls-files .github/pr-assets)" 2026-10-25T02:16:08.4109838Z if test -n "$files"; then 2026-10-25T02:16:08.4110061Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-25T02:16:08.4110267Z  exit 1 2026-10-25T02:16:08.4110373Z fi 2026-10-25T02:16:08.4125371Z shell: /usr/bin/bash -e {0} 2026-10-25T02:16:08.4125502Z env: 2026-10-25T02:16:08.4125615Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:08.4125773Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:08.4125914Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:08.4126046Z ##[endgroup] 2026-10-25T02:16:08.4268479Z Prepare all required actions 2026-10-25T02:16:08.4268816Z Getting action download info 2026-10-25T02:16:08.5045943Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-25T02:16:08.6331435Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-25T02:16:08.6331595Z env: 2026-10-25T02:16:08.6331705Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:08.6331849Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:08.6331990Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:08.6332124Z ##[endgroup] 2026-10-25T02:16:08.7625018Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-25T02:16:08.7638784Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T02:16:08.7639138Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T02:16:08.7639433Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T02:16:08.7639669Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T02:16:08.7654437Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:16:08.7654604Z env: 2026-10-25T02:16:08.7654721Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:08.7654865Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:08.7655002Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:08.7655135Z ##[endgroup] 2026-10-25T02:16:08.7723577Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=9] 2026-10-25T02:16:08.7725161Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-25T02:16:08.7766001Z ##[group]Run actions/cache@v6 2026-10-25T02:16:08.7766133Z with: 2026-10-25T02:16:08.7766369Z path: ~/.vite-plus 2026-10-25T02:16:08.7766530Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:16:08.7766725Z enableCrossOsArchive: false 2026-10-25T02:16:08.7766854Z fail-on-cache-miss: false 2026-10-25T02:16:08.7766980Z lookup-only: false 2026-10-25T02:16:08.7767087Z save-always: false 2026-10-25T02:16:08.7767194Z env: 2026-10-25T02:16:08.7767301Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:08.7767444Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:08.7767582Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:08.7767711Z ##[endgroup] 2026-10-25T02:16:09.2756539Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:16:09.6378562Z Received 170349591 of 170349591 (100.0%), 477.8 MBs/sec 2026-10-25T02:16:09.6380058Z Cache Size: ~162 MB (170349591 B) 2026-10-25T02:16:09.6407943Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/2ff66d2c-f228-4920-b079-9c700ee39c35/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:16:10.2664713Z Cache restored successfully 2026-10-25T02:16:10.2828625Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:16:10.2929393Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1520] 2026-10-25T02:16:10.2932335Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-25T02:16:10.2956114Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T02:16:10.2956434Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T02:16:10.2956659Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-25T02:16:10.2974999Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:16:10.2975268Z env: 2026-10-25T02:16:10.2975445Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:10.2975628Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:10.2975774Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:10.2975905Z ##[endgroup] 2026-10-25T02:16:10.3026079Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-25T02:16:10.3035445Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=10] 2026-10-25T02:16:10.3037006Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-25T02:16:10.3041797Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T02:16:10.3042990Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-25T02:16:10.3052885Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-25T02:16:10.3053071Z store_path="$(vp pm cache dir)" 2026-10-25T02:16:10.3053232Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-25T02:16:10.3072772Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:16:10.3073008Z env: 2026-10-25T02:16:10.3073180Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:10.3073389Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:10.3073649Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:10.3073867Z ##[endgroup] 2026-10-25T02:16:10.3235241Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=19] 2026-10-25T02:16:10.3237224Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-25T02:16:10.3631410Z ##[group]Run actions/cache@v6 2026-10-25T02:16:10.3631568Z with: 2026-10-25T02:16:10.3631706Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-25T02:16:10.3632034Z key: pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d 2026-10-25T02:16:10.3632352Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-25T02:16:10.3632557Z enableCrossOsArchive: false 2026-10-25T02:16:10.3632850Z fail-on-cache-miss: false 2026-10-25T02:16:10.3633031Z lookup-only: false 2026-10-25T02:16:10.3633261Z save-always: false 2026-10-25T02:16:10.3633435Z env: 2026-10-25T02:16:10.3633605Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:10.3634162Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:10.3634399Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:10.3634600Z ##[endgroup] 2026-10-25T02:16:10.5651713Z Cache hit for: pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d 2026-10-25T02:16:11.5865879Z Received 738197504 of 998158458 (74.0%), 704.0 MBs/sec 2026-10-25T02:16:11.9805792Z Received 998158458 of 998158458 (100.0%), 682.9 MBs/sec 2026-10-25T02:16:11.9806249Z Cache Size: ~952 MB (998158458 B) 2026-10-25T02:16:11.9832494Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d96c69ff-2621-495e-8a4d-c0fb6985aaa7/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:16:16.9148831Z Cache restored successfully 2026-10-25T02:16:16.9599920Z Cache restored from key: pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d 2026-10-25T02:16:16.9653368Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6641] 2026-10-25T02:16:16.9656115Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-25T02:16:16.9666831Z ##[group]Run vp install 2026-10-25T02:16:16.9666971Z vp install 2026-10-25T02:16:16.9681863Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:16:16.9682028Z env: 2026-10-25T02:16:16.9682141Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:16.9682286Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:16.9682429Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:16.9682556Z ##[endgroup] 2026-10-25T02:16:17.0085536Z Scope: all 34 workspace projects 2026-10-25T02:16:17.1140515Z ? Verifying lockfile against supply-chain policies (2087 entries)... 2026-10-25T02:16:17.3467018Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-25T02:16:17.3467495Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-25T02:16:17.3467773Z Virtual store is at: node_modules/.pnpm 2026-10-25T02:16:19.3614667Z ✓ Lockfile passes supply-chain policies (2087 entries in 2.2s) 2026-10-25T02:16:19.3614929Z Lockfile is up to date, resolution step is skipped 2026-10-25T02:16:19.3767291Z Packages: +1720 2026-10-25T02:16:19.3767456Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-25T02:16:19.4439453Z Progress: resolved 1720, reused 1716, downloaded 0, added 1720, done 2026-10-25T02:16:20.3078406Z . prepare$ vp config --no-agent 2026-10-25T02:16:20.3923535Z . prepare: Done 2026-10-25T02:16:20.3935079Z 2026-10-25T02:16:20.3935167Z devDependencies: 2026-10-25T02:16:20.3935377Z + @coderabbitai/config 1.1.0 2026-10-25T02:16:20.3935600Z + @shadcn/lint 0.1.5 2026-10-25T02:16:20.3935742Z + @types/node 24.12.4 2026-10-25T02:16:20.3935861Z + knip 6.34.0 2026-10-25T02:16:20.3935993Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-25T02:16:20.3936132Z + vite-plus 1.3.0 2026-10-25T02:16:20.3936192Z 2026-10-25T02:16:20.3948820Z Done in 3.4s using pnpm v12.14.0 2026-10-25T02:16:20.4080671Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3442] 2026-10-25T02:16:20.4494673Z ##[group]Run actions/cache@v6 2026-10-25T02:16:20.4494849Z with: 2026-10-25T02:16:20.4494966Z path: ~/.cache/electron 2026-10-25T02:16:20.4495194Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:16:20.4495425Z enableCrossOsArchive: false 2026-10-25T02:16:20.4495556Z fail-on-cache-miss: false 2026-10-25T02:16:20.4495674Z lookup-only: false 2026-10-25T02:16:20.4495783Z save-always: false 2026-10-25T02:16:20.4495887Z env: 2026-10-25T02:16:20.4495994Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:20.4496134Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:20.4496286Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:20.4496414Z ##[endgroup] 2026-10-25T02:16:20.6440795Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:16:20.8138220Z Received 122906203 of 122906203 (100.0%), 771.1 MBs/sec 2026-10-25T02:16:20.8138643Z Cache Size: ~117 MB (122906203 B) 2026-10-25T02:16:20.8173730Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/ad92b8ea-a633-440b-8d1e-b5df811c8c1f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:16:20.8907002Z Cache restored successfully 2026-10-25T02:16:20.9068804Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:16:20.9175342Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-25T02:16:20.9175624Z vp run --filter @t3tools/desktop ensure:electron 2026-10-25T02:16:20.9192797Z shell: /usr/bin/bash -e {0} 2026-10-25T02:16:20.9192925Z env: 2026-10-25T02:16:20.9193186Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:20.9193331Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:20.9193468Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:20.9193603Z ##[endgroup] 2026-10-25T02:16:21.0772464Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-25T02:16:21.6128078Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-25T02:16:21.6142884Z 2026-10-25T02:16:21.6217031Z ##[group]Run vp run knip:check 2026-10-25T02:16:21.6217256Z vp run knip:check 2026-10-25T02:16:21.6231967Z shell: /usr/bin/bash -e {0} 2026-10-25T02:16:21.6232091Z env: 2026-10-25T02:16:21.6232201Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:21.6232346Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:21.6232482Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:21.6232607Z ##[endgroup] 2026-10-25T02:16:21.7603597Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-25T02:16:25.3842044Z 2026-10-25T02:16:25.3845183Z $ 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-25T02:16:33.3050254Z 2026-10-25T02:16:33.3051184Z --- 2026-10-25T02:16:33.3051449Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-25T02:16:33.3121709Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-25T02:16:33.3122197Z vp run --filter @t3tools/source-control-github generate --check 2026-10-25T02:16:33.3137393Z shell: /usr/bin/bash -e {0} 2026-10-25T02:16:33.3137523Z env: 2026-10-25T02:16:33.3137631Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:33.3137779Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:33.3137917Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:33.3138048Z ##[endgroup] 2026-10-25T02:16:33.4580879Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-25T02:16:33.6391942Z 2026-10-25T02:16:33.6469718Z ##[group]Run vp run --filter t3 generate --check 2026-10-25T02:16:33.6470052Z vp run --filter t3 generate --check 2026-10-25T02:16:33.6484679Z shell: /usr/bin/bash -e {0} 2026-10-25T02:16:33.6484802Z env: 2026-10-25T02:16:33.6484922Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:33.6485065Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:33.6485199Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:33.6485330Z ##[endgroup] 2026-10-25T02:16:33.7936917Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-25T02:16:33.9401917Z 2026-10-25T02:16:33.9465176Z ##[group]Run vp check 2026-10-25T02:16:33.9465325Z vp check 2026-10-25T02:16:33.9479757Z shell: /usr/bin/bash -e {0} 2026-10-25T02:16:33.9479883Z env: 2026-10-25T02:16:33.9479993Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:33.9480139Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:33.9480276Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:16:33.9480410Z ##[endgroup] 2026-10-25T02:16:34.4861935Z pass: All 5815 files are correctly formatted (405ms, 8 threads) 2026-10-25T02:16:39.4176982Z warn: Lint warnings found 2026-10-25T02:16:39.4178733Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-25T02:16:39.4179292Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-25T02:16:39.4179541Z 78 │ 2026-10-25T02:16:39.4179761Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-25T02:16:39.4180013Z ·  ────────┬─────── 2026-10-25T02:16:39.4180267Z · ╰── 'describeSchedule' is declared here 2026-10-25T02:16:39.4180522Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-25T02:16:39.4180691Z ╰──── 2026-10-25T02:16:39.4180858Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4180979Z 2026-10-25T02:16:39.4181252Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4181672Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:388:7] 2026-10-25T02:16:39.4181896Z 383 │ }; 2026-10-25T02:16:39.4182029Z 384 │ useEffect(() => { 2026-10-25T02:16:39.4182185Z ·  ────┬──── 2026-10-25T02:16:39.4182399Z · ╰── This is the containing effect 2026-10-25T02:16:39.4182627Z 385 │ if (!guidesEnabled && section === "guide") { 2026-10-25T02:16:39.4182838Z 386 │ requestedSection.current = "overview"; 2026-10-25T02:16:39.4183123Z 387 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T02:16:39.4183366Z 388 │ setSection("overview"); 2026-10-25T02:16:39.4183532Z ·  ─────┬──── 2026-10-25T02:16:39.4183798Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4184016Z 389 │ } 2026-10-25T02:16:39.4184131Z ╰──── 2026-10-25T02:16:39.4184818Z  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-25T02:16:39.4185684Z  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-25T02:16:39.4185986Z 2026-10-25T02:16:39.4186192Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:16:39.4186562Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:390:6] 2026-10-25T02:16:39.4186831Z 385 │ if (!guidesEnabled && section === "guide") { 2026-10-25T02:16:39.4187039Z 386 │ requestedSection.current = "overview"; 2026-10-25T02:16:39.4187228Z ·  ────────┬─────── 2026-10-25T02:16:39.4187761Z · ╰── 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-25T02:16:39.4188307Z 387 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T02:16:39.4188627Z ·  ─────────┬───────── ──────┬────── 2026-10-25T02:16:39.4189340Z · │ ╰── 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-25T02:16:39.4190217Z · ╰── 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-25T02:16:39.4190830Z 388 │ setSection("overview"); 2026-10-25T02:16:39.4191073Z 389 │ } 2026-10-25T02:16:39.4191323Z 390 │ }, [guidesEnabled, section, insets.top]); 2026-10-25T02:16:39.4191680Z ·  ──────────────────┬───────────────── 2026-10-25T02:16:39.4192185Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4192629Z 391 │ const tabContent = activityContent; 2026-10-25T02:16:39.4192879Z ╰──── 2026-10-25T02:16:39.4193237Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:16:39.4194027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4194396Z 2026-10-25T02:16:39.4194845Z ⚠ 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-25T02:16:39.4195373Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-25T02:16:39.4195580Z 38 │ JSON.stringify( 2026-10-25T02:16:39.4195790Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-25T02:16:39.4196021Z ·  ──────────────────────── 2026-10-25T02:16:39.4196188Z 40 │ { name: "a" }, 2026-10-25T02:16:39.4196324Z ╰──── 2026-10-25T02:16:39.4196377Z 2026-10-25T02:16:39.4196520Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4196821Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-25T02:16:39.4197237Z 151 │ 2026-10-25T02:16:39.4197646Z 152 │ {props.children(open)} 2026-10-25T02:16:39.4197939Z ·  ──┬─ 2026-10-25T02:16:39.4198265Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4198487Z 153 │ 2026-10-25T02:16:39.4198614Z ╰──── 2026-10-25T02:16:39.4199127Z  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-25T02:16:39.4199825Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4200100Z 2026-10-25T02:16:39.4200292Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-25T02:16:39.4200624Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-25T02:16:39.4200859Z 139 │ if (action.id !== undefined) { 2026-10-25T02:16:39.4201171Z 140 │ props.onPressAction?.({ 2026-10-25T02:16:39.4201388Z ·  ──┬── 2026-10-25T02:16:39.4201599Z · ╰── Missing dependency `props` 2026-10-25T02:16:39.4201827Z 141 │ nativeEvent: { event: action.id }, 2026-10-25T02:16:39.4202084Z 142 │ } as Parameters>[0]); 2026-10-25T02:16:39.4202297Z 143 │ } 2026-10-25T02:16:39.4202417Z 144 │ }, 2026-10-25T02:16:39.4202567Z 145 │ [close, props.onPressAction], 2026-10-25T02:16:39.4202773Z ·  ─────────┬───────── 2026-10-25T02:16:39.4203087Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-25T02:16:39.4203339Z 146 │ ); 2026-10-25T02:16:39.4203452Z ╰──── 2026-10-25T02:16:39.4203979Z  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-25T02:16:39.4204751Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4205038Z 2026-10-25T02:16:39.4205490Z ⚠ 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-25T02:16:39.4206077Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-25T02:16:39.4206327Z 520 │ })).delivery; 2026-10-25T02:16:39.4206657Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-25T02:16:39.4206948Z 522 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4207218Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-25T02:16:39.4207463Z 524 │ │ id: task.id, 2026-10-25T02:16:39.4207691Z 525 │ │ deliveryId: deliveryId!, 2026-10-25T02:16:39.4207911Z 526 │ │ })).delivery; 2026-10-25T02:16:39.4208160Z 527 │ ╰─▶ } 2026-10-25T02:16:39.4208408Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-25T02:16:39.4208593Z ╰──── 2026-10-25T02:16:39.4208650Z 2026-10-25T02:16:39.4208796Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4209062Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-25T02:16:39.4210022Z 53 │ const child = children as ReactElement>; 2026-10-25T02:16:39.4210370Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-25T02:16:39.4210633Z 55 │ │ onTouchStart: (event) => { 2026-10-25T02:16:39.4210899Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-25T02:16:39.4211207Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-25T02:16:39.4211561Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-25T02:16:39.4211891Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-25T02:16:39.4212165Z 60 │ │ pendingPress.current = null; 2026-10-25T02:16:39.4212407Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-25T02:16:39.4212608Z 62 │ │ }, 2026-10-25T02:16:39.4212801Z 63 │ │ onPress: (event) => { 2026-10-25T02:16:39.4213073Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-25T02:16:39.4213372Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-25T02:16:39.4213671Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-25T02:16:39.4214029Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-25T02:16:39.4214340Z 68 │ │ return; 2026-10-25T02:16:39.4214521Z 69 │ │ } 2026-10-25T02:16:39.4214750Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-25T02:16:39.4215061Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-25T02:16:39.4215387Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-25T02:16:39.4215650Z 73 │ │ event.persist(); 2026-10-25T02:16:39.4215913Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-25T02:16:39.4216155Z 75 │ │ return; 2026-10-25T02:16:39.4216336Z 76 │ │ } 2026-10-25T02:16:39.4216540Z 77 │ │ child.props.onPress?.(event); 2026-10-25T02:16:39.4216737Z 78 │ │ }, 2026-10-25T02:16:39.4216954Z 79 │ ├─▶ }); 2026-10-25T02:16:39.4217320Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4217632Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-25T02:16:39.4217804Z ╰──── 2026-10-25T02:16:39.4218314Z  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-25T02:16:39.4219033Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4219308Z 2026-10-25T02:16:39.4219556Z ⚠ eslint(no-unused-vars): Variable 'I' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4219894Z ╭─[apps/server/src/guest/http.ts:88:33] 2026-10-25T02:16:39.4220153Z 87 │ /** Server-sent events with a heartbeat, never cached or buffered on the way. */ 2026-10-25T02:16:39.4220392Z 88 │ const eventStreamResponse = ( 2026-10-25T02:16:39.4220703Z ·  ┬ 2026-10-25T02:16:39.4220971Z · ╰── 'I' is declared here 2026-10-25T02:16:39.4221176Z 89 │ events: Stream.Stream, 2026-10-25T02:16:39.4221393Z ╰──── 2026-10-25T02:16:39.4221585Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4221703Z 2026-10-25T02:16:39.4221892Z ⚠ eslint(no-unused-vars): Identifier 'Option' is imported but never used. 2026-10-25T02:16:39.4222213Z ╭─[apps/server/src/guest/GuestShareService.test.ts:24:13] 2026-10-25T02:16:39.4222431Z 23 │ import * as Ref from "effect/Ref"; 2026-10-25T02:16:39.4222615Z 24 │ import * as Option from "effect/Option"; 2026-10-25T02:16:39.4222791Z ·  ───┬── 2026-10-25T02:16:39.4223018Z · ╰── 'Option' is imported here 2026-10-25T02:16:39.4223233Z 25 │ import * as Stream from "effect/Stream"; 2026-10-25T02:16:39.4223382Z ╰──── 2026-10-25T02:16:39.4223534Z  help: Consider removing this import. 2026-10-25T02:16:39.4223652Z 2026-10-25T02:16:39.4223873Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:16:39.4224268Z ╭─[apps/server/src/guest/GuestShareService.test.ts:733:50] 2026-10-25T02:16:39.4224564Z 732 │ yield* guestShares.submit(session, { shareId, text: `note ${index}` }, []); 2026-10-25T02:16:39.4224889Z 733 │ const [waiting] = (yield* waitingMessages).filter((next) => next.status === "pending"); 2026-10-25T02:16:39.4225167Z ·  ────── 2026-10-25T02:16:39.4225372Z 734 │ yield* orchestrator.dispatch({ 2026-10-25T02:16:39.4225525Z ╰──── 2026-10-25T02:16:39.4225749Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:16:39.4225923Z 2026-10-25T02:16:39.4226289Z ⚠ 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-25T02:16:39.4226732Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-25T02:16:39.4227011Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-25T02:16:39.4227341Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-25T02:16:39.4227608Z ·  ──────────────────────── 2026-10-25T02:16:39.4227783Z 18 │ "review:write", 2026-10-25T02:16:39.4227915Z ╰──── 2026-10-25T02:16:39.4227969Z 2026-10-25T02:16:39.4228328Z ⚠ 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-25T02:16:39.4228792Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-25T02:16:39.4228972Z 19 │ ]); 2026-10-25T02:16:39.4229196Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-25T02:16:39.4229467Z ·  ──────────────────────── 2026-10-25T02:16:39.4229706Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-25T02:16:39.4229898Z ╰──── 2026-10-25T02:16:39.4229952Z 2026-10-25T02:16:39.4230303Z ⚠ 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-25T02:16:39.4230965Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-25T02:16:39.4231412Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-25T02:16:39.4231917Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-25T02:16:39.4232161Z ·  ──────────────────────── 2026-10-25T02:16:39.4232340Z 59 │ authenticated: true, 2026-10-25T02:16:39.4232479Z ╰──── 2026-10-25T02:16:39.4232535Z 2026-10-25T02:16:39.4232863Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4233382Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-25T02:16:39.4233680Z 339 │ 2026-10-25T02:16:39.4233935Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-25T02:16:39.4234260Z ·  ────┬──── 2026-10-25T02:16:39.4234544Z · ╰── 'layerTest' is declared here 2026-10-25T02:16:39.4234771Z ╰──── 2026-10-25T02:16:39.4235006Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4235179Z 2026-10-25T02:16:39.4235465Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:16:39.4236063Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:121:34] 2026-10-25T02:16:39.4236475Z 120 │ return [...commands]; 2026-10-25T02:16:39.4236829Z 121 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-25T02:16:39.4237237Z ·  ─────────┬───────── 2026-10-25T02:16:39.4237542Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-25T02:16:39.4237765Z 122 │ 2026-10-25T02:16:39.4237874Z ╰──── 2026-10-25T02:16:39.4238246Z  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-25T02:16:39.4238852Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4239150Z 2026-10-25T02:16:39.4239513Z ⚠ 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-25T02:16:39.4239965Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-25T02:16:39.4240155Z 145 │ name, 2026-10-25T02:16:39.4240365Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-25T02:16:39.4240695Z ·  ────────────────────────── 2026-10-25T02:16:39.4240962Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-25T02:16:39.4241147Z ╰──── 2026-10-25T02:16:39.4241203Z 2026-10-25T02:16:39.4241517Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4241894Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-25T02:16:39.4242090Z 3754 │ 2026-10-25T02:16:39.4242348Z 3755 │ const layer: Layer.Layer = 2026-10-25T02:16:39.4242615Z ·  ──┬── 2026-10-25T02:16:39.4242825Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4243018Z 3756 │ Layer.effect( 2026-10-25T02:16:39.4243158Z ╰──── 2026-10-25T02:16:39.4243316Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4243432Z 2026-10-25T02:16:39.4243685Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4244096Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10691:7] 2026-10-25T02:16:39.4244454Z 10690 │ 2026-10-25T02:16:39.4244604Z 10691 │ const layer: Layer.Layer< 2026-10-25T02:16:39.4244764Z ·  ──┬── 2026-10-25T02:16:39.4244974Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4245197Z 10692 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:16:39.4245360Z ╰──── 2026-10-25T02:16:39.4245517Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4245636Z 2026-10-25T02:16:39.4246099Z ⚠ 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-25T02:16:39.4246648Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-25T02:16:39.4246930Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-25T02:16:39.4247254Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-25T02:16:39.4247559Z ·  ──────────────────────── 2026-10-25T02:16:39.4247737Z 182 │ version: 1, 2026-10-25T02:16:39.4247871Z ╰──── 2026-10-25T02:16:39.4247925Z 2026-10-25T02:16:39.4248261Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4248731Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-25T02:16:39.4248949Z 1443 │ 2026-10-25T02:16:39.4249128Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-25T02:16:39.4249374Z ·  ───────────────────┬─────────────────── 2026-10-25T02:16:39.4249701Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-25T02:16:39.4250014Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-25T02:16:39.4250202Z ╰──── 2026-10-25T02:16:39.4250360Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4250480Z 2026-10-25T02:16:39.4250789Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4251221Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-25T02:16:39.4251434Z 1679 │ 2026-10-25T02:16:39.4251564Z 1680 │ const layer: Layer.Layer< 2026-10-25T02:16:39.4251721Z ·  ──┬── 2026-10-25T02:16:39.4251930Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4252150Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:16:39.4252314Z ╰──── 2026-10-25T02:16:39.4252471Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4252588Z 2026-10-25T02:16:39.4252754Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4253113Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-25T02:16:39.4253360Z 52 │ 2026-10-25T02:16:39.4253483Z 53 │ for (const {} of [ 2026-10-25T02:16:39.4253633Z ·  ── 2026-10-25T02:16:39.4253789Z 54 │ { healthy: true }, 2026-10-25T02:16:39.4253923Z ╰──── 2026-10-25T02:16:39.4254252Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4254476Z 2026-10-25T02:16:39.4254695Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:16:39.4255076Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2144:15] 2026-10-25T02:16:39.4255311Z 2143 │ assert.equal( 2026-10-25T02:16:39.4255557Z 2144 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-25T02:16:39.4255797Z ·  ────── 2026-10-25T02:16:39.4255971Z 2145 │ "authoritative answer", 2026-10-25T02:16:39.4256117Z ╰──── 2026-10-25T02:16:39.4256342Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:16:39.4256514Z 2026-10-25T02:16:39.4256977Z ⚠ 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-25T02:16:39.4257556Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4246:7] 2026-10-25T02:16:39.4257901Z 4245 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-25T02:16:39.4258291Z 4246 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-25T02:16:39.4258601Z 4247 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4258863Z 4248 │ ╰─▶ } 2026-10-25T02:16:39.4259120Z 4249 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-25T02:16:39.4259309Z ╰──── 2026-10-25T02:16:39.4259364Z 2026-10-25T02:16:39.4259821Z ⚠ 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-25T02:16:39.4260403Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6357:9] 2026-10-25T02:16:39.4260719Z 6356 │ .pipe(Effect.forkScoped); 2026-10-25T02:16:39.4261046Z 6357 │ ╭─▶ while (promptGates.length < 1) { 2026-10-25T02:16:39.4261331Z 6358 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4261596Z 6359 │ ╰─▶ } 2026-10-25T02:16:39.4261908Z 6360 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-25T02:16:39.4262135Z ╰──── 2026-10-25T02:16:39.4262189Z 2026-10-25T02:16:39.4262644Z ⚠ 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-25T02:16:39.4263228Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6492:9] 2026-10-25T02:16:39.4263485Z 6491 │ .pipe(Effect.forkScoped); 2026-10-25T02:16:39.4263773Z 6492 │ ╭─▶ while (promptGates.length < 2) { 2026-10-25T02:16:39.4264058Z 6493 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4264348Z 6494 │ ╰─▶ } 2026-10-25T02:16:39.4264650Z 6495 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-25T02:16:39.4264874Z ╰──── 2026-10-25T02:16:39.4264928Z 2026-10-25T02:16:39.4265190Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4265601Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:266:5] 2026-10-25T02:16:39.4265893Z 264 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-25T02:16:39.4266096Z 265 │ useEffect(() => { 2026-10-25T02:16:39.4266251Z ·  ────┬──── 2026-10-25T02:16:39.4266473Z · ╰── This is the containing effect 2026-10-25T02:16:39.4266694Z 266 │ setNow(new Date().toISOString()); 2026-10-25T02:16:39.4266867Z ·  ───┬── 2026-10-25T02:16:39.4267118Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4267416Z 267 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-25T02:16:39.4267617Z ╰──── 2026-10-25T02:16:39.4268275Z  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-25T02:16:39.4269132Z  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-25T02:16:39.4269436Z 2026-10-25T02:16:39.4269665Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T02:16:39.4270046Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:12:8] 2026-10-25T02:16:39.4270282Z 11 │ threadSearchMatchKey, 2026-10-25T02:16:39.4270460Z 12 │ type EnvironmentThreadSearchMatch, 2026-10-25T02:16:39.4271141Z ·  ──────────────┬───────────── 2026-10-25T02:16:39.4271691Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T02:16:39.4272192Z 13 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T02:16:39.4272471Z ╰──── 2026-10-25T02:16:39.4272710Z  help: Consider removing this import. 2026-10-25T02:16:39.4272888Z 2026-10-25T02:16:39.4273201Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4273775Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:324:25] 2026-10-25T02:16:39.4274283Z 323 │ // range) the boundary string is identical and the chain would die. 2026-10-25T02:16:39.4274643Z 324 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T02:16:39.4274967Z ·  ───────┬────── 2026-10-25T02:16:39.4275414Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:16:39.4275851Z 325 │ const listItems: readonly SidebarListItem[] = 2026-10-25T02:16:39.4276112Z ╰──── 2026-10-25T02:16:39.4276659Z  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-25T02:16:39.4277596Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4278065Z 2026-10-25T02:16:39.4278355Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:16:39.4278882Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:612:27] 2026-10-25T02:16:39.4279418Z 611 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-25T02:16:39.4279835Z 612 │ const gesture = Gesture.Pan() 2026-10-25T02:16:39.4280137Z ·  ─┬─ 2026-10-25T02:16:39.4280518Z · ╰── `Pan` may be a component 2026-10-25T02:16:39.4280848Z 613 │ .enabled(!props.disabled) 2026-10-25T02:16:39.4281079Z ╰──── 2026-10-25T02:16:39.4281589Z  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-25T02:16:39.4282410Z  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-25T02:16:39.4282815Z 2026-10-25T02:16:39.4283152Z ⚠ 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-25T02:16:39.4283606Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-25T02:16:39.4283919Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-25T02:16:39.4284266Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T02:16:39.4284559Z ·  ───────── 2026-10-25T02:16:39.4284836Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T02:16:39.4285070Z ╰──── 2026-10-25T02:16:39.4285128Z 2026-10-25T02:16:39.4285526Z ⚠ 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-25T02:16:39.4285999Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-25T02:16:39.4286317Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T02:16:39.4286663Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T02:16:39.4286929Z ·  ───────── 2026-10-25T02:16:39.4287079Z 52 │ } 2026-10-25T02:16:39.4287196Z ╰──── 2026-10-25T02:16:39.4287254Z 2026-10-25T02:16:39.4287576Z ⚠ 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-25T02:16:39.4288019Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-25T02:16:39.4288239Z 54 │ assert.equal( 2026-10-25T02:16:39.4288494Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T02:16:39.4288740Z ·  ───────── 2026-10-25T02:16:39.4288884Z 56 │ true, 2026-10-25T02:16:39.4289001Z ╰──── 2026-10-25T02:16:39.4289056Z 2026-10-25T02:16:39.4289379Z ⚠ 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-25T02:16:39.4289815Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-25T02:16:39.4290028Z 58 │ assert.equal( 2026-10-25T02:16:39.4290282Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T02:16:39.4290534Z ·  ───────── 2026-10-25T02:16:39.4290681Z 60 │ true, 2026-10-25T02:16:39.4290799Z ╰──── 2026-10-25T02:16:39.4290854Z 2026-10-25T02:16:39.4291180Z ⚠ 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-25T02:16:39.4291622Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-25T02:16:39.4291834Z 102 │ 2026-10-25T02:16:39.4292058Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-25T02:16:39.4292317Z ·  ───────── 2026-10-25T02:16:39.4292467Z 104 │ }); 2026-10-25T02:16:39.4292578Z ╰──── 2026-10-25T02:16:39.4292632Z 2026-10-25T02:16:39.4292889Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-25T02:16:39.4293363Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-25T02:16:39.4293622Z 959 │ 2026-10-25T02:16:39.4293789Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-25T02:16:39.4294030Z ·  ──────────────────┬───────────────── 2026-10-25T02:16:39.4294398Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-25T02:16:39.4294690Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-25T02:16:39.4294860Z ╰──── 2026-10-25T02:16:39.4295030Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4295150Z 2026-10-25T02:16:39.4295333Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4295694Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-25T02:16:39.4295952Z 554 │ assert.deepStrictEqual( 2026-10-25T02:16:39.4296223Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T02:16:39.4296511Z ·  ┬ 2026-10-25T02:16:39.4296806Z · ╰── '_' is declared here 2026-10-25T02:16:39.4297020Z 556 │ [ 2026-10-25T02:16:39.4297153Z ╰──── 2026-10-25T02:16:39.4297311Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4297431Z 2026-10-25T02:16:39.4297620Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4297982Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-25T02:16:39.4298248Z 1154 │ assert.deepStrictEqual( 2026-10-25T02:16:39.4298518Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T02:16:39.4298811Z ·  ┬ 2026-10-25T02:16:39.4299102Z · ╰── '_' is declared here 2026-10-25T02:16:39.4299327Z 1156 │ [ 2026-10-25T02:16:39.4299455Z ╰──── 2026-10-25T02:16:39.4299611Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4299729Z 2026-10-25T02:16:39.4299999Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4300437Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:935:7] 2026-10-25T02:16:39.4300640Z 934 │ 2026-10-25T02:16:39.4300886Z 935 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-25T02:16:39.4315326Z ·  ─────┬───── 2026-10-25T02:16:39.4315592Z · ╰── 'layerDaemon' is declared here 2026-10-25T02:16:39.4315828Z 936 │ runDaemon.pipe(Effect.forkScoped), 2026-10-25T02:16:39.4315986Z ╰──── 2026-10-25T02:16:39.4316146Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4316264Z 2026-10-25T02:16:39.4316525Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4316892Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-25T02:16:39.4317206Z 3404 │ 2026-10-25T02:16:39.4317498Z 3405 │ const layer: Layer.Layer = 2026-10-25T02:16:39.4317756Z ·  ──┬── 2026-10-25T02:16:39.4317971Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4318167Z 3406 │ Layer.effect( 2026-10-25T02:16:39.4318293Z ╰──── 2026-10-25T02:16:39.4318446Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4318559Z 2026-10-25T02:16:39.4318763Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T02:16:39.4319063Z ╭─[packages/contracts/src/rpc.ts:302:8] 2026-10-25T02:16:39.4319242Z 301 │ } from "./device.ts"; 2026-10-25T02:16:39.4319415Z 302 │ import {} from "./previewAutomation.ts"; 2026-10-25T02:16:39.4319595Z ·  ── 2026-10-25T02:16:39.4319737Z 303 │ import { 2026-10-25T02:16:39.4319852Z ╰──── 2026-10-25T02:16:39.4319988Z  help: Remove empty braces 2026-10-25T02:16:39.4320089Z 2026-10-25T02:16:39.4320289Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-25T02:16:39.4320612Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-25T02:16:39.4320850Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-25T02:16:39.4321048Z 24 │ import * as Duration from "effect/Duration"; 2026-10-25T02:16:39.4321234Z ·  ────┬─── 2026-10-25T02:16:39.4321462Z · ╰── 'Duration' is imported here 2026-10-25T02:16:39.4321686Z 25 │ import * as Effect from "effect/Effect"; 2026-10-25T02:16:39.4321838Z ╰──── 2026-10-25T02:16:39.4321995Z  help: Consider removing this import. 2026-10-25T02:16:39.4322115Z 2026-10-25T02:16:39.4322343Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T02:16:39.4322684Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:14:8] 2026-10-25T02:16:39.4322890Z 13 │ threadSearchMatchKey, 2026-10-25T02:16:39.4323059Z 14 │ type EnvironmentThreadSearchMatch, 2026-10-25T02:16:39.4323269Z ·  ──────────────┬───────────── 2026-10-25T02:16:39.4323556Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T02:16:39.4323834Z 15 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T02:16:39.4324002Z ╰──── 2026-10-25T02:16:39.4324153Z  help: Consider removing this import. 2026-10-25T02:16:39.4324308Z 2026-10-25T02:16:39.4324511Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4324836Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:492:25] 2026-10-25T02:16:39.4325105Z 491 │ // range) the boundary string is identical and the chain would die. 2026-10-25T02:16:39.4325338Z 492 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T02:16:39.4325546Z ·  ───────┬────── 2026-10-25T02:16:39.4325825Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:16:39.4326159Z 493 │ // Called as `props.onSelectThread(...)`, the compiler would cache this handler on the whole 2026-10-25T02:16:39.4326387Z ╰──── 2026-10-25T02:16:39.4326796Z  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-25T02:16:39.4327418Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4327709Z 2026-10-25T02:16:39.4327903Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4328260Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-25T02:16:39.4328493Z 817 │
2026-10-25T02:16:39.4332665Z 494 │ {props.children(close)} 2026-10-25T02:16:39.4332850Z ·  ──┬── 2026-10-25T02:16:39.4333115Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4333346Z 495 │ 2026-10-25T02:16:39.4333498Z ╰──── 2026-10-25T02:16:39.4334019Z  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-25T02:16:39.4334766Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4335043Z 2026-10-25T02:16:39.4335213Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4335512Z ╭─[apps/web/src/components/CommandPalette.tsx:2057:20] 2026-10-25T02:16:39.4335768Z 2056 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-25T02:16:39.4335998Z 2057 │ createdAt: new Date().toISOString(), 2026-10-25T02:16:39.4336202Z ·  ─────┬──── 2026-10-25T02:16:39.4336452Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4336759Z 2058 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-25T02:16:39.4336964Z ╰──── 2026-10-25T02:16:39.4337295Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4337846Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4338121Z 2026-10-25T02:16:39.4338451Z ⚠ 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-25T02:16:39.4338872Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-25T02:16:39.4339166Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-25T02:16:39.4339452Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-25T02:16:39.4339665Z ·  ───────── 2026-10-25T02:16:39.4339821Z 19 │ expect( 2026-10-25T02:16:39.4339943Z ╰──── 2026-10-25T02:16:39.4339998Z 2026-10-25T02:16:39.4340324Z ⚠ 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-25T02:16:39.4340743Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-25T02:16:39.4340931Z 19 │ expect( 2026-10-25T02:16:39.4341166Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-25T02:16:39.4341408Z ·  ───────── 2026-10-25T02:16:39.4341558Z 21 │ ).toBe(true); 2026-10-25T02:16:39.4341691Z ╰──── 2026-10-25T02:16:39.4341750Z 2026-10-25T02:16:39.4342283Z ⚠ 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-25T02:16:39.4342816Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-25T02:16:39.4343002Z 499 │ 2026-10-25T02:16:39.4343176Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-25T02:16:39.4343431Z ·  ────────────────────────── 2026-10-25T02:16:39.4343664Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-25T02:16:39.4343841Z ╰──── 2026-10-25T02:16:39.4343898Z 2026-10-25T02:16:39.4344388Z ⚠ 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-25T02:16:39.4344868Z ╭─[packages/effect-acp/src/client.ts:1270:11] 2026-10-25T02:16:39.4345142Z 1269 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-25T02:16:39.4345479Z 1270 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-25T02:16:39.4345762Z ·  ────────────────────────── 2026-10-25T02:16:39.4346022Z 1271 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-25T02:16:39.4346228Z ╰──── 2026-10-25T02:16:39.4346288Z 2026-10-25T02:16:39.4346455Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-25T02:16:39.4346817Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-25T02:16:39.4347154Z 219 │ 2026-10-25T02:16:39.4347441Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-25T02:16:39.4347694Z ·  ──┬─ 2026-10-25T02:16:39.4347981Z · ╰── 'U+001B' is a control character. 2026-10-25T02:16:39.4348208Z 221 │ 2026-10-25T02:16:39.4348342Z ╰──── 2026-10-25T02:16:39.4348631Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-25T02:16:39.4348855Z 2026-10-25T02:16:39.4349312Z ⚠ 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-25T02:16:39.4349843Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-25T02:16:39.4350072Z 128 │ const secret = "acp-summary-secret"; 2026-10-25T02:16:39.4350292Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-25T02:16:39.4350534Z ·  ────────────────────────── 2026-10-25T02:16:39.4350817Z 130 │ Schema.Struct({ 2026-10-25T02:16:39.4350988Z ╰──── 2026-10-25T02:16:39.4351045Z 2026-10-25T02:16:39.4351243Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-25T02:16:39.4351543Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-25T02:16:39.4351745Z 27 │ import * as Schema from "effect/Schema"; 2026-10-25T02:16:39.4351948Z 28 │ import { identity } from "effect/Function"; 2026-10-25T02:16:39.4352136Z ·  ────┬─── 2026-10-25T02:16:39.4352364Z · ╰── 'identity' is imported here 2026-10-25T02:16:39.4352583Z 29 │ import * as Layer from "effect/Layer"; 2026-10-25T02:16:39.4352738Z ╰──── 2026-10-25T02:16:39.4352888Z  help: Consider removing this import. 2026-10-25T02:16:39.4353001Z 2026-10-25T02:16:39.4353362Z ⚠ 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-25T02:16:39.4353807Z ╭─[apps/server/src/auth/RpcAuthorization.ts:239:17] 2026-10-25T02:16:39.4354076Z 238 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-25T02:16:39.4354451Z 239 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-25T02:16:39.4354737Z ·  ──────────────────────── 2026-10-25T02:16:39.4354993Z 240 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-25T02:16:39.4355196Z ╰──── 2026-10-25T02:16:39.4355251Z 2026-10-25T02:16:39.4355619Z ⚠ 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-25T02:16:39.4356071Z ╭─[apps/server/src/auth/RpcAuthorization.ts:258:26] 2026-10-25T02:16:39.4356304Z 257 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-25T02:16:39.4356577Z 258 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-25T02:16:39.4356859Z ·  ──────────────────────── 2026-10-25T02:16:39.4357046Z 259 │ return [ 2026-10-25T02:16:39.4357171Z ╰──── 2026-10-25T02:16:39.4357227Z 2026-10-25T02:16:39.4357434Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-25T02:16:39.4357777Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-25T02:16:39.4357976Z 21 │ 2026-10-25T02:16:39.4358196Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-25T02:16:39.4358446Z ·  ────────┬─────── 2026-10-25T02:16:39.4358697Z · ╰── 'summarizePayload' is declared here 2026-10-25T02:16:39.4358948Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-25T02:16:39.4359120Z ╰──── 2026-10-25T02:16:39.4359285Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4359406Z 2026-10-25T02:16:39.4359591Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:16:39.4359890Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-25T02:16:39.4360076Z 7 │ () => 2026-10-25T02:16:39.4360208Z 8 │ Gesture.Hover() 2026-10-25T02:16:39.4360366Z ·  ──┬── 2026-10-25T02:16:39.4360594Z · ╰── `Hover` may be a component 2026-10-25T02:16:39.4360807Z 9 │ .manualActivation(true) 2026-10-25T02:16:39.4360956Z ╰──── 2026-10-25T02:16:39.4361288Z  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-25T02:16:39.4362000Z  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-25T02:16:39.4362406Z 2026-10-25T02:16:39.4362610Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T02:16:39.4362927Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-25T02:16:39.4363125Z 37 │ get isConnected() { 2026-10-25T02:16:39.4363304Z 38 │ let current: FakeElement | null = this; 2026-10-25T02:16:39.4363484Z ·  ─────── 2026-10-25T02:16:39.4363646Z 39 │ while (current?.parent) { 2026-10-25T02:16:39.4363789Z ╰──── 2026-10-25T02:16:39.4364175Z  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-25T02:16:39.4364508Z 2026-10-25T02:16:39.4364696Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-25T02:16:39.4365027Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-25T02:16:39.4365235Z  80 │ 2026-10-25T02:16:39.4365574Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-25T02:16:39.4365945Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-25T02:16:39.4366198Z  83 │ │ ): Effect.fn.Return { 2026-10-25T02:16:39.4366497Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-25T02:16:39.4366814Z  85 │ │ const connections = new Map(); 2026-10-25T02:16:39.4367030Z  86 │ │ 2026-10-25T02:16:39.4367333Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-25T02:16:39.4367642Z  88 │ │ Effect.suspend(() => { 2026-10-25T02:16:39.4367891Z  89 │ │ const connection = connections.get(connectionId); 2026-10-25T02:16:39.4368141Z  90 │ │ return connection === undefined 2026-10-25T02:16:39.4368470Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-25T02:16:39.4368785Z  92 │ │ : Effect.succeed(connection); 2026-10-25T02:16:39.4368981Z  93 │ │ }); 2026-10-25T02:16:39.4369145Z  94 │ │ 2026-10-25T02:16:39.4369322Z  95 │ │ const send = ( 2026-10-25T02:16:39.4369526Z  96 │ │ connection: Connection, 2026-10-25T02:16:39.4369730Z  97 │ │ message: unknown, 2026-10-25T02:16:39.4369995Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-25T02:16:39.4370268Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-25T02:16:39.4370501Z 100 │ │ Effect.gen(function* () { 2026-10-25T02:16:39.4370743Z 101 │ │ const body = JSON.stringify(message); 2026-10-25T02:16:39.4371018Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-25T02:16:39.4371385Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-25T02:16:39.4371677Z 104 │ │ } 2026-10-25T02:16:39.4371907Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T02:16:39.4372151Z 106 │ │ try: (signal) => 2026-10-25T02:16:39.4372395Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-25T02:16:39.4372640Z 108 │ │ method: "POST", 2026-10-25T02:16:39.4372852Z 109 │ │ signal, 2026-10-25T02:16:39.4373055Z 110 │ │ headers: { 2026-10-25T02:16:39.4373297Z 111 │ │ "content-type": "application/json", 2026-10-25T02:16:39.4373577Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-25T02:16:39.4373913Z 113 │ │ authorization: options.authorization, 2026-10-25T02:16:39.4374245Z 114 │ │ ...(connection.sessionId === null 2026-10-25T02:16:39.4374481Z 115 │ │ ? {} 2026-10-25T02:16:39.4374736Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-25T02:16:39.4375019Z 117 │ │ ...(connection.protocolVersion === null 2026-10-25T02:16:39.4375252Z 118 │ │ ? {} 2026-10-25T02:16:39.4375528Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T02:16:39.4375779Z 120 │ │ }, 2026-10-25T02:16:39.4375970Z 121 │ │ body, 2026-10-25T02:16:39.4376164Z 122 │ │ }), 2026-10-25T02:16:39.4376368Z 123 │ │ catch: bridgeError, 2026-10-25T02:16:39.4376565Z 124 │ │ }); 2026-10-25T02:16:39.4376873Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-25T02:16:39.4377185Z 126 │ │ if (!response.ok) { 2026-10-25T02:16:39.4377405Z 127 │ │ yield* Effect.promise( 2026-10-25T02:16:39.4377709Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T02:16:39.4377968Z 129 │ │ ); 2026-10-25T02:16:39.4378180Z 130 │ │ return yield* Effect.fail( 2026-10-25T02:16:39.4378516Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-25T02:16:39.4378801Z 132 │ │ ); 2026-10-25T02:16:39.4378977Z 133 │ │ } 2026-10-25T02:16:39.4379284Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-25T02:16:39.4379605Z 135 │ │ for (const payload of payloads) { 2026-10-25T02:16:39.4379948Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-25T02:16:39.4380233Z 137 │ │ } 2026-10-25T02:16:39.4380429Z 138 │ │ return payloads; 2026-10-25T02:16:39.4380662Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-25T02:16:39.4380878Z 140 │ │ ); 2026-10-25T02:16:39.4381046Z 141 │ │ 2026-10-25T02:16:39.4381305Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-25T02:16:39.4381606Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-25T02:16:39.4381932Z 144 │ │ ): Effect.fn.Return { 2026-10-25T02:16:39.4382275Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:16:39.4382562Z 146 │ │ connections.delete(request.connectionId); 2026-10-25T02:16:39.4382825Z 147 │ │ const sessionId = connection.sessionId; 2026-10-25T02:16:39.4383060Z 148 │ │ if (sessionId !== null) { 2026-10-25T02:16:39.4383362Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T02:16:39.4383632Z 150 │ │ try: (signal) => 2026-10-25T02:16:39.4383877Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-25T02:16:39.4384117Z 152 │ │ method: "DELETE", 2026-10-25T02:16:39.4384357Z 153 │ │ signal, 2026-10-25T02:16:39.4384556Z 154 │ │ headers: { 2026-10-25T02:16:39.4384798Z 155 │ │ authorization: options.authorization, 2026-10-25T02:16:39.4385061Z 156 │ │ "mcp-session-id": sessionId, 2026-10-25T02:16:39.4385330Z 157 │ │ ...(connection.protocolVersion === null 2026-10-25T02:16:39.4385564Z 158 │ │ ? {} 2026-10-25T02:16:39.4385839Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T02:16:39.4386092Z 160 │ │ }, 2026-10-25T02:16:39.4386276Z 161 │ │ }), 2026-10-25T02:16:39.4386472Z 162 │ │ catch: bridgeError, 2026-10-25T02:16:39.4386667Z 163 │ │ }); 2026-10-25T02:16:39.4386899Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-25T02:16:39.4387151Z 165 │ │ return yield* Effect.fail( 2026-10-25T02:16:39.4387386Z 166 │ │ new AcpMcpOverAcpError( 2026-10-25T02:16:39.4387692Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-25T02:16:39.4387958Z 168 │ │ ), 2026-10-25T02:16:39.4388134Z 169 │ │ ); 2026-10-25T02:16:39.4388307Z 170 │ │ } 2026-10-25T02:16:39.4388501Z 171 │ │ yield* Effect.promise( 2026-10-25T02:16:39.4388796Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T02:16:39.4389051Z 173 │ │ ); 2026-10-25T02:16:39.4389224Z 174 │ │ } 2026-10-25T02:16:39.4389400Z 175 │ │ return {}; 2026-10-25T02:16:39.4389574Z 176 │ │ }); 2026-10-25T02:16:39.4389735Z 177 │ │ 2026-10-25T02:16:39.4389899Z 178 │ │ return { 2026-10-25T02:16:39.4390173Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-25T02:16:39.4390468Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-25T02:16:39.4390924Z 181 │ │ return yield* Effect.fail( 2026-10-25T02:16:39.4391231Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-25T02:16:39.4391495Z 183 │ │ ); 2026-10-25T02:16:39.4391663Z 184 │ │ } 2026-10-25T02:16:39.4391883Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-25T02:16:39.4392228Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-25T02:16:39.4392508Z 187 │ │ } 2026-10-25T02:16:39.4392820Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-25T02:16:39.4393133Z 189 │ │ connections.set(connectionId, { 2026-10-25T02:16:39.4393378Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-25T02:16:39.4393606Z 191 │ │ sessionId: null, 2026-10-25T02:16:39.4393821Z 192 │ │ protocolVersion: null, 2026-10-25T02:16:39.4394042Z 193 │ │ nextRequestId: 0, 2026-10-25T02:16:39.4394256Z 194 │ │ }); 2026-10-25T02:16:39.4394455Z 195 │ │ return { connectionId }; 2026-10-25T02:16:39.4394650Z 196 │ │ }), 2026-10-25T02:16:39.4394910Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-25T02:16:39.4395252Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:16:39.4395542Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-25T02:16:39.4395804Z 200 │ │ const payloads = yield* send(connection, { 2026-10-25T02:16:39.4396036Z 201 │ │ jsonrpc: "2.0", 2026-10-25T02:16:39.4396232Z 202 │ │ id, 2026-10-25T02:16:39.4396433Z 203 │ │ method: request.method, 2026-10-25T02:16:39.4396712Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T02:16:39.4396950Z 205 │ │ }); 2026-10-25T02:16:39.4397236Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-25T02:16:39.4397553Z 207 │ │ const envelope = asEnvelope(response); 2026-10-25T02:16:39.4397789Z 208 │ │ if (envelope === null) { 2026-10-25T02:16:39.4398012Z 209 │ │ return yield* Effect.fail( 2026-10-25T02:16:39.4398317Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-25T02:16:39.4398580Z 211 │ │ ); 2026-10-25T02:16:39.4398752Z 212 │ │ } 2026-10-25T02:16:39.4398963Z 213 │ │ if (envelope.error !== undefined) { 2026-10-25T02:16:39.4399282Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-25T02:16:39.4399548Z 215 │ │ } 2026-10-25T02:16:39.4399864Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-25T02:16:39.4400146Z 217 │ │ }), 2026-10-25T02:16:39.4400427Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-25T02:16:39.4400778Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:16:39.4401045Z 220 │ │ yield* send(connection, { 2026-10-25T02:16:39.4401263Z 221 │ │ jsonrpc: "2.0", 2026-10-25T02:16:39.4401476Z 222 │ │ method: request.method, 2026-10-25T02:16:39.4401751Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T02:16:39.4401988Z 224 │ │ }); 2026-10-25T02:16:39.4402160Z 225 │ │ }), 2026-10-25T02:16:39.4402341Z 226 │ │ disconnect, 2026-10-25T02:16:39.4402552Z 227 │ │ dispose: Effect.suspend(() => 2026-10-25T02:16:39.4402772Z 228 │ │ Effect.forEach( 2026-10-25T02:16:39.4402989Z 229 │ │ [...connections.keys()], 2026-10-25T02:16:39.4403278Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-25T02:16:39.4403547Z 231 │ │ { discard: true }, 2026-10-25T02:16:39.4403739Z 232 │ │ ), 2026-10-25T02:16:39.4403910Z 233 │ │ ), 2026-10-25T02:16:39.4404079Z 234 │ │ }; 2026-10-25T02:16:39.4404332Z 235 │ ╰─▶ }); 2026-10-25T02:16:39.4404528Z ╰──── 2026-10-25T02:16:39.4404841Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-25T02:16:39.4405086Z 2026-10-25T02:16:39.4405355Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4405717Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-25T02:16:39.4405894Z 35 │ 2026-10-25T02:16:39.4406080Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-25T02:16:39.4406296Z ·  ─────┬──── 2026-10-25T02:16:39.4406526Z · ╰── 'claudeCaps' is declared here 2026-10-25T02:16:39.4406733Z 37 │ optionDescriptors: [ 2026-10-25T02:16:39.4406875Z ╰──── 2026-10-25T02:16:39.4407034Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4407160Z 2026-10-25T02:16:39.4407344Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-25T02:16:39.4407636Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-25T02:16:39.4407891Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-25T02:16:39.4408116Z 194 │ const codes = new Array(count); 2026-10-25T02:16:39.4408341Z ·  ──────────────────────── 2026-10-25T02:16:39.4408558Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-25T02:16:39.4408730Z ╰──── 2026-10-25T02:16:39.4409195Z  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-25T02:16:39.4409633Z 2026-10-25T02:16:39.4409923Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4410354Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-25T02:16:39.4410598Z 117 │ 2026-10-25T02:16:39.4410725Z 118 │ useEffect(() => { 2026-10-25T02:16:39.4410883Z ·  ────┬──── 2026-10-25T02:16:39.4411100Z · ╰── This is the containing effect 2026-10-25T02:16:39.4411314Z 119 │ void refreshNotifications(); 2026-10-25T02:16:39.4411506Z ·  ──────────┬───────── 2026-10-25T02:16:39.4411782Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4412105Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-25T02:16:39.4412311Z ╰──── 2026-10-25T02:16:39.4412957Z  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-25T02:16:39.4413801Z  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-25T02:16:39.4414104Z 2026-10-25T02:16:39.4414401Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4414830Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-25T02:16:39.4415073Z 125 │ 2026-10-25T02:16:39.4415199Z 126 │ useEffect(() => { 2026-10-25T02:16:39.4415360Z ·  ────┬──── 2026-10-25T02:16:39.4415575Z · ╰── This is the containing effect 2026-10-25T02:16:39.4415778Z 127 │ if (!isLoaded) { 2026-10-25T02:16:39.4415952Z 128 │ setLiveActivityStatus("checking"); 2026-10-25T02:16:39.4416152Z ·  ──────────┬────────── 2026-10-25T02:16:39.4416424Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4416657Z 129 │ return; 2026-10-25T02:16:39.4416785Z ╰──── 2026-10-25T02:16:39.4417438Z  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-25T02:16:39.4418285Z  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-25T02:16:39.4418588Z 2026-10-25T02:16:39.4418790Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-25T02:16:39.4419079Z ╭─[apps/web/src/types.ts:22:3] 2026-10-25T02:16:39.4419261Z 21 │ EnvironmentThreadShell, 2026-10-25T02:16:39.4419417Z 22 │ ThreadRunSummary, 2026-10-25T02:16:39.4419583Z ·  ────────┬─────── 2026-10-25T02:16:39.4419818Z · ╰── 'ThreadRunSummary' is imported here 2026-10-25T02:16:39.4420096Z 23 │ ThreadRuntimeSummary, 2026-10-25T02:16:39.4420269Z ╰──── 2026-10-25T02:16:39.4420420Z  help: Consider removing this import. 2026-10-25T02:16:39.4420537Z 2026-10-25T02:16:39.4420825Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4421243Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-25T02:16:39.4421461Z 14 │ 2026-10-25T02:16:39.4421589Z 15 │ const legacyCredentials = { 2026-10-25T02:16:39.4421768Z ·  ────────┬──────── 2026-10-25T02:16:39.4422010Z · ╰── 'legacyCredentials' is declared here 2026-10-25T02:16:39.4422223Z 16 │ version: 1 as const, 2026-10-25T02:16:39.4422359Z ╰──── 2026-10-25T02:16:39.4422525Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4422646Z 2026-10-25T02:16:39.4422920Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T02:16:39.4423305Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-25T02:16:39.4423501Z 248 │ }, 2026-10-25T02:16:39.4423652Z 249 │ (effect, flow, stopSessions) => 2026-10-25T02:16:39.4423845Z ·  ──────┬───── 2026-10-25T02:16:39.4424094Z · ╰── 'stopSessions' is declared here 2026-10-25T02:16:39.4424344Z 250 │ effect.pipe( 2026-10-25T02:16:39.4424477Z ╰──── 2026-10-25T02:16:39.4424640Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4424758Z 2026-10-25T02:16:39.4424929Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4425257Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-25T02:16:39.4425593Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-25T02:16:39.4425909Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-25T02:16:39.4426179Z ·  ─────┬──── 2026-10-25T02:16:39.4426480Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4426695Z 153 │ } 2026-10-25T02:16:39.4426814Z ╰──── 2026-10-25T02:16:39.4427155Z  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-25T02:16:39.4427715Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4427995Z 2026-10-25T02:16:39.4428210Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:16:39.4428545Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-25T02:16:39.4428776Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-25T02:16:39.4428982Z 259 │ for (const edit of edits.reverse()) 2026-10-25T02:16:39.4429181Z ·  ─────── 2026-10-25T02:16:39.4429456Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T02:16:39.4429675Z ╰──── 2026-10-25T02:16:39.4430058Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:16:39.4430337Z 2026-10-25T02:16:39.4430550Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:16:39.4430928Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-25T02:16:39.4431142Z 289 │ visit(parser.parse(markdown)); 2026-10-25T02:16:39.4431322Z 290 │ for (const edit of edits.reverse()) 2026-10-25T02:16:39.4431522Z ·  ─────── 2026-10-25T02:16:39.4431791Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T02:16:39.4432019Z ╰──── 2026-10-25T02:16:39.4432335Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:16:39.4432585Z 2026-10-25T02:16:39.4432794Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:16:39.4433116Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-25T02:16:39.4433328Z 343 │ visit(parser.parse(markdown)); 2026-10-25T02:16:39.4433529Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-25T02:16:39.4433752Z ·  ─────── 2026-10-25T02:16:39.4434026Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-25T02:16:39.4434259Z ╰──── 2026-10-25T02:16:39.4434595Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:16:39.4434843Z 2026-10-25T02:16:39.4435012Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4435296Z ╭─[apps/web/src/hooks/useThreadActions.ts:842:56] 2026-10-25T02:16:39.4435533Z 841 │ const resolved = resolveThreadTarget(target); 2026-10-25T02:16:39.4435809Z 842 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-25T02:16:39.4436096Z ·  ─────┬──── 2026-10-25T02:16:39.4436387Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4436631Z 843 │ return AsyncResult.failure( 2026-10-25T02:16:39.4436782Z ╰──── 2026-10-25T02:16:39.4437119Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4437674Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4437955Z 2026-10-25T02:16:39.4438122Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4438404Z ╭─[apps/web/src/hooks/useThreadActions.ts:730:46] 2026-10-25T02:16:39.4438606Z 729 │ const wokeAt = resolved 2026-10-25T02:16:39.4438831Z 730 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-25T02:16:39.4439091Z ·  ─────┬──── 2026-10-25T02:16:39.4439433Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4439685Z 731 │ : null; 2026-10-25T02:16:39.4439807Z ╰──── 2026-10-25T02:16:39.4440130Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4440672Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4440946Z 2026-10-25T02:16:39.4441127Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4441411Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-25T02:16:39.4441593Z 457 │ ): Array { 2026-10-25T02:16:39.4441779Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-25T02:16:39.4441995Z ·  ┬ 2026-10-25T02:16:39.4442247Z · ╰── '_' is declared here 2026-10-25T02:16:39.4442452Z 459 │ for (const b of data) { 2026-10-25T02:16:39.4442590Z ╰──── 2026-10-25T02:16:39.4442741Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4442856Z 2026-10-25T02:16:39.4443073Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:16:39.4443395Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-25T02:16:39.4443621Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-25T02:16:39.4443863Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-25T02:16:39.4444158Z ·  ────────────────────────────────────────────────────────────── 2026-10-25T02:16:39.4444399Z 347 │ }; 2026-10-25T02:16:39.4444515Z ╰──── 2026-10-25T02:16:39.4444829Z  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-25T02:16:39.4445078Z 2026-10-25T02:16:39.4445290Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-25T02:16:39.4445613Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-25T02:16:39.4445803Z 447 │ const favorites = 2026-10-25T02:16:39.4445990Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-25T02:16:39.4446192Z ·  ───┬── 2026-10-25T02:16:39.4446414Z · ╰── For this reduce 2026-10-25T02:16:39.4446669Z 449 │ const exists = current.some( 2026-10-25T02:16:39.4446965Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-25T02:16:39.4447190Z 451 │ ); 2026-10-25T02:16:39.4447325Z 452 │ return change.favorite 2026-10-25T02:16:39.4447474Z 453 │ ? exists 2026-10-25T02:16:39.4447609Z 454 │ ? current 2026-10-25T02:16:39.4447819Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-25T02:16:39.4448042Z ·  ─────┬──── 2026-10-25T02:16:39.4448252Z · ╰── From this spread 2026-10-25T02:16:39.4448442Z 456 │ : current.filter( 2026-10-25T02:16:39.4448582Z ╰──── 2026-10-25T02:16:39.4448840Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T02:16:39.4449202Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:16:39.4449368Z 2026-10-25T02:16:39.4449553Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T02:16:39.4449848Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-25T02:16:39.4450030Z 464 │ null; 2026-10-25T02:16:39.4450209Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-25T02:16:39.4450424Z ·  ──────────┬───────── 2026-10-25T02:16:39.4450650Z · ╰── From this accumulator 2026-10-25T02:16:39.4450882Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-25T02:16:39.4451067Z ·  ─┬─ 2026-10-25T02:16:39.4451303Z · ╰── For this loop 2026-10-25T02:16:39.4451556Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-25T02:16:39.4451778Z 468 │ hiddenModels: [], 2026-10-25T02:16:39.4451930Z 469 │ modelOrder: [], 2026-10-25T02:16:39.4452074Z 470 │ }; 2026-10-25T02:16:39.4452323Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-25T02:16:39.4452614Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-25T02:16:39.4452813Z 473 │ nextModelPreferences = { 2026-10-25T02:16:39.4452988Z 474 │ ...nextModelPreferences, 2026-10-25T02:16:39.4453179Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4453407Z · ╰── From this spread 2026-10-25T02:16:39.4453645Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-25T02:16:39.4453822Z ╰──── 2026-10-25T02:16:39.4454040Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T02:16:39.4454383Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:16:39.4454547Z 2026-10-25T02:16:39.4454762Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:16:39.4455083Z ╭─[apps/web/src/components/Sidebar.tsx:129:40] 2026-10-25T02:16:39.4455344Z 128 │ import { environmentPresentations } from "../state/presentation"; 2026-10-25T02:16:39.4455646Z 129 │ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server"; 2026-10-25T02:16:39.4455938Z ·  ────────┬──────── 2026-10-25T02:16:39.4456286Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:16:39.4456597Z 130 │ import { environmentProjects } from "../state/projects"; 2026-10-25T02:16:39.4456779Z ╰──── 2026-10-25T02:16:39.4456938Z  help: Consider removing this import. 2026-10-25T02:16:39.4457050Z 2026-10-25T02:16:39.4457217Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4457498Z ╭─[apps/web/src/components/Sidebar.tsx:1139:11] 2026-10-25T02:16:39.4457725Z 1138 │ foldSearchQuery(threadSearchQuery), 2026-10-25T02:16:39.4457912Z 1139 │ Date.now(), 2026-10-25T02:16:39.4458077Z ·  ─────┬──── 2026-10-25T02:16:39.4458309Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4458589Z 1140 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-25T02:16:39.4458788Z ╰──── 2026-10-25T02:16:39.4459123Z  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-25T02:16:39.4459679Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4459960Z 2026-10-25T02:16:39.4460193Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T02:16:39.4460572Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-25T02:16:39.4460799Z 261 │ ): boolean { 2026-10-25T02:16:39.4461021Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-25T02:16:39.4461350Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-25T02:16:39.4461652Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-25T02:16:39.4461860Z ╰──── 2026-10-25T02:16:39.4461993Z  help: Switch to `Set` 2026-10-25T02:16:39.4462091Z 2026-10-25T02:16:39.4462232Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4462545Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-25T02:16:39.4462794Z 26 │ const latestInput = useRef(input); 2026-10-25T02:16:39.4462969Z 27 │ latestInput.current = input; 2026-10-25T02:16:39.4463174Z ·  ─────┬─────────┬─── 2026-10-25T02:16:39.4463477Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4463773Z · ╰── This value is a ref 2026-10-25T02:16:39.4463972Z 28 │ const mounted = useRef(true); 2026-10-25T02:16:39.4464121Z ╰──── 2026-10-25T02:16:39.4464668Z  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-25T02:16:39.4465378Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4465656Z 2026-10-25T02:16:39.4465813Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4466187Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-25T02:16:39.4466494Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-25T02:16:39.4466697Z 66 │ const progress = useSharedValue(0); 2026-10-25T02:16:39.4466874Z ·  ────┬─── 2026-10-25T02:16:39.4467098Z · ╰── `progress` originates here 2026-10-25T02:16:39.4467301Z 67 │ useEffect(() => { 2026-10-25T02:16:39.4467504Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-25T02:16:39.4467710Z ·  ────┬─── 2026-10-25T02:16:39.4467928Z · ╰── `progress` cannot be modified 2026-10-25T02:16:39.4468137Z 69 │ }, [expanded, progress]); 2026-10-25T02:16:39.4468277Z ╰──── 2026-10-25T02:16:39.4468599Z  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-25T02:16:39.4469150Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4469438Z 2026-10-25T02:16:39.4469585Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4469893Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-25T02:16:39.4470218Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T02:16:39.4470505Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T02:16:39.4470818Z ·  ───────────┬────────── 2026-10-25T02:16:39.4471118Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4471406Z 123 │ const sessionRef = useRef(null); 2026-10-25T02:16:39.4471590Z ╰──── 2026-10-25T02:16:39.4472105Z  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-25T02:16:39.4472806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4473082Z 2026-10-25T02:16:39.4478673Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4479025Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-25T02:16:39.4479246Z 125 │ 2026-10-25T02:16:39.4479417Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:16:39.4479626Z ·  ─────────┬──────── 2026-10-25T02:16:39.4479874Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4480124Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:16:39.4480288Z ╰──── 2026-10-25T02:16:39.4480808Z  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-25T02:16:39.4481510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4481884Z 2026-10-25T02:16:39.4482071Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4482374Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-25T02:16:39.4482586Z 125 │ 2026-10-25T02:16:39.4482747Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:16:39.4482955Z ·  ─────────┬───────── 2026-10-25T02:16:39.4483200Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4483444Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:16:39.4483612Z ╰──── 2026-10-25T02:16:39.4484126Z  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-25T02:16:39.4484867Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4485142Z 2026-10-25T02:16:39.4485285Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4485596Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-25T02:16:39.4485812Z 125 │ 2026-10-25T02:16:39.4485976Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:16:39.4486211Z ·  ─────────┬───────── 2026-10-25T02:16:39.4486498Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4486760Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:16:39.4486931Z ╰──── 2026-10-25T02:16:39.4487443Z  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-25T02:16:39.4488137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4488410Z 2026-10-25T02:16:39.4488551Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4488857Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-25T02:16:39.4489067Z 125 │ 2026-10-25T02:16:39.4489239Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:16:39.4489523Z ·  ──────────┬───────── 2026-10-25T02:16:39.4489855Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4490112Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:16:39.4490280Z ╰──── 2026-10-25T02:16:39.4490784Z  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-25T02:16:39.4491477Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4491749Z 2026-10-25T02:16:39.4491894Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4492199Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-25T02:16:39.4492470Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:16:39.4492786Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:16:39.4493141Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T02:16:39.4493439Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-25T02:16:39.4493727Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T02:16:39.4494002Z 131 │ │ isFinished: status.isFinished, 2026-10-25T02:16:39.4494343Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T02:16:39.4494625Z 133 │ │ error: status.error, 2026-10-25T02:16:39.4494839Z 134 │ │ url: status.url, 2026-10-25T02:16:39.4494924Z 135 │ │ }); 2026-10-25T02:16:39.4495004Z 136 │ │ }, 2026-10-25T02:16:39.4495196Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T02:16:39.4495306Z 138 │ │ selectInput: (inputs) => { 2026-10-25T02:16:39.4495463Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T02:16:39.4495612Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T02:16:39.4495786Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T02:16:39.4495926Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-25T02:16:39.4496030Z 143 │ │ if (order !== known) { 2026-10-25T02:16:39.4496168Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T02:16:39.4496285Z 145 │ │ transform: (current) => ({ 2026-10-25T02:16:39.4496486Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T02:16:39.4496576Z 147 │ │ }), 2026-10-25T02:16:39.4496660Z 148 │ │ }); 2026-10-25T02:16:39.4496739Z 149 │ │ } 2026-10-25T02:16:39.4496927Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-25T02:16:39.4497037Z 151 │ │ }, 2026-10-25T02:16:39.4497168Z 152 │ ├─▶ }); 2026-10-25T02:16:39.4497403Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4497485Z 153 │ recorderRef.current = recorder; 2026-10-25T02:16:39.4497540Z ╰──── 2026-10-25T02:16:39.4498001Z  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-25T02:16:39.4498293Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4498298Z 2026-10-25T02:16:39.4498443Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4498598Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-25T02:16:39.4498661Z 152 │ }); 2026-10-25T02:16:39.4498745Z 153 │ recorderRef.current = recorder; 2026-10-25T02:16:39.4498861Z ·  ─────┬─────────┬─── 2026-10-25T02:16:39.4499042Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4499162Z · ╰── This value is a ref 2026-10-25T02:16:39.4499267Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:16:39.4499322Z ╰──── 2026-10-25T02:16:39.4499777Z  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-25T02:16:39.4500065Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4500067Z 2026-10-25T02:16:39.4500210Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4500365Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-25T02:16:39.4500453Z 153 │ recorderRef.current = recorder; 2026-10-25T02:16:39.4500647Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:16:39.4500740Z 155 │ │ recorder, 2026-10-25T02:16:39.4500872Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T02:16:39.4500991Z 157 │ │ requestPermission: async () => { 2026-10-25T02:16:39.4501152Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T02:16:39.4501344Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T02:16:39.4501423Z 160 │ │ }, 2026-10-25T02:16:39.4501566Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T02:16:39.4501699Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T02:16:39.4501890Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T02:16:39.4502034Z 164 │ │ onStateChange: (nextState) => 2026-10-25T02:16:39.4502124Z 165 │ │ setState({ 2026-10-25T02:16:39.4502222Z 166 │ │ state: nextState, 2026-10-25T02:16:39.4502360Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T02:16:39.4502491Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-25T02:16:39.4502573Z 169 │ │ }), 2026-10-25T02:16:39.4502699Z 170 │ ├─▶ }); 2026-10-25T02:16:39.4502897Z · ╰──── Cannot access ref value during render 2026-10-25T02:16:39.4502957Z 171 │ } 2026-10-25T02:16:39.4503018Z ╰──── 2026-10-25T02:16:39.4503470Z  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-25T02:16:39.4503756Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4503758Z 2026-10-25T02:16:39.4503901Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4504057Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-25T02:16:39.4504139Z 153 │ recorderRef.current = recorder; 2026-10-25T02:16:39.4504267Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:16:39.4504385Z ·  ─────┬────────┬─── 2026-10-25T02:16:39.4504570Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4504688Z · ╰── This value is a ref 2026-10-25T02:16:39.4504751Z 155 │ recorder, 2026-10-25T02:16:39.4504806Z ╰──── 2026-10-25T02:16:39.4505261Z  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-25T02:16:39.4505545Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4505547Z 2026-10-25T02:16:39.4505695Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4505851Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-25T02:16:39.4505941Z 184 │ return () => subscription.remove(); 2026-10-25T02:16:39.4506015Z 185 │ }, [controller]); 2026-10-25T02:16:39.4506095Z ·  ─────┬──── 2026-10-25T02:16:39.4506239Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4506296Z 186 │ 2026-10-25T02:16:39.4506350Z ╰──── 2026-10-25T02:16:39.4506807Z  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-25T02:16:39.4507136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4507169Z 2026-10-25T02:16:39.4507309Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4507463Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-25T02:16:39.4507549Z 184 │ return () => subscription.remove(); 2026-10-25T02:16:39.4507616Z 185 │ }, [controller]); 2026-10-25T02:16:39.4507691Z ·  ──────┬───── 2026-10-25T02:16:39.4507835Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4507889Z 186 │ 2026-10-25T02:16:39.4507939Z ╰──── 2026-10-25T02:16:39.4508397Z  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-25T02:16:39.4508683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4508685Z 2026-10-25T02:16:39.4508825Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4508981Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-25T02:16:39.4509037Z 191 │ }, 2026-10-25T02:16:39.4509113Z 192 │ [controller, recorder], 2026-10-25T02:16:39.4509190Z ·  ─────┬──── 2026-10-25T02:16:39.4509334Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4509393Z 193 │ ); 2026-10-25T02:16:39.4509451Z ╰──── 2026-10-25T02:16:39.4509903Z  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-25T02:16:39.4510185Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4510188Z 2026-10-25T02:16:39.4510329Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4510481Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-25T02:16:39.4510574Z 174 │ const controller = session.controller; 2026-10-25T02:16:39.4510724Z 175 │ const recorder = recorderRef.current; 2026-10-25T02:16:39.4510834Z ·  ─────────┬───────── 2026-10-25T02:16:39.4510989Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4511044Z 176 │ 2026-10-25T02:16:39.4511098Z ╰──── 2026-10-25T02:16:39.4511548Z  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-25T02:16:39.4511828Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4511833Z 2026-10-25T02:16:39.4512037Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4512229Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-25T02:16:39.4512288Z 191 │ }, 2026-10-25T02:16:39.4512361Z 192 │ [controller, recorder], 2026-10-25T02:16:39.4512448Z ·  ───────────┬────────── 2026-10-25T02:16:39.4512595Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4512652Z 193 │ ); 2026-10-25T02:16:39.4512707Z ╰──── 2026-10-25T02:16:39.4513159Z  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-25T02:16:39.4513448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4513453Z 2026-10-25T02:16:39.4513594Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4513749Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-25T02:16:39.4513840Z 245 │ return () => clearInterval(intervalId); 2026-10-25T02:16:39.4513952Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T02:16:39.4514041Z ·  ─────┬──── 2026-10-25T02:16:39.4514206Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4514259Z 247 │ 2026-10-25T02:16:39.4514338Z ╰──── 2026-10-25T02:16:39.4514794Z  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-25T02:16:39.4515078Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4515081Z 2026-10-25T02:16:39.4515222Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4515373Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-25T02:16:39.4515464Z 245 │ return () => clearInterval(intervalId); 2026-10-25T02:16:39.4515574Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T02:16:39.4515703Z ·  ────────────────────────┬─────────────────────── 2026-10-25T02:16:39.4515865Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4515924Z 247 │ 2026-10-25T02:16:39.4515978Z ╰──── 2026-10-25T02:16:39.4516434Z  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-25T02:16:39.4516714Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4516719Z 2026-10-25T02:16:39.4516858Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4517011Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-25T02:16:39.4517080Z 260 │ setOwnerFocused, 2026-10-25T02:16:39.4517189Z 261 │ session, 2026-10-25T02:16:39.4517288Z ·  ───┬─── 2026-10-25T02:16:39.4517426Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4517488Z 262 │ stop, 2026-10-25T02:16:39.4517541Z ╰──── 2026-10-25T02:16:39.4517992Z  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-25T02:16:39.4518275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4518277Z 2026-10-25T02:16:39.4518423Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4518578Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-25T02:16:39.4518630Z 250 │ 2026-10-25T02:16:39.4518772Z 251 │ ╭─▶ return { 2026-10-25T02:16:39.4518983Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-25T02:16:39.4519064Z 253 │ │ state, 2026-10-25T02:16:39.4519151Z 254 │ │ audioLevels, 2026-10-25T02:16:39.4519246Z 255 │ │ elapsedSeconds, 2026-10-25T02:16:39.4519375Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-25T02:16:39.4519458Z 257 │ │ ownerKey, 2026-10-25T02:16:39.4519534Z 258 │ │ label, 2026-10-25T02:16:39.4519633Z 259 │ │ focusedOwners, 2026-10-25T02:16:39.4519729Z 260 │ │ setOwnerFocused, 2026-10-25T02:16:39.4519811Z 261 │ │ session, 2026-10-25T02:16:39.4519887Z 262 │ │ stop, 2026-10-25T02:16:39.4519968Z 263 │ │ cancel, 2026-10-25T02:16:39.4520098Z 264 │ ├─▶ }; 2026-10-25T02:16:39.4520296Z · ╰──── Cannot access ref value during render 2026-10-25T02:16:39.4520351Z 265 │ } 2026-10-25T02:16:39.4520405Z ╰──── 2026-10-25T02:16:39.4520912Z  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-25T02:16:39.4521234Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4521236Z 2026-10-25T02:16:39.4521394Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4521549Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-25T02:16:39.4521708Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T02:16:39.4521834Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T02:16:39.4521919Z ·  ─────┬───── 2026-10-25T02:16:39.4522051Z · ╰── `audioLevels` originates here 2026-10-25T02:16:39.4522177Z 123 │ const sessionRef = useRef(null); 2026-10-25T02:16:39.4522324Z 124 │ const recorderRef = useRef | null>(null); 2026-10-25T02:16:39.4522379Z 125 │ 2026-10-25T02:16:39.4522483Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:16:39.4522584Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:16:39.4522722Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T02:16:39.4522817Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-25T02:16:39.4522939Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T02:16:39.4523023Z 131 │ isFinished: status.isFinished, 2026-10-25T02:16:39.4523164Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T02:16:39.4523244Z 133 │ error: status.error, 2026-10-25T02:16:39.4523314Z 134 │ url: status.url, 2026-10-25T02:16:39.4523373Z 135 │ }); 2026-10-25T02:16:39.4523432Z 136 │ }, 2026-10-25T02:16:39.4523595Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T02:16:39.4523675Z 138 │ selectInput: (inputs) => { 2026-10-25T02:16:39.4523795Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T02:16:39.4523910Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T02:16:39.4524039Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T02:16:39.4524144Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-25T02:16:39.4524226Z 143 │ if (order !== known) { 2026-10-25T02:16:39.4524496Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T02:16:39.4524585Z 145 │ transform: (current) => ({ 2026-10-25T02:16:39.4524759Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T02:16:39.4524821Z 147 │ }), 2026-10-25T02:16:39.4524884Z 148 │ }); 2026-10-25T02:16:39.4524942Z 149 │ } 2026-10-25T02:16:39.4525048Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-25T02:16:39.4525105Z 151 │ }, 2026-10-25T02:16:39.4525160Z 152 │ }); 2026-10-25T02:16:39.4525243Z 153 │ recorderRef.current = recorder; 2026-10-25T02:16:39.4525340Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:16:39.4525404Z 155 │ recorder, 2026-10-25T02:16:39.4525502Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T02:16:39.4525585Z 157 │ requestPermission: async () => { 2026-10-25T02:16:39.4525763Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T02:16:39.4525949Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T02:16:39.4526006Z 160 │ }, 2026-10-25T02:16:39.4526115Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T02:16:39.4526216Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T02:16:39.4526318Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T02:16:39.4526398Z 164 │ onStateChange: (nextState) => 2026-10-25T02:16:39.4526462Z 165 │ setState({ 2026-10-25T02:16:39.4526530Z 166 │ state: nextState, 2026-10-25T02:16:39.4526633Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T02:16:39.4526731Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-25T02:16:39.4526795Z 169 │ }), 2026-10-25T02:16:39.4526851Z 170 │ }); 2026-10-25T02:16:39.4526905Z 171 │ } 2026-10-25T02:16:39.4526956Z 172 │ 2026-10-25T02:16:39.4527038Z 173 │ const session = sessionRef.current; 2026-10-25T02:16:39.4527122Z 174 │ const controller = session.controller; 2026-10-25T02:16:39.4527204Z 175 │ const recorder = recorderRef.current; 2026-10-25T02:16:39.4527256Z 176 │ 2026-10-25T02:16:39.4527320Z 177 │ useEffect(() => { 2026-10-25T02:16:39.4527466Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-25T02:16:39.4527602Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-25T02:16:39.4527737Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-25T02:16:39.4527837Z 181 │ // calls and route interruptions during capture. 2026-10-25T02:16:39.4527974Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-25T02:16:39.4528031Z 183 │ }); 2026-10-25T02:16:39.4528114Z 184 │ return () => subscription.remove(); 2026-10-25T02:16:39.4528176Z 185 │ }, [controller]); 2026-10-25T02:16:39.4528231Z 186 │ 2026-10-25T02:16:39.4528291Z 187 │ useEffect( 2026-10-25T02:16:39.4528353Z 188 │ () => () => { 2026-10-25T02:16:39.4528422Z 189 │ controller.dispose(); 2026-10-25T02:16:39.4528489Z 190 │ recorder.release(); 2026-10-25T02:16:39.4528543Z 191 │ }, 2026-10-25T02:16:39.4528611Z 192 │ [controller, recorder], 2026-10-25T02:16:39.4528662Z 193 │ ); 2026-10-25T02:16:39.4528713Z 194 │ 2026-10-25T02:16:39.4528775Z 195 │ useEffect(() => { 2026-10-25T02:16:39.4528866Z 196 │ if (state.phase !== "recording") return; 2026-10-25T02:16:39.4528916Z 197 │ 2026-10-25T02:16:39.4529066Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-25T02:16:39.4529170Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-25T02:16:39.4529247Z 200 │ void activation.catch(() => {}); 2026-10-25T02:16:39.4529309Z 201 │ return () => { 2026-10-25T02:16:39.4529455Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-25T02:16:39.4529590Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-25T02:16:39.4529642Z 204 │ }; 2026-10-25T02:16:39.4529719Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-25T02:16:39.4529769Z 206 │ 2026-10-25T02:16:39.4529831Z 207 │ useEffect(() => { 2026-10-25T02:16:39.4529961Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T02:16:39.4530011Z 209 │ 2026-10-25T02:16:39.4530181Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T02:16:39.4530370Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T02:16:39.4530469Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T02:16:39.4530545Z ·  ─────┬───── 2026-10-25T02:16:39.4530682Z · ╰── `audioLevels` cannot be modified 2026-10-25T02:16:39.4530735Z 213 │ } 2026-10-25T02:16:39.4530784Z ╰──── 2026-10-25T02:16:39.4531046Z  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-25T02:16:39.4531345Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4531348Z 2026-10-25T02:16:39.4531551Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:16:39.4531708Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-25T02:16:39.4531759Z 206 │ 2026-10-25T02:16:39.4531821Z 207 │ useEffect(() => { 2026-10-25T02:16:39.4531897Z ·  ───┬─── 2026-10-25T02:16:39.4532111Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-25T02:16:39.4532244Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T02:16:39.4532295Z 209 │ 2026-10-25T02:16:39.4532412Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T02:16:39.4532568Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T02:16:39.4532669Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T02:16:39.4532745Z ·  ─────┬───── 2026-10-25T02:16:39.4532874Z · ╰── This modifies `audioLevels` 2026-10-25T02:16:39.4532928Z 213 │ } 2026-10-25T02:16:39.4532977Z ╰──── 2026-10-25T02:16:39.4533308Z  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-25T02:16:39.4533604Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4533607Z 2026-10-25T02:16:39.4533887Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4534030Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12629:7] 2026-10-25T02:16:39.4534084Z 12628 │ 2026-10-25T02:16:39.4534235Z 12629 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-25T02:16:39.4534366Z ·  ────────┬─────── 2026-10-25T02:16:39.4534511Z · ╰── 'layerUnavailable' is declared here 2026-10-25T02:16:39.4534576Z 12630 │ OrchestratorV2, 2026-10-25T02:16:39.4534627Z ╰──── 2026-10-25T02:16:39.4534730Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4534732Z 2026-10-25T02:16:39.4534955Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-25T02:16:39.4535166Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-25T02:16:39.4535262Z 1397 │ 2026-10-25T02:16:39.4535349Z 1398 │ function assertUserMessagesExclude( 2026-10-25T02:16:39.4535450Z ·  ────────────┬──────────── 2026-10-25T02:16:39.4535618Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-25T02:16:39.4535724Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-25T02:16:39.4535775Z ╰──── 2026-10-25T02:16:39.4535874Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4535878Z 2026-10-25T02:16:39.4536028Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4536192Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-25T02:16:39.4536246Z 90 │ }) { 2026-10-25T02:16:39.4536363Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-25T02:16:39.4536437Z ·  ────┬─── 2026-10-25T02:16:39.4536565Z · ╰── `rotation` originates here 2026-10-25T02:16:39.4536634Z 92 │ useLayoutEffect(() => { 2026-10-25T02:16:39.4536774Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-25T02:16:39.4536843Z ·  ────┬─── 2026-10-25T02:16:39.4536974Z · ╰── `rotation` cannot be modified 2026-10-25T02:16:39.4537049Z 94 │ }, [props.hidden, rotation]); 2026-10-25T02:16:39.4537101Z ╰──── 2026-10-25T02:16:39.4537357Z  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-25T02:16:39.4537663Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4537668Z 2026-10-25T02:16:39.4537819Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4537986Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-25T02:16:39.4538077Z 266 │ const variant = props.variant ?? "plain"; 2026-10-25T02:16:39.4538211Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-25T02:16:39.4538298Z ·  ────────┬──────── 2026-10-25T02:16:39.4538445Z · ╰── `loadingVisibility` originates here 2026-10-25T02:16:39.4538513Z 268 │ useLayoutEffect(() => { 2026-10-25T02:16:39.4538676Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-25T02:16:39.4538761Z ·  ────────┬──────── 2026-10-25T02:16:39.4538908Z · ╰── `loadingVisibility` cannot be modified 2026-10-25T02:16:39.4538997Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-25T02:16:39.4539052Z ╰──── 2026-10-25T02:16:39.4539308Z  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-25T02:16:39.4539607Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4539609Z 2026-10-25T02:16:39.4539761Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4539977Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-25T02:16:39.4540060Z 325 │ }) { 2026-10-25T02:16:39.4540218Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-25T02:16:39.4540306Z ·  ─────────┬───────── 2026-10-25T02:16:39.4540455Z · ╰── `recordingVisibility` originates here 2026-10-25T02:16:39.4540525Z 327 │ useLayoutEffect(() => { 2026-10-25T02:16:39.4540709Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-25T02:16:39.4540794Z ·  ─────────┬───────── 2026-10-25T02:16:39.4540944Z · ╰── `recordingVisibility` cannot be modified 2026-10-25T02:16:39.4541035Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-25T02:16:39.4541092Z ╰──── 2026-10-25T02:16:39.4541353Z  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-25T02:16:39.4541648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4541651Z 2026-10-25T02:16:39.4541944Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4542105Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-25T02:16:39.4542158Z 345 │ 2026-10-25T02:16:39.4542259Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-25T02:16:39.4542351Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4542520Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-25T02:16:39.4542600Z 347 │ ProviderAdapterRegistryV2, 2026-10-25T02:16:39.4542653Z ╰──── 2026-10-25T02:16:39.4542753Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4542756Z 2026-10-25T02:16:39.4542955Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:16:39.4543117Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-25T02:16:39.4543191Z 3 │ AuthProvidersManageScope, 2026-10-25T02:16:39.4543259Z 4 │ type AuthSessionState, 2026-10-25T02:16:39.4543342Z ·  ────────┬─────── 2026-10-25T02:16:39.4543485Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:16:39.4543599Z 5 │ type EnvironmentId, 2026-10-25T02:16:39.4543682Z ╰──── 2026-10-25T02:16:39.4543780Z  help: Consider removing this import. 2026-10-25T02:16:39.4543783Z 2026-10-25T02:16:39.4544248Z ⚠ 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-25T02:16:39.4544441Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-25T02:16:39.4544540Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-25T02:16:39.4544736Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-25T02:16:39.4544838Z 567 │ │ const nextEvent = { 2026-10-25T02:16:39.4544999Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-25T02:16:39.4545133Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-25T02:16:39.4545224Z 570 │ │ threadId, 2026-10-25T02:16:39.4545329Z 571 │ │ providerInstanceId, 2026-10-25T02:16:39.4545427Z 572 │ │ occurredAt: now, 2026-10-25T02:16:39.4545571Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-25T02:16:39.4545700Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-25T02:16:39.4545815Z 575 │ │ const reader = yield* eventSink 2026-10-25T02:16:39.4545934Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-25T02:16:39.4546069Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-25T02:16:39.4546175Z 578 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4546337Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-25T02:16:39.4546465Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-25T02:16:39.4546578Z 581 │ │ if (Option.isNone(received)) { 2026-10-25T02:16:39.4546773Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-25T02:16:39.4546851Z 583 │ │ } 2026-10-25T02:16:39.4547008Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-25T02:16:39.4547157Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-25T02:16:39.4547282Z 586 │ │ afterSequence = received.value.sequence; 2026-10-25T02:16:39.4547410Z 587 │ ╰─▶ } 2026-10-25T02:16:39.4547469Z 588 │ }), 2026-10-25T02:16:39.4547522Z ╰──── 2026-10-25T02:16:39.4547524Z 2026-10-25T02:16:39.4547972Z ⚠ 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-25T02:16:39.4548142Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-25T02:16:39.4548218Z 2326 │ let settled = false; 2026-10-25T02:16:39.4548423Z 2327 │ ╭─▶ while (!settled) { 2026-10-25T02:16:39.4548609Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-25T02:16:39.4548738Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-25T02:16:39.4548818Z 2330 │ │ ); 2026-10-25T02:16:39.4548941Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-25T02:16:39.4549075Z 2332 │ ╰─▶ } 2026-10-25T02:16:39.4549191Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-25T02:16:39.4549244Z ╰──── 2026-10-25T02:16:39.4549246Z 2026-10-25T02:16:39.4549448Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-25T02:16:39.4549613Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-25T02:16:39.4549699Z 24 │ import * as Schema from "effect/Schema"; 2026-10-25T02:16:39.4549814Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-25T02:16:39.4549896Z ·  ─────┬───── 2026-10-25T02:16:39.4550035Z · ╰── 'HostProcess' is imported here 2026-10-25T02:16:39.4550087Z 26 │ 2026-10-25T02:16:39.4550137Z ╰──── 2026-10-25T02:16:39.4550232Z  help: Consider removing this import. 2026-10-25T02:16:39.4550235Z 2026-10-25T02:16:39.4550502Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4550677Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-25T02:16:39.4550815Z 123 │ const path = yield* Path.Path; 2026-10-25T02:16:39.4550931Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T02:16:39.4551013Z ·  ──────┬───── 2026-10-25T02:16:39.4551148Z · ╰── 'serverConfig' is declared here 2026-10-25T02:16:39.4551290Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T02:16:39.4551343Z ╰──── 2026-10-25T02:16:39.4551446Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4551449Z 2026-10-25T02:16:39.4551717Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4551881Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-25T02:16:39.4552003Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T02:16:39.4552142Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T02:16:39.4552225Z ·  ───────┬────── 2026-10-25T02:16:39.4552364Z · ╰── 'serverSettings' is declared here 2026-10-25T02:16:39.4552500Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-25T02:16:39.4552551Z ╰──── 2026-10-25T02:16:39.4552653Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4552655Z 2026-10-25T02:16:39.4552820Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4552953Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-25T02:16:39.4553146Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-25T02:16:39.4553333Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-25T02:16:39.4553455Z ·  ─────┬──── 2026-10-25T02:16:39.4553622Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4553719Z 141 │ onSelect={(selected) => { 2026-10-25T02:16:39.4553770Z ╰──── 2026-10-25T02:16:39.4554041Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4554366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4554371Z 2026-10-25T02:16:39.4554571Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4554728Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:167:7] 2026-10-25T02:16:39.4554784Z 166 │ } 2026-10-25T02:16:39.4554853Z 167 │ }, [wrappedRender]); 2026-10-25T02:16:39.4554933Z ·  ──────┬────── 2026-10-25T02:16:39.4555080Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-25T02:16:39.4555134Z 168 │ 2026-10-25T02:16:39.4555184Z ╰──── 2026-10-25T02:16:39.4555474Z  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-25T02:16:39.4555787Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4555792Z 2026-10-25T02:16:39.4556030Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:16:39.4556188Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:843:42] 2026-10-25T02:16:39.4556244Z 842 │ > 2026-10-25T02:16:39.4556370Z 843 │ 2026-10-25T02:16:39.4556491Z ·  ──────────────────── 2026-10-25T02:16:39.4556588Z 844 │ 2026-10-25T02:16:39.4556640Z ╰──── 2026-10-25T02:16:39.4556864Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:16:39.4557006Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:16:39.4557009Z 2026-10-25T02:16:39.4557161Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4557317Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-25T02:16:39.4557372Z 35 │ 2026-10-25T02:16:39.4557509Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-25T02:16:39.4557597Z ·  ────────┬──────── 2026-10-25T02:16:39.4557738Z · ╰── `inspectorProgress` originates here 2026-10-25T02:16:39.4557833Z 37 │ const { renderedInspectorWidth } = props; 2026-10-25T02:16:39.4558014Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T02:16:39.4558095Z 39 │ 2026-10-25T02:16:39.4558173Z 40 │ const onClosed = props.onClosed; 2026-10-25T02:16:39.4558239Z 41 │ useEffect(() => { 2026-10-25T02:16:39.4558328Z 42 │ inspectorProgress.value = withTiming( 2026-10-25T02:16:39.4558410Z ·  ────────┬──────── 2026-10-25T02:16:39.4558557Z · ╰── `inspectorProgress` cannot be modified 2026-10-25T02:16:39.4558636Z 43 │ inspectorVisible ? 1 : 0, 2026-10-25T02:16:39.4558689Z ╰──── 2026-10-25T02:16:39.4558949Z  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-25T02:16:39.4559253Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4559258Z 2026-10-25T02:16:39.4559414Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4559572Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-25T02:16:39.4559665Z 37 │ const { renderedInspectorWidth } = props; 2026-10-25T02:16:39.4559794Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T02:16:39.4559884Z ·  ──────────┬───────── 2026-10-25T02:16:39.4560037Z · ╰── `renderedContentWidth` originates here 2026-10-25T02:16:39.4560091Z 39 │ 2026-10-25T02:16:39.4560168Z 40 │ const onClosed = props.onClosed; 2026-10-25T02:16:39.4560233Z 41 │ useEffect(() => { 2026-10-25T02:16:39.4560322Z 42 │ inspectorProgress.value = withTiming( 2026-10-25T02:16:39.4560404Z 43 │ inspectorVisible ? 1 : 0, 2026-10-25T02:16:39.4560476Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-25T02:16:39.4560544Z 45 │ (finished) => { 2026-10-25T02:16:39.4560689Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-25T02:16:39.4560763Z 47 │ runOnJS(onClosed)(); 2026-10-25T02:16:39.4560819Z 48 │ } 2026-10-25T02:16:39.4560876Z 49 │ }, 2026-10-25T02:16:39.4560932Z 50 │ ); 2026-10-25T02:16:39.4561060Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-25T02:16:39.4561136Z 52 │ renderedInspectorWidth.set( 2026-10-25T02:16:39.4561278Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-25T02:16:39.4561334Z 54 │ ); 2026-10-25T02:16:39.4561387Z 55 │ }, [ 2026-10-25T02:16:39.4561462Z 56 │ inspectorProgress, 2026-10-25T02:16:39.4561530Z 57 │ inspectorVisible, 2026-10-25T02:16:39.4561596Z 58 │ inspectorWidth, 2026-10-25T02:16:39.4561654Z 59 │ onClosed, 2026-10-25T02:16:39.4561728Z 60 │ renderedInspectorWidth, 2026-10-25T02:16:39.4561789Z 61 │ resizing, 2026-10-25T02:16:39.4561845Z 62 │ ]); 2026-10-25T02:16:39.4561896Z 63 │ 2026-10-25T02:16:39.4561959Z 64 │ useEffect(() => { 2026-10-25T02:16:39.4562051Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-25T02:16:39.4562135Z 66 │ if (!inspectorVisible || resizing) { 2026-10-25T02:16:39.4562231Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-25T02:16:39.4562320Z ·  ──────────┬───────── 2026-10-25T02:16:39.4562478Z · ╰── `renderedContentWidth` cannot be modified 2026-10-25T02:16:39.4562540Z 68 │ return; 2026-10-25T02:16:39.4562643Z ╰──── 2026-10-25T02:16:39.4562934Z  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-25T02:16:39.4563233Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4563236Z 2026-10-25T02:16:39.4563421Z ⚠ react(static-components): Cannot create components during render 2026-10-25T02:16:39.4563577Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-25T02:16:39.4563665Z 196 │ const { onInput, onResize } = props; 2026-10-25T02:16:39.4563813Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-25T02:16:39.4563948Z ·  ────────────────┬─────────────── 2026-10-25T02:16:39.4564135Z · ╰── The component is created during render here 2026-10-25T02:16:39.4564295Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-25T02:16:39.4564352Z 199 │ 2026-10-25T02:16:39.4564418Z 200 │ useEffect(() => { 2026-10-25T02:16:39.4564504Z 201 │ terminalDebugLog("native:surface", { 2026-10-25T02:16:39.4564592Z 202 │ terminalKey: props.terminalKey, 2026-10-25T02:16:39.4564669Z 203 │ native: hasNativeSurface, 2026-10-25T02:16:39.4564803Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-25T02:16:39.4564885Z 205 │ bufferLen: props.buffer.length, 2026-10-25T02:16:39.4564964Z 206 │ isRunning: props.isRunning, 2026-10-25T02:16:39.4565024Z 207 │ }); 2026-10-25T02:16:39.4565190Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-25T02:16:39.4565282Z 209 │ const handleNativeInput = useCallback( 2026-10-25T02:16:39.4565399Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-25T02:16:39.4565498Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-25T02:16:39.4565563Z 212 │ return; 2026-10-25T02:16:39.4565617Z 213 │ } 2026-10-25T02:16:39.4565708Z 214 │ terminalDebugLog("native:onInput", { 2026-10-25T02:16:39.4565861Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-25T02:16:39.4565921Z 216 │ }); 2026-10-25T02:16:39.4566005Z 217 │ onInput(event.nativeEvent.data); 2026-10-25T02:16:39.4566063Z 218 │ }, 2026-10-25T02:16:39.4566161Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-25T02:16:39.4566222Z 220 │ ); 2026-10-25T02:16:39.4566311Z 221 │ const handleNativeResize = useCallback( 2026-10-25T02:16:39.4566426Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-25T02:16:39.4566490Z 223 │ onResize({ 2026-10-25T02:16:39.4566573Z 224 │ cols: event.nativeEvent.cols, 2026-10-25T02:16:39.4566652Z 225 │ rows: event.nativeEvent.rows, 2026-10-25T02:16:39.4566712Z 226 │ }); 2026-10-25T02:16:39.4566769Z 227 │ }, 2026-10-25T02:16:39.4566830Z 228 │ [onResize], 2026-10-25T02:16:39.4566887Z 229 │ ); 2026-10-25T02:16:39.4566940Z 230 │ 2026-10-25T02:16:39.4567022Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-25T02:16:39.4567080Z 232 │ return ( 2026-10-25T02:16:39.4567158Z 233 │ 2026-10-25T02:16:39.4567238Z 234 │ { 2026-10-25T02:16:39.4569014Z ·  ────┬──── 2026-10-25T02:16:39.4569143Z · ╰── This is the containing effect 2026-10-25T02:16:39.4569253Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-25T02:16:39.4569313Z 641 │ return; 2026-10-25T02:16:39.4569369Z 642 │ } 2026-10-25T02:16:39.4569442Z 643 │ setPendingLaunchEntry({ 2026-10-25T02:16:39.4569529Z ·  ──────────┬────────── 2026-10-25T02:16:39.4569698Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4569769Z 644 │ key: launchTargetKey, 2026-10-25T02:16:39.4569821Z ╰──── 2026-10-25T02:16:39.4570417Z  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-25T02:16:39.4570733Z  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-25T02:16:39.4570736Z 2026-10-25T02:16:39.4570988Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4571156Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-25T02:16:39.4571209Z 648 │ 2026-10-25T02:16:39.4571321Z 649 │ useEffect(() => { 2026-10-25T02:16:39.4571417Z ·  ────┬──── 2026-10-25T02:16:39.4571545Z · ╰── This is the containing effect 2026-10-25T02:16:39.4571660Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-25T02:16:39.4571722Z 651 │ return; 2026-10-25T02:16:39.4571774Z 652 │ } 2026-10-25T02:16:39.4571855Z 653 │ setInitialAttachGridEntry({ 2026-10-25T02:16:39.4571948Z ·  ────────────┬──────────── 2026-10-25T02:16:39.4572118Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4572185Z 654 │ key: launchTargetKey, 2026-10-25T02:16:39.4572241Z ╰──── 2026-10-25T02:16:39.4572829Z  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-25T02:16:39.4573146Z  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-25T02:16:39.4573149Z 2026-10-25T02:16:39.4573402Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4573564Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-25T02:16:39.4573618Z 743 │ 2026-10-25T02:16:39.4573683Z 744 │ useEffect(() => { 2026-10-25T02:16:39.4573754Z ·  ────┬──── 2026-10-25T02:16:39.4573881Z · ╰── This is the containing effect 2026-10-25T02:16:39.4573985Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-25T02:16:39.4574055Z 746 │ setLastGridSize({ 2026-10-25T02:16:39.4574137Z ·  ───────┬─────── 2026-10-25T02:16:39.4574339Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4574421Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-25T02:16:39.4574473Z ╰──── 2026-10-25T02:16:39.4575051Z  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-25T02:16:39.4575366Z  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-25T02:16:39.4575374Z 2026-10-25T02:16:39.4575569Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4575738Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-25T02:16:39.4575795Z 537 │ }); 2026-10-25T02:16:39.4575917Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-25T02:16:39.4576024Z ·  ───────────┬────────── 2026-10-25T02:16:39.4576266Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-25T02:16:39.4576474Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-25T02:16:39.4576565Z ╰──── 2026-10-25T02:16:39.4576850Z  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-25T02:16:39.4577156Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4577159Z 2026-10-25T02:16:39.4577355Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4577521Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-25T02:16:39.4577618Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-25T02:16:39.4577683Z 709 │ }, [terminalKey]); 2026-10-25T02:16:39.4577766Z ·  ─────┬───── 2026-10-25T02:16:39.4577910Z · ╰── Unnecessary dependency `terminalKey` 2026-10-25T02:16:39.4577965Z 710 │ 2026-10-25T02:16:39.4578016Z ╰──── 2026-10-25T02:16:39.4578300Z  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-25T02:16:39.4578600Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4578603Z 2026-10-25T02:16:39.4578797Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4578959Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-25T02:16:39.4579017Z 799 │ }; 2026-10-25T02:16:39.4579198Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-25T02:16:39.4579377Z ·  ────────────┬──────────── ─────┬───── 2026-10-25T02:16:39.4579607Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-25T02:16:39.4579810Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-25T02:16:39.4579865Z 801 │ 2026-10-25T02:16:39.4579920Z ╰──── 2026-10-25T02:16:39.4580202Z  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-25T02:16:39.4580508Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4580513Z 2026-10-25T02:16:39.4580656Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4580822Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-25T02:16:39.4580877Z 792 │ } 2026-10-25T02:16:39.4580979Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-25T02:16:39.4581091Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4581252Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4581306Z 794 │ 2026-10-25T02:16:39.4581355Z ╰──── 2026-10-25T02:16:39.4581857Z  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-25T02:16:39.4582171Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4582173Z 2026-10-25T02:16:39.4582367Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-25T02:16:39.4582531Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1850:8] 2026-10-25T02:16:39.4582596Z 1849 │ assert.equal( 2026-10-25T02:16:39.4582740Z 1850 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-25T02:16:39.4582848Z ·  ────────────────────────── 2026-10-25T02:16:39.4582931Z 1851 │ stored.attachments[0]?.id, 2026-10-25T02:16:39.4582982Z ╰──── 2026-10-25T02:16:39.4583152Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-25T02:16:39.4583155Z 2026-10-25T02:16:39.4583345Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4583500Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-25T02:16:39.4583564Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-25T02:16:39.4585802Z 113 │ useEffect(() => { 2026-10-25T02:16:39.4585875Z ·  ────┬──── 2026-10-25T02:16:39.4586005Z · ╰── This is the containing effect 2026-10-25T02:16:39.4586167Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-25T02:16:39.4586228Z 115 │ return; 2026-10-25T02:16:39.4586285Z 116 │ } 2026-10-25T02:16:39.4586446Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-25T02:16:39.4586549Z ·  ────┬─── 2026-10-25T02:16:39.4586712Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4586833Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-25T02:16:39.4586887Z ╰──── 2026-10-25T02:16:39.4587468Z  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-25T02:16:39.4587784Z  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-25T02:16:39.4587791Z 2026-10-25T02:16:39.4588019Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-25T02:16:39.4588143Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-25T02:16:39.4588322Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-25T02:16:39.4588417Z 35 │ instanceId === configured ? true : false, 2026-10-25T02:16:39.4588528Z ·  ──────────────────────────────────────── 2026-10-25T02:16:39.4588585Z 36 │ ); 2026-10-25T02:16:39.4588638Z ╰──── 2026-10-25T02:16:39.4588732Z  help: Remove this ternary operator 2026-10-25T02:16:39.4588735Z 2026-10-25T02:16:39.4588980Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-25T02:16:39.4589093Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-25T02:16:39.4589148Z 55 │ 2026-10-25T02:16:39.4589248Z 56 │ function normalizeTerminalContextSelection( 2026-10-25T02:16:39.4589353Z ·  ────────────────┬──────────────── 2026-10-25T02:16:39.4589546Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-25T02:16:39.4589635Z 57 │ selection: TerminalContextSelection, 2026-10-25T02:16:39.4589686Z ╰──── 2026-10-25T02:16:39.4589788Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4589791Z 2026-10-25T02:16:39.4589995Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:16:39.4590125Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-25T02:16:39.4590250Z 89 │ let cursor = prompt.length; 2026-10-25T02:16:39.4590379Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-25T02:16:39.4590481Z ·  ─────── 2026-10-25T02:16:39.4590561Z 91 │ let { start, end } = occurrence; 2026-10-25T02:16:39.4590613Z ╰──── 2026-10-25T02:16:39.4590913Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:16:39.4590918Z 2026-10-25T02:16:39.4591118Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:16:39.4591239Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-25T02:16:39.4591292Z 40 │ 2026-10-25T02:16:39.4591404Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-25T02:16:39.4591511Z ·  ─────── 2026-10-25T02:16:39.4591607Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-25T02:16:39.4591658Z ╰──── 2026-10-25T02:16:39.4591910Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:16:39.4591912Z 2026-10-25T02:16:39.4592162Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4592326Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-25T02:16:39.4592382Z 409 │ 2026-10-25T02:16:39.4592508Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-25T02:16:39.4592577Z ·  ──┬── 2026-10-25T02:16:39.4592709Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4592768Z ╰──── 2026-10-25T02:16:39.4592870Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4592873Z 2026-10-25T02:16:39.4593330Z ⚠ 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-25T02:16:39.4593451Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-25T02:16:39.4593528Z 138 │ Effect.gen(function* () { 2026-10-25T02:16:39.4593721Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-25T02:16:39.4593850Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-25T02:16:39.4594167Z 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-25T02:16:39.4594380Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-25T02:16:39.4594509Z 143 │ ╰─▶ } 2026-10-25T02:16:39.4594596Z 144 │ return yield* Fiber.join(fiber); 2026-10-25T02:16:39.4594647Z ╰──── 2026-10-25T02:16:39.4594649Z 2026-10-25T02:16:39.4594816Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4594954Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-25T02:16:39.4595010Z 185 │ 2026-10-25T02:16:39.4595170Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-25T02:16:39.4595280Z ·  ── 2026-10-25T02:16:39.4595335Z 187 │ } 2026-10-25T02:16:39.4595389Z ╰──── 2026-10-25T02:16:39.4595613Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4595616Z 2026-10-25T02:16:39.4595781Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4595917Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-25T02:16:39.4595970Z 188 │ 2026-10-25T02:16:39.4596034Z 189 │ for (const {} of [ 2026-10-25T02:16:39.4596104Z ·  ── 2026-10-25T02:16:39.4596195Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-25T02:16:39.4596249Z ╰──── 2026-10-25T02:16:39.4596473Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4596478Z 2026-10-25T02:16:39.4596642Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4596782Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-25T02:16:39.4596836Z 310 │ 2026-10-25T02:16:39.4596961Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-25T02:16:39.4597033Z ·  ── 2026-10-25T02:16:39.4597087Z 312 │ } 2026-10-25T02:16:39.4597140Z ╰──── 2026-10-25T02:16:39.4597356Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4597358Z 2026-10-25T02:16:39.4597527Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4597663Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-25T02:16:39.4597717Z 313 │ 2026-10-25T02:16:39.4597779Z 314 │ for (const {} of [ 2026-10-25T02:16:39.4597849Z ·  ── 2026-10-25T02:16:39.4597906Z 315 │ { 2026-10-25T02:16:39.4597958Z ╰──── 2026-10-25T02:16:39.4598176Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4598178Z 2026-10-25T02:16:39.4598341Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-25T02:16:39.4598497Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-25T02:16:39.4598551Z 1436 │ 2026-10-25T02:16:39.4598615Z 1437 │ for (const [] of [ 2026-10-25T02:16:39.4598692Z ·  ── 2026-10-25T02:16:39.4598768Z 1438 │ ["github", "github.com"], 2026-10-25T02:16:39.4598822Z ╰──── 2026-10-25T02:16:39.4599093Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-25T02:16:39.4599095Z 2026-10-25T02:16:39.4599328Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-25T02:16:39.4599453Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-25T02:16:39.4599555Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-25T02:16:39.4599694Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-25T02:16:39.4599779Z ·  ─────────────── 2026-10-25T02:16:39.4599885Z 518 │ ) 2026-10-25T02:16:39.4599970Z ╰──── 2026-10-25T02:16:39.4600118Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-25T02:16:39.4600122Z 2026-10-25T02:16:39.4600470Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:16:39.4600604Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-25T02:16:39.4600739Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-25T02:16:39.4600889Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-25T02:16:39.4601002Z ·  ─────────────────── 2026-10-25T02:16:39.4601068Z 1787 │ cwd, 2026-10-25T02:16:39.4601127Z ╰──── 2026-10-25T02:16:39.4601131Z 2026-10-25T02:16:39.4601408Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:16:39.4601559Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-25T02:16:39.4601620Z 162 │ keys, 2026-10-25T02:16:39.4601695Z 163 │ overridingProjects = [], 2026-10-25T02:16:39.4601778Z ·  ── 2026-10-25T02:16:39.4601842Z 164 │ onClearOverrides, 2026-10-25T02:16:39.4601897Z ╰──── 2026-10-25T02:16:39.4602205Z  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-25T02:16:39.4602208Z 2026-10-25T02:16:39.4602575Z ⚠ 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-25T02:16:39.4602701Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-25T02:16:39.4602846Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-25T02:16:39.4603000Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-25T02:16:39.4603122Z ·  ────────────────────────── 2026-10-25T02:16:39.4603239Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-25T02:16:39.4603290Z ╰──── 2026-10-25T02:16:39.4603292Z 2026-10-25T02:16:39.4603739Z ⚠ 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-25T02:16:39.4603871Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-25T02:16:39.4604008Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-25T02:16:39.4604218Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-25T02:16:39.4604334Z ·  ─────────────────── 2026-10-25T02:16:39.4604428Z 1013 │ expect(encoded).not.toContain(url); 2026-10-25T02:16:39.4604481Z ╰──── 2026-10-25T02:16:39.4604483Z 2026-10-25T02:16:39.4604688Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T02:16:39.4604899Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-25T02:16:39.4605007Z 14 │ } from "@t3tools/contracts"; 2026-10-25T02:16:39.4605097Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-25T02:16:39.4605168Z ·  ── 2026-10-25T02:16:39.4605220Z 16 │ 2026-10-25T02:16:39.4605274Z ╰──── 2026-10-25T02:16:39.4605357Z  help: Remove empty braces 2026-10-25T02:16:39.4605359Z 2026-10-25T02:16:39.4605622Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4605736Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-25T02:16:39.4605793Z 168 │ 2026-10-25T02:16:39.4605871Z 169 │ const layerTest = Layer.succeed( 2026-10-25T02:16:39.4605943Z ·  ────┬──── 2026-10-25T02:16:39.4606084Z · ╰── 'layerTest' is declared here 2026-10-25T02:16:39.4606153Z 170 │ UsageService, 2026-10-25T02:16:39.4606208Z ╰──── 2026-10-25T02:16:39.4606311Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4606317Z 2026-10-25T02:16:39.4606771Z ⚠ 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-25T02:16:39.4606901Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-25T02:16:39.4606998Z 2614 │ let orphanedAt: number | undefined; 2026-10-25T02:16:39.4607228Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-25T02:16:39.4607352Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-25T02:16:39.4607506Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-25T02:16:39.4607639Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-25T02:16:39.4607744Z 2619 │ │ flush: () => { 2026-10-25T02:16:39.4607866Z 2620 │ │ let task: (() => void) | undefined; 2026-10-25T02:16:39.4608016Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-25T02:16:39.4608101Z 2622 │ │ }, 2026-10-25T02:16:39.4608183Z 2623 │ │ }; 2026-10-25T02:16:39.4608252Z 2624 │ │ 2026-10-25T02:16:39.4608420Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-25T02:16:39.4608531Z 2626 │ │ let requestChecks = 0; 2026-10-25T02:16:39.4608662Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-25T02:16:39.4608769Z 2628 │ │ executionMode: "async", 2026-10-25T02:16:39.4608889Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-25T02:16:39.4609001Z 2630 │ │ shouldYield: (fiber) => { 2026-10-25T02:16:39.4609135Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-25T02:16:39.4609238Z 2632 │ │ requestChecks += 1; 2026-10-25T02:16:39.4609383Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-25T02:16:39.4609499Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-25T02:16:39.4609647Z 2635 │ │ return true; 2026-10-25T02:16:39.4609761Z 2636 │ │ }, 2026-10-25T02:16:39.4609838Z 2637 │ │ }; 2026-10-25T02:16:39.4609909Z 2638 │ │ 2026-10-25T02:16:39.4610030Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-25T02:16:39.4610122Z 2640 │ │ ...WINDOW, 2026-10-25T02:16:39.4610250Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-25T02:16:39.4610449Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-25T02:16:39.4610532Z 2643 │ │ }; 2026-10-25T02:16:39.4610647Z 2644 │ │ const first = yield* service 2026-10-25T02:16:39.4610756Z 2645 │ │ .readSummary(input) 2026-10-25T02:16:39.4610850Z 2646 │ │ .pipe( 2026-10-25T02:16:39.4610948Z 2647 │ │ Effect.exit, 2026-10-25T02:16:39.4611108Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T02:16:39.4611210Z 2649 │ │ Effect.forkChild, 2026-10-25T02:16:39.4611292Z 2650 │ │ ); 2026-10-25T02:16:39.4611394Z 2651 │ │ requestFiber = first; 2026-10-25T02:16:39.4611501Z 2652 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4611603Z 2653 │ │ dispatcher.flush(); 2026-10-25T02:16:39.4611676Z 2654 │ │ 2026-10-25T02:16:39.4611831Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-25T02:16:39.4611932Z 2656 │ │ Effect.match({ 2026-10-25T02:16:39.4612052Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-25T02:16:39.4612176Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-25T02:16:39.4612260Z 2659 │ │ }), 2026-10-25T02:16:39.4612416Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T02:16:39.4612516Z 2661 │ │ Effect.forkChild, 2026-10-25T02:16:39.4612597Z 2662 │ │ ); 2026-10-25T02:16:39.4612703Z 2663 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4612804Z 2664 │ │ dispatcher.flush(); 2026-10-25T02:16:39.4612934Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-25T02:16:39.4613053Z 2666 │ │ if (secondExit === undefined) { 2026-10-25T02:16:39.4613168Z 2667 │ │ second.interruptUnsafe(); 2026-10-25T02:16:39.4613279Z 2668 │ │ orphanedAt = interruptAt; 2026-10-25T02:16:39.4613366Z 2669 │ │ break; 2026-10-25T02:16:39.4613448Z 2670 │ │ } 2026-10-25T02:16:39.4613571Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-25T02:16:39.4613731Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-25T02:16:39.4613808Z 2673 │ │ } 2026-10-25T02:16:39.4614007Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-25T02:16:39.4614215Z 2675 │ ╰─▶ } 2026-10-25T02:16:39.4614273Z 2676 │ 2026-10-25T02:16:39.4614323Z ╰──── 2026-10-25T02:16:39.4614326Z 2026-10-25T02:16:39.4614548Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:16:39.4614686Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-25T02:16:39.4614755Z 20 │ [instanceId]: { 2026-10-25T02:16:39.4614832Z 21 │ ...(state[instanceId] ?? {}), 2026-10-25T02:16:39.4614939Z ·  ──────────────────────────── 2026-10-25T02:16:39.4615008Z 22 │ [model]: options, 2026-10-25T02:16:39.4615062Z ╰──── 2026-10-25T02:16:39.4615330Z  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-25T02:16:39.4615335Z 2026-10-25T02:16:39.4615518Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-25T02:16:39.4615654Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-25T02:16:39.4615740Z 14 │ import * as Layer from "effect/Layer"; 2026-10-25T02:16:39.4615831Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-25T02:16:39.4615911Z ·  ──┬── 2026-10-25T02:16:39.4616044Z · ╰── 'Scope' is imported here 2026-10-25T02:16:39.4616130Z 16 │ import * as Stream from "effect/Stream"; 2026-10-25T02:16:39.4616181Z ╰──── 2026-10-25T02:16:39.4616279Z  help: Consider removing this import. 2026-10-25T02:16:39.4616282Z 2026-10-25T02:16:39.4616544Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-25T02:16:39.4616687Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-25T02:16:39.4616840Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-25T02:16:39.4616917Z 12 │ this.onmessage = listener; 2026-10-25T02:16:39.4616996Z ·  ───────── 2026-10-25T02:16:39.4617053Z 13 │ } 2026-10-25T02:16:39.4617104Z ╰──── 2026-10-25T02:16:39.4617416Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-25T02:16:39.4617419Z 2026-10-25T02:16:39.4617664Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T02:16:39.4617835Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-25T02:16:39.4617904Z 15 │ constructor() { 2026-10-25T02:16:39.4617968Z 16 │ source = this; 2026-10-25T02:16:39.4618041Z ·  ────── 2026-10-25T02:16:39.4618098Z 17 │ } 2026-10-25T02:16:39.4618149Z ╰──── 2026-10-25T02:16:39.4618416Z  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-25T02:16:39.4618419Z 2026-10-25T02:16:39.4618695Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:16:39.4618864Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-25T02:16:39.4618931Z 472 │ onFilters, 2026-10-25T02:16:39.4619001Z 473 │ authorOptions = [], 2026-10-25T02:16:39.4619080Z ·  ── 2026-10-25T02:16:39.4619148Z 474 │ labelOptions = [], 2026-10-25T02:16:39.4619201Z ╰──── 2026-10-25T02:16:39.4619509Z  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-25T02:16:39.4619511Z 2026-10-25T02:16:39.4619789Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:16:39.4619955Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-25T02:16:39.4620023Z 473 │ authorOptions = [], 2026-10-25T02:16:39.4620087Z 474 │ labelOptions = [], 2026-10-25T02:16:39.4620175Z ·  ── 2026-10-25T02:16:39.4620243Z 475 │ optionScope, 2026-10-25T02:16:39.4620295Z ╰──── 2026-10-25T02:16:39.4620601Z  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-25T02:16:39.4620606Z 2026-10-25T02:16:39.4620891Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4621019Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-25T02:16:39.4621076Z 217 │ 2026-10-25T02:16:39.4621225Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-25T02:16:39.4621315Z ·  ──────────┬────────── 2026-10-25T02:16:39.4621480Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-25T02:16:39.4621669Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-25T02:16:39.4621723Z ╰──── 2026-10-25T02:16:39.4621827Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4621829Z 2026-10-25T02:16:39.4622131Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4622257Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-25T02:16:39.4622312Z 220 │ 2026-10-25T02:16:39.4622443Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-25T02:16:39.4622549Z ·  ──────────────┬────────────── 2026-10-25T02:16:39.4622779Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-25T02:16:39.4622978Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-25T02:16:39.4623028Z ╰──── 2026-10-25T02:16:39.4623132Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4623135Z 2026-10-25T02:16:39.4623302Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4623450Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:373:47] 2026-10-25T02:16:39.4623576Z 372 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-25T02:16:39.4623732Z 373 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-25T02:16:39.4623845Z ·  ─────┬──── 2026-10-25T02:16:39.4624011Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4624076Z 374 │ return ( 2026-10-25T02:16:39.4624127Z ╰──── 2026-10-25T02:16:39.4624427Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4624720Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4624723Z 2026-10-25T02:16:39.4624890Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4625033Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:860:39] 2026-10-25T02:16:39.4625132Z 859 │ if (snoozeGateClock.thread !== thread) { 2026-10-25T02:16:39.4625262Z 860 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-25T02:16:39.4625371Z ·  ─────┬──── 2026-10-25T02:16:39.4625523Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4625579Z 861 │ } 2026-10-25T02:16:39.4625632Z ╰──── 2026-10-25T02:16:39.4625901Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4626188Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4626194Z 2026-10-25T02:16:39.4626412Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:16:39.4626547Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-25T02:16:39.4626618Z 1021 │ instanceId, 2026-10-25T02:16:39.4626759Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-25T02:16:39.4626895Z ·  ────────────────────────────────────────────────── 2026-10-25T02:16:39.4626959Z 1023 │ ]), 2026-10-25T02:16:39.4627015Z ╰──── 2026-10-25T02:16:39.4627273Z  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-25T02:16:39.4627276Z 2026-10-25T02:16:39.4627744Z ⚠ 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-25T02:16:39.4627918Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-25T02:16:39.4628000Z 262 │ ...(update._meta !== undefined 2026-10-25T02:16:39.4628166Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-25T02:16:39.4628253Z ·  ───────── 2026-10-25T02:16:39.4628313Z 264 │ : {}), 2026-10-25T02:16:39.4628365Z ╰──── 2026-10-25T02:16:39.4628367Z 2026-10-25T02:16:39.4628624Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4628751Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-25T02:16:39.4628863Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-25T02:16:39.4628932Z 84 │ useEffect(() => { 2026-10-25T02:16:39.4629002Z ·  ────┬──── 2026-10-25T02:16:39.4629132Z · ╰── This is the containing effect 2026-10-25T02:16:39.4629219Z 85 │ if (!actionState.isRunning) return; 2026-10-25T02:16:39.4629286Z 86 │ setNowMs(Date.now()); 2026-10-25T02:16:39.4629358Z ·  ────┬─── 2026-10-25T02:16:39.4629524Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4629647Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-25T02:16:39.4629701Z ╰──── 2026-10-25T02:16:39.4630294Z  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-25T02:16:39.4630617Z  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-25T02:16:39.4630620Z 2026-10-25T02:16:39.4630847Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4630981Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-25T02:16:39.4631143Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-25T02:16:39.4631234Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-25T02:16:39.4631320Z ·  ┬ 2026-10-25T02:16:39.4631455Z · ╰── '_' is declared here 2026-10-25T02:16:39.4631560Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-25T02:16:39.4631613Z ╰──── 2026-10-25T02:16:39.4631717Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4631719Z 2026-10-25T02:16:39.4631897Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4632031Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-25T02:16:39.4632087Z 133 │ ); 2026-10-25T02:16:39.4632195Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-25T02:16:39.4632289Z ·  ┬ 2026-10-25T02:16:39.4632427Z · ╰── '_' is declared here 2026-10-25T02:16:39.4632554Z 135 │ Effect.succeed( 2026-10-25T02:16:39.4632645Z ╰──── 2026-10-25T02:16:39.4632743Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4632745Z 2026-10-25T02:16:39.4632925Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4633061Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-25T02:16:39.4633118Z 177 │ }); 2026-10-25T02:16:39.4633213Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-25T02:16:39.4633303Z ·  ┬ 2026-10-25T02:16:39.4633435Z · ╰── '_' is declared here 2026-10-25T02:16:39.4633534Z 179 │ switch (options.continuation ?? "queued") { 2026-10-25T02:16:39.4633585Z ╰──── 2026-10-25T02:16:39.4633690Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4633695Z 2026-10-25T02:16:39.4633874Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4634006Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-25T02:16:39.4634061Z 202 │ ); 2026-10-25T02:16:39.4634160Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-25T02:16:39.4634283Z ·  ┬ 2026-10-25T02:16:39.4634419Z · ╰── '_' is declared here 2026-10-25T02:16:39.4634499Z 204 │ options.removeWorktreeFails 2026-10-25T02:16:39.4634554Z ╰──── 2026-10-25T02:16:39.4636934Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4636938Z 2026-10-25T02:16:39.4637137Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4637276Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-25T02:16:39.4637331Z 207 │ ); 2026-10-25T02:16:39.4637433Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-25T02:16:39.4637526Z ·  ┬ 2026-10-25T02:16:39.4637663Z · ╰── '_' is declared here 2026-10-25T02:16:39.4637747Z 209 │ options.deleteLocalBranchFails 2026-10-25T02:16:39.4637799Z ╰──── 2026-10-25T02:16:39.4637896Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4637899Z 2026-10-25T02:16:39.4638076Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4638210Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-25T02:16:39.4638267Z 212 │ ); 2026-10-25T02:16:39.4638378Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-25T02:16:39.4638473Z ·  ┬ 2026-10-25T02:16:39.4638614Z · ╰── '_' is declared here 2026-10-25T02:16:39.4638698Z 214 │ options.fetchWorktreeBaseFails 2026-10-25T02:16:39.4638750Z ╰──── 2026-10-25T02:16:39.4638844Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4638847Z 2026-10-25T02:16:39.4639023Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4639152Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-25T02:16:39.4639205Z 253 │ ); 2026-10-25T02:16:39.4639365Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-25T02:16:39.4639480Z ·  ┬ 2026-10-25T02:16:39.4639610Z · ╰── '_' is declared here 2026-10-25T02:16:39.4639677Z 255 │ Effect.succeed({ 2026-10-25T02:16:39.4639726Z ╰──── 2026-10-25T02:16:39.4639826Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4639828Z 2026-10-25T02:16:39.4640003Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:16:39.4640133Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-25T02:16:39.4640185Z 263 │ ); 2026-10-25T02:16:39.4640333Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-25T02:16:39.4640422Z ·  ┬ 2026-10-25T02:16:39.4640559Z · ╰── '_' is declared here 2026-10-25T02:16:39.4640704Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-25T02:16:39.4640757Z ╰──── 2026-10-25T02:16:39.4640859Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4640861Z 2026-10-25T02:16:39.4641012Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-25T02:16:39.4641133Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-25T02:16:39.4641244Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-25T02:16:39.4641339Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-25T02:16:39.4641436Z ·  ───────────────────────────── 2026-10-25T02:16:39.4641566Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-25T02:16:39.4641620Z ╰──── 2026-10-25T02:16:39.4641778Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-25T02:16:39.4641780Z 2026-10-25T02:16:39.4641992Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:16:39.4642113Z ╭─[apps/web/src/components/LegacySidebar.tsx:210:40] 2026-10-25T02:16:39.4642269Z 209 │ import { useClientSettings, updateClientSettings } from "~/hooks/useSettings"; 2026-10-25T02:16:39.4642431Z 210 │ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server"; 2026-10-25T02:16:39.4642546Z ·  ────────┬──────── 2026-10-25T02:16:39.4642783Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:16:39.4642922Z 211 │ import { appAtomRegistry } from "../rpc/atomRegistry"; 2026-10-25T02:16:39.4642974Z ╰──── 2026-10-25T02:16:39.4643070Z  help: Consider removing this import. 2026-10-25T02:16:39.4643073Z 2026-10-25T02:16:39.4643347Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T02:16:39.4643472Z ╭─[apps/server/src/provider/AntigravityAuth.ts:303:20] 2026-10-25T02:16:39.4643530Z 302 │ }, 2026-10-25T02:16:39.4643613Z 303 │ (effect, flow, stopSessions) => 2026-10-25T02:16:39.4643705Z ·  ──────┬───── 2026-10-25T02:16:39.4643849Z · ╰── 'stopSessions' is declared here 2026-10-25T02:16:39.4643917Z 304 │ effect.pipe( 2026-10-25T02:16:39.4643976Z ╰──── 2026-10-25T02:16:39.4644077Z  help: Consider removing this parameter. 2026-10-25T02:16:39.4644079Z 2026-10-25T02:16:39.4644317Z ⚠ eslint(no-unused-vars): Type 'PullRequestChecks' is imported but never used. 2026-10-25T02:16:39.4644482Z ╭─[apps/web/src/components/pullRequest/pullRequestDetail.logic.ts:16:8] 2026-10-25T02:16:39.4644553Z 15 │ type PullRequestCheck, 2026-10-25T02:16:39.4644624Z 16 │ type PullRequestChecks, 2026-10-25T02:16:39.4644706Z ·  ────────┬──────── 2026-10-25T02:16:39.4644854Z · ╰── 'PullRequestChecks' is imported here 2026-10-25T02:16:39.4644988Z 17 │ type PullRequestChecksState as ContractPullRequestChecksState, 2026-10-25T02:16:39.4645040Z ╰──── 2026-10-25T02:16:39.4645141Z  help: Consider removing this import. 2026-10-25T02:16:39.4645146Z 2026-10-25T02:16:39.4645310Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4645458Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-25T02:16:39.4645512Z 465 │ 2026-10-25T02:16:39.4645617Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-25T02:16:39.4645690Z ·  ── 2026-10-25T02:16:39.4645745Z 467 │ } 2026-10-25T02:16:39.4645798Z ╰──── 2026-10-25T02:16:39.4646028Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4646030Z 2026-10-25T02:16:39.4646229Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4646348Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-25T02:16:39.4646428Z 28 │ getPendingThreadOrder(); 2026-10-25T02:16:39.4646506Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-25T02:16:39.4646632Z ·  ────┬──── ───────┬────── 2026-10-25T02:16:39.4646821Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:16:39.4646960Z · ╰── Unnecessary dependency `nowMinute` 2026-10-25T02:16:39.4647025Z 30 │ return pending; 2026-10-25T02:16:39.4647076Z ╰──── 2026-10-25T02:16:39.4647364Z  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-25T02:16:39.4647728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4647758Z 2026-10-25T02:16:39.4647954Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4648093Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1387:5] 2026-10-25T02:16:39.4648175Z 1386 │ queuedMessagesByThreadKey, 2026-10-25T02:16:39.4648240Z 1387 │ retryTick, 2026-10-25T02:16:39.4648314Z ·  ────┬──── 2026-10-25T02:16:39.4648450Z · ╰── Unnecessary dependency `retryTick` 2026-10-25T02:16:39.4648523Z 1388 │ restoreQueuedMessage, 2026-10-25T02:16:39.4648577Z ╰──── 2026-10-25T02:16:39.4648866Z  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-25T02:16:39.4649172Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4649174Z 2026-10-25T02:16:39.4649427Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-25T02:16:39.4649576Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-25T02:16:39.4649633Z 1619 │ 2026-10-25T02:16:39.4649839Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-25T02:16:39.4649957Z ·  ──────────────────┬────────────────── 2026-10-25T02:16:39.4650160Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-25T02:16:39.4650240Z 1621 │ const meta = response._meta; 2026-10-25T02:16:39.4650291Z ╰──── 2026-10-25T02:16:39.4650395Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4650397Z 2026-10-25T02:16:39.4650563Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4650708Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-25T02:16:39.4650819Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-25T02:16:39.4650980Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-25T02:16:39.4651102Z ·  ─────┬──── 2026-10-25T02:16:39.4651273Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4651330Z 179 │ } 2026-10-25T02:16:39.4651380Z ╰──── 2026-10-25T02:16:39.4651654Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4651942Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4651945Z 2026-10-25T02:16:39.4652198Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4652327Z ╭─[packages/provider-grok/src/server/adapter.ts:427:7] 2026-10-25T02:16:39.4652379Z 426 │ 2026-10-25T02:16:39.4652449Z 427 │ const layer: Layer.Layer< 2026-10-25T02:16:39.4652579Z ·  ──┬── 2026-10-25T02:16:39.4652732Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4652823Z 428 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:16:39.4652874Z ╰──── 2026-10-25T02:16:39.4652976Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4652978Z 2026-10-25T02:16:39.4653166Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-25T02:16:39.4653259Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-25T02:16:39.4653346Z  9 │ import * as Effect from "effect/Effect"; 2026-10-25T02:16:39.4653431Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-25T02:16:39.4653505Z ·  ──┬── 2026-10-25T02:16:39.4653633Z · ╰── 'Fiber' is imported here 2026-10-25T02:16:39.4653740Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-25T02:16:39.4653796Z ╰──── 2026-10-25T02:16:39.4653889Z  help: Consider removing this import. 2026-10-25T02:16:39.4653895Z 2026-10-25T02:16:39.4654089Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-25T02:16:39.4654182Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-25T02:16:39.4654291Z 16 │ import * as Ref from "effect/Ref"; 2026-10-25T02:16:39.4654380Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-25T02:16:39.4654459Z ·  ────┬─── 2026-10-25T02:16:39.4654593Z · ╰── 'Schedule' is imported here 2026-10-25T02:16:39.4654677Z 18 │ import * as Schema from "effect/Schema"; 2026-10-25T02:16:39.4654727Z ╰──── 2026-10-25T02:16:39.4654828Z  help: Consider removing this import. 2026-10-25T02:16:39.4654833Z 2026-10-25T02:16:39.4655124Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4655221Z ╭─[apps/server/src/ws.ts:1313:13] 2026-10-25T02:16:39.4655376Z 1312 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-25T02:16:39.4655570Z 1313 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-25T02:16:39.4655675Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4655844Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-25T02:16:39.4656011Z 1314 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-25T02:16:39.4656068Z ╰──── 2026-10-25T02:16:39.4656174Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4656176Z 2026-10-25T02:16:39.4656427Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4656552Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-25T02:16:39.4656604Z 727 │ 2026-10-25T02:16:39.4656686Z 728 │ const layer = layerWithOptions(); 2026-10-25T02:16:39.4656756Z ·  ──┬── 2026-10-25T02:16:39.4656877Z · ╰── 'layer' is declared here 2026-10-25T02:16:39.4656927Z ╰──── 2026-10-25T02:16:39.4657026Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4657029Z 2026-10-25T02:16:39.4657243Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:16:39.4657393Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-25T02:16:39.4657445Z 265 │ 2026-10-25T02:16:39.4657548Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-25T02:16:39.4657621Z ·  ── 2026-10-25T02:16:39.4657676Z 267 │ } 2026-10-25T02:16:39.4657726Z ╰──── 2026-10-25T02:16:39.4657954Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:16:39.4657957Z 2026-10-25T02:16:39.4658415Z ⚠ 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-25T02:16:39.4658552Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-25T02:16:39.4658612Z 93 │ ) { 2026-10-25T02:16:39.4658809Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4658980Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-25T02:16:39.4659097Z 96 │ │ if (predicate(project)) return project; 2026-10-25T02:16:39.4659195Z 97 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4659315Z 98 │ ╰─▶ } 2026-10-25T02:16:39.4659464Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-25T02:16:39.4659516Z ╰──── 2026-10-25T02:16:39.4659519Z 2026-10-25T02:16:39.4659978Z ⚠ 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-25T02:16:39.4660133Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-25T02:16:39.4660191Z 27 │ ) { 2026-10-25T02:16:39.4660384Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4660526Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-25T02:16:39.4660647Z 30 │ │ if (predicate(available)) return available; 2026-10-25T02:16:39.4660743Z 31 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4660868Z 32 │ ╰─▶ } 2026-10-25T02:16:39.4661046Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-25T02:16:39.4661098Z ╰──── 2026-10-25T02:16:39.4661101Z 2026-10-25T02:16:39.4661329Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T02:16:39.4661462Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-25T02:16:39.4661587Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-25T02:16:39.4661824Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-25T02:16:39.4661941Z 986 │ │ (approval) => approval.requestId, 2026-10-25T02:16:39.4662125Z 987 │ ╰─▶ ); 2026-10-25T02:16:39.4662290Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-25T02:16:39.4662342Z ╰──── 2026-10-25T02:16:39.4662417Z  help: Switch to `Set` 2026-10-25T02:16:39.4662419Z 2026-10-25T02:16:39.4662869Z ⚠ 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-25T02:16:39.4663024Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7] 2026-10-25T02:16:39.4663114Z 1741 │ yield* harness.replaceSession; 2026-10-25T02:16:39.4663319Z 1742 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4663472Z 1743 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-25T02:16:39.4663561Z 1744 │ │ break; 2026-10-25T02:16:39.4663641Z 1745 │ │ } 2026-10-25T02:16:39.4663747Z 1746 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4663876Z 1747 │ ╰─▶ } 2026-10-25T02:16:39.4663952Z 1748 │ yield* Queue.offer( 2026-10-25T02:16:39.4664006Z ╰──── 2026-10-25T02:16:39.4664009Z 2026-10-25T02:16:39.4664489Z ⚠ 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-25T02:16:39.4664644Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7] 2026-10-25T02:16:39.4664735Z 1850 │ yield* harness.replaceSession; 2026-10-25T02:16:39.4664937Z 1851 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4665094Z 1852 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-25T02:16:39.4665200Z 1853 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4665329Z 1854 │ ╰─▶ } 2026-10-25T02:16:39.4665458Z 1855 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-25T02:16:39.4665511Z ╰──── 2026-10-25T02:16:39.4665514Z 2026-10-25T02:16:39.4665738Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:16:39.4665868Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-25T02:16:39.4665939Z 113 │ const declared = { 2026-10-25T02:16:39.4666029Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-25T02:16:39.4666141Z ·  ──────────────────────────────── 2026-10-25T02:16:39.4666242Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:16:39.4666294Z ╰──── 2026-10-25T02:16:39.4666557Z  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-25T02:16:39.4666560Z 2026-10-25T02:16:39.4666773Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:16:39.4666943Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-25T02:16:39.4667067Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-25T02:16:39.4667166Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:16:39.4667288Z ·  ──────────────────────────────────────── 2026-10-25T02:16:39.4667382Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T02:16:39.4667436Z ╰──── 2026-10-25T02:16:39.4667695Z  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-25T02:16:39.4667698Z 2026-10-25T02:16:39.4667910Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:16:39.4668034Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-25T02:16:39.4668137Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:16:39.4668238Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T02:16:39.4668352Z ·  ──────────────────────────────────── 2026-10-25T02:16:39.4668413Z 117 │ }; 2026-10-25T02:16:39.4668462Z ╰──── 2026-10-25T02:16:39.4668721Z  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-25T02:16:39.4668724Z 2026-10-25T02:16:39.4669161Z ⚠ 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-25T02:16:39.4669283Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-25T02:16:39.4669454Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-25T02:16:39.4669637Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T02:16:39.4669747Z ·  ─────────────────── 2026-10-25T02:16:39.4669855Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T02:16:39.4669906Z ╰──── 2026-10-25T02:16:39.4669909Z 2026-10-25T02:16:39.4670337Z ⚠ 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-25T02:16:39.4670455Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-25T02:16:39.4670636Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T02:16:39.4670864Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T02:16:39.4671012Z ·  ─────────────────── 2026-10-25T02:16:39.4671128Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-25T02:16:39.4671183Z ╰──── 2026-10-25T02:16:39.4671186Z 2026-10-25T02:16:39.4671370Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T02:16:39.4671493Z ╭─[packages/client-runtime/src/state/shell.ts:203:5] 2026-10-25T02:16:39.4671599Z 200 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-25T02:16:39.4671667Z 201 │ let next = initial; 2026-10-25T02:16:39.4671739Z ·  ──┬─ 2026-10-25T02:16:39.4671858Z · ╰── From this accumulator 2026-10-25T02:16:39.4671945Z 202 │ let receivedSnapshot = false; 2026-10-25T02:16:39.4672024Z 203 │ for (const item of items) { 2026-10-25T02:16:39.4672093Z ·  ─┬─ 2026-10-25T02:16:39.4672195Z · ╰── For this loop 2026-10-25T02:16:39.4672283Z 204 │ if (item.kind === "synchronized") { 2026-10-25T02:16:39.4672351Z 205 │ waiting = false; 2026-10-25T02:16:39.4672441Z 206 │ if (Option.isSome(next.snapshot)) { 2026-10-25T02:16:39.4672555Z 207 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-25T02:16:39.4672642Z ·  ───┬─── 2026-10-25T02:16:39.4672770Z · ╰── From this spread 2026-10-25T02:16:39.4672829Z 208 │ } 2026-10-25T02:16:39.4672883Z ╰──── 2026-10-25T02:16:39.4673046Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T02:16:39.4673203Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:16:39.4673206Z 2026-10-25T02:16:39.4673658Z ⚠ 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-25T02:16:39.4673804Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-25T02:16:39.4673934Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-25T02:16:39.4674078Z 133 │ ╭─▶ for ( 2026-10-25T02:16:39.4674182Z 134 │ │ let attempt = 0; 2026-10-25T02:16:39.4674380Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-25T02:16:39.4674480Z 136 │ │ attempt += 1 2026-10-25T02:16:39.4674565Z 137 │ │ ) { 2026-10-25T02:16:39.4674676Z 138 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4674810Z 139 │ ╰─▶ } 2026-10-25T02:16:39.4674934Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-25T02:16:39.4674986Z ╰──── 2026-10-25T02:16:39.4674988Z 2026-10-25T02:16:39.4675483Z ⚠ 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-25T02:16:39.4675660Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-25T02:16:39.4675723Z 168 │ }); 2026-10-25T02:16:39.4675914Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:16:39.4676102Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-25T02:16:39.4676206Z 171 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4676336Z 172 │ ╰─▶ } 2026-10-25T02:16:39.4676391Z 173 │ 2026-10-25T02:16:39.4676441Z ╰──── 2026-10-25T02:16:39.4676446Z 2026-10-25T02:16:39.4676899Z ⚠ 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-25T02:16:39.4677046Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-25T02:16:39.4677154Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-25T02:16:39.4677343Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:16:39.4677472Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-25T02:16:39.4677574Z 180 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4677703Z 181 │ ╰─▶ } 2026-10-25T02:16:39.4677756Z 182 │ 2026-10-25T02:16:39.4677806Z ╰──── 2026-10-25T02:16:39.4677809Z 2026-10-25T02:16:39.4678261Z ⚠ 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-25T02:16:39.4678408Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-25T02:16:39.4678533Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-25T02:16:39.4678719Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:16:39.4678835Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-25T02:16:39.4679026Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-25T02:16:39.4679116Z 310 │ │ break; 2026-10-25T02:16:39.4679197Z 311 │ │ } 2026-10-25T02:16:39.4679298Z 312 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4679425Z 313 │ ╰─▶ } 2026-10-25T02:16:39.4679480Z 314 │ 2026-10-25T02:16:39.4679534Z ╰──── 2026-10-25T02:16:39.4679536Z 2026-10-25T02:16:39.4679757Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:16:39.4679879Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-25T02:16:39.4679937Z 730 │ ); 2026-10-25T02:16:39.4680107Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-25T02:16:39.4680203Z ·  ────── 2026-10-25T02:16:39.4680366Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-25T02:16:39.4680447Z ╰──── 2026-10-25T02:16:39.4680615Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:16:39.4680618Z 2026-10-25T02:16:39.4680808Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-25T02:16:39.4680939Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-25T02:16:39.4681054Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-25T02:16:39.4681136Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T02:16:39.4681206Z ·  ─┬─ 2026-10-25T02:16:39.4681330Z · ╰── 'Arr' is imported here 2026-10-25T02:16:39.4681413Z 5 │ import * as Order from "effect/Order"; 2026-10-25T02:16:39.4681473Z ╰──── 2026-10-25T02:16:39.4681570Z  help: Consider removing this import. 2026-10-25T02:16:39.4681573Z 2026-10-25T02:16:39.4681764Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-25T02:16:39.4681893Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-25T02:16:39.4681971Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T02:16:39.4682048Z 5 │ import * as Order from "effect/Order"; 2026-10-25T02:16:39.4682124Z ·  ──┬── 2026-10-25T02:16:39.4682252Z · ╰── 'Order' is imported here 2026-10-25T02:16:39.4682305Z 6 │ 2026-10-25T02:16:39.4682356Z ╰──── 2026-10-25T02:16:39.4682453Z  help: Consider removing this import. 2026-10-25T02:16:39.4682456Z 2026-10-25T02:16:39.4682686Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-25T02:16:39.4682804Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-25T02:16:39.4682856Z 11 │ 2026-10-25T02:16:39.4682951Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-25T02:16:39.4683052Z ·  ────────────┬──────────── 2026-10-25T02:16:39.4683221Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-25T02:16:39.4683289Z 13 │ readonly thread: { 2026-10-25T02:16:39.4683342Z ╰──── 2026-10-25T02:16:39.4683446Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4683449Z 2026-10-25T02:16:39.4683651Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-25T02:16:39.4683802Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-25T02:16:39.4683856Z 236 │ 2026-10-25T02:16:39.4683970Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-25T02:16:39.4684062Z ·  ───────┬────── 2026-10-25T02:16:39.4684233Z · ╰── 'nonEmptyString' is declared here 2026-10-25T02:16:39.4684376Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-25T02:16:39.4684429Z ╰──── 2026-10-25T02:16:39.4684530Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4684532Z 2026-10-25T02:16:39.4684724Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-25T02:16:39.4684856Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-25T02:16:39.4684973Z 1 │ import type { 2026-10-25T02:16:39.4685067Z 2 │ EnvironmentId, 2026-10-25T02:16:39.4685143Z ·  ──────┬────── 2026-10-25T02:16:39.4685275Z · ╰── 'EnvironmentId' is imported here 2026-10-25T02:16:39.4685361Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-25T02:16:39.4685412Z ╰──── 2026-10-25T02:16:39.4685505Z  help: Consider removing this import. 2026-10-25T02:16:39.4685511Z 2026-10-25T02:16:39.4685705Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:16:39.4685835Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-25T02:16:39.4685907Z 2 │ AuthFilesystemReadScope, 2026-10-25T02:16:39.4685976Z 3 │ type AuthSessionState, 2026-10-25T02:16:39.4686057Z ·  ────────┬─────── 2026-10-25T02:16:39.4686207Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:16:39.4686285Z 4 │ type FilesystemBrowseEntry, 2026-10-25T02:16:39.4686339Z ╰──── 2026-10-25T02:16:39.4686432Z  help: Consider removing this import. 2026-10-25T02:16:39.4686434Z 2026-10-25T02:16:39.4686705Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4686851Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-25T02:16:39.4686905Z 60 │ ) { 2026-10-25T02:16:39.4687071Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-25T02:16:39.4687152Z ·  ──────┬────── 2026-10-25T02:16:39.4687296Z · ╰── 'useDragRegion' is declared here 2026-10-25T02:16:39.4687389Z 62 │ const isInline = props.mode === "inline"; 2026-10-25T02:16:39.4687439Z ╰──── 2026-10-25T02:16:39.4687541Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4687544Z 2026-10-25T02:16:39.4687763Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:16:39.4687903Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-25T02:16:39.4687963Z 237 │ ): string { 2026-10-25T02:16:39.4688115Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-25T02:16:39.4688227Z ·  ────── 2026-10-25T02:16:39.4688357Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-25T02:16:39.4688452Z ╰──── 2026-10-25T02:16:39.4688648Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:16:39.4688651Z 2026-10-25T02:16:39.4688859Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:16:39.4688961Z ╭─[apps/mobile/src/Stack.tsx:1074:21] 2026-10-25T02:16:39.4689024Z 1073 │ } 2026-10-25T02:16:39.4689292Z ·  ───────────────────────────────────────────── 2026-10-25T02:16:39.4689375Z 1075 │ screenOptions={({ route }) => 2026-10-25T02:16:39.4689425Z ╰──── 2026-10-25T02:16:39.4689790Z  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-25T02:16:39.4689795Z 2026-10-25T02:16:39.4690050Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4690184Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-25T02:16:39.4690286Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-25T02:16:39.4690350Z 67 │ useEffect(() => { 2026-10-25T02:16:39.4690421Z ·  ────┬──── 2026-10-25T02:16:39.4690550Z · ╰── This is the containing effect 2026-10-25T02:16:39.4690615Z 68 │ setUri(null); 2026-10-25T02:16:39.4690684Z ·  ───┬── 2026-10-25T02:16:39.4690856Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4690923Z 69 │ setError(null); 2026-10-25T02:16:39.4690974Z ╰──── 2026-10-25T02:16:39.4691562Z  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-25T02:16:39.4691885Z  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-25T02:16:39.4691888Z 2026-10-25T02:16:39.4692085Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4692218Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-25T02:16:39.4692278Z 90 │ }; 2026-10-25T02:16:39.4692352Z 91 │ }, [attachmentId, fileUri]); 2026-10-25T02:16:39.4692469Z ·  ──────┬───── ───┬─── 2026-10-25T02:16:39.4692647Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-25T02:16:39.4692792Z · ╰── Unnecessary dependency `attachmentId` 2026-10-25T02:16:39.4692922Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-25T02:16:39.4692974Z ╰──── 2026-10-25T02:16:39.4693262Z  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-25T02:16:39.4693616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4693653Z 2026-10-25T02:16:39.4693860Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4693996Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-25T02:16:39.4694063Z 212 │ useEffect(() => { 2026-10-25T02:16:39.4694175Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-25T02:16:39.4694281Z ·  ──┬── 2026-10-25T02:16:39.4694466Z · ╰── Missing dependency `props` 2026-10-25T02:16:39.4694570Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-25T02:16:39.4694681Z ·  ──────────┬───────── 2026-10-25T02:16:39.4694910Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-25T02:16:39.4694984Z 215 │ const { source } = props; 2026-10-25T02:16:39.4695037Z ╰──── 2026-10-25T02:16:39.4695447Z  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-25T02:16:39.4695751Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4695753Z 2026-10-25T02:16:39.4695950Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-25T02:16:39.4696076Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-25T02:16:39.4696177Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-25T02:16:39.4696339Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-25T02:16:39.4696469Z 159 │ │ constructor(data: Record) { 2026-10-25T02:16:39.4696584Z 160 │ │ clipboardItemConstructor(data); 2026-10-25T02:16:39.4696659Z 161 │ │ } 2026-10-25T02:16:39.4696785Z 162 │ ╰─▶ }, 2026-10-25T02:16:39.4696849Z 163 │ clipboard: { 2026-10-25T02:16:39.4696900Z ╰──── 2026-10-25T02:16:39.4697066Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-25T02:16:39.4697069Z 2026-10-25T02:16:39.4697284Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:16:39.4697412Z ╭─[apps/web/src/components/chat/ChatHeader.tsx:27:10] 2026-10-25T02:16:39.4697520Z 26 │ import { threadEnvironment } from "../../state/threads"; 2026-10-25T02:16:39.4697626Z 27 │ import { serverEnvironment } from "../../state/server"; 2026-10-25T02:16:39.4697714Z ·  ────────┬──────── 2026-10-25T02:16:39.4697862Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:16:39.4697990Z 28 │ import { canShareWithGuestAtom } from "./guestShareAvailability"; 2026-10-25T02:16:39.4698042Z ╰──── 2026-10-25T02:16:39.4698137Z  help: Consider removing this import. 2026-10-25T02:16:39.4698139Z 2026-10-25T02:16:39.4698387Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-25T02:16:39.4698513Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-25T02:16:39.4698649Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-25T02:16:39.4698761Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-25T02:16:39.4698847Z ·  ──────┬────── 2026-10-25T02:16:39.4698984Z · ╰── 'HookForwarder' is imported here 2026-10-25T02:16:39.4699085Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-25T02:16:39.4699137Z ╰──── 2026-10-25T02:16:39.4699231Z  help: Consider removing this import. 2026-10-25T02:16:39.4699234Z 2026-10-25T02:16:39.4699485Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4699651Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T02:16:39.4699718Z 259 │ .join("|"); 2026-10-25T02:16:39.4699782Z 260 │ useEffect(() => { 2026-10-25T02:16:39.4699852Z ·  ────┬──── 2026-10-25T02:16:39.4699981Z · ╰── This is the containing effect 2026-10-25T02:16:39.4700042Z 261 │ stop(); 2026-10-25T02:16:39.4700112Z ·  ──┬─ 2026-10-25T02:16:39.4700273Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4700339Z 262 │ }, [orderVersion]); 2026-10-25T02:16:39.4700391Z ╰──── 2026-10-25T02:16:39.4700978Z  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-25T02:16:39.4701299Z  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-25T02:16:39.4701302Z 2026-10-25T02:16:39.4701510Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4701667Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T02:16:39.4701733Z 260 │ useEffect(() => { 2026-10-25T02:16:39.4701792Z 261 │ stop(); 2026-10-25T02:16:39.4701858Z ·  ──┬─ 2026-10-25T02:16:39.4701983Z · ╰── Missing dependency `stop` 2026-10-25T02:16:39.4702052Z 262 │ }, [orderVersion]); 2026-10-25T02:16:39.4702133Z ·  ──────┬───── 2026-10-25T02:16:39.4702277Z · ╰── Unnecessary dependency `orderVersion` 2026-10-25T02:16:39.4702338Z 263 │ useEffect( 2026-10-25T02:16:39.4702389Z ╰──── 2026-10-25T02:16:39.4702798Z  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-25T02:16:39.4703105Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4703108Z 2026-10-25T02:16:39.4703295Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4703482Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-25T02:16:39.4703558Z 95 │ const latest = useRef(props); 2026-10-25T02:16:39.4703627Z 96 │ latest.current = props; 2026-10-25T02:16:39.4703730Z ·  ───┬──────┬─── 2026-10-25T02:16:39.4703903Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4704015Z · ╰── This value is a ref 2026-10-25T02:16:39.4704082Z 97 │ const gesture = useMemo( 2026-10-25T02:16:39.4704131Z ╰──── 2026-10-25T02:16:39.4704628Z  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-25T02:16:39.4704917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4704920Z 2026-10-25T02:16:39.4705061Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4705216Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-25T02:16:39.4705281Z 103 │ .runOnJS(true) 2026-10-25T02:16:39.4705381Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:16:39.4705494Z ·  ───────────────┬────────────── 2026-10-25T02:16:39.4705690Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4705828Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4705882Z ╰──── 2026-10-25T02:16:39.4706333Z  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-25T02:16:39.4706617Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4706620Z 2026-10-25T02:16:39.4706759Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4706913Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-25T02:16:39.4707010Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:16:39.4707142Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4707283Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T02:16:39.4707488Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4707612Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4707662Z ╰──── 2026-10-25T02:16:39.4708112Z  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-25T02:16:39.4708441Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4708471Z 2026-10-25T02:16:39.4708611Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4708765Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-25T02:16:39.4708892Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4709013Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4709151Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T02:16:39.4709352Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4709474Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:16:39.4709530Z ╰──── 2026-10-25T02:16:39.4709979Z  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-25T02:16:39.4710262Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4710265Z 2026-10-25T02:16:39.4710404Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4710558Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-25T02:16:39.4710688Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4710864Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:16:39.4711003Z ·  ───────────────────────┬────────────────────── 2026-10-25T02:16:39.4711204Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4711273Z 108 │ [props.disabled], 2026-10-25T02:16:39.4711322Z ╰──── 2026-10-25T02:16:39.4711773Z  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-25T02:16:39.4712054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4712057Z 2026-10-25T02:16:39.4712262Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4712454Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-25T02:16:39.4712564Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T02:16:39.4712667Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-25T02:16:39.4712769Z ·  ───┬──────┬─── 2026-10-25T02:16:39.4712947Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4713057Z · ╰── This value is a ref 2026-10-25T02:16:39.4713112Z 250 │ 2026-10-25T02:16:39.4713162Z ╰──── 2026-10-25T02:16:39.4713616Z  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-25T02:16:39.4713902Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4713905Z 2026-10-25T02:16:39.4714046Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4714238Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-25T02:16:39.4714359Z 246 │ const [preview, setPreview] = useState(null); 2026-10-25T02:16:39.4714469Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-25T02:16:39.4714591Z ·  ──────────────────┬────────────────── 2026-10-25T02:16:39.4714759Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4714870Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T02:16:39.4714920Z ╰──── 2026-10-25T02:16:39.4715365Z  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-25T02:16:39.4715647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4715649Z 2026-10-25T02:16:39.4715814Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4715972Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-25T02:16:39.4716037Z 323 │ update(0); 2026-10-25T02:16:39.4716118Z 324 │ let last = performance.now(); 2026-10-25T02:16:39.4716214Z ·  ────────┬──────── 2026-10-25T02:16:39.4716352Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4716418Z 325 │ const tick = () => { 2026-10-25T02:16:39.4716471Z ╰──── 2026-10-25T02:16:39.4716764Z  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-25T02:16:39.4717054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4717056Z 2026-10-25T02:16:39.4717311Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:16:39.4717494Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-25T02:16:39.4717554Z  98 │ () => 2026-10-25T02:16:39.4717621Z  99 │ Gesture.Pan() 2026-10-25T02:16:39.4717697Z ·  ─┬─ 2026-10-25T02:16:39.4717824Z · ╰── `Pan` may be a component 2026-10-25T02:16:39.4717904Z 100 │ .enabled(!props.disabled) 2026-10-25T02:16:39.4717956Z ╰──── 2026-10-25T02:16:39.4718227Z  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-25T02:16:39.4718664Z  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-25T02:16:39.4718671Z 2026-10-25T02:16:39.4718854Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:16:39.4719008Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-25T02:16:39.4719075Z 103 │ .runOnJS(true) 2026-10-25T02:16:39.4719173Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:16:39.4719258Z ·  ───┬── 2026-10-25T02:16:39.4719679Z · ╰── 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-25T02:16:39.4719814Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4719938Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:16:39.4720058Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:16:39.4720126Z 108 │ [props.disabled], 2026-10-25T02:16:39.4720208Z ·  ────────┬─────── 2026-10-25T02:16:39.4720393Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4720447Z 109 │ ); 2026-10-25T02:16:39.4720499Z ╰──── 2026-10-25T02:16:39.4720699Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:16:39.4721011Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4721015Z 2026-10-25T02:16:39.4721276Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4721440Z ╭─[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9] 2026-10-25T02:16:39.4721586Z 31 │ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const]; 2026-10-25T02:16:39.4721669Z 32 │ const navigation = useNavigation(); 2026-10-25T02:16:39.4721746Z ·  ─────┬──── 2026-10-25T02:16:39.4721875Z · ╰── 'navigation' is declared here 2026-10-25T02:16:39.4721969Z 33 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T02:16:39.4722021Z ╰──── 2026-10-25T02:16:39.4722176Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4722207Z 2026-10-25T02:16:39.4722400Z ⚠ eslint(no-unused-vars): Identifier 'FormSheet' is imported but never used. 2026-10-25T02:16:39.4722549Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:26:10] 2026-10-25T02:16:39.4722649Z 25 │ import { StyleSheet, View } from "react-native"; 2026-10-25T02:16:39.4722762Z 26 │ import { FormSheet, Stack } from "react-native-screens"; 2026-10-25T02:16:39.4722836Z ·  ────┬──── 2026-10-25T02:16:39.4722969Z · ╰── 'FormSheet' is imported here 2026-10-25T02:16:39.4723118Z 27 │ import { NativeScrollEdgeEffectsContext } from "./NativeScrollViewMarker"; 2026-10-25T02:16:39.4723170Z ╰──── 2026-10-25T02:16:39.4723265Z  help: Consider removing this import. 2026-10-25T02:16:39.4723269Z 2026-10-25T02:16:39.4723501Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopAction' is imported but never used. 2026-10-25T02:16:39.4723648Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:33:3] 2026-10-25T02:16:39.4723719Z 32 │ nativeStackPopAction, 2026-10-25T02:16:39.4723792Z 33 │ nativeWorkspacePopAction, 2026-10-25T02:16:39.4723882Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4724041Z · ╰── 'nativeWorkspacePopAction' is imported here 2026-10-25T02:16:39.4724113Z 34 │ nativeWorkspacePopCount, 2026-10-25T02:16:39.4724165Z ╰──── 2026-10-25T02:16:39.4724272Z  help: Consider removing this import. 2026-10-25T02:16:39.4724274Z 2026-10-25T02:16:39.4724529Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopCount' is imported but never used. 2026-10-25T02:16:39.4724674Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:34:3] 2026-10-25T02:16:39.4724745Z 33 │ nativeWorkspacePopAction, 2026-10-25T02:16:39.4724817Z 34 │ nativeWorkspacePopCount, 2026-10-25T02:16:39.4724905Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4725061Z · ╰── 'nativeWorkspacePopCount' is imported here 2026-10-25T02:16:39.4725138Z 35 │ partitionStackPresentations, 2026-10-25T02:16:39.4725190Z ╰──── 2026-10-25T02:16:39.4725285Z  help: Consider removing this import. 2026-10-25T02:16:39.4725287Z 2026-10-25T02:16:39.4725483Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4725640Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-25T02:16:39.4725742Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-25T02:16:39.4725843Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-25T02:16:39.4725946Z ·  ──────┬───── 2026-10-25T02:16:39.4726109Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-25T02:16:39.4726211Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-25T02:16:39.4726265Z ╰──── 2026-10-25T02:16:39.4726558Z  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-25T02:16:39.4726865Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4726868Z 2026-10-25T02:16:39.4727365Z ⚠ 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-25T02:16:39.4727548Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-25T02:16:39.4727660Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-25T02:16:39.4727871Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-25T02:16:39.4728006Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-25T02:16:39.4728110Z 137 │ │ if (predicate(lastState)) { 2026-10-25T02:16:39.4728213Z 138 │ │ return lastState; 2026-10-25T02:16:39.4728290Z 139 │ │ } 2026-10-25T02:16:39.4728392Z 140 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4728514Z 141 │ ╰─▶ } 2026-10-25T02:16:39.4728594Z 142 │ return yield* Effect.die( 2026-10-25T02:16:39.4728646Z ╰──── 2026-10-25T02:16:39.4728649Z 2026-10-25T02:16:39.4728908Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4729079Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:59:5] 2026-10-25T02:16:39.4729135Z 49 │ 2026-10-25T02:16:39.4729201Z 50 │ useEffect(() => { 2026-10-25T02:16:39.4729273Z ·  ────┬──── 2026-10-25T02:16:39.4729403Z · ╰── This is the containing effect 2026-10-25T02:16:39.4729498Z 51 │ traceDiffHighlight("viewport-reset", { 2026-10-25T02:16:39.4729589Z 52 │ reset: diffHighlightTraceId(resetKey), 2026-10-25T02:16:39.4729651Z 53 │ enabled, 2026-10-25T02:16:39.4729717Z 54 │ rows: rows.length, 2026-10-25T02:16:39.4729775Z 55 │ }); 2026-10-25T02:16:39.4729865Z 56 │ const previousRange = scheduler.reset(); 2026-10-25T02:16:39.4729958Z 57 │ highlightedRowIdsRef.current = new Set(); 2026-10-25T02:16:39.4730040Z 58 │ pendingPatchesRef.current = []; 2026-10-25T02:16:39.4730146Z 59 │ setViewport({ scope: viewportScope, range: null }); 2026-10-25T02:16:39.4730220Z ·  ─────┬───── 2026-10-25T02:16:39.4730384Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4730549Z 60 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-25T02:16:39.4730632Z ╰──── 2026-10-25T02:16:39.4731216Z  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-25T02:16:39.4731531Z  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-25T02:16:39.4731533Z 2026-10-25T02:16:39.4731724Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-25T02:16:39.4731864Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-25T02:16:39.4732002Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-25T02:16:39.4732117Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-25T02:16:39.4732187Z ·  ──┬── 2026-10-25T02:16:39.4732310Z · ╰── 'Image' is imported here 2026-10-25T02:16:39.4732364Z 18 │ 2026-10-25T02:16:39.4732415Z ╰──── 2026-10-25T02:16:39.4732508Z  help: Consider removing this import. 2026-10-25T02:16:39.4732511Z 2026-10-25T02:16:39.4732711Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:16:39.4732851Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-25T02:16:39.4733012Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T02:16:39.4733107Z 226 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4733200Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4733650Z · ╰── 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-25T02:16:39.4733723Z 227 │ mostRecentEventCount, 2026-10-25T02:16:39.4733779Z 228 │ ); 2026-10-25T02:16:39.4733900Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T02:16:39.4734035Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T02:16:39.4734243Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4734360Z 230 │ const assumedValue = props.value; 2026-10-25T02:16:39.4734415Z ╰──── 2026-10-25T02:16:39.4734580Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:16:39.4734885Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4734888Z 2026-10-25T02:16:39.4735096Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4735235Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-25T02:16:39.4735375Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T02:16:39.4735467Z 237 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4735557Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4736050Z · ╰── 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-25T02:16:39.4736150Z 238 │ controlledEventCount, 2026-10-25T02:16:39.4736216Z 239 │ assumedValue, 2026-10-25T02:16:39.4736271Z 240 │ ); 2026-10-25T02:16:39.4736427Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T02:16:39.4736560Z ·  ───────────┬────────── 2026-10-25T02:16:39.4736765Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T02:16:39.4736853Z 242 │ const acceptNativeEvent = useCallback( 2026-10-25T02:16:39.4736911Z ╰──── 2026-10-25T02:16:39.4737322Z  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-25T02:16:39.4737629Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4737631Z 2026-10-25T02:16:39.4737775Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4737917Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-25T02:16:39.4738038Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:16:39.4738147Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:16:39.4738268Z ·  ─────────────┬──────────── 2026-10-25T02:16:39.4738433Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4738491Z 163 │ }); 2026-10-25T02:16:39.4738541Z ╰──── 2026-10-25T02:16:39.4738992Z  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-25T02:16:39.4739283Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4739286Z 2026-10-25T02:16:39.4739433Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4739575Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-25T02:16:39.4739692Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:16:39.4739802Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:16:39.4739916Z ·  ─────────────┬──────────── 2026-10-25T02:16:39.4740119Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4740175Z 163 │ }); 2026-10-25T02:16:39.4740228Z ╰──── 2026-10-25T02:16:39.4740722Z  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-25T02:16:39.4741031Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4741034Z 2026-10-25T02:16:39.4741177Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4741314Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-25T02:16:39.4741370Z 163 │ }); 2026-10-25T02:16:39.4741459Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T02:16:39.4741581Z ·  ─────────┬────────────┬─── 2026-10-25T02:16:39.4741770Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4741891Z · ╰── This value is a ref 2026-10-25T02:16:39.4741965Z 165 │ return JSON.stringify( 2026-10-25T02:16:39.4742017Z ╰──── 2026-10-25T02:16:39.4742467Z  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-25T02:16:39.4742749Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4742752Z 2026-10-25T02:16:39.4742892Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4743031Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-25T02:16:39.4743100Z 205 │ mostRecentEventCount, 2026-10-25T02:16:39.4743191Z 206 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4743300Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4743484Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4743537Z 207 │ ); 2026-10-25T02:16:39.4743590Z ╰──── 2026-10-25T02:16:39.4744041Z  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-25T02:16:39.4744361Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4744363Z 2026-10-25T02:16:39.4744510Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4744648Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-25T02:16:39.4744718Z 211 │ mostRecentEventCount, 2026-10-25T02:16:39.4744804Z 212 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4744907Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4745090Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4745145Z 213 │ ); 2026-10-25T02:16:39.4745198Z ╰──── 2026-10-25T02:16:39.4745645Z  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-25T02:16:39.4745974Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4746013Z 2026-10-25T02:16:39.4746197Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:16:39.4746336Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-25T02:16:39.4746457Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:16:39.4746568Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:16:39.4746674Z ·  ─────────┬──────── 2026-10-25T02:16:39.4747134Z · ╰── 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-25T02:16:39.4747194Z 163 │ }); 2026-10-25T02:16:39.4747283Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T02:16:39.4747351Z 165 │ return JSON.stringify( 2026-10-25T02:16:39.4747514Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T02:16:39.4747582Z 167 │ const record = 2026-10-25T02:16:39.4747665Z 168 │ token.type === "context" 2026-10-25T02:16:39.4747829Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T02:16:39.4747896Z 170 │ : undefined; 2026-10-25T02:16:39.4748002Z 171 │ const presentation = contextChipPresentation( 2026-10-25T02:16:39.4748112Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-25T02:16:39.4748179Z 173 │ record, 2026-10-25T02:16:39.4748242Z 174 │ ); 2026-10-25T02:16:39.4748326Z 175 │ const icon = contextChipIcon( 2026-10-25T02:16:39.4748394Z 176 │ presentation, 2026-10-25T02:16:39.4748533Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T02:16:39.4748592Z 178 │ ); 2026-10-25T02:16:39.4748654Z 179 │ return { 2026-10-25T02:16:39.4748725Z 180 │ type: token.type, 2026-10-25T02:16:39.4748797Z 181 │ source: token.source, 2026-10-25T02:16:39.4748869Z 182 │ start: token.start, 2026-10-25T02:16:39.4748936Z 183 │ end: token.end, 2026-10-25T02:16:39.4749083Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T02:16:39.4749143Z 185 │ label: 2026-10-25T02:16:39.4749220Z 186 │ token.type === "skill" 2026-10-25T02:16:39.4749333Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T02:16:39.4749418Z 188 │ : token.type === "context" 2026-10-25T02:16:39.4749650Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T02:16:39.4749733Z 190 │ : basename(token.value), 2026-10-25T02:16:39.4749874Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T02:16:39.4749965Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-25T02:16:39.4750049Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-25T02:16:39.4750106Z 194 │ }; 2026-10-25T02:16:39.4750164Z 195 │ }), 2026-10-25T02:16:39.4750219Z 196 │ ); 2026-10-25T02:16:39.4750395Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T02:16:39.4750576Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T02:16:39.4750829Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4750966Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T02:16:39.4751017Z ╰──── 2026-10-25T02:16:39.4751221Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:16:39.4751528Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4751531Z 2026-10-25T02:16:39.4751719Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:16:39.4751862Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-25T02:16:39.4751995Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T02:16:39.4752095Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T02:16:39.4752186Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4752636Z · ╰── 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-25T02:16:39.4752726Z 253 │ eventCount: acknowledgedEventCount, 2026-10-25T02:16:39.4752789Z 254 │ value, 2026-10-25T02:16:39.4752866Z 255 │ selection: nextSelection, 2026-10-25T02:16:39.4752924Z 256 │ }); 2026-10-25T02:16:39.4753012Z 257 │ return acknowledgedEventCount; 2026-10-25T02:16:39.4753069Z 258 │ }, 2026-10-25T02:16:39.4753125Z 259 │ [], 2026-10-25T02:16:39.4753191Z ·  ─┬ 2026-10-25T02:16:39.4753373Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4753428Z 260 │ ); 2026-10-25T02:16:39.4753482Z ╰──── 2026-10-25T02:16:39.4753682Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:16:39.4753988Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4753991Z 2026-10-25T02:16:39.4754147Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4754384Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-25T02:16:39.4754566Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-25T02:16:39.4754699Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-25T02:16:39.4754774Z ·  ────┬─── 2026-10-25T02:16:39.4754905Z · ╰── `rotation` originates here 2026-10-25T02:16:39.4754960Z 172 │ 2026-10-25T02:16:39.4755028Z 173 │ useLayoutEffect(() => { 2026-10-25T02:16:39.4755162Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-25T02:16:39.4755235Z ·  ────┬─── 2026-10-25T02:16:39.4755365Z · ╰── `rotation` cannot be modified 2026-10-25T02:16:39.4755467Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-25T02:16:39.4755524Z ╰──── 2026-10-25T02:16:39.4755784Z  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-25T02:16:39.4756084Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4756087Z 2026-10-25T02:16:39.4756276Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4756426Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-25T02:16:39.4756494Z 1245 │ { 2026-10-25T02:16:39.4757567Z ·  ────┬──── 2026-10-25T02:16:39.4757693Z · ╰── This is the containing effect 2026-10-25T02:16:39.4757777Z 152 │ if (!controlledSelectedPath) { 2026-10-25T02:16:39.4757845Z 153 │ return; 2026-10-25T02:16:39.4757902Z 154 │ } 2026-10-25T02:16:39.4757985Z 155 │ setExpandedPaths((current) => { 2026-10-25T02:16:39.4758064Z ·  ────────┬─────── 2026-10-25T02:16:39.4758232Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4758354Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-25T02:16:39.4758407Z ╰──── 2026-10-25T02:16:39.4758995Z  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-25T02:16:39.4759361Z  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-25T02:16:39.4759393Z 2026-10-25T02:16:39.4759584Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4759730Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-25T02:16:39.4759836Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-25T02:16:39.4759929Z 223 │ 2026-10-25T02:16:39.4760035Z ·  ─────────────── 2026-10-25T02:16:39.4760123Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-25T02:16:39.4760176Z ╰──── 2026-10-25T02:16:39.4760320Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:16:39.4760322Z 2026-10-25T02:16:39.4760515Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4760663Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-25T02:16:39.4760736Z 226 │ { 2026-10-25T02:16:39.4761823Z ·  ────┬──── 2026-10-25T02:16:39.4761950Z · ╰── This is the containing effect 2026-10-25T02:16:39.4762027Z 106 │ clearReviewCommentTarget(); 2026-10-25T02:16:39.4762122Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T02:16:39.4762224Z ·  ────────────────┬─────────────── 2026-10-25T02:16:39.4762396Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4762467Z 108 │ }, [selectedSection?.id]); 2026-10-25T02:16:39.4762518Z ╰──── 2026-10-25T02:16:39.4763105Z  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-25T02:16:39.4763421Z  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-25T02:16:39.4763424Z 2026-10-25T02:16:39.4763673Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4763855Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-25T02:16:39.4763908Z 109 │ 2026-10-25T02:16:39.4763971Z 110 │ useEffect(() => { 2026-10-25T02:16:39.4764041Z ·  ────┬──── 2026-10-25T02:16:39.4764218Z · ╰── This is the containing effect 2026-10-25T02:16:39.4764370Z 111 │ if (activeCommentTarget === null) { 2026-10-25T02:16:39.4764469Z 112 │ setPendingNativeCommentSelection(null); 2026-10-25T02:16:39.4764573Z ·  ────────────────┬─────────────── 2026-10-25T02:16:39.4764749Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4764805Z 113 │ } 2026-10-25T02:16:39.4764855Z ╰──── 2026-10-25T02:16:39.4765436Z  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-25T02:16:39.4765751Z  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-25T02:16:39.4765756Z 2026-10-25T02:16:39.4765950Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4766129Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-25T02:16:39.4766224Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T02:16:39.4766295Z 108 │ }, [selectedSection?.id]); 2026-10-25T02:16:39.4766379Z ·  ─────────┬───────── 2026-10-25T02:16:39.4766538Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-25T02:16:39.4766590Z 109 │ 2026-10-25T02:16:39.4766640Z ╰──── 2026-10-25T02:16:39.4766930Z  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-25T02:16:39.4767236Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4767238Z 2026-10-25T02:16:39.4767435Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:16:39.4767569Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-25T02:16:39.4767729Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T02:16:39.4767817Z 228 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4767906Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4768358Z · ╰── 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-25T02:16:39.4768432Z 229 │ mostRecentEventCount, 2026-10-25T02:16:39.4768485Z 230 │ ); 2026-10-25T02:16:39.4768607Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T02:16:39.4768739Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T02:16:39.4768933Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4769013Z 232 │ const assumedValue = props.value; 2026-10-25T02:16:39.4769064Z ╰──── 2026-10-25T02:16:39.4769275Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:16:39.4769608Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4769611Z 2026-10-25T02:16:39.4769817Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4769949Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-25T02:16:39.4770091Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T02:16:39.4770178Z 239 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4770267Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4770715Z · ╰── 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-25T02:16:39.4770789Z 240 │ controlledEventCount, 2026-10-25T02:16:39.4770852Z 241 │ assumedValue, 2026-10-25T02:16:39.4770905Z 242 │ ); 2026-10-25T02:16:39.4771058Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T02:16:39.4771190Z ·  ───────────┬────────── 2026-10-25T02:16:39.4771392Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T02:16:39.4771479Z 244 │ const acceptNativeEvent = useCallback( 2026-10-25T02:16:39.4771528Z ╰──── 2026-10-25T02:16:39.4771940Z  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-25T02:16:39.4772245Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4772247Z 2026-10-25T02:16:39.4772388Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4772521Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-25T02:16:39.4772641Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:16:39.4772750Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:16:39.4772865Z ·  ─────────────┬──────────── 2026-10-25T02:16:39.4773070Z · ╰── Cannot access ref value during render 2026-10-25T02:16:39.4773154Z 165 │ }); 2026-10-25T02:16:39.4773204Z ╰──── 2026-10-25T02:16:39.4773663Z  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-25T02:16:39.4773947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4773950Z 2026-10-25T02:16:39.4774092Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4774254Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-25T02:16:39.4774380Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:16:39.4774491Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:16:39.4774603Z ·  ─────────────┬──────────── 2026-10-25T02:16:39.4774804Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4774859Z 165 │ }); 2026-10-25T02:16:39.4774909Z ╰──── 2026-10-25T02:16:39.4775357Z  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-25T02:16:39.4775645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4775650Z 2026-10-25T02:16:39.4775792Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4775922Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-25T02:16:39.4775977Z 165 │ }); 2026-10-25T02:16:39.4776064Z 166 │ confirmedTokensRef.current = tokens; 2026-10-25T02:16:39.4776184Z ·  ─────────┬────────────┬─── 2026-10-25T02:16:39.4776373Z · │ ╰── Cannot update ref value during render 2026-10-25T02:16:39.4776486Z · ╰── This value is a ref 2026-10-25T02:16:39.4776556Z 167 │ return JSON.stringify( 2026-10-25T02:16:39.4776608Z ╰──── 2026-10-25T02:16:39.4777064Z  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-25T02:16:39.4777353Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4777355Z 2026-10-25T02:16:39.4777497Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4777627Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-25T02:16:39.4777696Z 207 │ mostRecentEventCount, 2026-10-25T02:16:39.4777783Z 208 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4777932Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4778141Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4778200Z 209 │ ); 2026-10-25T02:16:39.4778252Z ╰──── 2026-10-25T02:16:39.4778705Z  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-25T02:16:39.4778986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4778991Z 2026-10-25T02:16:39.4779131Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4779267Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-25T02:16:39.4779339Z 213 │ mostRecentEventCount, 2026-10-25T02:16:39.4779426Z 214 │ nativeEventSnapshotsRef.current, 2026-10-25T02:16:39.4779525Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4779709Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4779764Z 215 │ ); 2026-10-25T02:16:39.4779816Z ╰──── 2026-10-25T02:16:39.4780262Z  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-25T02:16:39.4780552Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4780557Z 2026-10-25T02:16:39.4780740Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:16:39.4780872Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-25T02:16:39.4780991Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:16:39.4781102Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:16:39.4781210Z ·  ─────────┬──────── 2026-10-25T02:16:39.4781663Z · ╰── 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-25T02:16:39.4781720Z 165 │ }); 2026-10-25T02:16:39.4781810Z 166 │ confirmedTokensRef.current = tokens; 2026-10-25T02:16:39.4781884Z 167 │ return JSON.stringify( 2026-10-25T02:16:39.4782046Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T02:16:39.4782113Z 169 │ const record = 2026-10-25T02:16:39.4782190Z 170 │ token.type === "context" 2026-10-25T02:16:39.4782355Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T02:16:39.4782421Z 172 │ : undefined; 2026-10-25T02:16:39.4782527Z 173 │ const presentation = contextChipPresentation( 2026-10-25T02:16:39.4782634Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-25T02:16:39.4782697Z 175 │ record, 2026-10-25T02:16:39.4782756Z 176 │ ); 2026-10-25T02:16:39.4782892Z 177 │ const icon = contextChipIcon( 2026-10-25T02:16:39.4782985Z 178 │ presentation, 2026-10-25T02:16:39.4783126Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T02:16:39.4783184Z 180 │ ); 2026-10-25T02:16:39.4783245Z 181 │ return { 2026-10-25T02:16:39.4783315Z 182 │ type: token.type, 2026-10-25T02:16:39.4783390Z 183 │ source: token.source, 2026-10-25T02:16:39.4783460Z 184 │ start: token.start, 2026-10-25T02:16:39.4783524Z 185 │ end: token.end, 2026-10-25T02:16:39.4783670Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T02:16:39.4783731Z 187 │ label: 2026-10-25T02:16:39.4783808Z 188 │ token.type === "skill" 2026-10-25T02:16:39.4783912Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T02:16:39.4783998Z 190 │ : token.type === "context" 2026-10-25T02:16:39.4784243Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T02:16:39.4784352Z 192 │ : basename(token.value), 2026-10-25T02:16:39.4784492Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T02:16:39.4784584Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-25T02:16:39.4784675Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-25T02:16:39.4784733Z 196 │ }; 2026-10-25T02:16:39.4784788Z 197 │ }), 2026-10-25T02:16:39.4784843Z 198 │ ); 2026-10-25T02:16:39.4784974Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T02:16:39.4785124Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T02:16:39.4785329Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4785470Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T02:16:39.4785522Z ╰──── 2026-10-25T02:16:39.4785725Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:16:39.4786029Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4786032Z 2026-10-25T02:16:39.4786212Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:16:39.4786344Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-25T02:16:39.4786478Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T02:16:39.4786578Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T02:16:39.4786667Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4787114Z · ╰── 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-25T02:16:39.4787204Z 255 │ eventCount: acknowledgedEventCount, 2026-10-25T02:16:39.4787264Z 256 │ value, 2026-10-25T02:16:39.4787340Z 257 │ selection: nextSelection, 2026-10-25T02:16:39.4787397Z 258 │ }); 2026-10-25T02:16:39.4787478Z 259 │ return acknowledgedEventCount; 2026-10-25T02:16:39.4787532Z 260 │ }, 2026-10-25T02:16:39.4787632Z 261 │ [], 2026-10-25T02:16:39.4787755Z ·  ─┬ 2026-10-25T02:16:39.4787935Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:16:39.4787988Z 262 │ ); 2026-10-25T02:16:39.4788038Z ╰──── 2026-10-25T02:16:39.4788238Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:16:39.4788541Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4788543Z 2026-10-25T02:16:39.4788685Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4788800Z ╭─[apps/mobile/src/native/StackHeader.tsx:210:9] 2026-10-25T02:16:39.4788865Z 209 │ "options", 2026-10-25T02:16:39.4788962Z 210 │ latestOptionFunctionsRef.current, 2026-10-25T02:16:39.4789073Z ·  ────────────────┬─────────────── 2026-10-25T02:16:39.4789259Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4789352Z 211 │ optionFunctionWrappersRef.current, 2026-10-25T02:16:39.4789402Z ╰──── 2026-10-25T02:16:39.4789854Z  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-25T02:16:39.4790138Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4790140Z 2026-10-25T02:16:39.4790284Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4790403Z ╭─[apps/mobile/src/native/StackHeader.tsx:211:9] 2026-10-25T02:16:39.4790495Z 210 │ latestOptionFunctionsRef.current, 2026-10-25T02:16:39.4790587Z 211 │ optionFunctionWrappersRef.current, 2026-10-25T02:16:39.4790750Z ·  ────────────────┬──────────────── 2026-10-25T02:16:39.4790939Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4791030Z 212 │ ) as NativeStackNavigationOptions) 2026-10-25T02:16:39.4791082Z ╰──── 2026-10-25T02:16:39.4791589Z  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-25T02:16:39.4791911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4791914Z 2026-10-25T02:16:39.4792112Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4792245Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-25T02:16:39.4792328Z 453 │ showAuxiliaryPane("inspector"); 2026-10-25T02:16:39.4792433Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-25T02:16:39.4792576Z ·  ──────┬────── ────┬─── 2026-10-25T02:16:39.4792778Z · │ ╰── Unnecessary dependency `threadId` 2026-10-25T02:16:39.4792928Z · ╰── Unnecessary dependency `environmentId` 2026-10-25T02:16:39.4792986Z 455 │ const { 2026-10-25T02:16:39.4793037Z ╰──── 2026-10-25T02:16:39.4793324Z  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-25T02:16:39.4793626Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4793628Z 2026-10-25T02:16:39.4793809Z ⚠ react(static-components): Cannot create components during render 2026-10-25T02:16:39.4793939Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-25T02:16:39.4794007Z 492 │ // same check. 2026-10-25T02:16:39.4794136Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-25T02:16:39.4794264Z ·  ─────────────┬───────────── 2026-10-25T02:16:39.4794473Z · ╰── The component is created during render here 2026-10-25T02:16:39.4794624Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-25T02:16:39.4794743Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-25T02:16:39.4794872Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-25T02:16:39.4794961Z 497 │ const handlePullToRefresh = async () => { 2026-10-25T02:16:39.4795038Z 498 │ setIsPullRefreshing(true); 2026-10-25T02:16:39.4795121Z 499 │ await refreshSelectedSection(); 2026-10-25T02:16:39.4795201Z 500 │ setIsPullRefreshing(false); 2026-10-25T02:16:39.4795255Z 501 │ }; 2026-10-25T02:16:39.4795398Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-25T02:16:39.4795539Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-25T02:16:39.4795644Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-25T02:16:39.4795727Z 505 │ threadKey: reviewCache.threadKey, 2026-10-25T02:16:39.4795817Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-25T02:16:39.4795885Z 507 │ files: reviewFiles, 2026-10-25T02:16:39.4795983Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-25T02:16:39.4796111Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-25T02:16:39.4796174Z 510 │ : undefined, 2026-10-25T02:16:39.4796315Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-25T02:16:39.4796464Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-25T02:16:39.4796525Z 513 │ : undefined, 2026-10-25T02:16:39.4796580Z 514 │ }); 2026-10-25T02:16:39.4796767Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-25T02:16:39.4796899Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-25T02:16:39.4796960Z 517 │ environmentId, 2026-10-25T02:16:39.4797022Z 518 │ threadId, 2026-10-25T02:16:39.4797087Z 519 │ selectedSection, 2026-10-25T02:16:39.4797155Z 520 │ nativeReviewDiffData, 2026-10-25T02:16:39.4797211Z 521 │ }); 2026-10-25T02:16:39.4797316Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-25T02:16:39.4797401Z 523 │ threadKey: reviewCache.threadKey, 2026-10-25T02:16:39.4797492Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-25T02:16:39.4797572Z 525 │ diff: selectedSection?.diff, 2026-10-25T02:16:39.4797649Z 526 │ data: nativeReviewDiffData, 2026-10-25T02:16:39.4797716Z 527 │ collapsedFileIds, 2026-10-25T02:16:39.4797776Z 528 │ viewedFileIds, 2026-10-25T02:16:39.4797886Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-25T02:16:39.4800032Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-25T02:16:39.4800096Z 531 │ }); 2026-10-25T02:16:39.4800170Z 532 │ const showcaseReviewKey = 2026-10-25T02:16:39.4800302Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-25T02:16:39.4800507Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-25T02:16:39.4800568Z 535 │ : null; 2026-10-25T02:16:39.4800739Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-25T02:16:39.4800818Z 537 │ nativeBridge.onDebug(event); 2026-10-25T02:16:39.4800873Z 538 │ if ( 2026-10-25T02:16:39.4800952Z 539 │ showcaseReviewKey === null || 2026-10-25T02:16:39.4801072Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-25T02:16:39.4801179Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-25T02:16:39.4801232Z 542 │ ) { 2026-10-25T02:16:39.4801292Z 543 │ return; 2026-10-25T02:16:39.4801345Z 544 │ } 2026-10-25T02:16:39.4801454Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-25T02:16:39.4801613Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-25T02:16:39.4801666Z 547 │ }; 2026-10-25T02:16:39.4801717Z 548 │ 2026-10-25T02:16:39.4801837Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-25T02:16:39.4801918Z 550 │ loadVisibleFile(fileId, true); 2026-10-25T02:16:39.4802005Z 551 │ commentSelection.clearSelection(); 2026-10-25T02:16:39.4802122Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-25T02:16:39.4802198Z 553 │ toggleExpandedFile(fileId); 2026-10-25T02:16:39.4802251Z 554 │ } 2026-10-25T02:16:39.4802360Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-25T02:16:39.4802429Z 556 │ if (!nativeView) return; 2026-10-25T02:16:39.4802519Z 557 │ const result = await settlePromise(() => 2026-10-25T02:16:39.4802690Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-25T02:16:39.4802745Z 559 │ ); 2026-10-25T02:16:39.4802833Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-25T02:16:39.4803093Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-25T02:16:39.4803177Z 562 │ } 2026-10-25T02:16:39.4803230Z 563 │ }; 2026-10-25T02:16:39.4803311Z 564 │ const handleVisibleFileChange = ( 2026-10-25T02:16:39.4803439Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-25T02:16:39.4803496Z 566 │ ) => { 2026-10-25T02:16:39.4803604Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T02:16:39.4803773Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T02:16:39.4803824Z 569 │ }; 2026-10-25T02:16:39.4803902Z 570 │ const renderInspector = () => ( 2026-10-25T02:16:39.4803972Z 571 │ void handleSelectFile(fileId)} 2026-10-25T02:16:39.4804521Z 577 │ /> 2026-10-25T02:16:39.4804574Z 578 │ ); 2026-10-25T02:16:39.4804626Z 579 │ 2026-10-25T02:16:39.4804806Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-25T02:16:39.4804891Z 581 │ const { fileId } = event.nativeEvent; 2026-10-25T02:16:39.4804954Z 582 │ if (fileId) { 2026-10-25T02:16:39.4805033Z 583 │ loadVisibleFile(fileId, true); 2026-10-25T02:16:39.4805109Z 584 │ toggleExpandedFile(fileId); 2026-10-25T02:16:39.4805162Z 585 │ } 2026-10-25T02:16:39.4805218Z 586 │ }; 2026-10-25T02:16:39.4805270Z 587 │ 2026-10-25T02:16:39.4805361Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-25T02:16:39.4805480Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-25T02:16:39.4805536Z 590 │ ) => { 2026-10-25T02:16:39.4805620Z 591 │ const { fileId } = event.nativeEvent; 2026-10-25T02:16:39.4805680Z 592 │ if (fileId) { 2026-10-25T02:16:39.4805754Z 593 │ toggleViewedFile(fileId); 2026-10-25T02:16:39.4805808Z 594 │ } 2026-10-25T02:16:39.4805861Z 595 │ }; 2026-10-25T02:16:39.4805911Z 596 │ 2026-10-25T02:16:39.4805980Z 597 │ const parsedDiffNotice = 2026-10-25T02:16:39.4806139Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-25T02:16:39.4806260Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-25T02:16:39.4806419Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-25T02:16:39.4806541Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-25T02:16:39.4806697Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-25T02:16:39.4806806Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-25T02:16:39.4806904Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-25T02:16:39.4806974Z 605 │ hasCachedSelectedDiff, 2026-10-25T02:16:39.4807039Z 606 │ hasAnyCachedDiff, 2026-10-25T02:16:39.4807091Z 607 │ }); 2026-10-25T02:16:39.4807179Z 608 │ const handleRetryEnvironment = () => { 2026-10-25T02:16:39.4807264Z 609 │ void retryEnvironment(environmentId); 2026-10-25T02:16:39.4807317Z 610 │ }; 2026-10-25T02:16:39.4807398Z 611 │ const handleReturnToThread = () => { 2026-10-25T02:16:39.4807474Z 612 │ if (navigation.canGoBack()) { 2026-10-25T02:16:39.4807590Z 613 │ navigation.goBack(); 2026-10-25T02:16:39.4807680Z 614 │ return; 2026-10-25T02:16:39.4807730Z 615 │ } 2026-10-25T02:16:39.4807809Z 616 │ navigation.navigate("Thread", { 2026-10-25T02:16:39.4807895Z 617 │ environmentId: String(environmentId), 2026-10-25T02:16:39.4807970Z 618 │ threadId: String(threadId), 2026-10-25T02:16:39.4808024Z 619 │ }); 2026-10-25T02:16:39.4808076Z 620 │ }; 2026-10-25T02:16:39.4808156Z 621 │ const androidHeaderSubtitle = [ 2026-10-25T02:16:39.4808228Z 622 │ selectedSection?.title, 2026-10-25T02:16:39.4808305Z 623 │ headerDiffSummary.additions, 2026-10-25T02:16:39.4808383Z 624 │ headerDiffSummary.deletions, 2026-10-25T02:16:39.4808434Z 625 │ ] 2026-10-25T02:16:39.4808536Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-25T02:16:39.4808606Z 627 │ .join(" · "); 2026-10-25T02:16:39.4808660Z 628 │ 2026-10-25T02:16:39.4808737Z 629 │ const showChangedFilesPane = 2026-10-25T02:16:39.4808807Z 630 │ !showConnectionNotice && 2026-10-25T02:16:39.4808879Z 631 │ selectedSection !== null && 2026-10-25T02:16:39.4808956Z 632 │ parsedDiff.kind === "files" && 2026-10-25T02:16:39.4809033Z 633 │ NativeReviewDiffView !== null; 2026-10-25T02:16:39.4809198Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-25T02:16:39.4809367Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-25T02:16:39.4809418Z 636 │ 2026-10-25T02:16:39.4809488Z 637 │ const listHeader = (() => { 2026-10-25T02:16:39.4809570Z 638 │ const children: ReactElement[] = []; 2026-10-25T02:16:39.4809623Z 639 │ 2026-10-25T02:16:39.4809685Z 640 │ if (error) { 2026-10-25T02:16:39.4809757Z 641 │ children.push( 2026-10-25T02:16:39.4809817Z 642 │ 2026-10-25T02:16:39.4810449Z 649 │ Review unavailable 2026-10-25T02:16:39.4810604Z 650 │ {error} 2026-10-25T02:16:39.4810664Z 651 │ , 2026-10-25T02:16:39.4810719Z 652 │ ); 2026-10-25T02:16:39.4810770Z 653 │ } 2026-10-25T02:16:39.4810828Z 654 │ 2026-10-25T02:16:39.4810902Z 655 │ if (parsedDiffNotice) { 2026-10-25T02:16:39.4811058Z 656 │ children.push(); 2026-10-25T02:16:39.4811110Z 657 │ } 2026-10-25T02:16:39.4811162Z 658 │ 2026-10-25T02:16:39.4811238Z 659 │ if (children.length === 0) { 2026-10-25T02:16:39.4811302Z 660 │ return null; 2026-10-25T02:16:39.4811353Z 661 │ } 2026-10-25T02:16:39.4811405Z 662 │ 2026-10-25T02:16:39.4811473Z 663 │ return <>{children}; 2026-10-25T02:16:39.4811528Z 664 │ })(); 2026-10-25T02:16:39.4811595Z 665 │ const headerSubtitle = [ 2026-10-25T02:16:39.4811672Z 666 │ headerDiffSummary.additions, 2026-10-25T02:16:39.4811748Z 667 │ headerDiffSummary.deletions, 2026-10-25T02:16:39.4811825Z 668 │ pendingReviewCommentCount > 0 2026-10-25T02:16:39.4812046Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-25T02:16:39.4812137Z 670 │ : null, 2026-10-25T02:16:39.4812189Z 671 │ ] 2026-10-25T02:16:39.4812253Z 672 │ .filter(Boolean) 2026-10-25T02:16:39.4812315Z 673 │ .join(" · "); 2026-10-25T02:16:39.4812447Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-25T02:16:39.4812498Z 675 │ 2026-10-25T02:16:39.4812555Z 676 │ return ( 2026-10-25T02:16:39.4812610Z 677 │ <> 2026-10-25T02:16:39.4812674Z 678 │ 2026-10-25T02:16:39.4813971Z 694 │ 2026-10-25T02:16:39.4814034Z 695 │ 2026-10-25T02:16:39.4814159Z 696 │ 2026-10-25T02:16:39.4814273Z 697 │ {showConnectionNotice ? ( 2026-10-25T02:16:39.4814410Z 698 │ 2026-10-25T02:16:39.4814496Z 699 │ 2026-10-25T02:16:39.4815480Z 711 │ 2026-10-25T02:16:39.4815631Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-25T02:16:39.4815694Z 713 │ 2026-10-25T02:16:39.4816120Z 719 │ 2026-10-25T02:16:39.4816552Z 723 │ {listHeader} 2026-10-25T02:16:39.4816671Z 724 │ 2026-10-25T02:16:39.4816753Z 725 │ Promise.resolve()); 2026-10-25T02:16:39.4819803Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-25T02:16:39.4819901Z 226 │ │ if (!pending) { 2026-10-25T02:16:39.4819998Z 227 │ │ idlePasses++; 2026-10-25T02:16:39.4820103Z 228 │ │ if (idlePasses >= 3) { 2026-10-25T02:16:39.4820187Z 229 │ │ return; 2026-10-25T02:16:39.4820263Z 230 │ │ } 2026-10-25T02:16:39.4820347Z 231 │ │ continue; 2026-10-25T02:16:39.4820421Z 232 │ │ } 2026-10-25T02:16:39.4820513Z 233 │ │ idlePasses = 0; 2026-10-25T02:16:39.4820626Z 234 │ │ const exit = yield* Effect.exit( 2026-10-25T02:16:39.4820836Z 235 │ │ pending.operation as Effect.Effect, 2026-10-25T02:16:39.4820910Z 236 │ │ ); 2026-10-25T02:16:39.4821061Z 237 │ │ yield* Effect.sync(() => { 2026-10-25T02:16:39.4821193Z 238 │ │ pending.resolve(exit); 2026-10-25T02:16:39.4821268Z 239 │ │ }); 2026-10-25T02:16:39.4821393Z 240 │ ╰─▶ } 2026-10-25T02:16:39.4821449Z 241 │ }, 2026-10-25T02:16:39.4821501Z ╰──── 2026-10-25T02:16:39.4821504Z 2026-10-25T02:16:39.4821703Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4821845Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-25T02:16:39.4821939Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-25T02:16:39.4822017Z 257 │ }, [props.path, targetIndex]); 2026-10-25T02:16:39.4822093Z ·  ─────┬──── 2026-10-25T02:16:39.4822241Z · ╰── Unnecessary dependency `props.path` 2026-10-25T02:16:39.4822296Z 258 │ 2026-10-25T02:16:39.4822350Z ╰──── 2026-10-25T02:16:39.4822642Z  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-25T02:16:39.4822948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4822951Z 2026-10-25T02:16:39.4823143Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4823287Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-25T02:16:39.4823358Z 292 │ 2026-10-25T02:16:39.4824451Z ·  ─────────── 2026-10-25T02:16:39.4824563Z 310 │ {body} 2026-10-25T02:16:39.4824643Z ╰──── 2026-10-25T02:16:39.4824783Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:16:39.4824788Z 2026-10-25T02:16:39.4825040Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4825214Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-25T02:16:39.4825267Z 58 │ 2026-10-25T02:16:39.4825329Z 59 │ useEffect(() => { 2026-10-25T02:16:39.4825397Z ·  ────┬──── 2026-10-25T02:16:39.4825526Z · ╰── This is the containing effect 2026-10-25T02:16:39.4825606Z 60 │ setMountedModes((current) => { 2026-10-25T02:16:39.4825682Z ·  ───────┬─────── 2026-10-25T02:16:39.4825856Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4825939Z 61 │ if (current.has(props.mode)) { 2026-10-25T02:16:39.4825991Z ╰──── 2026-10-25T02:16:39.4826580Z  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-25T02:16:39.4826895Z  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-25T02:16:39.4826897Z 2026-10-25T02:16:39.4827357Z ⚠ 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-25T02:16:39.4827490Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-25T02:16:39.4827551Z 130 │ ) { 2026-10-25T02:16:39.4827758Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4827879Z 132 │ │ if (subscriptions.length >= count) { 2026-10-25T02:16:39.4827969Z 133 │ │ return; 2026-10-25T02:16:39.4828052Z 134 │ │ } 2026-10-25T02:16:39.4828159Z 135 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4828289Z 136 │ ╰─▶ } 2026-10-25T02:16:39.4828456Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-25T02:16:39.4828511Z ╰──── 2026-10-25T02:16:39.4828514Z 2026-10-25T02:16:39.4828967Z ⚠ 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-25T02:16:39.4829097Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-25T02:16:39.4829255Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-25T02:16:39.4829504Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-25T02:16:39.4829653Z 253 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4829811Z 254 │ ╰─▶ } 2026-10-25T02:16:39.4829931Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-25T02:16:39.4829982Z ╰──── 2026-10-25T02:16:39.4829984Z 2026-10-25T02:16:39.4830428Z ⚠ 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-25T02:16:39.4830555Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-25T02:16:39.4830611Z 257 │ 2026-10-25T02:16:39.4830921Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T02:16:39.4831026Z 259 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4831156Z 260 │ ╰─▶ } 2026-10-25T02:16:39.4831258Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T02:16:39.4831308Z ╰──── 2026-10-25T02:16:39.4831311Z 2026-10-25T02:16:39.4831757Z ⚠ 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-25T02:16:39.4831882Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-25T02:16:39.4831942Z 321 │ ); 2026-10-25T02:16:39.4832196Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-25T02:16:39.4832299Z 323 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4832424Z 324 │ ╰─▶ } 2026-10-25T02:16:39.4832477Z 325 │ 2026-10-25T02:16:39.4832526Z ╰──── 2026-10-25T02:16:39.4832529Z 2026-10-25T02:16:39.4832970Z ⚠ 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-25T02:16:39.4833096Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-25T02:16:39.4833256Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-25T02:16:39.4833500Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T02:16:39.4833728Z 331 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4833853Z 332 │ ╰─▶ } 2026-10-25T02:16:39.4833953Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T02:16:39.4834003Z ╰──── 2026-10-25T02:16:39.4834005Z 2026-10-25T02:16:39.4834481Z ⚠ 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-25T02:16:39.4834612Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-25T02:16:39.4834668Z 225 │ ) { 2026-10-25T02:16:39.4834926Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4835077Z 227 │ │ const socket = sockets[index]; 2026-10-25T02:16:39.4835162Z 228 │ │ if (socket) { 2026-10-25T02:16:39.4835256Z 229 │ │ return socket; 2026-10-25T02:16:39.4835326Z 230 │ │ } 2026-10-25T02:16:39.4835426Z 231 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4835547Z 232 │ ╰─▶ } 2026-10-25T02:16:39.4835720Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-25T02:16:39.4835769Z ╰──── 2026-10-25T02:16:39.4835772Z 2026-10-25T02:16:39.4836221Z ⚠ 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-25T02:16:39.4836353Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-25T02:16:39.4836407Z 239 │ ) { 2026-10-25T02:16:39.4836601Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:16:39.4836809Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-25T02:16:39.4836899Z 242 │ │ if (request) { 2026-10-25T02:16:39.4836990Z 243 │ │ return request; 2026-10-25T02:16:39.4837060Z 244 │ │ } 2026-10-25T02:16:39.4837164Z 245 │ │ yield* Effect.yieldNow; 2026-10-25T02:16:39.4837288Z 246 │ ╰─▶ } 2026-10-25T02:16:39.4837452Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-25T02:16:39.4837501Z ╰──── 2026-10-25T02:16:39.4837505Z 2026-10-25T02:16:39.4837693Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4837835Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-25T02:16:39.4837921Z 35 │ { 2026-10-25T02:16:39.4839216Z 57 │ if (pulse) { 2026-10-25T02:16:39.4839301Z 58 │ pulseProgress.value = withRepeat( 2026-10-25T02:16:39.4839425Z ·  ──────┬────── 2026-10-25T02:16:39.4839594Z · ╰── `pulseProgress` cannot be modified 2026-10-25T02:16:39.4839661Z 59 │ withTiming(1, { 2026-10-25T02:16:39.4839711Z ╰──── 2026-10-25T02:16:39.4839971Z  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-25T02:16:39.4840273Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4840276Z 2026-10-25T02:16:39.4840528Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4840700Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:124:7] 2026-10-25T02:16:39.4840753Z 119 │ 2026-10-25T02:16:39.4840817Z 120 │ useEffect(() => { 2026-10-25T02:16:39.4840886Z ·  ────┬──── 2026-10-25T02:16:39.4841012Z · ╰── This is the containing effect 2026-10-25T02:16:39.4841094Z 121 │ if (orientationSettled) return; 2026-10-25T02:16:39.4841205Z 122 │ const orientation = getNativeShowcaseOrientation(); 2026-10-25T02:16:39.4841277Z 123 │ if (orientation === null) { 2026-10-25T02:16:39.4841355Z 124 │ setOrientationSettled(true); 2026-10-25T02:16:39.4841443Z ·  ──────────┬────────── 2026-10-25T02:16:39.4841612Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4841672Z 125 │ return; 2026-10-25T02:16:39.4841722Z ╰──── 2026-10-25T02:16:39.4842310Z  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-25T02:16:39.4842628Z  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-25T02:16:39.4842631Z 2026-10-25T02:16:39.4842882Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4843045Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:300:7] 2026-10-25T02:16:39.4843097Z 288 │ 2026-10-25T02:16:39.4843166Z 289 │ useEffect(() => { 2026-10-25T02:16:39.4843238Z ·  ────┬──── 2026-10-25T02:16:39.4843361Z · ╰── This is the containing effect 2026-10-25T02:16:39.4843418Z 290 │ if ( 2026-10-25T02:16:39.4843483Z 291 │ scene === null || 2026-10-25T02:16:39.4843558Z 292 │ requestedScene === null || 2026-10-25T02:16:39.4843631Z 293 │ scene !== requestedScene || 2026-10-25T02:16:39.4843694Z 294 │ !hasFixture || 2026-10-25T02:16:39.4843764Z 295 │ !orientationSettled || 2026-10-25T02:16:39.4843829Z 296 │ !themeApplied || 2026-10-25T02:16:39.4843943Z 297 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-25T02:16:39.4844075Z 298 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-25T02:16:39.4844130Z 299 │ ) { 2026-10-25T02:16:39.4844253Z 300 │ setReadyScene(null); 2026-10-25T02:16:39.4844389Z ·  ──────┬────── 2026-10-25T02:16:39.4844557Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4844617Z 301 │ return; 2026-10-25T02:16:39.4844666Z ╰──── 2026-10-25T02:16:39.4845246Z  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-25T02:16:39.4845560Z  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-25T02:16:39.4845563Z 2026-10-25T02:16:39.4845832Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4846001Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:129:9] 2026-10-25T02:16:39.4846068Z 128 │ let cancelled = false; 2026-10-25T02:16:39.4846157Z 129 │ let lastOutcome: string | null = null; 2026-10-25T02:16:39.4846234Z ·  ─────┬───── 2026-10-25T02:16:39.4846366Z · ╰── 'lastOutcome' is declared here 2026-10-25T02:16:39.4846540Z 130 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-25T02:16:39.4846591Z ╰──── 2026-10-25T02:16:39.4846693Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4846695Z 2026-10-25T02:16:39.4846899Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:16:39.4847032Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-25T02:16:39.4847103Z 2 │ AuthDiagnosticsReadScope, 2026-10-25T02:16:39.4847171Z 3 │ type AuthSessionState, 2026-10-25T02:16:39.4847252Z ·  ────────┬─────── 2026-10-25T02:16:39.4847392Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:16:39.4847459Z 4 │ sessionGrantsScope, 2026-10-25T02:16:39.4847509Z ╰──── 2026-10-25T02:16:39.4847605Z  help: Consider removing this import. 2026-10-25T02:16:39.4847607Z 2026-10-25T02:16:39.4847858Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4848070Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:82:5] 2026-10-25T02:16:39.4848149Z 79 │ 2026-10-25T02:16:39.4848212Z 80 │ useEffect(() => { 2026-10-25T02:16:39.4848281Z ·  ────┬──── 2026-10-25T02:16:39.4848407Z · ╰── This is the containing effect 2026-10-25T02:16:39.4848532Z 81 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-25T02:16:39.4848597Z 82 │ setHostInput(host); 2026-10-25T02:16:39.4848670Z ·  ──────┬───── 2026-10-25T02:16:39.4848833Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4848898Z 83 │ setCodeInput(code); 2026-10-25T02:16:39.4848948Z ╰──── 2026-10-25T02:16:39.4849538Z  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-25T02:16:39.4849854Z  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-25T02:16:39.4849856Z 2026-10-25T02:16:39.4850117Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4850283Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:92:5] 2026-10-25T02:16:39.4850335Z 85 │ 2026-10-25T02:16:39.4850395Z 86 │ useEffect(() => { 2026-10-25T02:16:39.4850464Z ·  ────┬──── 2026-10-25T02:16:39.4850591Z · ╰── This is the containing effect 2026-10-25T02:16:39.4850681Z 87 │ if (routePairingUrl.length === 0) { 2026-10-25T02:16:39.4850739Z 88 │ return; 2026-10-25T02:16:39.4850792Z 89 │ } 2026-10-25T02:16:39.4850842Z 90 │ 2026-10-25T02:16:39.4850956Z 91 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-25T02:16:39.4851019Z 92 │ setHostInput(host); 2026-10-25T02:16:39.4851093Z ·  ──────┬───── 2026-10-25T02:16:39.4851256Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4851320Z 93 │ setCodeInput(code); 2026-10-25T02:16:39.4851369Z ╰──── 2026-10-25T02:16:39.4851954Z  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-25T02:16:39.4852270Z  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-25T02:16:39.4852272Z 2026-10-25T02:16:39.4852521Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4852684Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:98:7] 2026-10-25T02:16:39.4852734Z 95 │ 2026-10-25T02:16:39.4852795Z 96 │ useEffect(() => { 2026-10-25T02:16:39.4852863Z ·  ────┬──── 2026-10-25T02:16:39.4852985Z · ╰── This is the containing effect 2026-10-25T02:16:39.4853115Z 97 │ if (pairingConnectionError) { 2026-10-25T02:16:39.4853213Z 98 │ setIsSubmitting(false); 2026-10-25T02:16:39.4853293Z ·  ───────┬─────── 2026-10-25T02:16:39.4853461Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4853515Z 99 │ } 2026-10-25T02:16:39.4853565Z ╰──── 2026-10-25T02:16:39.4854139Z  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-25T02:16:39.4854488Z  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-25T02:16:39.4854493Z 2026-10-25T02:16:39.4854694Z ⚠ eslint(no-unused-vars): Identifier 'openSettings' is imported but never used. 2026-10-25T02:16:39.4854860Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10] 2026-10-25T02:16:39.4854994Z 34 │ import { splitEnvironmentSections } from "./environmentSections"; 2026-10-25T02:16:39.4855116Z 35 │ import { openSettings } from "../settings/settings-navigation"; 2026-10-25T02:16:39.4855194Z ·  ──────┬───── 2026-10-25T02:16:39.4855329Z · ╰── 'openSettings' is imported here 2026-10-25T02:16:39.4855460Z 36 │ import { leaveSettingsPage } from "../settings/settings-navigation"; 2026-10-25T02:16:39.4855512Z ╰──── 2026-10-25T02:16:39.4855614Z  help: Consider removing this import. 2026-10-25T02:16:39.4855619Z 2026-10-25T02:16:39.4855868Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4856018Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-25T02:16:39.4856153Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-25T02:16:39.4856217Z 356 │ useEffect(() => { 2026-10-25T02:16:39.4856286Z ·  ────┬──── 2026-10-25T02:16:39.4856412Z · ╰── This is the containing effect 2026-10-25T02:16:39.4856500Z 357 │ if (!isReturningToProjectPicker) { 2026-10-25T02:16:39.4856560Z 358 │ return; 2026-10-25T02:16:39.4856613Z 359 │ } 2026-10-25T02:16:39.4856709Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-25T02:16:39.4856806Z 361 │ setIsReturningToProjectPicker(false); 2026-10-25T02:16:39.4856910Z ·  ──────────────┬────────────── 2026-10-25T02:16:39.4857082Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4857141Z 362 │ return; 2026-10-25T02:16:39.4857191Z ╰──── 2026-10-25T02:16:39.4857770Z  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-25T02:16:39.4858086Z  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-25T02:16:39.4858134Z 2026-10-25T02:16:39.4858411Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4858559Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-25T02:16:39.4858611Z 447 │ 2026-10-25T02:16:39.4858674Z 448 │ useEffect(() => { 2026-10-25T02:16:39.4858742Z ·  ────┬──── 2026-10-25T02:16:39.4858866Z · ╰── This is the containing effect 2026-10-25T02:16:39.4858967Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-25T02:16:39.4859024Z 450 │ return; 2026-10-25T02:16:39.4859076Z 451 │ } 2026-10-25T02:16:39.4859214Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-25T02:16:39.4859353Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-25T02:16:39.4859461Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-25T02:16:39.4859513Z 455 │ } 2026-10-25T02:16:39.4859649Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T02:16:39.4859773Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T02:16:39.4859874Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-25T02:16:39.4859944Z 459 │ const directProject = 2026-10-25T02:16:39.4860009Z 460 │ projects.find( 2026-10-25T02:16:39.4860072Z 461 │ (project) => 2026-10-25T02:16:39.4860243Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-25T02:16:39.4860302Z 463 │ ) ?? null; 2026-10-25T02:16:39.4860352Z 464 │ 2026-10-25T02:16:39.4860419Z 465 │ if (directProject) { 2026-10-25T02:16:39.4860561Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-25T02:16:39.4860700Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-25T02:16:39.4860859Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-25T02:16:39.4860992Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-25T02:16:39.4861053Z 470 │ return; 2026-10-25T02:16:39.4861108Z 471 │ } 2026-10-25T02:16:39.4861204Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-25T02:16:39.4861265Z 473 │ if ( 2026-10-25T02:16:39.4861404Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-25T02:16:39.4861502Z 475 │ selectedProject.id !== directProject.id 2026-10-25T02:16:39.4861565Z 476 │ ) { 2026-10-25T02:16:39.4861649Z 477 │ setProject(directProject); 2026-10-25T02:16:39.4861710Z 478 │ return; 2026-10-25T02:16:39.4861769Z 479 │ } 2026-10-25T02:16:39.4861850Z 480 │ if (!flow.draftKey) return; 2026-10-25T02:16:39.4861987Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-25T02:16:39.4862125Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-25T02:16:39.4862234Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-25T02:16:39.4862310Z 484 │ workspaceSelection: { 2026-10-25T02:16:39.4862378Z 485 │ mode: "local", 2026-10-25T02:16:39.4862478Z 486 │ branch: props.initialProjectRef.branch, 2026-10-25T02:16:39.4862611Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-25T02:16:39.4862738Z 488 │ startFromOrigin: false, 2026-10-25T02:16:39.4862873Z 489 │ }, 2026-10-25T02:16:39.4862929Z 490 │ }); 2026-10-25T02:16:39.4862986Z 491 │ } 2026-10-25T02:16:39.4863110Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-25T02:16:39.4863167Z 493 │ if ( 2026-10-25T02:16:39.4863305Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-25T02:16:39.4863401Z 495 │ selectedProject.id === directProject.id 2026-10-25T02:16:39.4863459Z 496 │ ) { 2026-10-25T02:16:39.4863520Z 497 │ return; 2026-10-25T02:16:39.4863574Z 498 │ } 2026-10-25T02:16:39.4863652Z 499 │ setProject(directProject); 2026-10-25T02:16:39.4863711Z 500 │ return; 2026-10-25T02:16:39.4863764Z 501 │ } 2026-10-25T02:16:39.4863815Z 502 │ 2026-10-25T02:16:39.4863896Z 503 │ if (projects.length > 0) { 2026-10-25T02:16:39.4863993Z 504 │ setIsReturningToProjectPicker(true); 2026-10-25T02:16:39.4864097Z ·  ──────────────┬────────────── 2026-10-25T02:16:39.4864298Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4864353Z 505 │ } 2026-10-25T02:16:39.4864404Z ╰──── 2026-10-25T02:16:39.4864984Z  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-25T02:16:39.4865302Z  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-25T02:16:39.4865308Z 2026-10-25T02:16:39.4865565Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4865715Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-25T02:16:39.4865766Z 545 │ 2026-10-25T02:16:39.4865828Z 546 │ useEffect(() => { 2026-10-25T02:16:39.4865898Z ·  ────┬──── 2026-10-25T02:16:39.4866022Z · ╰── This is the containing effect 2026-10-25T02:16:39.4866115Z 547 │ const shareId = props.incomingShareId; 2026-10-25T02:16:39.4866192Z 548 │ const draftKey = flow.draftKey; 2026-10-25T02:16:39.4866291Z 549 │ const destinationProject = selectedProject; 2026-10-25T02:16:39.4866432Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T02:16:39.4866561Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T02:16:39.4866648Z 552 │ const selectedProjectMatchesRoute = 2026-10-25T02:16:39.4866723Z 553 │ !initialEnvironmentId || 2026-10-25T02:16:39.4866791Z 554 │ !initialProjectId || 2026-10-25T02:16:39.4866920Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-25T02:16:39.4867021Z 556 │ destinationProject.id === initialProjectId); 2026-10-25T02:16:39.4867078Z 557 │ if ( 2026-10-25T02:16:39.4867140Z 558 │ !shareId || 2026-10-25T02:16:39.4867201Z 559 │ !draftKey || 2026-10-25T02:16:39.4867271Z 560 │ !destinationProject || 2026-10-25T02:16:39.4867355Z 561 │ !selectedProjectMatchesRoute || 2026-10-25T02:16:39.4867490Z 562 │ cancelledIncomingShareId === shareId 2026-10-25T02:16:39.4867572Z 563 │ ) { 2026-10-25T02:16:39.4867630Z 564 │ return; 2026-10-25T02:16:39.4867684Z 565 │ } 2026-10-25T02:16:39.4867777Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-25T02:16:39.4867832Z 567 │ if ( 2026-10-25T02:16:39.4867944Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-25T02:16:39.4868054Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-25T02:16:39.4868108Z 570 │ ) { 2026-10-25T02:16:39.4868165Z 571 │ return; 2026-10-25T02:16:39.4868219Z 572 │ } 2026-10-25T02:16:39.4868271Z 573 │ 2026-10-25T02:16:39.4868337Z 574 │ if (!incomingShare) { 2026-10-25T02:16:39.4868529Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-25T02:16:39.4868661Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-25T02:16:39.4868733Z 577 │ Dialog.alert( 2026-10-25T02:16:39.4868818Z 578 │ "Shared content unavailable", 2026-10-25T02:16:39.4868988Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-25T02:16:39.4869046Z 580 │ ); 2026-10-25T02:16:39.4869099Z 581 │ } 2026-10-25T02:16:39.4869158Z 582 │ return; 2026-10-25T02:16:39.4869210Z 583 │ } 2026-10-25T02:16:39.4869260Z 584 │ 2026-10-25T02:16:39.4869315Z 585 │ if ( 2026-10-25T02:16:39.4869470Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-25T02:16:39.4869567Z 587 │ selectedEnvironmentServerConfig === null 2026-10-25T02:16:39.4869623Z 588 │ ) { 2026-10-25T02:16:39.4869681Z 589 │ return; 2026-10-25T02:16:39.4869732Z 590 │ } 2026-10-25T02:16:39.4869788Z 591 │ 2026-10-25T02:16:39.4869925Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-25T02:16:39.4870044Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-25T02:16:39.4870096Z 594 │ } 2026-10-25T02:16:39.4870199Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-25T02:16:39.4870267Z 596 │ const draftBackup = 2026-10-25T02:16:39.4870450Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-25T02:16:39.4870583Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-25T02:16:39.4870732Z 599 │ const importToken = Symbol(importKey); 2026-10-25T02:16:39.4870808Z 600 │ let didReserveShare = false; 2026-10-25T02:16:39.4870883Z 601 │ let didConsumeShare = false; 2026-10-25T02:16:39.4870965Z 602 │ let needsDraftRestore = false; 2026-10-25T02:16:39.4871076Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-25T02:16:39.4871159Z 604 │ setImportingShareKey(importKey); 2026-10-25T02:16:39.4871244Z ·  ──────────┬───────── 2026-10-25T02:16:39.4871413Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4871480Z 605 │ void (async () => { 2026-10-25T02:16:39.4871532Z ╰──── 2026-10-25T02:16:39.4872112Z  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-25T02:16:39.4872496Z  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-25T02:16:39.4872535Z 2026-10-25T02:16:39.4872732Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4872883Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-25T02:16:39.4872959Z 523 │ props.initialProjectRef, 2026-10-25T02:16:39.4873031Z 524 │ props.incomingShareId, 2026-10-25T02:16:39.4873116Z ·  ──────────┬────────── 2026-10-25T02:16:39.4873279Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-25T02:16:39.4873348Z 525 │ props.pendingTaskId, 2026-10-25T02:16:39.4873400Z ╰──── 2026-10-25T02:16:39.4873691Z  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-25T02:16:39.4873998Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4874000Z 2026-10-25T02:16:39.4874220Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4874396Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-25T02:16:39.4874510Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-25T02:16:39.4874576Z 543 │ flow.loadBranches(); 2026-10-25T02:16:39.4874643Z ·  ──┬─ 2026-10-25T02:16:39.4874764Z · ╰── Missing dependency `flow` 2026-10-25T02:16:39.4874860Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-25T02:16:39.4874945Z ·  ────────┬──────── 2026-10-25T02:16:39.4875141Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-25T02:16:39.4875193Z 545 │ 2026-10-25T02:16:39.4875242Z ╰──── 2026-10-25T02:16:39.4875654Z  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-25T02:16:39.4875958Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4875960Z 2026-10-25T02:16:39.4876199Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4876374Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-25T02:16:39.4876437Z 765 │ flow.draftKey, 2026-10-25T02:16:39.4876513Z 766 │ hasImportedIncomingShare, 2026-10-25T02:16:39.4876602Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4876776Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-25T02:16:39.4876839Z 767 │ incomingShare, 2026-10-25T02:16:39.4876918Z 768 │ isIncomingShareInboxLoading, 2026-10-25T02:16:39.4877012Z ·  ─────────────┬───────────── 2026-10-25T02:16:39.4877190Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-25T02:16:39.4877268Z 769 │ isIncomingShareUnavailable, 2026-10-25T02:16:39.4877344Z 770 │ props.incomingShareId, 2026-10-25T02:16:39.4877439Z 771 │ props.initialProjectRef?.environmentId, 2026-10-25T02:16:39.4877525Z 772 │ props.initialProjectRef?.projectId, 2026-10-25T02:16:39.4877596Z 773 │ releaseShareReservation, 2026-10-25T02:16:39.4877658Z 774 │ reserveShare, 2026-10-25T02:16:39.4877742Z 775 │ selectedEnvironmentServerConfig, 2026-10-25T02:16:39.4877809Z 776 │ selectedProject, 2026-10-25T02:16:39.4877876Z 777 │ shareImportAttempt, 2026-10-25T02:16:39.4877961Z ·  ─────────┬──────── 2026-10-25T02:16:39.4878122Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-25T02:16:39.4878177Z 778 │ ]); 2026-10-25T02:16:39.4878227Z ╰──── 2026-10-25T02:16:39.4878518Z  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-25T02:16:39.4878823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4878825Z 2026-10-25T02:16:39.4879020Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4879172Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:267:35] 2026-10-25T02:16:39.4879228Z 266 │ }; 2026-10-25T02:16:39.4879357Z 267 │ }, [method, nativeRef, payload, resetKey, onFailure, onDelivered]); 2026-10-25T02:16:39.4879457Z ·  ────┬─── 2026-10-25T02:16:39.4879613Z · ╰── Unnecessary dependency `resetKey` 2026-10-25T02:16:39.4879669Z 268 │ } 2026-10-25T02:16:39.4879724Z ╰──── 2026-10-25T02:16:39.4880006Z  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-25T02:16:39.4880308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4880310Z 2026-10-25T02:16:39.4880452Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:16:39.4880606Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:391:39] 2026-10-25T02:16:39.4880659Z 390 │ 2026-10-25T02:16:39.4880838Z 391 │ ╭─▶ return createElement(RawNativeView, { 2026-10-25T02:16:39.4880977Z 392 │ │ ...nativeProps, 2026-10-25T02:16:39.4881147Z 393 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-25T02:16:39.4881246Z 394 │ │ onDebug: (event) => { 2026-10-25T02:16:39.4881397Z 395 │ │ if (event.nativeEvent.message === "rows-decode-failed") { 2026-10-25T02:16:39.4881596Z 396 │ │ console.error("[native-review-diff] rows decode failed", event.nativeEvent.error); 2026-10-25T02:16:39.4881694Z 397 │ │ onRowsFailure(); 2026-10-25T02:16:39.4881769Z 398 │ │ } 2026-10-25T02:16:39.4881862Z 399 │ │ onDebug?.(event); 2026-10-25T02:16:39.4881934Z 400 │ │ }, 2026-10-25T02:16:39.4882023Z 401 │ │ ref: nativeRef, 2026-10-25T02:16:39.4882156Z 402 │ ├─▶ }); 2026-10-25T02:16:39.4882392Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:16:39.4882444Z 403 │ } 2026-10-25T02:16:39.4882497Z ╰──── 2026-10-25T02:16:39.4882956Z  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-25T02:16:39.4883247Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:16:39.4883249Z 2026-10-25T02:16:39.4883507Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4883665Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-25T02:16:39.4883726Z 434 │ : null; 2026-10-25T02:16:39.4883792Z 435 │ useEffect(() => { 2026-10-25T02:16:39.4883861Z ·  ────┬──── 2026-10-25T02:16:39.4883986Z · ╰── This is the containing effect 2026-10-25T02:16:39.4884042Z 436 │ if ( 2026-10-25T02:16:39.4884117Z 437 │ props.active === false || 2026-10-25T02:16:39.4884222Z 438 │ activeDraftKey !== null || 2026-10-25T02:16:39.4884301Z 439 │ editingPendingTask !== null || 2026-10-25T02:16:39.4884374Z 440 │ selectedProject === null 2026-10-25T02:16:39.4884428Z 441 │ ) { 2026-10-25T02:16:39.4884485Z 442 │ return; 2026-10-25T02:16:39.4884543Z 443 │ } 2026-10-25T02:16:39.4884614Z 444 │ setActiveDraftKey( 2026-10-25T02:16:39.4884694Z ·  ────────┬──────── 2026-10-25T02:16:39.4884864Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4884932Z 445 │ createNewTaskDraft({ 2026-10-25T02:16:39.4884983Z ╰──── 2026-10-25T02:16:39.4885567Z  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-25T02:16:39.4885926Z  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-25T02:16:39.4885962Z 2026-10-25T02:16:39.4886198Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:16:39.4886360Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-25T02:16:39.4886464Z 1243 │ 2026-10-25T02:16:39.4886656Z 1244 │ {props.children} 2026-10-25T02:16:39.4886767Z ·  ───────────── 2026-10-25T02:16:39.4886838Z 1245 │ 2026-10-25T02:16:39.4886891Z ╰──── 2026-10-25T02:16:39.4887109Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:16:39.4887251Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:16:39.4887257Z 2026-10-25T02:16:39.4887491Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:16:39.4887644Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-25T02:16:39.4887704Z 289 │ return ( 2026-10-25T02:16:39.4887837Z 290 │ 2026-10-25T02:16:39.4887952Z ·  ───────────── 2026-10-25T02:16:39.4888021Z 291 │ {props.children} 2026-10-25T02:16:39.4888071Z ╰──── 2026-10-25T02:16:39.4888284Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:16:39.4888423Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:16:39.4888428Z 2026-10-25T02:16:39.4888659Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:16:39.4888810Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-25T02:16:39.4888867Z 653 │ return ( 2026-10-25T02:16:39.4888986Z 654 │ 2026-10-25T02:16:39.4889099Z ·  ───────────── 2026-10-25T02:16:39.4889163Z 655 │ {props.children} 2026-10-25T02:16:39.4889213Z ╰──── 2026-10-25T02:16:39.4889425Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:16:39.4889561Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:16:39.4889566Z 2026-10-25T02:16:39.4889795Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:16:39.4889950Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-25T02:16:39.4890010Z 1461 │ return ( 2026-10-25T02:16:39.4890168Z 1462 │ 2026-10-25T02:16:39.4890297Z ·  ──────────────────── 2026-10-25T02:16:39.4890393Z 1463 │ { 2026-10-25T02:16:39.4891448Z ·  ────┬──── 2026-10-25T02:16:39.4891576Z · ╰── This is the containing effect 2026-10-25T02:16:39.4891648Z 2236 │ setExpandedVideo(null); 2026-10-25T02:16:39.4891728Z ·  ────────┬─────── 2026-10-25T02:16:39.4891903Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4891979Z 2237 │ setExpandedFile(null); 2026-10-25T02:16:39.4892029Z ╰──── 2026-10-25T02:16:39.4892610Z  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-25T02:16:39.4892927Z  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-25T02:16:39.4892929Z 2026-10-25T02:16:39.4893182Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4893317Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2744:9] 2026-10-25T02:16:39.4893454Z 2735 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-25T02:16:39.4893518Z 2736 │ useEffect(() => { 2026-10-25T02:16:39.4893591Z ·  ────┬──── 2026-10-25T02:16:39.4893718Z · ╰── This is the containing effect 2026-10-25T02:16:39.4893844Z 2737 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-25T02:16:39.4893938Z 2738 │ const index = presentedFeed.findIndex( 2026-10-25T02:16:39.4894067Z 2739 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-25T02:16:39.4894122Z 2740 │ ); 2026-10-25T02:16:39.4894200Z 2741 │ if (index === -1) { 2026-10-25T02:16:39.4894356Z 2742 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-25T02:16:39.4894458Z 2743 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-25T02:16:39.4894549Z 2744 │ setInteractionState((current) => ({ 2026-10-25T02:16:39.4894636Z ·  ─────────┬───────── 2026-10-25T02:16:39.4894811Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4894877Z 2745 │ ...current, 2026-10-25T02:16:39.4894930Z ╰──── 2026-10-25T02:16:39.4895508Z  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-25T02:16:39.4895867Z  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-25T02:16:39.4895898Z 2026-10-25T02:16:39.4896125Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-25T02:16:39.4896255Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:72:10] 2026-10-25T02:16:39.4896389Z 71 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-25T02:16:39.4896523Z 72 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-25T02:16:39.4896617Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4896780Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-25T02:16:39.4896940Z 73 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-25T02:16:39.4896992Z ╰──── 2026-10-25T02:16:39.4897088Z  help: Consider removing this import. 2026-10-25T02:16:39.4897090Z 2026-10-25T02:16:39.4897291Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-25T02:16:39.4897419Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:98:3] 2026-10-25T02:16:39.4897476Z 97 │ import { 2026-10-25T02:16:39.4897538Z 98 │ createContext, 2026-10-25T02:16:39.4897611Z ·  ──────┬────── 2026-10-25T02:16:39.4897744Z · ╰── 'createContext' is imported here 2026-10-25T02:16:39.4897797Z 99 │ memo, 2026-10-25T02:16:39.4897848Z ╰──── 2026-10-25T02:16:39.4897941Z  help: Consider removing this import. 2026-10-25T02:16:39.4897944Z 2026-10-25T02:16:39.4898156Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T02:16:39.4898287Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:114:3] 2026-10-25T02:16:39.4898343Z 113 │ import { 2026-10-25T02:16:39.4898408Z 114 │ ActivityIndicator, 2026-10-25T02:16:39.4898487Z ·  ────────┬──────── 2026-10-25T02:16:39.4898627Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T02:16:39.4898686Z 115 │ Image, 2026-10-25T02:16:39.4898737Z ╰──── 2026-10-25T02:16:39.4898830Z  help: Consider removing this import. 2026-10-25T02:16:39.4898832Z 2026-10-25T02:16:39.4899026Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-25T02:16:39.4899200Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:3] 2026-10-25T02:16:39.4899289Z 120 │ Pressable, 2026-10-25T02:16:39.4899351Z 121 │ ScrollView, 2026-10-25T02:16:39.4899421Z ·  ─────┬──── 2026-10-25T02:16:39.4899549Z · ╰── 'ScrollView' is imported here 2026-10-25T02:16:39.4899614Z 122 │ StyleSheet, 2026-10-25T02:16:39.4899665Z ╰──── 2026-10-25T02:16:39.4899755Z  help: Consider removing this import. 2026-10-25T02:16:39.4899758Z 2026-10-25T02:16:39.4899950Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-25T02:16:39.4900079Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11] 2026-10-25T02:16:39.4900138Z 122 │ StyleSheet, 2026-10-25T02:16:39.4900203Z 123 │ Text as NativeText, 2026-10-25T02:16:39.4900287Z ·  ─────┬──── 2026-10-25T02:16:39.4900422Z · ╰── 'NativeText' is imported here 2026-10-25T02:16:39.4900486Z 124 │ type ColorValue, 2026-10-25T02:16:39.4900535Z ╰──── 2026-10-25T02:16:39.4900626Z  help: Consider removing this import. 2026-10-25T02:16:39.4900628Z 2026-10-25T02:16:39.4900837Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-25T02:16:39.4900966Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:146:10] 2026-10-25T02:16:39.4901099Z 145 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-25T02:16:39.4901221Z 146 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-25T02:16:39.4901308Z ·  ─────────┬──────── 2026-10-25T02:16:39.4901464Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-25T02:16:39.4901612Z 147 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-25T02:16:39.4901661Z ╰──── 2026-10-25T02:16:39.4901754Z  help: Consider removing this import. 2026-10-25T02:16:39.4901757Z 2026-10-25T02:16:39.4901968Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-25T02:16:39.4902095Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:149:10] 2026-10-25T02:16:39.4902226Z 148 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-25T02:16:39.4902348Z 149 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-25T02:16:39.4902436Z ·  ─────────┬───────── 2026-10-25T02:16:39.4902593Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-25T02:16:39.4902653Z 150 │ import { 2026-10-25T02:16:39.4902704Z ╰──── 2026-10-25T02:16:39.4902794Z  help: Consider removing this import. 2026-10-25T02:16:39.4902797Z 2026-10-25T02:16:39.4903003Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-25T02:16:39.4903129Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10] 2026-10-25T02:16:39.4903273Z 162 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-25T02:16:39.4903405Z 163 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-25T02:16:39.4903491Z ·  ────────┬─────── 2026-10-25T02:16:39.4903634Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-25T02:16:39.4903818Z 164 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-25T02:16:39.4903904Z ╰──── 2026-10-25T02:16:39.4903995Z  help: Consider removing this import. 2026-10-25T02:16:39.4903998Z 2026-10-25T02:16:39.4904234Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-25T02:16:39.4904364Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:3] 2026-10-25T02:16:39.4904445Z 166 │ attachmentVideoPreviewSource, 2026-10-25T02:16:39.4904514Z 167 │ mediaVideoPreviewUri, 2026-10-25T02:16:39.4904595Z ·  ──────────┬───────── 2026-10-25T02:16:39.4904747Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-25T02:16:39.4904818Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:16:39.4904869Z ╰──── 2026-10-25T02:16:39.4904966Z  help: Consider removing this import. 2026-10-25T02:16:39.4904973Z 2026-10-25T02:16:39.4905188Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-25T02:16:39.4905317Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3] 2026-10-25T02:16:39.4905386Z 167 │ mediaVideoPreviewUri, 2026-10-25T02:16:39.4905455Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:16:39.4905539Z ·  ───────────┬────────── 2026-10-25T02:16:39.4905694Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-25T02:16:39.4905772Z 169 │ type MediaVideoPreviewSource, 2026-10-25T02:16:39.4905823Z ╰──── 2026-10-25T02:16:39.4905914Z  help: Consider removing this import. 2026-10-25T02:16:39.4905916Z 2026-10-25T02:16:39.4906128Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-25T02:16:39.4906260Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:169:8] 2026-10-25T02:16:39.4906329Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:16:39.4906404Z 169 │ type MediaVideoPreviewSource, 2026-10-25T02:16:39.4906498Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4906661Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-25T02:16:39.4906746Z 170 │ } from "../../lib/videoPreviewSource"; 2026-10-25T02:16:39.4906796Z ╰──── 2026-10-25T02:16:39.4906888Z  help: Consider removing this import. 2026-10-25T02:16:39.4906890Z 2026-10-25T02:16:39.4907118Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-25T02:16:39.4907248Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-25T02:16:39.4907305Z 190 │ import { 2026-10-25T02:16:39.4907379Z 191 │ resolveMarkdownFontSizes, 2026-10-25T02:16:39.4907468Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4907623Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-25T02:16:39.4907707Z 192 │ resolveNativeMarkdownTypography, 2026-10-25T02:16:39.4907758Z ╰──── 2026-10-25T02:16:39.4907851Z  help: Consider removing this import. 2026-10-25T02:16:39.4907853Z 2026-10-25T02:16:39.4908103Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-25T02:16:39.4908279Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:198:3] 2026-10-25T02:16:39.4908386Z 197 │ normalizeNativeMarkdownUrl, 2026-10-25T02:16:39.4908478Z 198 │ resolveMarkdownInlineCodePresentation, 2026-10-25T02:16:39.4908585Z ·  ──────────────────┬────────────────── 2026-10-25T02:16:39.4908774Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-25T02:16:39.4908857Z 199 │ resolveMarkdownLinkPresentation, 2026-10-25T02:16:39.4908908Z ╰──── 2026-10-25T02:16:39.4908999Z  help: Consider removing this import. 2026-10-25T02:16:39.4909001Z 2026-10-25T02:16:39.4909206Z ⚠ eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used. 2026-10-25T02:16:39.4909335Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8] 2026-10-25T02:16:39.4909412Z 236 │ isCompactionCommandFeedEntry, 2026-10-25T02:16:39.4909495Z 237 │ type PendingThreadFeedEntry, 2026-10-25T02:16:39.4909586Z ·  ───────────┬────────── 2026-10-25T02:16:39.4909742Z · ╰── 'PendingThreadFeedEntry' is imported here 2026-10-25T02:16:39.4909809Z 238 │ type ThreadFeedRow, 2026-10-25T02:16:39.4909861Z ╰──── 2026-10-25T02:16:39.4909950Z  help: Consider removing this import. 2026-10-25T02:16:39.4909953Z 2026-10-25T02:16:39.4910159Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-25T02:16:39.4910287Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:248:3] 2026-10-25T02:16:39.4910349Z 247 │ useAssetUrl, 2026-10-25T02:16:39.4910414Z 248 │ useAssetUrlState, 2026-10-25T02:16:39.4910493Z ·  ────────┬─────── 2026-10-25T02:16:39.4910636Z · ╰── 'useAssetUrlState' is imported here 2026-10-25T02:16:39.4910752Z 249 │ useRefreshAssetUrl, 2026-10-25T02:16:39.4910801Z ╰──── 2026-10-25T02:16:39.4910892Z  help: Consider removing this import. 2026-10-25T02:16:39.4910895Z 2026-10-25T02:16:39.4911090Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4911224Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2238:7] 2026-10-25T02:16:39.4911295Z 2237 │ setExpandedFile(null); 2026-10-25T02:16:39.4911450Z 2238 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-25T02:16:39.4911671Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-25T02:16:39.4912015Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-25T02:16:39.4912257Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-25T02:16:39.4912415Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T02:16:39.4912556Z 2239 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-25T02:16:39.4912609Z ╰──── 2026-10-25T02:16:39.4912900Z  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-25T02:16:39.4913214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4913220Z 2026-10-25T02:16:39.4913416Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4913549Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2710:7] 2026-10-25T02:16:39.4913645Z 2709 │ reportHeaderMaterialVisibility(false); 2026-10-25T02:16:39.4913758Z 2710 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-25T02:16:39.4913837Z ·  ──────┬────── 2026-10-25T02:16:39.4913984Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-25T02:16:39.4914039Z 2711 │ 2026-10-25T02:16:39.4914091Z ╰──── 2026-10-25T02:16:39.4914412Z  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-25T02:16:39.4914721Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4914723Z 2026-10-25T02:16:39.4914918Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4915049Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2729:7] 2026-10-25T02:16:39.4915104Z 2728 │ } 2026-10-25T02:16:39.4915235Z 2729 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-25T02:16:39.4915313Z ·  ──────┬───── 2026-10-25T02:16:39.4915457Z · ╰── Unnecessary dependency `listMountKey` 2026-10-25T02:16:39.4915603Z 2730 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-25T02:16:39.4915659Z ╰──── 2026-10-25T02:16:39.4915942Z  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-25T02:16:39.4916245Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4916248Z 2026-10-25T02:16:39.4916443Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4916571Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2925:7] 2026-10-25T02:16:39.4916627Z 2924 │ } 2026-10-25T02:16:39.4916805Z 2925 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-25T02:16:39.4917047Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-25T02:16:39.4917320Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-25T02:16:39.4917520Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-25T02:16:39.4917670Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-25T02:16:39.4917723Z 2926 │ 2026-10-25T02:16:39.4917773Z ╰──── 2026-10-25T02:16:39.4918054Z  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-25T02:16:39.4918367Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4918372Z 2026-10-25T02:16:39.4918547Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:16:39.4918678Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:630:9] 2026-10-25T02:16:39.4918734Z 629 │ }; 2026-10-25T02:16:39.4918849Z 630 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-25T02:16:39.4919035Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-25T02:16:39.4919272Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-25T02:16:39.4919469Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-25T02:16:39.4919631Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T02:16:39.4919687Z 631 │ ); 2026-10-25T02:16:39.4919738Z ╰──── 2026-10-25T02:16:39.4920042Z  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-25T02:16:39.4920344Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4920346Z 2026-10-25T02:16:39.4920613Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:16:39.4920778Z ╭─[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9] 2026-10-25T02:16:39.4920872Z 22 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T02:16:39.4920954Z 23 │ const navigation = useNavigation(); 2026-10-25T02:16:39.4921030Z ·  ─────┬──── 2026-10-25T02:16:39.4921163Z · ╰── 'navigation' is declared here 2026-10-25T02:16:39.4921253Z 24 │ const selected = selectedNavigationTab( 2026-10-25T02:16:39.4921303Z ╰──── 2026-10-25T02:16:39.4921406Z  help: Consider removing this declaration. 2026-10-25T02:16:39.4921409Z 2026-10-25T02:16:39.4921661Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4921869Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-25T02:16:39.4922012Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-25T02:16:39.4922080Z 38 │ useLayoutEffect(() => { 2026-10-25T02:16:39.4922156Z ·  ───────┬─────── 2026-10-25T02:16:39.4922284Z · ╰── This is the containing effect 2026-10-25T02:16:39.4922344Z 39 │ reset(); 2026-10-25T02:16:39.4922410Z 40 │ setInitialized(true); 2026-10-25T02:16:39.4922485Z ·  ───────┬────── 2026-10-25T02:16:39.4922649Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4922709Z 41 │ }, [reset]); 2026-10-25T02:16:39.4922761Z ╰──── 2026-10-25T02:16:39.4923351Z  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-25T02:16:39.4923670Z  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-25T02:16:39.4923672Z 2026-10-25T02:16:39.4923924Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4924080Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-25T02:16:39.4924131Z 88 │ 2026-10-25T02:16:39.4924207Z 89 │ useEffect(() => { 2026-10-25T02:16:39.4924276Z ·  ────┬──── 2026-10-25T02:16:39.4924431Z · ╰── This is the containing effect 2026-10-25T02:16:39.4924589Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-25T02:16:39.4924690Z 91 │ const branchName = initialProjectRef.branch; 2026-10-25T02:16:39.4924755Z 92 │ let active = true; 2026-10-25T02:16:39.4924849Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-25T02:16:39.4924932Z ·  ─────────┬───────── 2026-10-25T02:16:39.4925101Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4925251Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-25T02:16:39.4925300Z ╰──── 2026-10-25T02:16:39.4925883Z  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-25T02:16:39.4926202Z  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-25T02:16:39.4926204Z 2026-10-25T02:16:39.4926368Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4926521Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:704:76] 2026-10-25T02:16:39.4926699Z 703 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-25T02:16:39.4926915Z 704 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-25T02:16:39.4927081Z ·  ─────┬──── 2026-10-25T02:16:39.4927260Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4927395Z 705 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-25T02:16:39.4927445Z ╰──── 2026-10-25T02:16:39.4927725Z  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-25T02:16:39.4928014Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4928017Z 2026-10-25T02:16:39.4928185Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:16:39.4928341Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:725:71] 2026-10-25T02:16:39.4928419Z 724 │ const snoozePresets = useMemo( 2026-10-25T02:16:39.4928596Z 725 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T02:16:39.4928728Z ·  ─────┬──── 2026-10-25T02:16:39.4928902Z · ╰── Cannot call impure function 2026-10-25T02:16:39.4929016Z 726 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T02:16:39.4929067Z ╰──── 2026-10-25T02:16:39.4929343Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:16:39.4929634Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:16:39.4929637Z 2026-10-25T02:16:39.4929812Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:16:39.4929962Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:726:6] 2026-10-25T02:16:39.4930136Z 725 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T02:16:39.4930249Z 726 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T02:16:39.4930342Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4930516Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-25T02:16:39.4930573Z 727 │ ); 2026-10-25T02:16:39.4930625Z ╰──── 2026-10-25T02:16:39.4930934Z  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-25T02:16:39.4931237Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4931239Z 2026-10-25T02:16:39.4931413Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:16:39.4931564Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:772:7] 2026-10-25T02:16:39.4931634Z 771 │ thread.pinnedAt, 2026-10-25T02:16:39.4931693Z 772 │ variant, 2026-10-25T02:16:39.4931809Z ·  ───┬─── 2026-10-25T02:16:39.4931971Z · ╰── Unnecessary dependency `variant` 2026-10-25T02:16:39.4932026Z 773 │ ], 2026-10-25T02:16:39.4932075Z ╰──── 2026-10-25T02:16:39.4932382Z  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-25T02:16:39.4932683Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4932685Z 2026-10-25T02:16:39.4932874Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.4933030Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1222:21] 2026-10-25T02:16:39.4933160Z 1221 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-25T02:16:39.4933294Z 1222 │ 2026-10-25T02:16:39.4933407Z ·  ────────────────────────── 2026-10-25T02:16:39.4933515Z 1223 │ 2026-10-25T02:16:39.4933566Z ╰──── 2026-10-25T02:16:39.4933712Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:16:39.4933715Z 2026-10-25T02:16:39.4933969Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4934115Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:410:5] 2026-10-25T02:16:39.4934166Z 408 │ 2026-10-25T02:16:39.4934243Z 409 │ useEffect(() => { 2026-10-25T02:16:39.4934344Z ·  ────┬──── 2026-10-25T02:16:39.4934475Z · ╰── This is the containing effect 2026-10-25T02:16:39.4934564Z 410 │ setInspectorSelection((current) => { 2026-10-25T02:16:39.4934648Z ·  ──────────┬────────── 2026-10-25T02:16:39.4934817Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4934918Z 411 │ if (props.renderInspector === undefined) { 2026-10-25T02:16:39.4934967Z ╰──── 2026-10-25T02:16:39.4935549Z  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-25T02:16:39.4935945Z  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-25T02:16:39.4935991Z 2026-10-25T02:16:39.4936199Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:16:39.4936348Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:538:24] 2026-10-25T02:16:39.4936503Z 537 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-25T02:16:39.4936669Z 538 │ ╭─▶ const GitInspector = () => ( 2026-10-25T02:16:39.4936766Z 539 │ │ 2026-10-25T02:16:39.4937370Z 544 │ ╰─▶ ); 2026-10-25T02:16:39.4937447Z 545 │ const FilesInspector = () => 2026-10-25T02:16:39.4937500Z ╰──── 2026-10-25T02:16:39.4937714Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T02:16:39.4937717Z 2026-10-25T02:16:39.4937924Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:16:39.4938077Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:545:26] 2026-10-25T02:16:39.4938134Z 544 │ ); 2026-10-25T02:16:39.4938295Z 545 │ ╭─▶ const FilesInspector = () => 2026-10-25T02:16:39.4938442Z 546 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-25T02:16:39.4938546Z 547 │ │ 2026-10-25T02:16:39.4939495Z 555 │ ╰─▶ ) : null; 2026-10-25T02:16:39.4939642Z 556 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-25T02:16:39.4939693Z ╰──── 2026-10-25T02:16:39.4939903Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T02:16:39.4939906Z 2026-10-25T02:16:39.4940115Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4940253Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-25T02:16:39.4940404Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-25T02:16:39.4940560Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-25T02:16:39.4940652Z ·  ────────────┬──────────── 2026-10-25T02:16:39.4940822Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-25T02:16:39.4940876Z 774 │ } 2026-10-25T02:16:39.4941075Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-25T02:16:39.4941181Z ·  ────────────────┬──────────────── 2026-10-25T02:16:39.4941459Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-25T02:16:39.4941512Z 776 │ 2026-10-25T02:16:39.4941562Z ╰──── 2026-10-25T02:16:39.4941982Z  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-25T02:16:39.4942292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4942295Z 2026-10-25T02:16:39.4942446Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4942585Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-25T02:16:39.4942742Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-25T02:16:39.4942876Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-25T02:16:39.4942969Z ·  ──────────┬───────── 2026-10-25T02:16:39.4943123Z · ╰── `animatedBorderRadius` originates here 2026-10-25T02:16:39.4943278Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-25T02:16:39.4943346Z 390 │ useLayoutEffect(() => { 2026-10-25T02:16:39.4943444Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-25T02:16:39.4943529Z ·  ──────────┬───────── 2026-10-25T02:16:39.4943682Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-25T02:16:39.4943770Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-25T02:16:39.4943819Z ╰──── 2026-10-25T02:16:39.4944078Z  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-25T02:16:39.4944422Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4944428Z 2026-10-25T02:16:39.4944680Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4944842Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-25T02:16:39.4944894Z 213 │ }; 2026-10-25T02:16:39.4944961Z 214 │ useEffect(() => { 2026-10-25T02:16:39.4945031Z ·  ────┬──── 2026-10-25T02:16:39.4945157Z · ╰── This is the containing effect 2026-10-25T02:16:39.4945326Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-25T02:16:39.4945392Z 216 │ if (inserted) { 2026-10-25T02:16:39.4945514Z 217 │ setSelection((current) => 2026-10-25T02:16:39.4945620Z ·  ──────┬───── 2026-10-25T02:16:39.4945785Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4947965Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-25T02:16:39.4948025Z ╰──── 2026-10-25T02:16:39.4948619Z  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-25T02:16:39.4948942Z  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-25T02:16:39.4948947Z 2026-10-25T02:16:39.4949203Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4949365Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-25T02:16:39.4949441Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-25T02:16:39.4949505Z 287 │ useEffect(() => { 2026-10-25T02:16:39.4949574Z ·  ────┬──── 2026-10-25T02:16:39.4949702Z · ╰── This is the containing effect 2026-10-25T02:16:39.4949848Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-25T02:16:39.4949993Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-25T02:16:39.4950068Z 290 │ const now = Date.now(); 2026-10-25T02:16:39.4950182Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-25T02:16:39.4950238Z 292 │ if ( 2026-10-25T02:16:39.4950314Z 293 │ lastRequest?.key === key && 2026-10-25T02:16:39.4950449Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-25T02:16:39.4950503Z 295 │ ) 2026-10-25T02:16:39.4950561Z 296 │ return; 2026-10-25T02:16:39.4950800Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-25T02:16:39.4950886Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-25T02:16:39.4950979Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4951152Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4951211Z 299 │ return; 2026-10-25T02:16:39.4951269Z ╰──── 2026-10-25T02:16:39.4951852Z  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-25T02:16:39.4952167Z  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-25T02:16:39.4952172Z 2026-10-25T02:16:39.4952368Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4952528Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-25T02:16:39.4952584Z 327 │ }, [ 2026-10-25T02:16:39.4952721Z 328 │ draftMessage, 2026-10-25T02:16:39.4952834Z ·  ──────┬───── 2026-10-25T02:16:39.4952977Z · ╰── Unnecessary dependency `draftMessage` 2026-10-25T02:16:39.4953042Z 329 │ environmentId, 2026-10-25T02:16:39.4953091Z ╰──── 2026-10-25T02:16:39.4953380Z  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-25T02:16:39.4953684Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4953687Z 2026-10-25T02:16:39.4953839Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4954001Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-25T02:16:39.4954056Z 107 │ ); 2026-10-25T02:16:39.4954240Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-25T02:16:39.4954331Z ·  ─────────┬──────── 2026-10-25T02:16:39.4954478Z · ╰── `separationProgress` originates here 2026-10-25T02:16:39.4954530Z 109 │ 2026-10-25T02:16:39.4954596Z 110 │ useEffect(() => { 2026-10-25T02:16:39.4954766Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-25T02:16:39.4954848Z ·  ─────────┬──────── 2026-10-25T02:16:39.4954996Z · ╰── `separationProgress` cannot be modified 2026-10-25T02:16:39.4955103Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-25T02:16:39.4955154Z ╰──── 2026-10-25T02:16:39.4955420Z  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-25T02:16:39.4955723Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4955727Z 2026-10-25T02:16:39.4955878Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4956036Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-25T02:16:39.4956145Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-25T02:16:39.4956258Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-25T02:16:39.4956336Z ·  ──────┬───── 2026-10-25T02:16:39.4956473Z · ╰── `capsuleWidth` originates here 2026-10-25T02:16:39.4956584Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T02:16:39.4956696Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4956800Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:16:39.4956893Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T02:16:39.4956952Z 134 │ return; 2026-10-25T02:16:39.4957006Z 135 │ } 2026-10-25T02:16:39.4957108Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T02:16:39.4957192Z 137 │ measuredWidthRef.current = width; 2026-10-25T02:16:39.4957330Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:16:39.4957406Z ·  ──────┬───── 2026-10-25T02:16:39.4957592Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T02:16:39.4957682Z 139 │ }; 2026-10-25T02:16:39.4957733Z ╰──── 2026-10-25T02:16:39.4957991Z  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-25T02:16:39.4958288Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4958291Z 2026-10-25T02:16:39.4958445Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4958603Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-25T02:16:39.4958710Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-25T02:16:39.4958824Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-25T02:16:39.4958905Z ·  ──────┬───── 2026-10-25T02:16:39.4959038Z · ╰── `capsuleWidth` originates here 2026-10-25T02:16:39.4959145Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T02:16:39.4959255Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4959357Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:16:39.4959449Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T02:16:39.4959507Z 134 │ return; 2026-10-25T02:16:39.4959559Z 135 │ } 2026-10-25T02:16:39.4959664Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T02:16:39.4959748Z 137 │ measuredWidthRef.current = width; 2026-10-25T02:16:39.4959886Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:16:39.4959942Z 139 │ }; 2026-10-25T02:16:39.4960032Z 140 │ const hasStatus = props.status !== null; 2026-10-25T02:16:39.4960164Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T02:16:39.4960229Z 142 │ useEffect(() => { 2026-10-25T02:16:39.4960292Z 143 │ if (!hasStatus) { 2026-10-25T02:16:39.4960376Z 144 │ measuredWidthRef.current = null; 2026-10-25T02:16:39.4960453Z 145 │ capsuleWidth.value = null; 2026-10-25T02:16:39.4960529Z ·  ──────┬───── 2026-10-25T02:16:39.4960663Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T02:16:39.4960717Z 146 │ } 2026-10-25T02:16:39.4960769Z ╰──── 2026-10-25T02:16:39.4961075Z  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-25T02:16:39.4961398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4961401Z 2026-10-25T02:16:39.4961598Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:16:39.4961758Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-25T02:16:39.4961889Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T02:16:39.4961951Z 142 │ useEffect(() => { 2026-10-25T02:16:39.4962028Z ·  ───┬─── 2026-10-25T02:16:39.4962244Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T02:16:39.4962314Z 143 │ if (!hasStatus) { 2026-10-25T02:16:39.4962400Z 144 │ measuredWidthRef.current = null; 2026-10-25T02:16:39.4962475Z 145 │ capsuleWidth.value = null; 2026-10-25T02:16:39.4962549Z ·  ──────┬───── 2026-10-25T02:16:39.4962682Z · ╰── This modifies `capsuleWidth` 2026-10-25T02:16:39.4962735Z 146 │ } 2026-10-25T02:16:39.4962787Z ╰──── 2026-10-25T02:16:39.4963124Z  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-25T02:16:39.4963421Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4963424Z 2026-10-25T02:16:39.4963624Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:16:39.4963782Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-25T02:16:39.4963891Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T02:16:39.4964004Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4964126Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4964387Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T02:16:39.4964492Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:16:39.4964585Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T02:16:39.4964644Z 134 │ return; 2026-10-25T02:16:39.4964695Z 135 │ } 2026-10-25T02:16:39.4964806Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T02:16:39.4964891Z 137 │ measuredWidthRef.current = width; 2026-10-25T02:16:39.4965029Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:16:39.4965102Z ·  ──────┬───── 2026-10-25T02:16:39.4965232Z · ╰── This modifies `capsuleWidth` 2026-10-25T02:16:39.4965284Z 139 │ }; 2026-10-25T02:16:39.4965339Z ╰──── 2026-10-25T02:16:39.4965669Z  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-25T02:16:39.4966016Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4966045Z 2026-10-25T02:16:39.4966254Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:16:39.4966422Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-25T02:16:39.4966499Z 248 │ mountedRef.current = false; 2026-10-25T02:16:39.4966572Z 249 │ flow.setBranchQuery(""); 2026-10-25T02:16:39.4966640Z ·  ──┬─ 2026-10-25T02:16:39.4966763Z · ╰── Missing dependency `flow` 2026-10-25T02:16:39.4966816Z 250 │ }; 2026-10-25T02:16:39.4966889Z 251 │ }, [flow.setBranchQuery]); 2026-10-25T02:16:39.4966974Z ·  ─────────┬───────── 2026-10-25T02:16:39.4967179Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-25T02:16:39.4967233Z 252 │ 2026-10-25T02:16:39.4967284Z ╰──── 2026-10-25T02:16:39.4967695Z  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-25T02:16:39.4968003Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4968006Z 2026-10-25T02:16:39.4968261Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4968406Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-25T02:16:39.4968568Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-25T02:16:39.4968635Z 29 │ useEffect(() => { 2026-10-25T02:16:39.4968704Z ·  ────┬──── 2026-10-25T02:16:39.4968828Z · ╰── This is the containing effect 2026-10-25T02:16:39.4968950Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-25T02:16:39.4969054Z ·  ───┬─── 2026-10-25T02:16:39.4969241Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4969310Z 31 │ }, [key, live, snapshot]); 2026-10-25T02:16:39.4969360Z ╰──── 2026-10-25T02:16:39.4969947Z  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-25T02:16:39.4970265Z  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-25T02:16:39.4970267Z 2026-10-25T02:16:39.4970519Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4970668Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:5] 2026-10-25T02:16:39.4970726Z 569 │ }, []); 2026-10-25T02:16:39.4970790Z 570 │ useEffect(() => { 2026-10-25T02:16:39.4970860Z ·  ────┬──── 2026-10-25T02:16:39.4971029Z · ╰── This is the containing effect 2026-10-25T02:16:39.4971140Z 571 │ setKeyboardStateSuspect(false); 2026-10-25T02:16:39.4971229Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4971396Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4971496Z 572 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T02:16:39.4971547Z ╰──── 2026-10-25T02:16:39.4972122Z  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-25T02:16:39.4972439Z  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-25T02:16:39.4972444Z 2026-10-25T02:16:39.4972693Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4972840Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:967:7] 2026-10-25T02:16:39.4972994Z 964 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-25T02:16:39.4973058Z 965 │ useEffect(() => { 2026-10-25T02:16:39.4973127Z ·  ────┬──── 2026-10-25T02:16:39.4973249Z · ╰── This is the containing effect 2026-10-25T02:16:39.4973405Z 966 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-25T02:16:39.4973515Z 967 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-25T02:16:39.4973616Z ·  ─────────────┬──────────── 2026-10-25T02:16:39.4973788Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4973843Z 968 │ } 2026-10-25T02:16:39.4973893Z ╰──── 2026-10-25T02:16:39.4974508Z  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-25T02:16:39.4974820Z  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-25T02:16:39.4974823Z 2026-10-25T02:16:39.4975076Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4975228Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1223:5] 2026-10-25T02:16:39.4975281Z 1221 │ 2026-10-25T02:16:39.4975346Z 1222 │ useEffect(() => { 2026-10-25T02:16:39.4975417Z ·  ────┬──── 2026-10-25T02:16:39.4975545Z · ╰── This is the containing effect 2026-10-25T02:16:39.4975620Z 1223 │ setAnchorMessageId(null); 2026-10-25T02:16:39.4975703Z ·  ─────────┬──────── 2026-10-25T02:16:39.4975869Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.4975949Z 1224 │ setSubmittedMessageId(null); 2026-10-25T02:16:39.4976002Z ╰──── 2026-10-25T02:16:39.4976626Z  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-25T02:16:39.4976971Z  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-25T02:16:39.4976974Z 2026-10-25T02:16:39.4977168Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4977316Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:572:7] 2026-10-25T02:16:39.4977399Z 571 │ setKeyboardStateSuspect(false); 2026-10-25T02:16:39.4977496Z 572 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T02:16:39.4977638Z ·  ────────┬──────── ─────────┬──────── 2026-10-25T02:16:39.4977845Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-25T02:16:39.4978000Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-25T02:16:39.4978125Z 573 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-25T02:16:39.4978174Z ╰──── 2026-10-25T02:16:39.4978461Z  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-25T02:16:39.4978764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4978772Z 2026-10-25T02:16:39.4978971Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4979126Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1171:7] 2026-10-25T02:16:39.4979209Z 1170 │ userInputInsetProgress.set(1); 2026-10-25T02:16:39.4979369Z 1171 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-25T02:16:39.4979462Z ·  ────────────┬─────────── 2026-10-25T02:16:39.4979637Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-25T02:16:39.4979740Z 1172 │ const showContent = props.showContent ?? true; 2026-10-25T02:16:39.4979793Z ╰──── 2026-10-25T02:16:39.4980082Z  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-25T02:16:39.4980387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4980390Z 2026-10-25T02:16:39.4980583Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.4980735Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1229:15] 2026-10-25T02:16:39.4980804Z 1228 │ freeze.set(false); 2026-10-25T02:16:39.4980884Z 1229 │ }, [freeze, selectedThreadKey]); 2026-10-25T02:16:39.4980977Z ·  ────────┬──────── 2026-10-25T02:16:39.4981134Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-25T02:16:39.4981234Z 1230 │ 2026-10-25T02:16:39.4981315Z ╰──── 2026-10-25T02:16:39.4981599Z  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-25T02:16:39.4981900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.4981902Z 2026-10-25T02:16:39.4982056Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4982204Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1059:5] 2026-10-25T02:16:39.4982313Z 1054 │ const composerPopoverHeight = useSharedValue(0); 2026-10-25T02:16:39.4982419Z 1055 │ const floatingControlCoverage = useSharedValue( 2026-10-25T02:16:39.4982518Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4982677Z · ╰── `floatingControlCoverage` originates here 2026-10-25T02:16:39.4982804Z 1056 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T02:16:39.4982857Z 1057 │ ); 2026-10-25T02:16:39.4982921Z 1058 │ useEffect(() => { 2026-10-25T02:16:39.4983022Z 1059 │ floatingControlCoverage.value = withTiming( 2026-10-25T02:16:39.4983112Z ·  ───────────┬─────────── 2026-10-25T02:16:39.4983272Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-25T02:16:39.4983396Z 1060 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T02:16:39.4983447Z ╰──── 2026-10-25T02:16:39.4983710Z  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-25T02:16:39.4984012Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4984015Z 2026-10-25T02:16:39.4984165Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4984352Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1077:7] 2026-10-25T02:16:39.4984535Z 1067 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-25T02:16:39.4984657Z 1068 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-25T02:16:39.4984766Z ·  ────────────────┬──────────────── 2026-10-25T02:16:39.4984997Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-25T02:16:39.4985153Z 1069 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-25T02:16:39.4985207Z 1070 │ ); 2026-10-25T02:16:39.4985274Z 1071 │ useAnimatedReaction( 2026-10-25T02:16:39.4985332Z 1072 │ () => 2026-10-25T02:16:39.4985424Z 1073 │ contentInsetEndAdjustment.value + 2026-10-25T02:16:39.4985511Z 1074 │ floatingControlCoverage.value + 2026-10-25T02:16:39.4985704Z 1075 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-25T02:16:39.4985768Z 1076 │ (value) => { 2026-10-25T02:16:39.4985881Z 1077 │ combinedContentInsetEndAdjustment.value = value; 2026-10-25T02:16:39.4985987Z ·  ────────────────┬──────────────── 2026-10-25T02:16:39.4986179Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-25T02:16:39.4986238Z 1078 │ }, 2026-10-25T02:16:39.4986289Z ╰──── 2026-10-25T02:16:39.4986546Z  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-25T02:16:39.4986842Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4986846Z 2026-10-25T02:16:39.4986996Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4987147Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T02:16:39.4987199Z 83 │ 2026-10-25T02:16:39.4987289Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-25T02:16:39.4987366Z ·  ──────┬───── 2026-10-25T02:16:39.4987502Z · ╰── `cardCoverage` originates here 2026-10-25T02:16:39.4987582Z 85 │ const barHeightRef = useRef(0); 2026-10-25T02:16:39.4987659Z 86 │ const cardHeightRef = useRef(0); 2026-10-25T02:16:39.4987742Z 87 │ const cardHeight = useSharedValue(0); 2026-10-25T02:16:39.4987831Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:16:39.4987896Z 89 │ if (!cardCoverage) { 2026-10-25T02:16:39.4987954Z 90 │ return; 2026-10-25T02:16:39.4988007Z 91 │ } 2026-10-25T02:16:39.4988170Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:16:39.4988269Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T02:16:39.4988426Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:16:39.4988506Z ·  ──────┬───── 2026-10-25T02:16:39.4988642Z · ╰── `cardCoverage` cannot be modified 2026-10-25T02:16:39.4988706Z 95 │ }, [cardCoverage]); 2026-10-25T02:16:39.4988757Z ╰──── 2026-10-25T02:16:39.4989044Z  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-25T02:16:39.4989341Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4989344Z 2026-10-25T02:16:39.4989494Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:16:39.4989647Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-25T02:16:39.4989775Z  86 │ const cardHeightRef = useRef(0); 2026-10-25T02:16:39.4989889Z  87 │ const cardHeight = useSharedValue(0); 2026-10-25T02:16:39.4989964Z ·  ─────┬──── 2026-10-25T02:16:39.4990093Z · ╰── `cardHeight` originates here 2026-10-25T02:16:39.4990185Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:16:39.4990251Z  89 │ if (!cardCoverage) { 2026-10-25T02:16:39.4990310Z  90 │ return; 2026-10-25T02:16:39.4990362Z  91 │ } 2026-10-25T02:16:39.4990523Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:16:39.4990622Z  93 │ // feed inset and floating controls trailing it. 2026-10-25T02:16:39.4990827Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:16:39.4990892Z  95 │ }, [cardCoverage]); 2026-10-25T02:16:39.4990978Z  96 │ const handleBarLayout = useCallback( 2026-10-25T02:16:39.4991059Z  97 │ (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4991177Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:16:39.4991243Z  99 │ notifyCoverage(); 2026-10-25T02:16:39.4991296Z 100 │ }, 2026-10-25T02:16:39.4991360Z 101 │ [notifyCoverage], 2026-10-25T02:16:39.4991417Z 102 │ ); 2026-10-25T02:16:39.4991502Z 103 │ const handleCardLayout = useCallback( 2026-10-25T02:16:39.4991580Z 104 │ (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4991704Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:16:39.4991815Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T02:16:39.4991891Z ·  ─────┬──── 2026-10-25T02:16:39.4992030Z · ╰── `cardHeight` cannot be modified 2026-10-25T02:16:39.4992097Z 107 │ notifyCoverage(); 2026-10-25T02:16:39.4992148Z ╰──── 2026-10-25T02:16:39.4992406Z  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-25T02:16:39.4992703Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4992706Z 2026-10-25T02:16:39.4992902Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:16:39.4993051Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T02:16:39.4993135Z 87 │ const cardHeight = useSharedValue(0); 2026-10-25T02:16:39.4993228Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:16:39.4993332Z ·  ───┬─── 2026-10-25T02:16:39.4993562Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T02:16:39.4993627Z 89 │ if (!cardCoverage) { 2026-10-25T02:16:39.4993685Z 90 │ return; 2026-10-25T02:16:39.4993737Z 91 │ } 2026-10-25T02:16:39.4993896Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:16:39.4993994Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T02:16:39.4994148Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:16:39.4994254Z ·  ──────┬───── 2026-10-25T02:16:39.4994451Z · ╰── This modifies `cardCoverage` 2026-10-25T02:16:39.4994555Z 95 │ }, [cardCoverage]); 2026-10-25T02:16:39.4994607Z ╰──── 2026-10-25T02:16:39.4994938Z  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-25T02:16:39.4995234Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4995238Z 2026-10-25T02:16:39.4995433Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:16:39.4995582Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T02:16:39.4995680Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T02:16:39.4995837Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:16:39.4995911Z ·  ──────┬───── 2026-10-25T02:16:39.4996039Z · ╰── This modifies `cardCoverage` 2026-10-25T02:16:39.4996102Z 95 │ }, [cardCoverage]); 2026-10-25T02:16:39.4996185Z 96 │ const handleBarLayout = useCallback( 2026-10-25T02:16:39.4996262Z 97 │ (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4996363Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4996580Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T02:16:39.4996699Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:16:39.4996749Z ╰──── 2026-10-25T02:16:39.4997083Z  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-25T02:16:39.4997382Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4997384Z 2026-10-25T02:16:39.4997577Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:16:39.4997729Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-25T02:16:39.4997814Z 103 │ const handleCardLayout = useCallback( 2026-10-25T02:16:39.4997895Z 104 │ (event: LayoutChangeEvent) => { 2026-10-25T02:16:39.4997997Z ·  ───────────────┬─────────────── 2026-10-25T02:16:39.4998213Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-25T02:16:39.4998342Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:16:39.4998454Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T02:16:39.4998527Z ·  ─────┬──── 2026-10-25T02:16:39.4998655Z · ╰── This modifies `cardHeight` 2026-10-25T02:16:39.4998720Z 107 │ notifyCoverage(); 2026-10-25T02:16:39.4998771Z ╰──── 2026-10-25T02:16:39.4999098Z  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-25T02:16:39.4999443Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:16:39.4999475Z 2026-10-25T02:16:39.4999728Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.4999878Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-25T02:16:39.4999930Z 55 │ 2026-10-25T02:16:39.4999994Z 56 │ useEffect(() => { 2026-10-25T02:16:39.5000062Z ·  ────┬──── 2026-10-25T02:16:39.5000187Z · ╰── This is the containing effect 2026-10-25T02:16:39.5000254Z 57 │ setDecodedSize(null); 2026-10-25T02:16:39.5000330Z ·  ───────┬────── 2026-10-25T02:16:39.5000492Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.5000559Z 58 │ }, [props.sourceKey]); 2026-10-25T02:16:39.5000616Z ╰──── 2026-10-25T02:16:39.5001198Z  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-25T02:16:39.5001511Z  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-25T02:16:39.5001513Z 2026-10-25T02:16:39.5001764Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.5001911Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-25T02:16:39.5001963Z 59 │ 2026-10-25T02:16:39.5002029Z 60 │ useEffect(() => { 2026-10-25T02:16:39.5002097Z ·  ────┬──── 2026-10-25T02:16:39.5002220Z · ╰── This is the containing effect 2026-10-25T02:16:39.5002287Z 61 │ setFailedUri(null); 2026-10-25T02:16:39.5002360Z ·  ──────┬───── 2026-10-25T02:16:39.5002522Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.5002585Z 62 │ }, [props.uri]); 2026-10-25T02:16:39.5002635Z ╰──── 2026-10-25T02:16:39.5003212Z  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-25T02:16:39.5003567Z  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-25T02:16:39.5003599Z 2026-10-25T02:16:39.5003808Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T02:16:39.5003954Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-25T02:16:39.5004076Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-25T02:16:39.5004277Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-25T02:16:39.5004363Z ·  ────────┬──────── 2026-10-25T02:16:39.5004508Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T02:16:39.5004566Z 8 │ 2026-10-25T02:16:39.5004619Z ╰──── 2026-10-25T02:16:39.5004715Z  help: Consider removing this import. 2026-10-25T02:16:39.5004717Z 2026-10-25T02:16:39.5004913Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.5005058Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-25T02:16:39.5005124Z 57 │ setDecodedSize(null); 2026-10-25T02:16:39.5005190Z 58 │ }, [props.sourceKey]); 2026-10-25T02:16:39.5005269Z ·  ───────┬─────── 2026-10-25T02:16:39.5005420Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-25T02:16:39.5005472Z 59 │ 2026-10-25T02:16:39.5005521Z ╰──── 2026-10-25T02:16:39.5005813Z  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-25T02:16:39.5006121Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.5006123Z 2026-10-25T02:16:39.5006317Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.5006461Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-25T02:16:39.5006526Z 61 │ setFailedUri(null); 2026-10-25T02:16:39.5006589Z 62 │ }, [props.uri]); 2026-10-25T02:16:39.5006661Z ·  ────┬──── 2026-10-25T02:16:39.5006796Z · ╰── Unnecessary dependency `props.uri` 2026-10-25T02:16:39.5006846Z 63 │ 2026-10-25T02:16:39.5006896Z ╰──── 2026-10-25T02:16:39.5007184Z  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-25T02:16:39.5007487Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.5007489Z 2026-10-25T02:16:39.5007739Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.5007869Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-25T02:16:39.5008057Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-25T02:16:39.5008126Z 168 │ useLayoutEffect(() => { 2026-10-25T02:16:39.5008201Z ·  ───────┬─────── 2026-10-25T02:16:39.5008379Z · ╰── This is the containing effect 2026-10-25T02:16:39.5008495Z 169 │ if (faviconRequest === null) return; 2026-10-25T02:16:39.5008547Z 170 │ 2026-10-25T02:16:39.5008675Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-25T02:16:39.5008770Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-25T02:16:39.5008859Z ·  ───────────┬─────────── 2026-10-25T02:16:39.5009027Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.5009093Z 173 │ return endRequest; 2026-10-25T02:16:39.5009144Z ╰──── 2026-10-25T02:16:39.5009728Z  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-25T02:16:39.5010043Z  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-25T02:16:39.5010045Z 2026-10-25T02:16:39.5010241Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.5010367Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-25T02:16:39.5010421Z 81 │ }, 2026-10-25T02:16:39.5010481Z 82 │ [draftKey], 2026-10-25T02:16:39.5010553Z ·  ────┬─── 2026-10-25T02:16:39.5010684Z · ╰── Unnecessary dependency `draftKey` 2026-10-25T02:16:39.5010738Z 83 │ ); 2026-10-25T02:16:39.5010793Z ╰──── 2026-10-25T02:16:39.5011081Z  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-25T02:16:39.5011384Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.5011386Z 2026-10-25T02:16:39.5011637Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.5011781Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-25T02:16:39.5011839Z 61 │ }, []); 2026-10-25T02:16:39.5011901Z 62 │ useEffect(() => { 2026-10-25T02:16:39.5011969Z ·  ────┬──── 2026-10-25T02:16:39.5012098Z · ╰── This is the containing effect 2026-10-25T02:16:39.5012246Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-25T02:16:39.5012367Z ·  ───────┬────── 2026-10-25T02:16:39.5012567Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.5012644Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-25T02:16:39.5012693Z ╰──── 2026-10-25T02:16:39.5013377Z  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-25T02:16:39.5013716Z  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-25T02:16:39.5013719Z 2026-10-25T02:16:39.5013969Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:16:39.5014100Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-25T02:16:39.5014151Z 57 │ 2026-10-25T02:16:39.5014233Z 58 │ useEffect(() => { 2026-10-25T02:16:39.5014302Z ·  ────┬──── 2026-10-25T02:16:39.5014425Z · ╰── This is the containing effect 2026-10-25T02:16:39.5014517Z 59 │ const controller = new AbortController(); 2026-10-25T02:16:39.5014587Z 60 │ setLoadState("pending"); 2026-10-25T02:16:39.5014665Z ·  ──────┬───── 2026-10-25T02:16:39.5014828Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:16:39.5014983Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-25T02:16:39.5015032Z ╰──── 2026-10-25T02:16:39.5015605Z  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-25T02:16:39.5015919Z  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-25T02:16:39.5015921Z 2026-10-25T02:16:39.5016119Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:16:39.5016251Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-25T02:16:39.5016329Z 70 │ return () => controller.abort(); 2026-10-25T02:16:39.5016423Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-25T02:16:39.5016592Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-25T02:16:39.5016811Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-25T02:16:39.5017006Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-25T02:16:39.5017144Z · ╰── Unnecessary dependency `player_0` 2026-10-25T02:16:39.5017199Z 72 │ 2026-10-25T02:16:39.5017248Z ╰──── 2026-10-25T02:16:39.5017535Z  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-25T02:16:39.5017838Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.5017840Z 2026-10-25T02:16:39.5018028Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:16:39.5018172Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-25T02:16:39.5018280Z 271 │ {record.elements?.map((element, index) => ( 2026-10-25T02:16:39.5018488Z 272 │ 2026-10-25T02:16:39.5018667Z ·  ─────────────────────────────────────────────────────── 2026-10-25T02:16:39.5018742Z 273 │ startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-25T02:16:39.5020649Z ·  ─────┬───── 2026-10-25T02:16:39.5020851Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T02:16:39.5020930Z 82 │ const readEditor = useCallback( 2026-10-25T02:16:39.5020979Z ╰──── 2026-10-25T02:16:39.5021288Z  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-25T02:16:39.5021593Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.5021595Z 2026-10-25T02:16:39.5021770Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:16:39.5021930Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7] 2026-10-25T02:16:39.5021994Z 101 │ setEditor, 2026-10-25T02:16:39.5022057Z 102 │ startEditor, 2026-10-25T02:16:39.5022133Z ·  ─────┬───── 2026-10-25T02:16:39.5022272Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T02:16:39.5022334Z 103 │ hasChanges, 2026-10-25T02:16:39.5022384Z ╰──── 2026-10-25T02:16:39.5022690Z  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-25T02:16:39.5022993Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:16:39.5022995Z 2026-10-25T02:16:39.5023123Z Found 0 errors and 377 warnings in 5539 files (4.9s, 8 threads) 2026-10-25T02:16:39.5427088Z Post job cleanup. 2026-10-25T02:16:39.6021135Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-25T02:16:39.6083689Z Post job cleanup. 2026-10-25T02:16:39.6096883Z ##[start-action display=Cache full pnpm store;id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.__actions_cache] 2026-10-25T02:16:39.6379988Z Post job cleanup. 2026-10-25T02:16:39.6970869Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d, not saving cache. 2026-10-25T02:16:39.6999190Z ##[end-action id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.__actions_cache;outcome=success;conclusion=success;duration_ms=90] 2026-10-25T02:16:39.7001026Z ##[start-action display=Cache Vite+;id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.vp_cache] 2026-10-25T02:16:39.7031237Z Post job cleanup. 2026-10-25T02:16:39.7638512Z 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-25T02:16:39.7672069Z ##[end-action id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.vp_cache;outcome=success;conclusion=success;duration_ms=67] 2026-10-25T02:16:39.7707024Z Post job cleanup. 2026-10-25T02:16:39.8101847Z [command]/usr/local/bin/git version 2026-10-25T02:16:39.8128733Z git version 2.55.0 2026-10-25T02:16:39.8176474Z Temporarily overriding HOME='/home/runner/_work/_temp/c1b72717-1831-4a45-ad0a-eccde49b26eb' before making global git config changes 2026-10-25T02:16:39.8176820Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T02:16:39.8179225Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T02:16:39.8199067Z Removing SSH command configuration 2026-10-25T02:16:39.8201727Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T02:16:39.8222433Z [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-25T02:16:39.8330997Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-25T02:16:39.8353239Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-25T02:16:39.8385184Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-25T02:16:39.8403818Z ##[group]Run '/job_completed.sh' 2026-10-25T02:16:39.8413629Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:16:39.8413805Z env: 2026-10-25T02:16:39.8413918Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162 2026-10-25T02:16:39.8414070Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401 2026-10-25T02:16:39.8414233Z BLACKSMITH_CHECK_RUN_ID: 121050673687 2026-10-25T02:16:39.8414385Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T02:16:39.8414520Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T02:16:39.8414651Z ##[endgroup] 2026-10-25T02:16:39.8486251Z Docker container cache not activated, skipping hash computation. 2026-10-25T02:16:39.8728044Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-25T02:16:39.8767044Z Cleaning up orphan processes