2026-10-23T19:47:24.9287960Z Current runner version: '2.337.0' 2026-10-23T19:47:24.9291747Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-2vj5fzcgdgblmphr' 2026-10-23T19:47:24.9292480Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T19:47:24.9293200Z Machine name: 'ip-172-31-73-130' 2026-10-23T19:47:24.9295410Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T19:47:24.9296746Z Contents: read 2026-10-23T19:47:24.9297156Z Metadata: read 2026-10-23T19:47:24.9297545Z ##[endgroup] 2026-10-23T19:47:24.9298873Z Secret source: Actions 2026-10-23T19:47:24.9299564Z Cache mode: write 2026-10-23T19:47:24.9300052Z Prepare workflow directory 2026-10-23T19:47:24.9483003Z Prepare all required actions 2026-10-23T19:47:24.9509579Z Getting action download info 2026-10-23T19:47:25.0652574Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T19:47:25.0948155Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T19:47:25.2137784Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T19:47:25.2175739Z Complete job name: Lint 2026-10-23T19:47:25.2536681Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T19:47:25.2632334Z ##[group]Run '/setup.sh' 2026-10-23T19:47:25.2643835Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T19:47:25.2644238Z env: 2026-10-23T19:47:25.2644461Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:25.2644750Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:25.2645084Z BLACKSMITH_CHECK_RUN_ID: 120621802502 2026-10-23T19:47:25.2645364Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T19:47:25.2645638Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T19:47:25.2645895Z ##[endgroup] 2026-10-23T19:47:25.2903675Z Logging daemon started (blacksmithd for logs) 2026-10-23T19:47:25.3005768Z Results daemon started (blacksmithd for results) 2026-10-23T19:47:25.3163985Z Background adoption and SSH setup started (PID: 3145) 2026-10-23T19:47:25.3164600Z 2026-10-23T19:47:25.3164867Z ---------------------------------------- 2026-10-23T19:47:25.3165409Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40014157786/jobs/120621802502 2026-10-23T19:47:25.3166092Z SSH Access (using your GitHub SSH key): 2026-10-23T19:47:25.3166509Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-2vj5fzcgdgblmphr.vm.blacksmith.sh 2026-10-23T19:47:25.3166813Z 2026-10-23T19:47:25.3166921Z No GitHub SSH key? Add one at: 2026-10-23T19:47:25.3167400Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T19:47:25.3167794Z 2026-10-23T19:47:25.3167898Z ---------------------------------------- 2026-10-23T19:47:25.3168073Z 2026-10-23T19:47:25.3168215Z VM ID: blacksmith-8vcpu-ubuntu-2404-2vj5fzcgdgblmphr 2026-10-23T19:47:25.3168534Z Host: production-152.236.46.245-x8664 2026-10-23T19:47:25.3168805Z Host Agent PID: 25533 2026-10-23T19:47:25.3169045Z Host Agent Git SHA: af74fd76b 2026-10-23T19:47:25.3169315Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T19:47:25.3169592Z Blacksmith Host Generation: gen 2 2026-10-23T19:47:25.3169869Z Petname: production-fast-anchovy-d561051f 2026-10-23T19:47:25.3170151Z Region: us-east 2026-10-23T19:47:25.3170383Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T19:47:25.3178167Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T19:47:25.3178953Z 2026-10-23T19:47:25.3179321Z Enabling Blacksmith transparent cache 2026-10-23T19:47:25.3406237Z ##[group]Run actions/checkout@v6 2026-10-23T19:47:25.3406697Z with: 2026-10-23T19:47:25.3407197Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T19:47:25.3407822Z sparse-checkout-cone-mode: false 2026-10-23T19:47:25.3408242Z repository: pingdotgg/t3code 2026-10-23T19:47:25.3411204Z token: *** 2026-10-23T19:47:25.3411661Z ssh-strict: true 2026-10-23T19:47:25.3412000Z ssh-user: git 2026-10-23T19:47:25.3412336Z persist-credentials: true 2026-10-23T19:47:25.3412969Z clean: true 2026-10-23T19:47:25.3413291Z fetch-depth: 1 2026-10-23T19:47:25.3413623Z fetch-tags: false 2026-10-23T19:47:25.3413967Z show-progress: true 2026-10-23T19:47:25.3414286Z lfs: false 2026-10-23T19:47:25.3414499Z submodules: false 2026-10-23T19:47:25.3414782Z set-safe-directory: true 2026-10-23T19:47:25.3415230Z allow-unsafe-pr-checkout: false 2026-10-23T19:47:25.3415624Z env: 2026-10-23T19:47:25.3415995Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:25.3416450Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:25.3416886Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:25.3417297Z ##[endgroup] 2026-10-23T19:47:25.4846165Z Syncing repository: pingdotgg/t3code 2026-10-23T19:47:25.4847021Z ##[group]Getting Git version info 2026-10-23T19:47:25.4847350Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T19:47:25.4847821Z [command]/usr/local/bin/git version 2026-10-23T19:47:25.4933362Z git version 2.55.0 2026-10-23T19:47:25.4945855Z ##[endgroup] 2026-10-23T19:47:25.4951191Z Temporarily overriding HOME='/home/runner/_work/_temp/f17acacd-ab7a-41c5-853d-3ab3c14fc02d' before making global git config changes 2026-10-23T19:47:25.4951845Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T19:47:25.4954245Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T19:47:25.4990084Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T19:47:25.4992004Z ##[group]Determining repository object format 2026-10-23T19:47:25.4992731Z ##[endgroup] 2026-10-23T19:47:25.4993094Z ##[group]Initializing the repository 2026-10-23T19:47:25.4995043Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T19:47:25.5037438Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T19:47:25.5037955Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T19:47:25.5038447Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T19:47:25.5038814Z hint: call: 2026-10-23T19:47:25.5039020Z hint: 2026-10-23T19:47:25.5039286Z hint: git config --global init.defaultBranch 2026-10-23T19:47:25.5039585Z hint: 2026-10-23T19:47:25.5039872Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T19:47:25.5040318Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T19:47:25.5040688Z hint: 2026-10-23T19:47:25.5040899Z hint: git branch -m 2026-10-23T19:47:25.5041137Z hint: 2026-10-23T19:47:25.5041447Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T19:47:25.5041910Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T19:47:25.5042770Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T19:47:25.5104244Z ##[endgroup] 2026-10-23T19:47:25.5104636Z ##[group]Disabling automatic garbage collection 2026-10-23T19:47:25.5106262Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T19:47:25.5128272Z ##[endgroup] 2026-10-23T19:47:25.5128618Z ##[group]Setting up auth 2026-10-23T19:47:25.5129141Z Removing SSH command configuration 2026-10-23T19:47:25.5132121Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T19:47:25.5158842Z [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-23T19:47:25.5300075Z Removing HTTP extra header 2026-10-23T19:47:25.5302712Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T19:47:25.5330328Z [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-23T19:47:25.5442249Z Removing includeIf entries pointing to credentials config files 2026-10-23T19:47:25.5445562Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T19:47:25.5469659Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T19:47:25.5586112Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-f23af7ca-bd78-4358-98b3-82ce8e2a6114.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T19:47:25.5616244Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-f23af7ca-bd78-4358-98b3-82ce8e2a6114.config 2026-10-23T19:47:25.5636647Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-f23af7ca-bd78-4358-98b3-82ce8e2a6114.config 2026-10-23T19:47:25.5656617Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-f23af7ca-bd78-4358-98b3-82ce8e2a6114.config 2026-10-23T19:47:25.5676246Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-f23af7ca-bd78-4358-98b3-82ce8e2a6114.config 2026-10-23T19:47:25.5694160Z ##[endgroup] 2026-10-23T19:47:25.5694530Z ##[group]Fetching the repository 2026-10-23T19:47:25.5698838Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +e340aaeeb98bc6ac623c2e70ac8eca8bcbddfe1b:refs/remotes/origin/main 2026-10-23T19:47:25.8340819Z From https://github.com/pingdotgg/t3code 2026-10-23T19:47:25.8341779Z * [new ref] e340aaeeb98bc6ac623c2e70ac8eca8bcbddfe1b -> origin/main 2026-10-23T19:47:25.8368638Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-23T19:47:25.8387513Z origin/main 2026-10-23T19:47:25.8391663Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-23T19:47:25.8414603Z e340aaeeb98bc6ac623c2e70ac8eca8bcbddfe1b 2026-10-23T19:47:25.8416175Z ##[endgroup] 2026-10-23T19:47:25.8416601Z ##[group]Determining the checkout info 2026-10-23T19:47:25.8417077Z ##[endgroup] 2026-10-23T19:47:25.8417505Z ##[group]Setting up sparse checkout 2026-10-23T19:47:25.8419416Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T19:47:25.8440887Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T19:47:25.8462385Z .git/info/sparse-checkout 2026-10-23T19:47:25.8465526Z ##[endgroup] 2026-10-23T19:47:25.8466226Z ##[group]Checking out the ref 2026-10-23T19:47:25.8468070Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-23T19:47:38.5934518Z Updating files: 0% (1/6308) 2026-10-23T19:47:38.5964607Z Updating files: 1% (64/6308) 2026-10-23T19:47:38.5983235Z Updating files: 2% (127/6308) 2026-10-23T19:47:38.6005825Z Updating files: 3% (190/6308) 2026-10-23T19:47:38.6028093Z Updating files: 4% (253/6308) 2026-10-23T19:47:38.6060653Z Updating files: 5% (316/6308) 2026-10-23T19:47:38.6082657Z Updating files: 6% (379/6308) 2026-10-23T19:47:38.6141968Z Updating files: 7% (442/6308) 2026-10-23T19:47:38.6173921Z Updating files: 8% (505/6308) 2026-10-23T19:47:38.6196746Z Updating files: 9% (568/6308) 2026-10-23T19:47:38.6490886Z Updating files: 10% (631/6308) 2026-10-23T19:47:38.6507817Z Updating files: 11% (694/6308) 2026-10-23T19:47:38.6519420Z Updating files: 12% (757/6308) 2026-10-23T19:47:38.6534766Z Updating files: 13% (821/6308) 2026-10-23T19:47:38.6551043Z Updating files: 14% (884/6308) 2026-10-23T19:47:38.6569622Z Updating files: 15% (947/6308) 2026-10-23T19:47:38.6589170Z Updating files: 16% (1010/6308) 2026-10-23T19:47:38.6604416Z Updating files: 17% (1073/6308) 2026-10-23T19:47:38.6623689Z Updating files: 18% (1136/6308) 2026-10-23T19:47:38.6639297Z Updating files: 19% (1199/6308) 2026-10-23T19:47:38.6663450Z Updating files: 20% (1262/6308) 2026-10-23T19:47:38.6683165Z Updating files: 21% (1325/6308) 2026-10-23T19:47:38.6702808Z Updating files: 22% (1388/6308) 2026-10-23T19:47:38.6716731Z Updating files: 23% (1451/6308) 2026-10-23T19:47:38.6730167Z Updating files: 24% (1514/6308) 2026-10-23T19:47:38.6746725Z Updating files: 25% (1577/6308) 2026-10-23T19:47:38.6760985Z Updating files: 26% (1641/6308) 2026-10-23T19:47:38.6776712Z Updating files: 27% (1704/6308) 2026-10-23T19:47:38.6797319Z Updating files: 28% (1767/6308) 2026-10-23T19:47:38.6831733Z Updating files: 29% (1830/6308) 2026-10-23T19:47:38.6853313Z Updating files: 30% (1893/6308) 2026-10-23T19:47:38.6878067Z Updating files: 31% (1956/6308) 2026-10-23T19:47:38.6909611Z Updating files: 32% (2019/6308) 2026-10-23T19:47:38.6940195Z Updating files: 33% (2082/6308) 2026-10-23T19:47:38.7013348Z Updating files: 34% (2145/6308) 2026-10-23T19:47:38.7073093Z Updating files: 35% (2208/6308) 2026-10-23T19:47:38.7108671Z Updating files: 36% (2271/6308) 2026-10-23T19:47:38.7142248Z Updating files: 37% (2334/6308) 2026-10-23T19:47:38.7185582Z Updating files: 38% (2398/6308) 2026-10-23T19:47:38.7213345Z Updating files: 39% (2461/6308) 2026-10-23T19:47:38.7246278Z Updating files: 40% (2524/6308) 2026-10-23T19:47:38.7279530Z Updating files: 41% (2587/6308) 2026-10-23T19:47:38.7297235Z Updating files: 42% (2650/6308) 2026-10-23T19:47:38.7307314Z Updating files: 43% (2713/6308) 2026-10-23T19:47:38.7330074Z Updating files: 44% (2776/6308) 2026-10-23T19:47:38.7360969Z Updating files: 45% (2839/6308) 2026-10-23T19:47:38.7387632Z Updating files: 46% (2902/6308) 2026-10-23T19:47:38.7415647Z Updating files: 47% (2965/6308) 2026-10-23T19:47:38.7445829Z Updating files: 48% (3028/6308) 2026-10-23T19:47:38.7477289Z Updating files: 49% (3091/6308) 2026-10-23T19:47:38.7520647Z Updating files: 50% (3154/6308) 2026-10-23T19:47:38.7537682Z Updating files: 51% (3218/6308) 2026-10-23T19:47:38.7578026Z Updating files: 52% (3281/6308) 2026-10-23T19:47:38.7602802Z Updating files: 53% (3344/6308) 2026-10-23T19:47:38.7624847Z Updating files: 54% (3407/6308) 2026-10-23T19:47:38.7650094Z Updating files: 55% (3470/6308) 2026-10-23T19:47:38.7668831Z Updating files: 56% (3533/6308) 2026-10-23T19:47:38.7686729Z Updating files: 57% (3596/6308) 2026-10-23T19:47:38.7706456Z Updating files: 58% (3659/6308) 2026-10-23T19:47:38.8096679Z Updating files: 59% (3722/6308) 2026-10-23T19:47:38.8111513Z Updating files: 60% (3785/6308) 2026-10-23T19:47:38.8128556Z Updating files: 61% (3848/6308) 2026-10-23T19:47:38.8147668Z Updating files: 62% (3911/6308) 2026-10-23T19:47:38.8170151Z Updating files: 63% (3975/6308) 2026-10-23T19:47:38.8198679Z Updating files: 64% (4038/6308) 2026-10-23T19:47:38.8221114Z Updating files: 65% (4101/6308) 2026-10-23T19:47:38.8237583Z Updating files: 66% (4164/6308) 2026-10-23T19:47:38.8263836Z Updating files: 67% (4227/6308) 2026-10-23T19:47:38.8277094Z Updating files: 68% (4290/6308) 2026-10-23T19:47:38.8297094Z Updating files: 69% (4353/6308) 2026-10-23T19:47:38.8309735Z Updating files: 70% (4416/6308) 2026-10-23T19:47:38.8326817Z Updating files: 71% (4479/6308) 2026-10-23T19:47:38.8344298Z Updating files: 72% (4542/6308) 2026-10-23T19:47:38.8370520Z Updating files: 73% (4605/6308) 2026-10-23T19:47:38.8642685Z Updating files: 74% (4668/6308) 2026-10-23T19:47:38.8730032Z Updating files: 75% (4731/6308) 2026-10-23T19:47:38.8840653Z Updating files: 75% (4738/6308) 2026-10-23T19:47:38.8864396Z Updating files: 76% (4795/6308) 2026-10-23T19:47:38.8884937Z Updating files: 77% (4858/6308) 2026-10-23T19:47:38.8912323Z Updating files: 78% (4921/6308) 2026-10-23T19:47:38.8932409Z Updating files: 79% (4984/6308) 2026-10-23T19:47:38.8950305Z Updating files: 80% (5047/6308) 2026-10-23T19:47:38.8970859Z Updating files: 81% (5110/6308) 2026-10-23T19:47:38.8990231Z Updating files: 82% (5173/6308) 2026-10-23T19:47:38.9008300Z Updating files: 83% (5236/6308) 2026-10-23T19:47:38.9031509Z Updating files: 84% (5299/6308) 2026-10-23T19:47:38.9051907Z Updating files: 85% (5362/6308) 2026-10-23T19:47:38.9075058Z Updating files: 86% (5425/6308) 2026-10-23T19:47:38.9148034Z Updating files: 87% (5488/6308) 2026-10-23T19:47:38.9181565Z Updating files: 88% (5552/6308) 2026-10-23T19:47:38.9199823Z Updating files: 89% (5615/6308) 2026-10-23T19:47:38.9227024Z Updating files: 90% (5678/6308) 2026-10-23T19:47:38.9264041Z Updating files: 91% (5741/6308) 2026-10-23T19:47:38.9279757Z Updating files: 92% (5804/6308) 2026-10-23T19:47:38.9296993Z Updating files: 93% (5867/6308) 2026-10-23T19:47:38.9318928Z Updating files: 94% (5930/6308) 2026-10-23T19:47:38.9343719Z Updating files: 95% (5993/6308) 2026-10-23T19:47:38.9399088Z Updating files: 96% (6056/6308) 2026-10-23T19:47:38.9426664Z Updating files: 97% (6119/6308) 2026-10-23T19:47:38.9475787Z Updating files: 98% (6182/6308) 2026-10-23T19:47:38.9496418Z Updating files: 99% (6245/6308) 2026-10-23T19:47:38.9496663Z Updating files: 100% (6308/6308) 2026-10-23T19:47:38.9496871Z Updating files: 100% (6308/6308), done. 2026-10-23T19:47:38.9658488Z Switched to a new branch 'main' 2026-10-23T19:47:38.9659201Z branch 'main' set up to track 'origin/main'. 2026-10-23T19:47:38.9672544Z ##[endgroup] 2026-10-23T19:47:38.9709753Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T19:47:38.9729859Z e340aaeeb98bc6ac623c2e70ac8eca8bcbddfe1b 2026-10-23T19:47:38.9810634Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T19:47:38.9810932Z files="$(git ls-files .github/pr-assets)" 2026-10-23T19:47:38.9811151Z if test -n "$files"; then 2026-10-23T19:47:38.9811808Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T19:47:38.9812048Z  exit 1 2026-10-23T19:47:38.9812185Z fi 2026-10-23T19:47:38.9825497Z shell: /usr/bin/bash -e {0} 2026-10-23T19:47:38.9825677Z env: 2026-10-23T19:47:38.9825840Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:38.9826024Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:38.9826199Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:38.9826367Z ##[endgroup] 2026-10-23T19:47:38.9981510Z Prepare all required actions 2026-10-23T19:47:38.9981884Z Getting action download info 2026-10-23T19:47:39.0802725Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T19:47:39.1731712Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T19:47:39.1731998Z env: 2026-10-23T19:47:39.1732212Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:39.1732486Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:39.1732754Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:39.1733007Z ##[endgroup] 2026-10-23T19:47:39.1866860Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T19:47:39.1886805Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T19:47:39.1887402Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T19:47:39.1887912Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T19:47:39.1888342Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T19:47:39.1907172Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T19:47:39.1907485Z env: 2026-10-23T19:47:39.1907703Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:39.1907975Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:39.1908247Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:39.1908498Z ##[endgroup] 2026-10-23T19:47:39.1987623Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=12] 2026-10-23T19:47:39.1989031Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T19:47:39.2032686Z ##[group]Run actions/cache@v6 2026-10-23T19:47:39.2033062Z with: 2026-10-23T19:47:39.2033199Z path: ~/.vite-plus 2026-10-23T19:47:39.2033395Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T19:47:39.2033627Z enableCrossOsArchive: false 2026-10-23T19:47:39.2033789Z fail-on-cache-miss: false 2026-10-23T19:47:39.2033945Z lookup-only: false 2026-10-23T19:47:39.2034084Z save-always: false 2026-10-23T19:47:39.2034220Z env: 2026-10-23T19:47:39.2034360Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:39.2034538Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:39.2034711Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:39.2034873Z ##[endgroup] 2026-10-23T19:47:39.4062703Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T19:47:39.7943209Z Received 170349591 of 170349591 (100.0%), 442.7 MBs/sec 2026-10-23T19:47:39.7944083Z Cache Size: ~162 MB (170349591 B) 2026-10-23T19:47:39.7984689Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/aca37646-d3db-49af-8bd3-9113d3497aa8/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T19:47:40.5516927Z Cache restored successfully 2026-10-23T19:47:40.5661125Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T19:47:40.5723343Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1373] 2026-10-23T19:47:40.5725944Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T19:47:40.5744963Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T19:47:40.5745192Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T19:47:40.5745377Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T19:47:40.5759480Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T19:47:40.5759658Z env: 2026-10-23T19:47:40.5759785Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:40.5759937Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:40.5760095Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:40.5760251Z ##[endgroup] 2026-10-23T19:47:40.5801864Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T19:47:40.5813139Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-23T19:47:40.5815321Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T19:47:40.5820085Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T19:47:40.5821318Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T19:47:40.5832199Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T19:47:40.5832398Z store_path="$(vp pm cache dir)" 2026-10-23T19:47:40.5832566Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T19:47:40.5848675Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T19:47:40.5848857Z env: 2026-10-23T19:47:40.5848987Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:40.5849158Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:40.5849306Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:40.5849463Z ##[endgroup] 2026-10-23T19:47:40.5997942Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=17] 2026-10-23T19:47:40.5999860Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T19:47:40.6599813Z ##[group]Run actions/cache@v6 2026-10-23T19:47:40.6600070Z with: 2026-10-23T19:47:40.6600257Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T19:47:40.6600634Z key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T19:47:40.6600941Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T19:47:40.6601164Z enableCrossOsArchive: false 2026-10-23T19:47:40.6601331Z fail-on-cache-miss: false 2026-10-23T19:47:40.6601538Z lookup-only: false 2026-10-23T19:47:40.6601690Z save-always: false 2026-10-23T19:47:40.6601869Z env: 2026-10-23T19:47:40.6602021Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:40.6602409Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:40.6602622Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:40.6602790Z ##[endgroup] 2026-10-23T19:47:40.8709884Z Cache hit for: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T19:47:41.9433200Z Received 671088640 of 994615207 (67.5%), 608.9 MBs/sec 2026-10-23T19:47:42.4308153Z Received 994615207 of 994615207 (100.0%), 616.7 MBs/sec 2026-10-23T19:47:42.4309293Z Cache Size: ~949 MB (994615207 B) 2026-10-23T19:47:42.4349366Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/1a789369-b2e5-4ecb-9a28-2a4b8b4021e2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T19:47:48.4146465Z Cache restored successfully 2026-10-23T19:47:48.4625347Z Cache restored from key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T19:47:48.4697904Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7869] 2026-10-23T19:47:48.4700074Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T19:47:48.4710074Z ##[group]Run vp install 2026-10-23T19:47:48.4710270Z vp install 2026-10-23T19:47:48.4723515Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T19:47:48.4723689Z env: 2026-10-23T19:47:48.4723811Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:48.4723964Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:48.4724116Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:48.4724255Z ##[endgroup] 2026-10-23T19:47:48.5063415Z Scope: all 33 workspace projects 2026-10-23T19:47:48.6038188Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T19:47:48.9083017Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T19:47:48.9083384Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T19:47:48.9083613Z Virtual store is at: node_modules/.pnpm 2026-10-23T19:47:51.7864509Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.2s) 2026-10-23T19:47:51.7864787Z Lockfile is up to date, resolution step is skipped 2026-10-23T19:47:51.8079999Z Packages: +1721 2026-10-23T19:47:51.8080323Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T19:47:51.8853104Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-23T19:47:52.9478647Z . prepare$ vp config --no-agent 2026-10-23T19:47:53.0516684Z . prepare: Done 2026-10-23T19:47:53.0534493Z 2026-10-23T19:47:53.0534620Z devDependencies: 2026-10-23T19:47:53.0534818Z + @coderabbitai/config 1.1.0 2026-10-23T19:47:53.0535025Z + @shadcn/lint 0.1.5 2026-10-23T19:47:53.0535244Z + @types/node 24.12.4 2026-10-23T19:47:53.0535373Z + knip 6.34.0 2026-10-23T19:47:53.0535512Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T19:47:53.0535661Z + vite-plus 1.3.0 2026-10-23T19:47:53.0535728Z 2026-10-23T19:47:53.0580157Z Done in 4.6s using pnpm v12.14.0 2026-10-23T19:47:53.0765025Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4606] 2026-10-23T19:47:53.1291417Z ##[group]Run actions/cache@v6 2026-10-23T19:47:53.1291639Z with: 2026-10-23T19:47:53.1291815Z path: ~/.cache/electron 2026-10-23T19:47:53.1292170Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T19:47:53.1292553Z enableCrossOsArchive: false 2026-10-23T19:47:53.1292759Z fail-on-cache-miss: false 2026-10-23T19:47:53.1292953Z lookup-only: false 2026-10-23T19:47:53.1293076Z save-always: false 2026-10-23T19:47:53.1293186Z env: 2026-10-23T19:47:53.1293300Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:53.1293450Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:53.1293607Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:53.1293750Z ##[endgroup] 2026-10-23T19:47:53.3318025Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T19:47:53.5289062Z Received 122906203 of 122906203 (100.0%), 647.6 MBs/sec 2026-10-23T19:47:53.5289793Z Cache Size: ~117 MB (122906203 B) 2026-10-23T19:47:53.5306889Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/064a5022-c5d9-4537-8f68-51f71ddb0d14/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T19:47:53.6101144Z Cache restored successfully 2026-10-23T19:47:53.6252797Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T19:47:53.6371724Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T19:47:53.6371994Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T19:47:53.6385469Z shell: /usr/bin/bash -e {0} 2026-10-23T19:47:53.6385608Z env: 2026-10-23T19:47:53.6385724Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:53.6385881Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:53.6386027Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:53.6386168Z ##[endgroup] 2026-10-23T19:47:53.8032167Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T19:47:54.4149295Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T19:47:54.4170903Z 2026-10-23T19:47:54.4268408Z ##[group]Run vp run knip:check 2026-10-23T19:47:54.4268589Z vp run knip:check 2026-10-23T19:47:54.4281898Z shell: /usr/bin/bash -e {0} 2026-10-23T19:47:54.4282029Z env: 2026-10-23T19:47:54.4282147Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:47:54.4282304Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:47:54.4282452Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:47:54.4282590Z ##[endgroup] 2026-10-23T19:47:54.5773337Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T19:47:58.5815030Z 2026-10-23T19:47:58.5818324Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-23T19:48:07.3430179Z 2026-10-23T19:48:07.3431203Z --- 2026-10-23T19:48:07.3431529Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T19:48:07.3512982Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T19:48:07.3513300Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T19:48:07.3526502Z shell: /usr/bin/bash -e {0} 2026-10-23T19:48:07.3526635Z env: 2026-10-23T19:48:07.3526749Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:48:07.3526903Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:48:07.3527049Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:48:07.3527194Z ##[endgroup] 2026-10-23T19:48:07.5018190Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T19:48:07.7043586Z 2026-10-23T19:48:07.7135578Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T19:48:07.7135793Z vp run --filter t3 generate --check 2026-10-23T19:48:07.7149398Z shell: /usr/bin/bash -e {0} 2026-10-23T19:48:07.7149532Z env: 2026-10-23T19:48:07.7149674Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:48:07.7149826Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:48:07.7150002Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:48:07.7150148Z ##[endgroup] 2026-10-23T19:48:07.8673576Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T19:48:08.0307978Z 2026-10-23T19:48:08.0386716Z ##[group]Run vp check 2026-10-23T19:48:08.0386874Z vp check 2026-10-23T19:48:08.0399955Z shell: /usr/bin/bash -e {0} 2026-10-23T19:48:08.0400087Z env: 2026-10-23T19:48:08.0400201Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:48:08.0400355Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:48:08.0400500Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T19:48:08.0400638Z ##[endgroup] 2026-10-23T19:48:08.6051445Z pass: All 5665 files are correctly formatted (419ms, 8 threads) 2026-10-23T19:48:14.5894136Z warn: Lint warnings found 2026-10-23T19:48:14.5895553Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.5895914Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T19:48:14.5896129Z 28 │ getPendingThreadOrder(); 2026-10-23T19:48:14.5896316Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T19:48:14.5896599Z ·  ────┬──── ───────┬────── 2026-10-23T19:48:14.5896967Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T19:48:14.5897297Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T19:48:14.5897525Z 30 │ return pending; 2026-10-23T19:48:14.5897670Z ╰──── 2026-10-23T19:48:14.5898051Z  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-23T19:48:14.5898704Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.5899020Z 2026-10-23T19:48:14.5899263Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T19:48:14.5899651Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T19:48:14.5899926Z 227 │ ): string { 2026-10-23T19:48:14.5900190Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T19:48:14.5900489Z ·  ────── 2026-10-23T19:48:14.5900767Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T19:48:14.5900975Z ╰──── 2026-10-23T19:48:14.5901227Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T19:48:14.5901418Z 2026-10-23T19:48:14.5901915Z ⚠ 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-23T19:48:14.5902584Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T19:48:14.5902890Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T19:48:14.5903218Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T19:48:14.5903531Z 567 │ │ const nextEvent = { 2026-10-23T19:48:14.5903853Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T19:48:14.5904183Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T19:48:14.5904440Z 570 │ │ threadId, 2026-10-23T19:48:14.5904667Z 571 │ │ providerInstanceId, 2026-10-23T19:48:14.5904908Z 572 │ │ occurredAt: now, 2026-10-23T19:48:14.5905179Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T19:48:14.5905486Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T19:48:14.5905748Z 575 │ │ const reader = yield* eventSink 2026-10-23T19:48:14.5906165Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T19:48:14.5906926Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T19:48:14.5907190Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.5907483Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T19:48:14.5907791Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T19:48:14.5908054Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T19:48:14.5908398Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T19:48:14.5908687Z 583 │ │ } 2026-10-23T19:48:14.5908959Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T19:48:14.5909284Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T19:48:14.5909582Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T19:48:14.5909890Z 587 │ ╰─▶ } 2026-10-23T19:48:14.5910097Z 588 │ }), 2026-10-23T19:48:14.5910224Z ╰──── 2026-10-23T19:48:14.5910288Z 2026-10-23T19:48:14.5910776Z ⚠ 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-23T19:48:14.5911386Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T19:48:14.5911648Z 2326 │ let settled = false; 2026-10-23T19:48:14.5911921Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T19:48:14.5912254Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T19:48:14.5912555Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T19:48:14.5912788Z 2330 │ │ ); 2026-10-23T19:48:14.5913018Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T19:48:14.5913298Z 2332 │ ╰─▶ } 2026-10-23T19:48:14.5913562Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T19:48:14.5913750Z ╰──── 2026-10-23T19:48:14.5913810Z 2026-10-23T19:48:14.5914025Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.5914373Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T19:48:14.5914609Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T19:48:14.5914777Z 1315 │ retryTick, 2026-10-23T19:48:14.5914938Z ·  ────┬──── 2026-10-23T19:48:14.5915198Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T19:48:14.5915426Z 1316 │ restoreQueuedMessage, 2026-10-23T19:48:14.5915574Z ╰──── 2026-10-23T19:48:14.5916060Z  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-23T19:48:14.5916669Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.5917057Z 2026-10-23T19:48:14.5917306Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.5917660Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T19:48:14.5917923Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T19:48:14.5918121Z 257 │ }, [props.path, targetIndex]); 2026-10-23T19:48:14.5918307Z ·  ─────┬──── 2026-10-23T19:48:14.5918550Z · ╰── Unnecessary dependency `props.path` 2026-10-23T19:48:14.5918760Z 258 │ 2026-10-23T19:48:14.5918876Z ╰──── 2026-10-23T19:48:14.5919234Z  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-23T19:48:14.5919865Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.5920176Z 2026-10-23T19:48:14.5920375Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.5920719Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T19:48:14.5920957Z 292 │ 2026-10-23T19:48:14.5923265Z ·  ─────────── 2026-10-23T19:48:14.5923448Z 310 │ {body} 2026-10-23T19:48:14.5923588Z ╰──── 2026-10-23T19:48:14.5923796Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T19:48:14.5923956Z 2026-10-23T19:48:14.5924222Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.5924627Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-23T19:48:14.5924838Z 150 │ 2026-10-23T19:48:14.5924971Z 151 │ useEffect(() => { 2026-10-23T19:48:14.5925130Z ·  ────┬──── 2026-10-23T19:48:14.5925353Z · ╰── This is the containing effect 2026-10-23T19:48:14.5925583Z 152 │ if (!controlledSelectedPath) { 2026-10-23T19:48:14.5925758Z 153 │ return; 2026-10-23T19:48:14.5925898Z 154 │ } 2026-10-23T19:48:14.5926049Z 155 │ setExpandedPaths((current) => { 2026-10-23T19:48:14.5926242Z ·  ────────┬─────── 2026-10-23T19:48:14.5926515Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.5926813Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T19:48:14.5927006Z ╰──── 2026-10-23T19:48:14.5927763Z  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-23T19:48:14.5928708Z  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-23T19:48:14.5929023Z 2026-10-23T19:48:14.5929239Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-23T19:48:14.5929611Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-23T19:48:14.5929914Z 24 │ import * as Schema from "effect/Schema"; 2026-10-23T19:48:14.5930149Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-23T19:48:14.5930376Z ·  ─────┬───── 2026-10-23T19:48:14.5930620Z · ╰── 'HostProcess' is imported here 2026-10-23T19:48:14.5930823Z 26 │ 2026-10-23T19:48:14.5930937Z ╰──── 2026-10-23T19:48:14.5931095Z  help: Consider removing this import. 2026-10-23T19:48:14.5931214Z 2026-10-23T19:48:14.5931659Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.5932093Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-23T19:48:14.5932351Z 123 │ const path = yield* Path.Path; 2026-10-23T19:48:14.5932574Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T19:48:14.5932806Z ·  ──────┬───── 2026-10-23T19:48:14.5933052Z · ╰── 'serverConfig' is declared here 2026-10-23T19:48:14.5933343Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T19:48:14.5933555Z ╰──── 2026-10-23T19:48:14.5933725Z  help: Consider removing this declaration. 2026-10-23T19:48:14.5933848Z 2026-10-23T19:48:14.5934131Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.5934701Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-23T19:48:14.5935021Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T19:48:14.5935296Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T19:48:14.5935551Z ·  ───────┬────── 2026-10-23T19:48:14.5935800Z · ╰── 'serverSettings' is declared here 2026-10-23T19:48:14.5936088Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-23T19:48:14.5936296Z ╰──── 2026-10-23T19:48:14.5936462Z  help: Consider removing this declaration. 2026-10-23T19:48:14.5936580Z 2026-10-23T19:48:14.5936793Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T19:48:14.5937149Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T19:48:14.5937360Z 233 │ 2026-10-23T19:48:14.5937545Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T19:48:14.5937764Z ·  ───────┬────── 2026-10-23T19:48:14.5938103Z · ╰── 'nonEmptyString' is declared here 2026-10-23T19:48:14.5938447Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T19:48:14.5938666Z ╰──── 2026-10-23T19:48:14.5938831Z  help: Consider removing this declaration. 2026-10-23T19:48:14.5938954Z 2026-10-23T19:48:14.5939158Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T19:48:14.5939531Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-23T19:48:14.5939813Z 3 │ AuthProvidersManageScope, 2026-10-23T19:48:14.5939987Z 4 │ type AuthSessionState, 2026-10-23T19:48:14.5940164Z ·  ────────┬─────── 2026-10-23T19:48:14.5940423Z · ╰── 'AuthSessionState' is imported here 2026-10-23T19:48:14.5940647Z 5 │ type EnvironmentId, 2026-10-23T19:48:14.5940790Z ╰──── 2026-10-23T19:48:14.5940944Z  help: Consider removing this import. 2026-10-23T19:48:14.5941063Z 2026-10-23T19:48:14.5941265Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T19:48:14.5941638Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T19:48:14.5941878Z 1782 │ assert.equal( 2026-10-23T19:48:14.5942116Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T19:48:14.5942379Z ·  ────────────────────────── 2026-10-23T19:48:14.5942579Z 1784 │ stored.attachments[0]?.id, 2026-10-23T19:48:14.5942735Z ╰──── 2026-10-23T19:48:14.5942981Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T19:48:14.5943166Z 2026-10-23T19:48:14.5943312Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.5943623Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T19:48:14.5943848Z 493 │ > 2026-10-23T19:48:14.5944005Z 494 │ {props.children(close)} 2026-10-23T19:48:14.5944202Z ·  ──┬── 2026-10-23T19:48:14.5944477Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.5944717Z 495 │ 2026-10-23T19:48:14.5944869Z ╰──── 2026-10-23T19:48:14.5945423Z  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-23T19:48:14.5946176Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.5946462Z 2026-10-23T19:48:14.5946730Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.5947148Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-23T19:48:14.5947376Z 412 │ 2026-10-23T19:48:14.5947572Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-23T19:48:14.5947791Z ·  ──┬── 2026-10-23T19:48:14.5948007Z · ╰── 'layer' is declared here 2026-10-23T19:48:14.5948201Z ╰──── 2026-10-23T19:48:14.5948439Z  help: Consider removing this declaration. 2026-10-23T19:48:14.5948599Z 2026-10-23T19:48:14.5948762Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.5949085Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-23T19:48:14.5949358Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-23T19:48:14.5949571Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-23T19:48:14.5949797Z ·  ──────┬────── 2026-10-23T19:48:14.5950036Z · ╰── `pulseProgress` originates here 2026-10-23T19:48:14.5950239Z 55 │ 2026-10-23T19:48:14.5950367Z 56 │ useEffect(() => { 2026-10-23T19:48:14.5950523Z 57 │ if (pulse) { 2026-10-23T19:48:14.5950692Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T19:48:14.5950889Z ·  ──────┬────── 2026-10-23T19:48:14.5951136Z · ╰── `pulseProgress` cannot be modified 2026-10-23T19:48:14.5951349Z 59 │ withTiming(1, { 2026-10-23T19:48:14.5951494Z ╰──── 2026-10-23T19:48:14.5951822Z  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-23T19:48:14.5952399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.5952696Z 2026-10-23T19:48:14.5953176Z ⚠ 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-23T19:48:14.5953773Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T19:48:14.5954052Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T19:48:14.5954403Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T19:48:14.5954741Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T19:48:14.5955000Z 137 │ │ if (predicate(lastState)) { 2026-10-23T19:48:14.5955224Z 138 │ │ return lastState; 2026-10-23T19:48:14.5955416Z 139 │ │ } 2026-10-23T19:48:14.5955617Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.5955953Z 141 │ ╰─▶ } 2026-10-23T19:48:14.5956213Z 142 │ return yield* Effect.die( 2026-10-23T19:48:14.5956367Z ╰──── 2026-10-23T19:48:14.5956423Z 2026-10-23T19:48:14.5956599Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.5956900Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T19:48:14.5957135Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T19:48:14.5957415Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T19:48:14.5957705Z ·  ─────┬──── 2026-10-23T19:48:14.5958009Z · ╰── Cannot call impure function 2026-10-23T19:48:14.5958254Z 822 │ return AsyncResult.failure( 2026-10-23T19:48:14.5958416Z ╰──── 2026-10-23T19:48:14.5958767Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.5959338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.5959623Z 2026-10-23T19:48:14.5959813Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.5960101Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T19:48:14.5960310Z 708 │ const wokeAt = resolved 2026-10-23T19:48:14.5960541Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T19:48:14.5960811Z ·  ─────┬──── 2026-10-23T19:48:14.5961101Z · ╰── Cannot call impure function 2026-10-23T19:48:14.5961329Z 710 │ : null; 2026-10-23T19:48:14.5961459Z ╰──── 2026-10-23T19:48:14.5961803Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.5962364Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.5962653Z 2026-10-23T19:48:14.5962854Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.5963196Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T19:48:14.5963448Z 35 │ { 2026-10-23T19:48:14.5970034Z ╰──── 2026-10-23T19:48:14.5970380Z  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-23T19:48:14.5970952Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.5971602Z 2026-10-23T19:48:14.5971876Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.5972305Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-23T19:48:14.5972544Z 330 │ }; 2026-10-23T19:48:14.5972677Z 331 │ useEffect(() => { 2026-10-23T19:48:14.5972836Z ·  ────┬──── 2026-10-23T19:48:14.5973059Z · ╰── This is the containing effect 2026-10-23T19:48:14.5973299Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T19:48:14.5973517Z 333 │ requestedSection.current = "overview"; 2026-10-23T19:48:14.5973804Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T19:48:14.5974057Z 335 │ setSection("overview"); 2026-10-23T19:48:14.5974237Z ·  ─────┬──── 2026-10-23T19:48:14.5974510Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.5974736Z 336 │ } 2026-10-23T19:48:14.5974859Z ╰──── 2026-10-23T19:48:14.5975532Z  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-23T19:48:14.5976411Z  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-23T19:48:14.5976725Z 2026-10-23T19:48:14.5977018Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T19:48:14.5977440Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T19:48:14.5977717Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T19:48:14.5977934Z 333 │ requestedSection.current = "overview"; 2026-10-23T19:48:14.5978133Z ·  ────────┬─────── 2026-10-23T19:48:14.5978688Z · ╰── 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-23T19:48:14.5979256Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T19:48:14.5979595Z ·  ─────────┬───────── ──────┬────── 2026-10-23T19:48:14.5980301Z · │ ╰── 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-23T19:48:14.5981199Z · ╰── 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-23T19:48:14.5981685Z 335 │ setSection("overview"); 2026-10-23T19:48:14.5981845Z 336 │ } 2026-10-23T19:48:14.5982009Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T19:48:14.5982247Z ·  ──────────────────┬───────────────── 2026-10-23T19:48:14.5982578Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.5982866Z 338 │ const tabContent = activityContent; 2026-10-23T19:48:14.5983027Z ╰──── 2026-10-23T19:48:14.5983262Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T19:48:14.5983757Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.5984062Z 2026-10-23T19:48:14.5984276Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T19:48:14.5984659Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T19:48:14.5984901Z 856 │ if ( 2026-10-23T19:48:14.5985101Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T19:48:14.5985323Z ·  ──────┬────── 2026-10-23T19:48:14.5985866Z · ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T19:48:14.5986397Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T19:48:14.5986596Z 859 │ ) 2026-10-23T19:48:14.5986731Z 860 │ return; 2026-10-23T19:48:14.5986988Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T19:48:14.5987312Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T19:48:14.5987552Z 863 │ setJumpPath(route.params.path); 2026-10-23T19:48:14.5987820Z 864 │ setSelectedRowId(null); 2026-10-23T19:48:14.5988039Z 865 │ jumpStarted.current = false; 2026-10-23T19:48:14.5988293Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T19:48:14.5988555Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T19:48:14.5988763Z ·  ─────┬──── 2026-10-23T19:48:14.5989320Z · ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T19:48:14.5989876Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T19:48:14.5990102Z 869 │ jumpStarted.current = true; 2026-10-23T19:48:14.5990346Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T19:48:14.5990593Z 871 │ jumpStarted.current = false; 2026-10-23T19:48:14.5990759Z 872 │ }); 2026-10-23T19:48:14.5991035Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T19:48:14.5991471Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T19:48:14.5991901Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.5992225Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T19:48:14.5992412Z ╰──── 2026-10-23T19:48:14.5992641Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T19:48:14.5993150Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.5993461Z 2026-10-23T19:48:14.5993670Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-23T19:48:14.5994015Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-23T19:48:14.5994233Z 1 │ import type { 2026-10-23T19:48:14.5994379Z 2 │ EnvironmentId, 2026-10-23T19:48:14.5994538Z ·  ──────┬────── 2026-10-23T19:48:14.5994774Z · ╰── 'EnvironmentId' is imported here 2026-10-23T19:48:14.5995011Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-23T19:48:14.5995171Z ╰──── 2026-10-23T19:48:14.5995332Z  help: Consider removing this import. 2026-10-23T19:48:14.5995450Z 2026-10-23T19:48:14.5995892Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.5996423Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T19:48:14.5996650Z 1443 │ 2026-10-23T19:48:14.5996836Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T19:48:14.5997092Z ·  ───────────────────┬─────────────────── 2026-10-23T19:48:14.5997436Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T19:48:14.5997764Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T19:48:14.5997960Z ╰──── 2026-10-23T19:48:14.5998126Z  help: Consider removing this declaration. 2026-10-23T19:48:14.5998249Z 2026-10-23T19:48:14.5998525Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.5998939Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T19:48:14.5999167Z 1679 │ 2026-10-23T19:48:14.5999304Z 1680 │ const layer: Layer.Layer< 2026-10-23T19:48:14.5999471Z ·  ──┬── 2026-10-23T19:48:14.5999695Z · ╰── 'layer' is declared here 2026-10-23T19:48:14.5999960Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T19:48:14.6000130Z ╰──── 2026-10-23T19:48:14.6000292Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6000413Z 2026-10-23T19:48:14.6000675Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T19:48:14.6001110Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T19:48:14.6001357Z 959 │ 2026-10-23T19:48:14.6001532Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T19:48:14.6001782Z ·  ──────────────────┬───────────────── 2026-10-23T19:48:14.6002110Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T19:48:14.6002421Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T19:48:14.6002598Z ╰──── 2026-10-23T19:48:14.6002763Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6002885Z 2026-10-23T19:48:14.6003074Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T19:48:14.6003379Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T19:48:14.6003650Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T19:48:14.6003888Z 194 │ const codes = new Array(count); 2026-10-23T19:48:14.6004120Z ·  ──────────────────────── 2026-10-23T19:48:14.6004347Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T19:48:14.6004526Z ╰──── 2026-10-23T19:48:14.6005018Z  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-23T19:48:14.6005411Z 2026-10-23T19:48:14.6005647Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T19:48:14.6006138Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T19:48:14.6006420Z 1997 │ assert.equal( 2026-10-23T19:48:14.6006664Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T19:48:14.6006911Z ·  ────── 2026-10-23T19:48:14.6007092Z 1999 │ "authoritative answer", 2026-10-23T19:48:14.6007256Z ╰──── 2026-10-23T19:48:14.6007491Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T19:48:14.6007673Z 2026-10-23T19:48:14.6008194Z ⚠ 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-23T19:48:14.6026299Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T19:48:14.6026683Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T19:48:14.6027094Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T19:48:14.6027409Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6027668Z 3953 │ ╰─▶ } 2026-10-23T19:48:14.6027928Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T19:48:14.6028115Z ╰──── 2026-10-23T19:48:14.6028175Z 2026-10-23T19:48:14.6028665Z ⚠ 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-23T19:48:14.6029276Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T19:48:14.6029539Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T19:48:14.6029912Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T19:48:14.6030203Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6030464Z 6064 │ ╰─▶ } 2026-10-23T19:48:14.6030781Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T19:48:14.6031009Z ╰──── 2026-10-23T19:48:14.6031067Z 2026-10-23T19:48:14.6031550Z ⚠ 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-23T19:48:14.6032148Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T19:48:14.6032410Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T19:48:14.6032706Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T19:48:14.6033000Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6033263Z 6199 │ ╰─▶ } 2026-10-23T19:48:14.6033576Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T19:48:14.6033801Z ╰──── 2026-10-23T19:48:14.6033861Z 2026-10-23T19:48:14.6034189Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T19:48:14.6034611Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T19:48:14.6034878Z 115 │ return [...commands]; 2026-10-23T19:48:14.6035104Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T19:48:14.6035379Z ·  ─────────┬───────── 2026-10-23T19:48:14.6035694Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T19:48:14.6035931Z 117 │ 2026-10-23T19:48:14.6036048Z ╰──── 2026-10-23T19:48:14.6036431Z  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-23T19:48:14.6037068Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6037383Z 2026-10-23T19:48:14.6037606Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T19:48:14.6037946Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-23T19:48:14.6038169Z 137 │ visit(parser.parse(markdown)); 2026-10-23T19:48:14.6038356Z 138 │ for (const edit of edits.reverse()) 2026-10-23T19:48:14.6038564Z ·  ─────── 2026-10-23T19:48:14.6038842Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T19:48:14.6039068Z ╰──── 2026-10-23T19:48:14.6039403Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T19:48:14.6039663Z 2026-10-23T19:48:14.6039907Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T19:48:14.6040243Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-23T19:48:14.6040460Z 168 │ visit(parser.parse(markdown)); 2026-10-23T19:48:14.6040647Z 169 │ for (const edit of edits.reverse()) 2026-10-23T19:48:14.6040846Z ·  ─────── 2026-10-23T19:48:14.6041124Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T19:48:14.6041348Z ╰──── 2026-10-23T19:48:14.6041668Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T19:48:14.6041921Z 2026-10-23T19:48:14.6042139Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T19:48:14.6042474Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-23T19:48:14.6042691Z 222 │ visit(parser.parse(markdown)); 2026-10-23T19:48:14.6042899Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-23T19:48:14.6043132Z ·  ─────── 2026-10-23T19:48:14.6043420Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-23T19:48:14.6043643Z ╰──── 2026-10-23T19:48:14.6043965Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T19:48:14.6044213Z 2026-10-23T19:48:14.6044699Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6045156Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T19:48:14.6045387Z 10577 │ 2026-10-23T19:48:14.6045530Z 10578 │ const layer: Layer.Layer< 2026-10-23T19:48:14.6045698Z ·  ──┬── 2026-10-23T19:48:14.6045919Z · ╰── 'layer' is declared here 2026-10-23T19:48:14.6046158Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T19:48:14.6046325Z ╰──── 2026-10-23T19:48:14.6046496Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6046618Z 2026-10-23T19:48:14.6046807Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6047179Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-23T19:48:14.6047448Z 554 │ assert.deepStrictEqual( 2026-10-23T19:48:14.6047724Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T19:48:14.6048018Z ·  ┬ 2026-10-23T19:48:14.6048320Z · ╰── '_' is declared here 2026-10-23T19:48:14.6048543Z 556 │ [ 2026-10-23T19:48:14.6048677Z ╰──── 2026-10-23T19:48:14.6048837Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6048956Z 2026-10-23T19:48:14.6049147Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6049518Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T19:48:14.6049818Z 1154 │ assert.deepStrictEqual( 2026-10-23T19:48:14.6050090Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T19:48:14.6050389Z ·  ┬ 2026-10-23T19:48:14.6050688Z · ╰── '_' is declared here 2026-10-23T19:48:14.6050913Z 1156 │ [ 2026-10-23T19:48:14.6051045Z ╰──── 2026-10-23T19:48:14.6051206Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6051815Z 2026-10-23T19:48:14.6052306Z ⚠ 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-23T19:48:14.6052889Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T19:48:14.6053112Z 168 │ }); 2026-10-23T19:48:14.6053393Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T19:48:14.6053786Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T19:48:14.6054088Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6054353Z 172 │ ╰─▶ } 2026-10-23T19:48:14.6054549Z 173 │ 2026-10-23T19:48:14.6054670Z ╰──── 2026-10-23T19:48:14.6054729Z 2026-10-23T19:48:14.6055291Z ⚠ 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-23T19:48:14.6055909Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T19:48:14.6056180Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T19:48:14.6056510Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T19:48:14.6056834Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T19:48:14.6057088Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6057344Z 181 │ ╰─▶ } 2026-10-23T19:48:14.6057543Z 182 │ 2026-10-23T19:48:14.6057668Z ╰──── 2026-10-23T19:48:14.6057734Z 2026-10-23T19:48:14.6058206Z ⚠ 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-23T19:48:14.6058777Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T19:48:14.6059070Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T19:48:14.6059407Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T19:48:14.6059725Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T19:48:14.6060103Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T19:48:14.6060391Z 310 │ │ break; 2026-10-23T19:48:14.6060576Z 311 │ │ } 2026-10-23T19:48:14.6060786Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6061042Z 313 │ ╰─▶ } 2026-10-23T19:48:14.6061238Z 314 │ 2026-10-23T19:48:14.6061356Z ╰──── 2026-10-23T19:48:14.6061416Z 2026-10-23T19:48:14.6061624Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T19:48:14.6061960Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T19:48:14.6062177Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T19:48:14.6062346Z 3 │ type AuthSessionState, 2026-10-23T19:48:14.6062602Z ·  ────────┬─────── 2026-10-23T19:48:14.6062896Z · ╰── 'AuthSessionState' is imported here 2026-10-23T19:48:14.6063118Z 4 │ sessionGrantsScope, 2026-10-23T19:48:14.6063262Z ╰──── 2026-10-23T19:48:14.6063419Z  help: Consider removing this import. 2026-10-23T19:48:14.6063539Z 2026-10-23T19:48:14.6063805Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6064231Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-23T19:48:14.6064469Z 76 │ 2026-10-23T19:48:14.6064596Z 77 │ useEffect(() => { 2026-10-23T19:48:14.6064755Z ·  ────┬──── 2026-10-23T19:48:14.6064980Z · ╰── This is the containing effect 2026-10-23T19:48:14.6065258Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T19:48:14.6065477Z 79 │ setHostInput(host); 2026-10-23T19:48:14.6065645Z ·  ──────┬───── 2026-10-23T19:48:14.6065913Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6066150Z 80 │ setCodeInput(code); 2026-10-23T19:48:14.6066294Z ╰──── 2026-10-23T19:48:14.6066969Z  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-23T19:48:14.6067860Z  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-23T19:48:14.6068179Z 2026-10-23T19:48:14.6068442Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6068869Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T19:48:14.6069106Z 82 │ 2026-10-23T19:48:14.6069235Z 83 │ useEffect(() => { 2026-10-23T19:48:14.6069393Z ·  ────┬──── 2026-10-23T19:48:14.6069615Z · ╰── This is the containing effect 2026-10-23T19:48:14.6069872Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T19:48:14.6070043Z 85 │ return; 2026-10-23T19:48:14.6070174Z 86 │ } 2026-10-23T19:48:14.6070290Z 87 │ 2026-10-23T19:48:14.6070465Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T19:48:14.6070669Z 89 │ setHostInput(host); 2026-10-23T19:48:14.6070839Z ·  ──────┬───── 2026-10-23T19:48:14.6071099Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6071333Z 90 │ setCodeInput(code); 2026-10-23T19:48:14.6071469Z ╰──── 2026-10-23T19:48:14.6072134Z  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-23T19:48:14.6073000Z  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-23T19:48:14.6073308Z 2026-10-23T19:48:14.6073647Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6074098Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T19:48:14.6074329Z 92 │ 2026-10-23T19:48:14.6074449Z 93 │ useEffect(() => { 2026-10-23T19:48:14.6074605Z ·  ────┬──── 2026-10-23T19:48:14.6074820Z · ╰── This is the containing effect 2026-10-23T19:48:14.6075039Z 94 │ if (pairingConnectionError) { 2026-10-23T19:48:14.6075211Z 95 │ setIsSubmitting(false); 2026-10-23T19:48:14.6075386Z ·  ───────┬─────── 2026-10-23T19:48:14.6075654Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6075884Z 96 │ } 2026-10-23T19:48:14.6076000Z ╰──── 2026-10-23T19:48:14.6076661Z  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-23T19:48:14.6077524Z  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-23T19:48:14.6077834Z 2026-10-23T19:48:14.6078095Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6078506Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-23T19:48:14.6078746Z 434 │ : null; 2026-10-23T19:48:14.6078890Z 435 │ useEffect(() => { 2026-10-23T19:48:14.6079045Z ·  ────┬──── 2026-10-23T19:48:14.6079263Z · ╰── This is the containing effect 2026-10-23T19:48:14.6079461Z 436 │ if ( 2026-10-23T19:48:14.6079605Z 437 │ props.active === false || 2026-10-23T19:48:14.6079812Z 438 │ activeDraftKey !== null || 2026-10-23T19:48:14.6079991Z 439 │ editingPendingTask !== null || 2026-10-23T19:48:14.6080169Z 440 │ selectedProject === null 2026-10-23T19:48:14.6080322Z 441 │ ) { 2026-10-23T19:48:14.6080446Z 442 │ return; 2026-10-23T19:48:14.6080577Z 443 │ } 2026-10-23T19:48:14.6080710Z 444 │ setActiveDraftKey( 2026-10-23T19:48:14.6080876Z ·  ────────┬──────── 2026-10-23T19:48:14.6081157Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6081398Z 445 │ createNewTaskDraft({ 2026-10-23T19:48:14.6081541Z ╰──── 2026-10-23T19:48:14.6082199Z  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-23T19:48:14.6083063Z  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-23T19:48:14.6083368Z 2026-10-23T19:48:14.6083615Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T19:48:14.6084090Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T19:48:14.6084402Z 1243 │ 2026-10-23T19:48:14.6084716Z 1244 │ {props.children} 2026-10-23T19:48:14.6085034Z ·  ───────────── 2026-10-23T19:48:14.6085228Z 1245 │ 2026-10-23T19:48:14.6085375Z ╰──── 2026-10-23T19:48:14.6085660Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T19:48:14.6086027Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T19:48:14.6086208Z 2026-10-23T19:48:14.6086424Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T19:48:14.6086760Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T19:48:14.6086974Z 2 │ AuthFilesystemReadScope, 2026-10-23T19:48:14.6087131Z 3 │ type AuthSessionState, 2026-10-23T19:48:14.6087303Z ·  ────────┬─────── 2026-10-23T19:48:14.6087544Z · ╰── 'AuthSessionState' is imported here 2026-10-23T19:48:14.6087768Z 4 │ type FilesystemBrowseEntry, 2026-10-23T19:48:14.6087910Z ╰──── 2026-10-23T19:48:14.6088064Z  help: Consider removing this import. 2026-10-23T19:48:14.6088175Z 2026-10-23T19:48:14.6088438Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6088851Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T19:48:14.6089087Z 259 │ .join("|"); 2026-10-23T19:48:14.6089228Z 260 │ useEffect(() => { 2026-10-23T19:48:14.6089382Z ·  ────┬──── 2026-10-23T19:48:14.6089597Z · ╰── This is the containing effect 2026-10-23T19:48:14.6089823Z 261 │ stop(); 2026-10-23T19:48:14.6089958Z ·  ──┬─ 2026-10-23T19:48:14.6090206Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6090434Z 262 │ }, [orderVersion]); 2026-10-23T19:48:14.6090569Z ╰──── 2026-10-23T19:48:14.6091295Z  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-23T19:48:14.6092164Z  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-23T19:48:14.6092469Z 2026-10-23T19:48:14.6092687Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6093059Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T19:48:14.6093285Z 260 │ useEffect(() => { 2026-10-23T19:48:14.6093429Z 261 │ stop(); 2026-10-23T19:48:14.6093566Z ·  ──┬─ 2026-10-23T19:48:14.6093774Z · ╰── Missing dependency `stop` 2026-10-23T19:48:14.6093975Z 262 │ }, [orderVersion]); 2026-10-23T19:48:14.6094246Z ·  ──────┬───── 2026-10-23T19:48:14.6094533Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T19:48:14.6094739Z 263 │ useEffect( 2026-10-23T19:48:14.6094867Z ╰──── 2026-10-23T19:48:14.6095347Z  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-23T19:48:14.6096058Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6096362Z 2026-10-23T19:48:14.6096510Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6096825Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T19:48:14.6097073Z 95 │ const latest = useRef(props); 2026-10-23T19:48:14.6097239Z 96 │ latest.current = props; 2026-10-23T19:48:14.6097435Z ·  ───┬──────┬─── 2026-10-23T19:48:14.6097732Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6098017Z · ╰── This value is a ref 2026-10-23T19:48:14.6098209Z 97 │ const gesture = useMemo( 2026-10-23T19:48:14.6098348Z ╰──── 2026-10-23T19:48:14.6098879Z  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-23T19:48:14.6099611Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6099925Z 2026-10-23T19:48:14.6100073Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6100385Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T19:48:14.6100619Z 103 │ .runOnJS(true) 2026-10-23T19:48:14.6100804Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T19:48:14.6101040Z ·  ───────────────┬────────────── 2026-10-23T19:48:14.6101362Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6101692Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6101896Z ╰──── 2026-10-23T19:48:14.6102430Z  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-23T19:48:14.6103148Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6103427Z 2026-10-23T19:48:14.6103573Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6103885Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T19:48:14.6104155Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T19:48:14.6104402Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6104770Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T19:48:14.6105157Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6105481Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6105667Z ╰──── 2026-10-23T19:48:14.6106194Z  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-23T19:48:14.6106904Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6107185Z 2026-10-23T19:48:14.6107337Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6107651Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T19:48:14.6107948Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6108215Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6108500Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T19:48:14.6108846Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6109169Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T19:48:14.6109359Z ╰──── 2026-10-23T19:48:14.6109930Z  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-23T19:48:14.6110653Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6110930Z 2026-10-23T19:48:14.6111075Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6111386Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T19:48:14.6111677Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6111937Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T19:48:14.6112293Z ·  ───────────────────────┬────────────────────── 2026-10-23T19:48:14.6112672Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6112934Z 108 │ [props.disabled], 2026-10-23T19:48:14.6113073Z ╰──── 2026-10-23T19:48:14.6113597Z  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-23T19:48:14.6114309Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6114592Z 2026-10-23T19:48:14.6114744Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6115061Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T19:48:14.6115345Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T19:48:14.6115579Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T19:48:14.6115809Z ·  ───┬──────┬─── 2026-10-23T19:48:14.6116097Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6116385Z · ╰── This value is a ref 2026-10-23T19:48:14.6116562Z 250 │ 2026-10-23T19:48:14.6116678Z ╰──── 2026-10-23T19:48:14.6117206Z  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-23T19:48:14.6117928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6118207Z 2026-10-23T19:48:14.6118351Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6118667Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T19:48:14.6118954Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T19:48:14.6119208Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T19:48:14.6119465Z ·  ──────────────────┬────────────────── 2026-10-23T19:48:14.6119800Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6120080Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T19:48:14.6120259Z ╰──── 2026-10-23T19:48:14.6120784Z  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-23T19:48:14.6121505Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6121784Z 2026-10-23T19:48:14.6121955Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6122290Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T19:48:14.6122597Z 323 │ update(0); 2026-10-23T19:48:14.6122796Z 324 │ let last = performance.now(); 2026-10-23T19:48:14.6122997Z ·  ────────┬──────── 2026-10-23T19:48:14.6123251Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6123463Z 325 │ const tick = () => { 2026-10-23T19:48:14.6123602Z ╰──── 2026-10-23T19:48:14.6123969Z  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-23T19:48:14.6124553Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6124837Z 2026-10-23T19:48:14.6125036Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T19:48:14.6125389Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T19:48:14.6125616Z  98 │ () => 2026-10-23T19:48:14.6125756Z  99 │ Gesture.Pan() 2026-10-23T19:48:14.6125920Z ·  ─┬─ 2026-10-23T19:48:14.6126144Z · ╰── `Pan` may be a component 2026-10-23T19:48:14.6126366Z 100 │ .enabled(!props.disabled) 2026-10-23T19:48:14.6126516Z ╰──── 2026-10-23T19:48:14.6126852Z  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-23T19:48:14.6127561Z  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-23T19:48:14.6127974Z 2026-10-23T19:48:14.6128167Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T19:48:14.6128520Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T19:48:14.6128760Z 103 │ .runOnJS(true) 2026-10-23T19:48:14.6128947Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T19:48:14.6129154Z ·  ───┬── 2026-10-23T19:48:14.6129700Z · ╰── 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-23T19:48:14.6130256Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6130534Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T19:48:14.6130800Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T19:48:14.6131007Z 108 │ [props.disabled], 2026-10-23T19:48:14.6131180Z ·  ────────┬─────── 2026-10-23T19:48:14.6131523Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6131764Z 109 │ ); 2026-10-23T19:48:14.6131883Z ╰──── 2026-10-23T19:48:14.6132151Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T19:48:14.6132678Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6132982Z 2026-10-23T19:48:14.6133381Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T19:48:14.6133865Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-23T19:48:14.6134103Z 386 │ onFilters, 2026-10-23T19:48:14.6134245Z 387 │ authorOptions = [], 2026-10-23T19:48:14.6134410Z ·  ── 2026-10-23T19:48:14.6134573Z 388 │ labelOptions = [], 2026-10-23T19:48:14.6134709Z ╰──── 2026-10-23T19:48:14.6135088Z  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-23T19:48:14.6135393Z 2026-10-23T19:48:14.6135684Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T19:48:14.6136125Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-23T19:48:14.6136365Z 387 │ authorOptions = [], 2026-10-23T19:48:14.6136519Z 388 │ labelOptions = [], 2026-10-23T19:48:14.6136680Z ·  ── 2026-10-23T19:48:14.6136831Z 389 │ host, 2026-10-23T19:48:14.6136950Z ╰──── 2026-10-23T19:48:14.6137327Z  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-23T19:48:14.6137626Z 2026-10-23T19:48:14.6137788Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6138109Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T19:48:14.6138335Z  86 │ 2026-10-23T19:48:14.6138496Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T19:48:14.6138689Z ·  ──────┬───── 2026-10-23T19:48:14.6138921Z · ╰── `cardCoverage` originates here 2026-10-23T19:48:14.6139148Z  88 │ const barHeightRef = useRef(0); 2026-10-23T19:48:14.6139327Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T19:48:14.6139514Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T19:48:14.6139712Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T19:48:14.6139925Z  92 │ if (!cardCoverage) { 2026-10-23T19:48:14.6140077Z  93 │ return; 2026-10-23T19:48:14.6140211Z  94 │ } 2026-10-23T19:48:14.6140432Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T19:48:14.6140692Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T19:48:14.6140862Z  97 │ return; 2026-10-23T19:48:14.6140989Z  98 │ } 2026-10-23T19:48:14.6141137Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T19:48:14.6141322Z 100 │ cardCoverage.value = coverage; 2026-10-23T19:48:14.6141507Z ·  ──────┬───── 2026-10-23T19:48:14.6141747Z · ╰── `cardCoverage` cannot be modified 2026-10-23T19:48:14.6141953Z 101 │ return; 2026-10-23T19:48:14.6142078Z ╰──── 2026-10-23T19:48:14.6142438Z  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-23T19:48:14.6143037Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6143412Z 2026-10-23T19:48:14.6143611Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6143930Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T19:48:14.6144181Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T19:48:14.6144369Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T19:48:14.6144553Z ·  ─────┬──── 2026-10-23T19:48:14.6144783Z · ╰── `cardHeight` originates here 2026-10-23T19:48:14.6145015Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T19:48:14.6145197Z  92 │ if (!cardCoverage) { 2026-10-23T19:48:14.6145344Z  93 │ return; 2026-10-23T19:48:14.6145472Z  94 │ } 2026-10-23T19:48:14.6145696Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T19:48:14.6145951Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T19:48:14.6146118Z  97 │ return; 2026-10-23T19:48:14.6146250Z  98 │ } 2026-10-23T19:48:14.6146396Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T19:48:14.6146580Z 100 │ cardCoverage.value = coverage; 2026-10-23T19:48:14.6146744Z 101 │ return; 2026-10-23T19:48:14.6146871Z 102 │ } 2026-10-23T19:48:14.6147040Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T19:48:14.6147254Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T19:48:14.6147456Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T19:48:14.6147615Z 106 │ }); 2026-10-23T19:48:14.6147749Z 107 │ }, [cardCoverage]); 2026-10-23T19:48:14.6147918Z 108 │ const handleBarLayout = useCallback( 2026-10-23T19:48:14.6148112Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6148346Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T19:48:14.6148557Z 111 │ notifyCoverage(); 2026-10-23T19:48:14.6148700Z 112 │ }, 2026-10-23T19:48:14.6148827Z 113 │ [notifyCoverage], 2026-10-23T19:48:14.6148967Z 114 │ ); 2026-10-23T19:48:14.6149115Z 115 │ const handleCardLayout = useCallback( 2026-10-23T19:48:14.6149303Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6149532Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T19:48:14.6149816Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T19:48:14.6150028Z ·  ─────┬──── 2026-10-23T19:48:14.6150258Z · ╰── `cardHeight` cannot be modified 2026-10-23T19:48:14.6150469Z 119 │ notifyCoverage(); 2026-10-23T19:48:14.6150619Z ╰──── 2026-10-23T19:48:14.6150955Z  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-23T19:48:14.6151524Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6151822Z 2026-10-23T19:48:14.6152029Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T19:48:14.6152388Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T19:48:14.6152645Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T19:48:14.6152841Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T19:48:14.6153061Z ·  ───┬─── 2026-10-23T19:48:14.6153503Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T19:48:14.6153831Z  92 │ if (!cardCoverage) { 2026-10-23T19:48:14.6153978Z  93 │ return; 2026-10-23T19:48:14.6154110Z  94 │ } 2026-10-23T19:48:14.6154327Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T19:48:14.6154579Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T19:48:14.6154748Z  97 │ return; 2026-10-23T19:48:14.6154875Z  98 │ } 2026-10-23T19:48:14.6155024Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T19:48:14.6155206Z 100 │ cardCoverage.value = coverage; 2026-10-23T19:48:14.6155393Z ·  ──────┬───── 2026-10-23T19:48:14.6155634Z · ╰── This modifies `cardCoverage` 2026-10-23T19:48:14.6155845Z 101 │ return; 2026-10-23T19:48:14.6155973Z ╰──── 2026-10-23T19:48:14.6156381Z  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-23T19:48:14.6157014Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6157314Z 2026-10-23T19:48:14.6157517Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T19:48:14.6157871Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T19:48:14.6158118Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T19:48:14.6158304Z 100 │ cardCoverage.value = coverage; 2026-10-23T19:48:14.6158493Z ·  ──────┬───── 2026-10-23T19:48:14.6158723Z · ╰── This modifies `cardCoverage` 2026-10-23T19:48:14.6158925Z 101 │ return; 2026-10-23T19:48:14.6159055Z 102 │ } 2026-10-23T19:48:14.6159222Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T19:48:14.6159443Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T19:48:14.6159641Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T19:48:14.6159837Z 106 │ }); 2026-10-23T19:48:14.6159972Z 107 │ }, [cardCoverage]); 2026-10-23T19:48:14.6160148Z 108 │ const handleBarLayout = useCallback( 2026-10-23T19:48:14.6160334Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6160548Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6160973Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T19:48:14.6161355Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T19:48:14.6161554Z ╰──── 2026-10-23T19:48:14.6161953Z  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-23T19:48:14.6162585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6162886Z 2026-10-23T19:48:14.6163091Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T19:48:14.6163444Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T19:48:14.6163703Z 115 │ const handleCardLayout = useCallback( 2026-10-23T19:48:14.6163894Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6164103Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6164438Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T19:48:14.6164778Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T19:48:14.6165037Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T19:48:14.6165246Z ·  ─────┬──── 2026-10-23T19:48:14.6165475Z · ╰── This modifies `cardHeight` 2026-10-23T19:48:14.6165680Z 119 │ notifyCoverage(); 2026-10-23T19:48:14.6165826Z ╰──── 2026-10-23T19:48:14.6166231Z  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-23T19:48:14.6166861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6167153Z 2026-10-23T19:48:14.6167352Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6167720Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-23T19:48:14.6167960Z 813 │
{ 2026-10-23T19:48:14.6171629Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T19:48:14.6171848Z ·  ────┬─── 2026-10-23T19:48:14.6172074Z · ╰── `rotation` cannot be modified 2026-10-23T19:48:14.6172316Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T19:48:14.6172487Z ╰──── 2026-10-23T19:48:14.6172813Z  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-23T19:48:14.6173378Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6173677Z 2026-10-23T19:48:14.6173884Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6174235Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T19:48:14.6174465Z 1245 │ { 2026-10-23T19:48:14.6176761Z ·  ────┬──── 2026-10-23T19:48:14.6176980Z · ╰── This is the containing effect 2026-10-23T19:48:14.6177212Z 400 │ setInspectorSelection((current) => { 2026-10-23T19:48:14.6177408Z ·  ──────────┬────────── 2026-10-23T19:48:14.6177682Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6177952Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T19:48:14.6178127Z ╰──── 2026-10-23T19:48:14.6178801Z  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-23T19:48:14.6179749Z  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-23T19:48:14.6180089Z 2026-10-23T19:48:14.6180308Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T19:48:14.6180681Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T19:48:14.6181000Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T19:48:14.6181349Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T19:48:14.6181698Z 529 │ │ 2026-10-23T19:48:14.6183003Z 534 │ ╰─▶ ); 2026-10-23T19:48:14.6183218Z 535 │ const FilesInspector = () => 2026-10-23T19:48:14.6183370Z ╰──── 2026-10-23T19:48:14.6183647Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T19:48:14.6183867Z 2026-10-23T19:48:14.6184092Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T19:48:14.6184460Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T19:48:14.6184676Z 534 │ ); 2026-10-23T19:48:14.6184913Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T19:48:14.6185228Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T19:48:14.6185495Z 537 │ │ 2026-10-23T19:48:14.6187508Z 545 │ ╰─▶ ) : null; 2026-10-23T19:48:14.6187806Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T19:48:14.6188023Z ╰──── 2026-10-23T19:48:14.6188296Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T19:48:14.6188515Z 2026-10-23T19:48:14.6188981Z ⚠ 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-23T19:48:14.6189526Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-23T19:48:14.6189840Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-23T19:48:14.6190179Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-23T19:48:14.6190490Z ·  ─────────────────── 2026-10-23T19:48:14.6190708Z 1044 │ expect(encoded).not.toContain(url); 2026-10-23T19:48:14.6190875Z ╰──── 2026-10-23T19:48:14.6190931Z 2026-10-23T19:48:14.6191151Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6191509Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:772:7] 2026-10-23T19:48:14.6191840Z 771 │ if (settingsSheetPresentation.isActive) { 2026-10-23T19:48:14.6192125Z 772 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T19:48:14.6192368Z ·  ────────────┬──────────── 2026-10-23T19:48:14.6192650Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T19:48:14.6192882Z 773 │ } 2026-10-23T19:48:14.6193152Z 774 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T19:48:14.6193475Z ·  ────────────────┬──────────────── 2026-10-23T19:48:14.6193878Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T19:48:14.6194202Z 775 │ 2026-10-23T19:48:14.6194315Z ╰──── 2026-10-23T19:48:14.6194807Z  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-23T19:48:14.6195515Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6195817Z 2026-10-23T19:48:14.6195979Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6196284Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:390:5] 2026-10-23T19:48:14.6196599Z 386 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T19:48:14.6196905Z 387 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T19:48:14.6197154Z ·  ──────────┬───────── 2026-10-23T19:48:14.6197420Z · ╰── `animatedBorderRadius` originates here 2026-10-23T19:48:14.6197740Z 388 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T19:48:14.6197981Z 389 │ useLayoutEffect(() => { 2026-10-23T19:48:14.6198178Z 390 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T19:48:14.6198385Z ·  ──────────┬───────── 2026-10-23T19:48:14.6198645Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T19:48:14.6205053Z 391 │ ? withTiming(targetBorderRadius, { 2026-10-23T19:48:14.6205237Z ╰──── 2026-10-23T19:48:14.6205575Z  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-23T19:48:14.6206148Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6206440Z 2026-10-23T19:48:14.6206684Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T19:48:14.6207073Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9] 2026-10-23T19:48:14.6207310Z 186 │ ): boolean { 2026-10-23T19:48:14.6207538Z 187 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-23T19:48:14.6207870Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T19:48:14.6208173Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T19:48:14.6208480Z ╰──── 2026-10-23T19:48:14.6208665Z  help: Switch to `Set` 2026-10-23T19:48:14.6208764Z 2026-10-23T19:48:14.6209250Z ⚠ 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-23T19:48:14.6209866Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T19:48:14.6210120Z 1227 │ yield* harness.replaceSession; 2026-10-23T19:48:14.6210443Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6210794Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T19:48:14.6211048Z 1230 │ │ break; 2026-10-23T19:48:14.6211345Z 1231 │ │ } 2026-10-23T19:48:14.6211553Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6211813Z 1233 │ ╰─▶ } 2026-10-23T19:48:14.6212024Z 1234 │ yield* Queue.offer( 2026-10-23T19:48:14.6212171Z ╰──── 2026-10-23T19:48:14.6212228Z 2026-10-23T19:48:14.6212698Z ⚠ 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-23T19:48:14.6213270Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T19:48:14.6213518Z 1336 │ yield* harness.replaceSession; 2026-10-23T19:48:14.6213840Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6214200Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T19:48:14.6214473Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6214728Z 1340 │ ╰─▶ } 2026-10-23T19:48:14.6214996Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T19:48:14.6215187Z ╰──── 2026-10-23T19:48:14.6215246Z 2026-10-23T19:48:14.6215475Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T19:48:14.6215831Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T19:48:14.6216136Z 1021 │ instanceId, 2026-10-23T19:48:14.6216410Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T19:48:14.6216709Z ·  ────────────────────────────────────────────────── 2026-10-23T19:48:14.6216907Z 1023 │ ]), 2026-10-23T19:48:14.6217035Z ╰──── 2026-10-23T19:48:14.6217364Z  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-23T19:48:14.6217624Z 2026-10-23T19:48:14.6217829Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T19:48:14.6218155Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-23T19:48:14.6218360Z 37 │ get isConnected() { 2026-10-23T19:48:14.6218545Z 38 │ let current: FakeElement | null = this; 2026-10-23T19:48:14.6218732Z ·  ─────── 2026-10-23T19:48:14.6218893Z 39 │ while (current?.parent) { 2026-10-23T19:48:14.6219035Z ╰──── 2026-10-23T19:48:14.6219363Z  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-23T19:48:14.6219621Z 2026-10-23T19:48:14.6219917Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6220342Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T19:48:14.6220570Z 118 │ 2026-10-23T19:48:14.6220696Z 119 │ useEffect(() => { 2026-10-23T19:48:14.6220853Z ·  ────┬──── 2026-10-23T19:48:14.6221084Z · ╰── This is the containing effect 2026-10-23T19:48:14.6221313Z 120 │ if (orientationSettled) return; 2026-10-23T19:48:14.6221530Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T19:48:14.6221735Z 122 │ if (orientation === null) { 2026-10-23T19:48:14.6221912Z 123 │ setOrientationSettled(true); 2026-10-23T19:48:14.6222108Z ·  ──────────┬────────── 2026-10-23T19:48:14.6222383Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6222616Z 124 │ return; 2026-10-23T19:48:14.6222742Z ╰──── 2026-10-23T19:48:14.6223417Z  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-23T19:48:14.6224295Z  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-23T19:48:14.6224608Z 2026-10-23T19:48:14.6224870Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6225046Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T19:48:14.6225100Z 292 │ 2026-10-23T19:48:14.6225168Z 293 │ useEffect(() => { 2026-10-23T19:48:14.6225242Z ·  ────┬──── 2026-10-23T19:48:14.6225377Z · ╰── This is the containing effect 2026-10-23T19:48:14.6225436Z 294 │ if ( 2026-10-23T19:48:14.6225579Z 295 │ scene === null || 2026-10-23T19:48:14.6225695Z 296 │ requestedScene === null || 2026-10-23T19:48:14.6225774Z 297 │ scene !== requestedScene || 2026-10-23T19:48:14.6225838Z 298 │ !hasFixture || 2026-10-23T19:48:14.6225912Z 299 │ !orientationSettled || 2026-10-23T19:48:14.6225984Z 300 │ !themeApplied || 2026-10-23T19:48:14.6226104Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T19:48:14.6226239Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T19:48:14.6226296Z 303 │ ) { 2026-10-23T19:48:14.6226367Z 304 │ setReadyScene(null); 2026-10-23T19:48:14.6226449Z ·  ──────┬────── 2026-10-23T19:48:14.6226624Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6226687Z 305 │ return; 2026-10-23T19:48:14.6226750Z ╰──── 2026-10-23T19:48:14.6227361Z  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-23T19:48:14.6227679Z  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-23T19:48:14.6227682Z 2026-10-23T19:48:14.6227960Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6228135Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T19:48:14.6228211Z 127 │ let cancelled = false; 2026-10-23T19:48:14.6228306Z 128 │ let lastOutcome: string | null = null; 2026-10-23T19:48:14.6228385Z ·  ─────┬───── 2026-10-23T19:48:14.6228524Z · ╰── 'lastOutcome' is declared here 2026-10-23T19:48:14.6228704Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T19:48:14.6228757Z ╰──── 2026-10-23T19:48:14.6228862Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6228865Z 2026-10-23T19:48:14.6229138Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6229277Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T19:48:14.6229332Z 913 │ 2026-10-23T19:48:14.6229532Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T19:48:14.6229614Z ·  ─────┬───── 2026-10-23T19:48:14.6229753Z · ╰── 'layerDaemon' is declared here 2026-10-23T19:48:14.6229868Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T19:48:14.6229920Z ╰──── 2026-10-23T19:48:14.6230026Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6230028Z 2026-10-23T19:48:14.6230309Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6230456Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12340:7] 2026-10-23T19:48:14.6230511Z 12339 │ 2026-10-23T19:48:14.6230729Z 12340 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-23T19:48:14.6230847Z ·  ────────┬─────── 2026-10-23T19:48:14.6230999Z · ╰── 'layerUnavailable' is declared here 2026-10-23T19:48:14.6231066Z 12341 │ OrchestratorV2, 2026-10-23T19:48:14.6231121Z ╰──── 2026-10-23T19:48:14.6231225Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6231228Z 2026-10-23T19:48:14.6231415Z ⚠ react(static-components): Cannot create components during render 2026-10-23T19:48:14.6231578Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-23T19:48:14.6231666Z 196 │ const { onInput, onResize } = props; 2026-10-23T19:48:14.6231814Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-23T19:48:14.6231957Z ·  ────────────────┬─────────────── 2026-10-23T19:48:14.6232150Z · ╰── The component is created during render here 2026-10-23T19:48:14.6232278Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-23T19:48:14.6232333Z 199 │ 2026-10-23T19:48:14.6232399Z 200 │ useEffect(() => { 2026-10-23T19:48:14.6232486Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T19:48:14.6232573Z 202 │ terminalKey: props.terminalKey, 2026-10-23T19:48:14.6232650Z 203 │ native: hasNativeSurface, 2026-10-23T19:48:14.6232785Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T19:48:14.6232868Z 205 │ bufferLen: props.buffer.length, 2026-10-23T19:48:14.6232948Z 206 │ isRunning: props.isRunning, 2026-10-23T19:48:14.6233004Z 207 │ }); 2026-10-23T19:48:14.6233171Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T19:48:14.6233262Z 209 │ const handleNativeInput = useCallback( 2026-10-23T19:48:14.6233377Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T19:48:14.6233475Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T19:48:14.6233538Z 212 │ return; 2026-10-23T19:48:14.6233593Z 213 │ } 2026-10-23T19:48:14.6233685Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T19:48:14.6233837Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T19:48:14.6233897Z 216 │ }); 2026-10-23T19:48:14.6233982Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T19:48:14.6234040Z 218 │ }, 2026-10-23T19:48:14.6234140Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T19:48:14.6234202Z 220 │ ); 2026-10-23T19:48:14.6234292Z 221 │ const handleNativeResize = useCallback( 2026-10-23T19:48:14.6234410Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T19:48:14.6234474Z 223 │ onResize({ 2026-10-23T19:48:14.6234560Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T19:48:14.6234641Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T19:48:14.6234701Z 226 │ }); 2026-10-23T19:48:14.6234758Z 227 │ }, 2026-10-23T19:48:14.6234820Z 228 │ [onResize], 2026-10-23T19:48:14.6234876Z 229 │ ); 2026-10-23T19:48:14.6234929Z 230 │ 2026-10-23T19:48:14.6235013Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T19:48:14.6235074Z 232 │ return ( 2026-10-23T19:48:14.6235154Z 233 │ 2026-10-23T19:48:14.6235235Z 234 │ { 2026-10-23T19:48:14.6239106Z ·  ────┬──── 2026-10-23T19:48:14.6239269Z · ╰── This is the containing effect 2026-10-23T19:48:14.6239380Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T19:48:14.6239441Z 641 │ return; 2026-10-23T19:48:14.6239498Z 642 │ } 2026-10-23T19:48:14.6239576Z 643 │ setPendingLaunchEntry({ 2026-10-23T19:48:14.6239668Z ·  ──────────┬────────── 2026-10-23T19:48:14.6239880Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6239954Z 644 │ key: launchTargetKey, 2026-10-23T19:48:14.6240008Z ╰──── 2026-10-23T19:48:14.6240622Z  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-23T19:48:14.6240954Z  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-23T19:48:14.6240956Z 2026-10-23T19:48:14.6241218Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6241389Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T19:48:14.6241443Z 648 │ 2026-10-23T19:48:14.6241510Z 649 │ useEffect(() => { 2026-10-23T19:48:14.6241581Z ·  ────┬──── 2026-10-23T19:48:14.6241719Z · ╰── This is the containing effect 2026-10-23T19:48:14.6241841Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T19:48:14.6241903Z 651 │ return; 2026-10-23T19:48:14.6241958Z 652 │ } 2026-10-23T19:48:14.6242041Z 653 │ setInitialAttachGridEntry({ 2026-10-23T19:48:14.6242137Z ·  ────────────┬──────────── 2026-10-23T19:48:14.6242312Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6242382Z 654 │ key: launchTargetKey, 2026-10-23T19:48:14.6242435Z ╰──── 2026-10-23T19:48:14.6243045Z  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-23T19:48:14.6243369Z  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-23T19:48:14.6243372Z 2026-10-23T19:48:14.6243631Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6243799Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T19:48:14.6243853Z 743 │ 2026-10-23T19:48:14.6243919Z 744 │ useEffect(() => { 2026-10-23T19:48:14.6243992Z ·  ────┬──── 2026-10-23T19:48:14.6244121Z · ╰── This is the containing effect 2026-10-23T19:48:14.6244225Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T19:48:14.6244361Z 746 │ setLastGridSize({ 2026-10-23T19:48:14.6244478Z ·  ───────┬─────── 2026-10-23T19:48:14.6244649Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6244731Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T19:48:14.6244783Z ╰──── 2026-10-23T19:48:14.6245381Z  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-23T19:48:14.6245703Z  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-23T19:48:14.6245706Z 2026-10-23T19:48:14.6245912Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6246083Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T19:48:14.6246142Z 537 │ }); 2026-10-23T19:48:14.6246267Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T19:48:14.6246378Z ·  ───────────┬────────── 2026-10-23T19:48:14.6246623Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T19:48:14.6246787Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T19:48:14.6246840Z ╰──── 2026-10-23T19:48:14.6247146Z  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-23T19:48:14.6247457Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6247459Z 2026-10-23T19:48:14.6247661Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6247830Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T19:48:14.6247926Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T19:48:14.6247992Z 709 │ }, [terminalKey]); 2026-10-23T19:48:14.6248069Z ·  ─────┬───── 2026-10-23T19:48:14.6248212Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T19:48:14.6248271Z 710 │ 2026-10-23T19:48:14.6248324Z ╰──── 2026-10-23T19:48:14.6248621Z  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-23T19:48:14.6248933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6248935Z 2026-10-23T19:48:14.6249135Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6249304Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T19:48:14.6249359Z 799 │ }; 2026-10-23T19:48:14.6249539Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T19:48:14.6249811Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T19:48:14.6250081Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T19:48:14.6250292Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T19:48:14.6250344Z 801 │ 2026-10-23T19:48:14.6250396Z ╰──── 2026-10-23T19:48:14.6250689Z  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-23T19:48:14.6251009Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6251014Z 2026-10-23T19:48:14.6251159Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6251398Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T19:48:14.6251454Z 792 │ } 2026-10-23T19:48:14.6251564Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T19:48:14.6251676Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6251842Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6251896Z 794 │ 2026-10-23T19:48:14.6251948Z ╰──── 2026-10-23T19:48:14.6252427Z  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-23T19:48:14.6252722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6252725Z 2026-10-23T19:48:14.6252920Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6253080Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-23T19:48:14.6253146Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-23T19:48:14.6254245Z 113 │ useEffect(() => { 2026-10-23T19:48:14.6254319Z ·  ────┬──── 2026-10-23T19:48:14.6254450Z · ╰── This is the containing effect 2026-10-23T19:48:14.6254614Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T19:48:14.6254675Z 115 │ return; 2026-10-23T19:48:14.6254822Z 116 │ } 2026-10-23T19:48:14.6254981Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T19:48:14.6255054Z ·  ────┬─── 2026-10-23T19:48:14.6255222Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6255345Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T19:48:14.6255397Z ╰──── 2026-10-23T19:48:14.6256005Z  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-23T19:48:14.6256334Z  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-23T19:48:14.6256341Z 2026-10-23T19:48:14.6256535Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-23T19:48:14.6256672Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-23T19:48:14.6256793Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-23T19:48:14.6256876Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T19:48:14.6256949Z ·  ─┬─ 2026-10-23T19:48:14.6257076Z · ╰── 'Arr' is imported here 2026-10-23T19:48:14.6257160Z 5 │ import * as Order from "effect/Order"; 2026-10-23T19:48:14.6257212Z ╰──── 2026-10-23T19:48:14.6257311Z  help: Consider removing this import. 2026-10-23T19:48:14.6257313Z 2026-10-23T19:48:14.6257515Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-23T19:48:14.6257650Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-23T19:48:14.6257730Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T19:48:14.6257809Z 5 │ import * as Order from "effect/Order"; 2026-10-23T19:48:14.6257886Z ·  ──┬── 2026-10-23T19:48:14.6258017Z · ╰── 'Order' is imported here 2026-10-23T19:48:14.6258070Z 6 │ 2026-10-23T19:48:14.6258121Z ╰──── 2026-10-23T19:48:14.6258219Z  help: Consider removing this import. 2026-10-23T19:48:14.6258222Z 2026-10-23T19:48:14.6258701Z ⚠ 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-23T19:48:14.6258842Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T19:48:14.6258898Z 225 │ ) { 2026-10-23T19:48:14.6259110Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6259224Z 227 │ │ const socket = sockets[index]; 2026-10-23T19:48:14.6259312Z 228 │ │ if (socket) { 2026-10-23T19:48:14.6259405Z 229 │ │ return socket; 2026-10-23T19:48:14.6259477Z 230 │ │ } 2026-10-23T19:48:14.6259581Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6259707Z 232 │ ╰─▶ } 2026-10-23T19:48:14.6260145Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T19:48:14.6260230Z ╰──── 2026-10-23T19:48:14.6260232Z 2026-10-23T19:48:14.6260704Z ⚠ 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-23T19:48:14.6260839Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T19:48:14.6260897Z 239 │ ) { 2026-10-23T19:48:14.6261099Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6261317Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T19:48:14.6261416Z 242 │ │ if (request) { 2026-10-23T19:48:14.6261514Z 243 │ │ return request; 2026-10-23T19:48:14.6261588Z 244 │ │ } 2026-10-23T19:48:14.6261690Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6261815Z 246 │ ╰─▶ } 2026-10-23T19:48:14.6261985Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T19:48:14.6262036Z ╰──── 2026-10-23T19:48:14.6262038Z 2026-10-23T19:48:14.6262507Z ⚠ 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-23T19:48:14.6262646Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T19:48:14.6262712Z 130 │ ) { 2026-10-23T19:48:14.6262920Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6263043Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T19:48:14.6263134Z 133 │ │ return; 2026-10-23T19:48:14.6263215Z 134 │ │ } 2026-10-23T19:48:14.6263322Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6263455Z 136 │ ╰─▶ } 2026-10-23T19:48:14.6263619Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T19:48:14.6263672Z ╰──── 2026-10-23T19:48:14.6263674Z 2026-10-23T19:48:14.6264207Z ⚠ 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-23T19:48:14.6264377Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T19:48:14.6264539Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T19:48:14.6264793Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T19:48:14.6264900Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6265032Z 254 │ ╰─▶ } 2026-10-23T19:48:14.6265163Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T19:48:14.6265217Z ╰──── 2026-10-23T19:48:14.6265220Z 2026-10-23T19:48:14.6265686Z ⚠ 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-23T19:48:14.6265818Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T19:48:14.6265872Z 257 │ 2026-10-23T19:48:14.6266122Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T19:48:14.6266227Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6266359Z 260 │ ╰─▶ } 2026-10-23T19:48:14.6266471Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T19:48:14.6266525Z ╰──── 2026-10-23T19:48:14.6266527Z 2026-10-23T19:48:14.6266991Z ⚠ 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-23T19:48:14.6267122Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T19:48:14.6267182Z 321 │ ); 2026-10-23T19:48:14.6267435Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T19:48:14.6267540Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6267677Z 324 │ ╰─▶ } 2026-10-23T19:48:14.6267734Z 325 │ 2026-10-23T19:48:14.6267786Z ╰──── 2026-10-23T19:48:14.6267788Z 2026-10-23T19:48:14.6268252Z ⚠ 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-23T19:48:14.6268384Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T19:48:14.6268547Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T19:48:14.6268794Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T19:48:14.6268964Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6269130Z 332 │ ╰─▶ } 2026-10-23T19:48:14.6269236Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T19:48:14.6269287Z ╰──── 2026-10-23T19:48:14.6269289Z 2026-10-23T19:48:14.6269752Z ⚠ 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-23T19:48:14.6269937Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T19:48:14.6269994Z 27 │ ) { 2026-10-23T19:48:14.6270192Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6270345Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T19:48:14.6270475Z 30 │ │ if (predicate(available)) return available; 2026-10-23T19:48:14.6270576Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6270698Z 32 │ ╰─▶ } 2026-10-23T19:48:14.6270879Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T19:48:14.6270931Z ╰──── 2026-10-23T19:48:14.6270933Z 2026-10-23T19:48:14.6271121Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6271228Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T19:48:14.6271295Z 457 │ ): Array { 2026-10-23T19:48:14.6271399Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T19:48:14.6271509Z ·  ┬ 2026-10-23T19:48:14.6271660Z · ╰── '_' is declared here 2026-10-23T19:48:14.6271733Z 459 │ for (const b of data) { 2026-10-23T19:48:14.6271784Z ╰──── 2026-10-23T19:48:14.6271888Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6271891Z 2026-10-23T19:48:14.6272100Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-23T19:48:14.6272203Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-23T19:48:14.6272342Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-23T19:48:14.6272456Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-23T19:48:14.6272551Z ·  ──────┬────── 2026-10-23T19:48:14.6272701Z · ╰── 'HookForwarder' is imported here 2026-10-23T19:48:14.6272802Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-23T19:48:14.6272855Z ╰──── 2026-10-23T19:48:14.6272953Z  help: Consider removing this import. 2026-10-23T19:48:14.6272956Z 2026-10-23T19:48:14.6273246Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T19:48:14.6273402Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-23T19:48:14.6273458Z 162 │ keys, 2026-10-23T19:48:14.6273532Z 163 │ overridingProjects = [], 2026-10-23T19:48:14.6273617Z ·  ── 2026-10-23T19:48:14.6273684Z 164 │ onClearOverrides, 2026-10-23T19:48:14.6273809Z ╰──── 2026-10-23T19:48:14.6274166Z  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-23T19:48:14.6274169Z 2026-10-23T19:48:14.6274337Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T19:48:14.6274532Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T19:48:14.6274670Z 219 │ 2026-10-23T19:48:14.6274813Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T19:48:14.6274924Z ·  ──┬─ 2026-10-23T19:48:14.6275098Z · ╰── 'U+001B' is a control character. 2026-10-23T19:48:14.6275165Z 221 │ 2026-10-23T19:48:14.6275218Z ╰──── 2026-10-23T19:48:14.6275448Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T19:48:14.6275451Z 2026-10-23T19:48:14.6275710Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6275895Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-23T19:48:14.6275948Z 117 │ 2026-10-23T19:48:14.6276013Z 118 │ useEffect(() => { 2026-10-23T19:48:14.6276086Z ·  ────┬──── 2026-10-23T19:48:14.6276217Z · ╰── This is the containing effect 2026-10-23T19:48:14.6276304Z 119 │ void refreshNotifications(); 2026-10-23T19:48:14.6276400Z ·  ──────────┬───────── 2026-10-23T19:48:14.6276577Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6276719Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T19:48:14.6276772Z ╰──── 2026-10-23T19:48:14.6277380Z  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-23T19:48:14.6277712Z  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-23T19:48:14.6277718Z 2026-10-23T19:48:14.6277977Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6278161Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T19:48:14.6278215Z 125 │ 2026-10-23T19:48:14.6278279Z 126 │ useEffect(() => { 2026-10-23T19:48:14.6278353Z ·  ────┬──── 2026-10-23T19:48:14.6278483Z · ╰── This is the containing effect 2026-10-23T19:48:14.6278550Z 127 │ if (!isLoaded) { 2026-10-23T19:48:14.6278641Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T19:48:14.6278732Z ·  ──────────┬────────── 2026-10-23T19:48:14.6278968Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6279061Z 129 │ return; 2026-10-23T19:48:14.6279113Z ╰──── 2026-10-23T19:48:14.6279709Z  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-23T19:48:14.6280058Z  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-23T19:48:14.6280060Z 2026-10-23T19:48:14.6280243Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T19:48:14.6280409Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-23T19:48:14.6280516Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-23T19:48:14.6280700Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T19:48:14.6280847Z ·  ─────┬───── 2026-10-23T19:48:14.6281055Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T19:48:14.6281135Z 101 │ const readEditor = useCallback( 2026-10-23T19:48:14.6281186Z ╰──── 2026-10-23T19:48:14.6281499Z  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-23T19:48:14.6281815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6281821Z 2026-10-23T19:48:14.6282002Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T19:48:14.6282162Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T19:48:14.6282226Z 120 │ setEditor, 2026-10-23T19:48:14.6282289Z 121 │ startEditor, 2026-10-23T19:48:14.6282368Z ·  ─────┬───── 2026-10-23T19:48:14.6282515Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T19:48:14.6282579Z 122 │ hasChanges, 2026-10-23T19:48:14.6282629Z ╰──── 2026-10-23T19:48:14.6282948Z  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-23T19:48:14.6283266Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6283268Z 2026-10-23T19:48:14.6283736Z ⚠ 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-23T19:48:14.6283871Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T19:48:14.6283926Z 93 │ ) { 2026-10-23T19:48:14.6284128Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T19:48:14.6284371Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T19:48:14.6284524Z 96 │ │ if (predicate(project)) return project; 2026-10-23T19:48:14.6284626Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6284751Z 98 │ ╰─▶ } 2026-10-23T19:48:14.6284901Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T19:48:14.6284955Z ╰──── 2026-10-23T19:48:14.6284957Z 2026-10-23T19:48:14.6285423Z ⚠ 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-23T19:48:14.6285607Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-23T19:48:14.6285685Z 222 │ let idlePasses = 0; 2026-10-23T19:48:14.6285828Z 223 │ ╭─▶ for (;;) { 2026-10-23T19:48:14.6285965Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-23T19:48:14.6286109Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T19:48:14.6286204Z 226 │ │ if (!pending) { 2026-10-23T19:48:14.6286299Z 227 │ │ idlePasses++; 2026-10-23T19:48:14.6286404Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T19:48:14.6286489Z 229 │ │ return; 2026-10-23T19:48:14.6286567Z 230 │ │ } 2026-10-23T19:48:14.6286660Z 231 │ │ continue; 2026-10-23T19:48:14.6286739Z 232 │ │ } 2026-10-23T19:48:14.6286831Z 233 │ │ idlePasses = 0; 2026-10-23T19:48:14.6286947Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T19:48:14.6287160Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T19:48:14.6287238Z 236 │ │ ); 2026-10-23T19:48:14.6287343Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T19:48:14.6287447Z 238 │ │ pending.resolve(exit); 2026-10-23T19:48:14.6287525Z 239 │ │ }); 2026-10-23T19:48:14.6287655Z 240 │ ╰─▶ } 2026-10-23T19:48:14.6287712Z 241 │ }, 2026-10-23T19:48:14.6287764Z ╰──── 2026-10-23T19:48:14.6287774Z 2026-10-23T19:48:14.6288038Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6288214Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-23T19:48:14.6288266Z 58 │ 2026-10-23T19:48:14.6288331Z 59 │ useEffect(() => { 2026-10-23T19:48:14.6288404Z ·  ────┬──── 2026-10-23T19:48:14.6288535Z · ╰── This is the containing effect 2026-10-23T19:48:14.6288615Z 60 │ setMountedModes((current) => { 2026-10-23T19:48:14.6288695Z ·  ───────┬─────── 2026-10-23T19:48:14.6288866Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6289016Z 61 │ if (current.has(props.mode)) { 2026-10-23T19:48:14.6289105Z ╰──── 2026-10-23T19:48:14.6289714Z  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-23T19:48:14.6290069Z  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-23T19:48:14.6290072Z 2026-10-23T19:48:14.6290220Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6290380Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T19:48:14.6290436Z 276 │ 2026-10-23T19:48:14.6290622Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T19:48:14.6290720Z 278 │ │ ...nativeProps, 2026-10-23T19:48:14.6290865Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T19:48:14.6290957Z 280 │ │ ref: nativeRef, 2026-10-23T19:48:14.6291086Z 281 │ ├─▶ }); 2026-10-23T19:48:14.6291380Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6291438Z 282 │ } 2026-10-23T19:48:14.6291490Z ╰──── 2026-10-23T19:48:14.6291971Z  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-23T19:48:14.6292268Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6292271Z 2026-10-23T19:48:14.6292429Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6292593Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T19:48:14.6292648Z 107 │ ); 2026-10-23T19:48:14.6292800Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T19:48:14.6292890Z ·  ─────────┬──────── 2026-10-23T19:48:14.6293046Z · ╰── `separationProgress` originates here 2026-10-23T19:48:14.6293179Z 109 │ 2026-10-23T19:48:14.6293284Z 110 │ useEffect(() => { 2026-10-23T19:48:14.6293461Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T19:48:14.6293548Z ·  ─────────┬──────── 2026-10-23T19:48:14.6293701Z · ╰── `separationProgress` cannot be modified 2026-10-23T19:48:14.6293811Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T19:48:14.6293865Z ╰──── 2026-10-23T19:48:14.6294130Z  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-23T19:48:14.6294437Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6294439Z 2026-10-23T19:48:14.6294602Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6294772Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T19:48:14.6294887Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T19:48:14.6295003Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T19:48:14.6295085Z ·  ──────┬───── 2026-10-23T19:48:14.6295227Z · ╰── `capsuleWidth` originates here 2026-10-23T19:48:14.6295339Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T19:48:14.6295454Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6295561Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T19:48:14.6295664Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T19:48:14.6295730Z 134 │ return; 2026-10-23T19:48:14.6295783Z 135 │ } 2026-10-23T19:48:14.6295891Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T19:48:14.6295980Z 137 │ measuredWidthRef.current = width; 2026-10-23T19:48:14.6296122Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T19:48:14.6296199Z ·  ──────┬───── 2026-10-23T19:48:14.6296342Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T19:48:14.6296398Z 139 │ }; 2026-10-23T19:48:14.6296451Z ╰──── 2026-10-23T19:48:14.6296713Z  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-23T19:48:14.6297024Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6297033Z 2026-10-23T19:48:14.6297189Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6297353Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T19:48:14.6297466Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T19:48:14.6297580Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T19:48:14.6297661Z ·  ──────┬───── 2026-10-23T19:48:14.6297800Z · ╰── `capsuleWidth` originates here 2026-10-23T19:48:14.6297910Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T19:48:14.6298024Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6298195Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T19:48:14.6298321Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T19:48:14.6298384Z 134 │ return; 2026-10-23T19:48:14.6298437Z 135 │ } 2026-10-23T19:48:14.6298542Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T19:48:14.6298629Z 137 │ measuredWidthRef.current = width; 2026-10-23T19:48:14.6298771Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T19:48:14.6298824Z 139 │ }; 2026-10-23T19:48:14.6298916Z 140 │ const hasStatus = props.status !== null; 2026-10-23T19:48:14.6299051Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T19:48:14.6299116Z 142 │ useEffect(() => { 2026-10-23T19:48:14.6299182Z 143 │ if (!hasStatus) { 2026-10-23T19:48:14.6299277Z 144 │ measuredWidthRef.current = null; 2026-10-23T19:48:14.6299361Z 145 │ capsuleWidth.value = null; 2026-10-23T19:48:14.6299438Z ·  ──────┬───── 2026-10-23T19:48:14.6299580Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T19:48:14.6299636Z 146 │ } 2026-10-23T19:48:14.6299690Z ╰──── 2026-10-23T19:48:14.6299990Z  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-23T19:48:14.6300299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6300302Z 2026-10-23T19:48:14.6300507Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T19:48:14.6300680Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T19:48:14.6300820Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T19:48:14.6300885Z 142 │ useEffect(() => { 2026-10-23T19:48:14.6300964Z ·  ───┬─── 2026-10-23T19:48:14.6301188Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T19:48:14.6301255Z 143 │ if (!hasStatus) { 2026-10-23T19:48:14.6301341Z 144 │ measuredWidthRef.current = null; 2026-10-23T19:48:14.6301420Z 145 │ capsuleWidth.value = null; 2026-10-23T19:48:14.6301497Z ·  ──────┬───── 2026-10-23T19:48:14.6301633Z · ╰── This modifies `capsuleWidth` 2026-10-23T19:48:14.6301687Z 146 │ } 2026-10-23T19:48:14.6301747Z ╰──── 2026-10-23T19:48:14.6302091Z  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-23T19:48:14.6302396Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6302398Z 2026-10-23T19:48:14.6302598Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T19:48:14.6302762Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T19:48:14.6302877Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T19:48:14.6302994Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T19:48:14.6303189Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6303463Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T19:48:14.6303570Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T19:48:14.6303667Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T19:48:14.6303728Z 134 │ return; 2026-10-23T19:48:14.6303782Z 135 │ } 2026-10-23T19:48:14.6303887Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T19:48:14.6303973Z 137 │ measuredWidthRef.current = width; 2026-10-23T19:48:14.6304113Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T19:48:14.6304192Z ·  ──────┬───── 2026-10-23T19:48:14.6304333Z · ╰── This modifies `capsuleWidth` 2026-10-23T19:48:14.6304393Z 139 │ }; 2026-10-23T19:48:14.6304443Z ╰──── 2026-10-23T19:48:14.6304786Z  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-23T19:48:14.6305090Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6305093Z 2026-10-23T19:48:14.6305317Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T19:48:14.6305437Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-23T19:48:14.6305538Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-23T19:48:14.6305674Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-23T19:48:14.6305831Z ·  ────────────────────────────────────────────────────────────── 2026-10-23T19:48:14.6305889Z 347 │ }; 2026-10-23T19:48:14.6305940Z ╰──── 2026-10-23T19:48:14.6306204Z  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-23T19:48:14.6306207Z 2026-10-23T19:48:14.6306428Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-23T19:48:14.6306549Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-23T19:48:14.6306614Z 447 │ const favorites = 2026-10-23T19:48:14.6306720Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-23T19:48:14.6306816Z ·  ───┬── 2026-10-23T19:48:14.6306946Z · ╰── For this reduce 2026-10-23T19:48:14.6307025Z 449 │ const exists = current.some( 2026-10-23T19:48:14.6307198Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T19:48:14.6307257Z 451 │ ); 2026-10-23T19:48:14.6307330Z 452 │ return change.favorite 2026-10-23T19:48:14.6307392Z 453 │ ? exists 2026-10-23T19:48:14.6307456Z 454 │ ? current 2026-10-23T19:48:14.6307591Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T19:48:14.6307675Z ·  ─────┬──── 2026-10-23T19:48:14.6307794Z · ╰── From this spread 2026-10-23T19:48:14.6307865Z 456 │ : current.filter( 2026-10-23T19:48:14.6307996Z ╰──── 2026-10-23T19:48:14.6308240Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T19:48:14.6308396Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T19:48:14.6308400Z 2026-10-23T19:48:14.6308588Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T19:48:14.6308707Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T19:48:14.6308767Z 464 │ null; 2026-10-23T19:48:14.6308880Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T19:48:14.6308970Z ·  ──────────┬───────── 2026-10-23T19:48:14.6309099Z · ╰── From this accumulator 2026-10-23T19:48:14.6309205Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T19:48:14.6309274Z ·  ─┬─ 2026-10-23T19:48:14.6309380Z · ╰── For this loop 2026-10-23T19:48:14.6309518Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T19:48:14.6309587Z 468 │ hiddenModels: [], 2026-10-23T19:48:14.6309652Z 469 │ modelOrder: [], 2026-10-23T19:48:14.6309708Z 470 │ }; 2026-10-23T19:48:14.6309917Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T19:48:14.6310026Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T19:48:14.6310100Z 473 │ nextModelPreferences = { 2026-10-23T19:48:14.6310177Z 474 │ ...nextModelPreferences, 2026-10-23T19:48:14.6310274Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6310406Z · ╰── From this spread 2026-10-23T19:48:14.6310520Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T19:48:14.6310574Z ╰──── 2026-10-23T19:48:14.6310728Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T19:48:14.6310884Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T19:48:14.6310887Z 2026-10-23T19:48:14.6311087Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T19:48:14.6311224Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T19:48:14.6311318Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T19:48:14.6311411Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T19:48:14.6311491Z ·  ────┬─── 2026-10-23T19:48:14.6311631Z · ╰── 'Duration' is imported here 2026-10-23T19:48:14.6311720Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T19:48:14.6311773Z ╰──── 2026-10-23T19:48:14.6311870Z  help: Consider removing this import. 2026-10-23T19:48:14.6311874Z 2026-10-23T19:48:14.6312352Z ⚠ 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-23T19:48:14.6312477Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T19:48:14.6312555Z 138 │ Effect.gen(function* () { 2026-10-23T19:48:14.6312751Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T19:48:14.6312949Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T19:48:14.6313306Z 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-23T19:48:14.6313493Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T19:48:14.6313623Z 143 │ ╰─▶ } 2026-10-23T19:48:14.6313710Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T19:48:14.6313761Z ╰──── 2026-10-23T19:48:14.6313763Z 2026-10-23T19:48:14.6314027Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6314194Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T19:48:14.6314309Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T19:48:14.6314377Z 38 │ useLayoutEffect(() => { 2026-10-23T19:48:14.6314456Z ·  ───────┬─────── 2026-10-23T19:48:14.6314589Z · ╰── This is the containing effect 2026-10-23T19:48:14.6314651Z 39 │ reset(); 2026-10-23T19:48:14.6314720Z 40 │ setInitialized(true); 2026-10-23T19:48:14.6314798Z ·  ───────┬────── 2026-10-23T19:48:14.6314969Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6315031Z 41 │ }, [reset]); 2026-10-23T19:48:14.6315081Z ╰──── 2026-10-23T19:48:14.6315697Z  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-23T19:48:14.6316025Z  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-23T19:48:14.6316028Z 2026-10-23T19:48:14.6316287Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6316445Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T19:48:14.6316497Z 88 │ 2026-10-23T19:48:14.6316562Z 89 │ useEffect(() => { 2026-10-23T19:48:14.6316634Z ·  ────┬──── 2026-10-23T19:48:14.6316833Z · ╰── This is the containing effect 2026-10-23T19:48:14.6317025Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T19:48:14.6317129Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T19:48:14.6317197Z 92 │ let active = true; 2026-10-23T19:48:14.6317292Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T19:48:14.6317377Z ·  ─────────┬───────── 2026-10-23T19:48:14.6317550Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6317706Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T19:48:14.6317759Z ╰──── 2026-10-23T19:48:14.6318364Z  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-23T19:48:14.6318691Z  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-23T19:48:14.6318693Z 2026-10-23T19:48:14.6318982Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6319138Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T19:48:14.6319192Z 14 │ 2026-10-23T19:48:14.6319263Z 15 │ const legacyCredentials = { 2026-10-23T19:48:14.6319348Z ·  ────────┬──────── 2026-10-23T19:48:14.6319502Z · ╰── 'legacyCredentials' is declared here 2026-10-23T19:48:14.6319572Z 16 │ version: 1 as const, 2026-10-23T19:48:14.6319623Z ╰──── 2026-10-23T19:48:14.6319728Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6319731Z 2026-10-23T19:48:14.6320023Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6320158Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T19:48:14.6320212Z 3404 │ 2026-10-23T19:48:14.6320401Z 3405 │ const layer: Layer.Layer = 2026-10-23T19:48:14.6320475Z ·  ──┬── 2026-10-23T19:48:14.6320603Z · ╰── 'layer' is declared here 2026-10-23T19:48:14.6320672Z 3406 │ Layer.effect( 2026-10-23T19:48:14.6320729Z ╰──── 2026-10-23T19:48:14.6320831Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6320833Z 2026-10-23T19:48:14.6321078Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T19:48:14.6321233Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T19:48:14.6321294Z 289 │ return ( 2026-10-23T19:48:14.6321431Z 290 │ 2026-10-23T19:48:14.6321554Z ·  ───────────── 2026-10-23T19:48:14.6321622Z 291 │ {props.children} 2026-10-23T19:48:14.6321675Z ╰──── 2026-10-23T19:48:14.6321966Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T19:48:14.6322135Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T19:48:14.6322138Z 2026-10-23T19:48:14.6322378Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T19:48:14.6322533Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T19:48:14.6322593Z 653 │ return ( 2026-10-23T19:48:14.6322713Z 654 │ 2026-10-23T19:48:14.6322828Z ·  ───────────── 2026-10-23T19:48:14.6322898Z 655 │ {props.children} 2026-10-23T19:48:14.6322949Z ╰──── 2026-10-23T19:48:14.6323176Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T19:48:14.6323317Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T19:48:14.6323321Z 2026-10-23T19:48:14.6323561Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T19:48:14.6323721Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T19:48:14.6323782Z 1461 │ return ( 2026-10-23T19:48:14.6323945Z 1462 │ 2026-10-23T19:48:14.6324077Z ·  ──────────────────── 2026-10-23T19:48:14.6324175Z 1463 │ 2026-10-23T19:48:14.6325242Z ·  ──────┬───── 2026-10-23T19:48:14.6325393Z · ╰── 'stopSessions' is declared here 2026-10-23T19:48:14.6325459Z 250 │ effect.pipe( 2026-10-23T19:48:14.6325515Z ╰──── 2026-10-23T19:48:14.6325621Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6325624Z 2026-10-23T19:48:14.6326091Z ⚠ 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-23T19:48:14.6326216Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T19:48:14.6326270Z 499 │ 2026-10-23T19:48:14.6326384Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T19:48:14.6326503Z ·  ────────────────────────── 2026-10-23T19:48:14.6326612Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T19:48:14.6326663Z ╰──── 2026-10-23T19:48:14.6326667Z 2026-10-23T19:48:14.6326996Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6327194Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T19:48:14.6327249Z 211 │ }; 2026-10-23T19:48:14.6327316Z 212 │ useEffect(() => { 2026-10-23T19:48:14.6327389Z ·  ────┬──── 2026-10-23T19:48:14.6327521Z · ╰── This is the containing effect 2026-10-23T19:48:14.6327695Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T19:48:14.6327760Z 214 │ if (inserted) { 2026-10-23T19:48:14.6327836Z 215 │ setSelection((current) => 2026-10-23T19:48:14.6327916Z ·  ──────┬───── 2026-10-23T19:48:14.6328095Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6328268Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T19:48:14.6328319Z ╰──── 2026-10-23T19:48:14.6328927Z  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-23T19:48:14.6329256Z  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-23T19:48:14.6329259Z 2026-10-23T19:48:14.6329523Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6329692Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T19:48:14.6329801Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T19:48:14.6329865Z 285 │ useEffect(() => { 2026-10-23T19:48:14.6329937Z ·  ────┬──── 2026-10-23T19:48:14.6330069Z · ╰── This is the containing effect 2026-10-23T19:48:14.6330216Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T19:48:14.6330369Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T19:48:14.6330441Z 288 │ const now = Date.now(); 2026-10-23T19:48:14.6330555Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T19:48:14.6330612Z 290 │ if ( 2026-10-23T19:48:14.6330697Z 291 │ lastRequest?.key === key && 2026-10-23T19:48:14.6330841Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T19:48:14.6330896Z 293 │ ) 2026-10-23T19:48:14.6330956Z 294 │ return; 2026-10-23T19:48:14.6331133Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T19:48:14.6331222Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T19:48:14.6331368Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6331545Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6331607Z 297 │ return; 2026-10-23T19:48:14.6331659Z ╰──── 2026-10-23T19:48:14.6332343Z  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-23T19:48:14.6332706Z  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-23T19:48:14.6332708Z 2026-10-23T19:48:14.6332911Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6333076Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T19:48:14.6333134Z 325 │ }, [ 2026-10-23T19:48:14.6333198Z 326 │ draftMessage, 2026-10-23T19:48:14.6333277Z ·  ──────┬───── 2026-10-23T19:48:14.6333433Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T19:48:14.6333501Z 327 │ environmentId, 2026-10-23T19:48:14.6333553Z ╰──── 2026-10-23T19:48:14.6333850Z  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-23T19:48:14.6334158Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6334160Z 2026-10-23T19:48:14.6334381Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T19:48:14.6334512Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-23T19:48:14.6334582Z 113 │ const declared = { 2026-10-23T19:48:14.6334674Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T19:48:14.6334795Z ·  ──────────────────────────────── 2026-10-23T19:48:14.6334907Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T19:48:14.6334958Z ╰──── 2026-10-23T19:48:14.6335225Z  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-23T19:48:14.6335227Z 2026-10-23T19:48:14.6335449Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T19:48:14.6335576Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-23T19:48:14.6335665Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T19:48:14.6335770Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T19:48:14.6335895Z ·  ──────────────────────────────────────── 2026-10-23T19:48:14.6335999Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T19:48:14.6336054Z ╰──── 2026-10-23T19:48:14.6336317Z  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-23T19:48:14.6336320Z 2026-10-23T19:48:14.6336540Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T19:48:14.6336668Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-23T19:48:14.6336771Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T19:48:14.6336865Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T19:48:14.6336982Z ·  ──────────────────────────────────── 2026-10-23T19:48:14.6337041Z 117 │ }; 2026-10-23T19:48:14.6337095Z ╰──── 2026-10-23T19:48:14.6337421Z  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-23T19:48:14.6337457Z 2026-10-23T19:48:14.6337692Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T19:48:14.6337818Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T19:48:14.6338002Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T19:48:14.6338096Z 35 │ instanceId === configured ? true : false, 2026-10-23T19:48:14.6338215Z ·  ──────────────────────────────────────── 2026-10-23T19:48:14.6338271Z 36 │ ); 2026-10-23T19:48:14.6338323Z ╰──── 2026-10-23T19:48:14.6338418Z  help: Remove this ternary operator 2026-10-23T19:48:14.6338427Z 2026-10-23T19:48:14.6338897Z ⚠ 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-23T19:48:14.6339018Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-23T19:48:14.6339112Z 128 │ const secret = "acp-summary-secret"; 2026-10-23T19:48:14.6339223Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-23T19:48:14.6339341Z ·  ────────────────────────── 2026-10-23T19:48:14.6339408Z 130 │ Schema.Struct({ 2026-10-23T19:48:14.6339460Z ╰──── 2026-10-23T19:48:14.6339463Z 2026-10-23T19:48:14.6339678Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T19:48:14.6339861Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T19:48:14.6339992Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T19:48:14.6340101Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T19:48:14.6340210Z ·  ─────── 2026-10-23T19:48:14.6340320Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T19:48:14.6340372Z ╰──── 2026-10-23T19:48:14.6340634Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T19:48:14.6340637Z 2026-10-23T19:48:14.6340973Z ⚠ 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-23T19:48:14.6341156Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T19:48:14.6341354Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T19:48:14.6341478Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T19:48:14.6341558Z ·  ───────── 2026-10-23T19:48:14.6341617Z 19 │ expect( 2026-10-23T19:48:14.6341669Z ╰──── 2026-10-23T19:48:14.6341671Z 2026-10-23T19:48:14.6342006Z ⚠ 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-23T19:48:14.6342122Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T19:48:14.6342181Z 19 │ expect( 2026-10-23T19:48:14.6342357Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T19:48:14.6342435Z ·  ───────── 2026-10-23T19:48:14.6342498Z 21 │ ).toBe(true); 2026-10-23T19:48:14.6342549Z ╰──── 2026-10-23T19:48:14.6342553Z 2026-10-23T19:48:14.6342748Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6342919Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T19:48:14.6342981Z 87 │
  • 2026-10-23T19:48:14.6345323Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T19:48:14.6345428Z ·  ────────────────────────── 2026-10-23T19:48:14.6345576Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T19:48:14.6345629Z ╰──── 2026-10-23T19:48:14.6345631Z 2026-10-23T19:48:14.6345777Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6346012Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-23T19:48:14.6346143Z 26 │ const latestInput = useRef(input); 2026-10-23T19:48:14.6346221Z 27 │ latestInput.current = input; 2026-10-23T19:48:14.6346332Z ·  ─────┬─────────┬─── 2026-10-23T19:48:14.6346517Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6346633Z · ╰── This value is a ref 2026-10-23T19:48:14.6346711Z 28 │ const mounted = useRef(true); 2026-10-23T19:48:14.6346763Z ╰──── 2026-10-23T19:48:14.6347236Z  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-23T19:48:14.6347538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6347543Z 2026-10-23T19:48:14.6347703Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6347871Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T19:48:14.6347927Z 90 │ }) { 2026-10-23T19:48:14.6348038Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T19:48:14.6348113Z ·  ────┬─── 2026-10-23T19:48:14.6348248Z · ╰── `rotation` originates here 2026-10-23T19:48:14.6348317Z 92 │ useLayoutEffect(() => { 2026-10-23T19:48:14.6348458Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T19:48:14.6348536Z ·  ────┬─── 2026-10-23T19:48:14.6348672Z · ╰── `rotation` cannot be modified 2026-10-23T19:48:14.6348749Z 94 │ }, [props.hidden, rotation]); 2026-10-23T19:48:14.6348800Z ╰──── 2026-10-23T19:48:14.6349066Z  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-23T19:48:14.6349370Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6349373Z 2026-10-23T19:48:14.6349529Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6349699Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T19:48:14.6349829Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T19:48:14.6349967Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T19:48:14.6350056Z ·  ────────┬──────── 2026-10-23T19:48:14.6350205Z · ╰── `loadingVisibility` originates here 2026-10-23T19:48:14.6350274Z 268 │ useLayoutEffect(() => { 2026-10-23T19:48:14.6350432Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T19:48:14.6350518Z ·  ────────┬──────── 2026-10-23T19:48:14.6350668Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T19:48:14.6350758Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T19:48:14.6350810Z ╰──── 2026-10-23T19:48:14.6351143Z  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-23T19:48:14.6351482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6351485Z 2026-10-23T19:48:14.6351638Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6351806Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T19:48:14.6351863Z 325 │ }) { 2026-10-23T19:48:14.6352024Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T19:48:14.6352113Z ·  ─────────┬───────── 2026-10-23T19:48:14.6352265Z · ╰── `recordingVisibility` originates here 2026-10-23T19:48:14.6352342Z 327 │ useLayoutEffect(() => { 2026-10-23T19:48:14.6352531Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T19:48:14.6352618Z ·  ─────────┬───────── 2026-10-23T19:48:14.6352770Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T19:48:14.6352862Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T19:48:14.6352914Z ╰──── 2026-10-23T19:48:14.6353175Z  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-23T19:48:14.6353481Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6353483Z 2026-10-23T19:48:14.6353643Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6353813Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-23T19:48:14.6353917Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-23T19:48:14.6354000Z 66 │ const progress = useSharedValue(0); 2026-10-23T19:48:14.6354075Z ·  ────┬─── 2026-10-23T19:48:14.6354207Z · ╰── `progress` originates here 2026-10-23T19:48:14.6354273Z 67 │ useEffect(() => { 2026-10-23T19:48:14.6354396Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T19:48:14.6354467Z ·  ────┬─── 2026-10-23T19:48:14.6354599Z · ╰── `progress` cannot be modified 2026-10-23T19:48:14.6354672Z 69 │ }, [expanded, progress]); 2026-10-23T19:48:14.6354790Z ╰──── 2026-10-23T19:48:14.6355099Z  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-23T19:48:14.6355403Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6355405Z 2026-10-23T19:48:14.6355550Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6355710Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-23T19:48:14.6355870Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T19:48:14.6355995Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T19:48:14.6356125Z ·  ───────────┬────────── 2026-10-23T19:48:14.6356306Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6356425Z 123 │ const sessionRef = useRef(null); 2026-10-23T19:48:14.6356478Z ╰──── 2026-10-23T19:48:14.6356948Z  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-23T19:48:14.6357239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6357242Z 2026-10-23T19:48:14.6357390Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6357548Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T19:48:14.6357603Z 125 │ 2026-10-23T19:48:14.6357713Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T19:48:14.6357801Z ·  ─────────┬──────── 2026-10-23T19:48:14.6357948Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6358051Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T19:48:14.6358104Z ╰──── 2026-10-23T19:48:14.6358566Z  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-23T19:48:14.6358858Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6358864Z 2026-10-23T19:48:14.6359007Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6359163Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T19:48:14.6359217Z 125 │ 2026-10-23T19:48:14.6359324Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T19:48:14.6359412Z ·  ─────────┬───────── 2026-10-23T19:48:14.6359559Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6359660Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T19:48:14.6359711Z ╰──── 2026-10-23T19:48:14.6360284Z  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-23T19:48:14.6360615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6360618Z 2026-10-23T19:48:14.6360763Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6360921Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T19:48:14.6360974Z 125 │ 2026-10-23T19:48:14.6361080Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T19:48:14.6361193Z ·  ─────────┬───────── 2026-10-23T19:48:14.6361365Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6361466Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T19:48:14.6361521Z ╰──── 2026-10-23T19:48:14.6361982Z  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-23T19:48:14.6362268Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6362271Z 2026-10-23T19:48:14.6362414Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6362571Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T19:48:14.6362630Z 125 │ 2026-10-23T19:48:14.6362739Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T19:48:14.6362852Z ·  ──────────┬───────── 2026-10-23T19:48:14.6363017Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6363117Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T19:48:14.6363169Z ╰──── 2026-10-23T19:48:14.6363633Z  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-23T19:48:14.6363925Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6363932Z 2026-10-23T19:48:14.6364075Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6364233Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T19:48:14.6364345Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T19:48:14.6364540Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T19:48:14.6364715Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T19:48:14.6364842Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T19:48:14.6364997Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T19:48:14.6365180Z 131 │ │ isFinished: status.isFinished, 2026-10-23T19:48:14.6365388Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T19:48:14.6365493Z 133 │ │ error: status.error, 2026-10-23T19:48:14.6365592Z 134 │ │ url: status.url, 2026-10-23T19:48:14.6365673Z 135 │ │ }); 2026-10-23T19:48:14.6365749Z 136 │ │ }, 2026-10-23T19:48:14.6365946Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T19:48:14.6366056Z 138 │ │ selectInput: (inputs) => { 2026-10-23T19:48:14.6366211Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T19:48:14.6366362Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T19:48:14.6366533Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T19:48:14.6366673Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T19:48:14.6366776Z 143 │ │ if (order !== known) { 2026-10-23T19:48:14.6366914Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T19:48:14.6367028Z 145 │ │ transform: (current) => ({ 2026-10-23T19:48:14.6367234Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T19:48:14.6367319Z 147 │ │ }), 2026-10-23T19:48:14.6367401Z 148 │ │ }); 2026-10-23T19:48:14.6367484Z 149 │ │ } 2026-10-23T19:48:14.6367626Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T19:48:14.6367705Z 151 │ │ }, 2026-10-23T19:48:14.6367836Z 152 │ ├─▶ }); 2026-10-23T19:48:14.6368073Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6368160Z 153 │ recorderRef.current = recorder; 2026-10-23T19:48:14.6368213Z ╰──── 2026-10-23T19:48:14.6368689Z  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-23T19:48:14.6368986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6368990Z 2026-10-23T19:48:14.6369135Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6369296Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T19:48:14.6369355Z 152 │ }); 2026-10-23T19:48:14.6369438Z 153 │ recorderRef.current = recorder; 2026-10-23T19:48:14.6369551Z ·  ─────┬─────────┬─── 2026-10-23T19:48:14.6369737Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6369961Z · ╰── This value is a ref 2026-10-23T19:48:14.6370134Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T19:48:14.6370218Z ╰──── 2026-10-23T19:48:14.6370687Z  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-23T19:48:14.6370976Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6370978Z 2026-10-23T19:48:14.6371122Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6371354Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T19:48:14.6371440Z 153 │ recorderRef.current = recorder; 2026-10-23T19:48:14.6371640Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T19:48:14.6371729Z 155 │ │ recorder, 2026-10-23T19:48:14.6371861Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T19:48:14.6371977Z 157 │ │ requestPermission: async () => { 2026-10-23T19:48:14.6372143Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T19:48:14.6372337Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T19:48:14.6372416Z 160 │ │ }, 2026-10-23T19:48:14.6372558Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T19:48:14.6372702Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T19:48:14.6372842Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T19:48:14.6372958Z 164 │ │ onStateChange: (nextState) => 2026-10-23T19:48:14.6409142Z 165 │ │ setState({ 2026-10-23T19:48:14.6409321Z 166 │ │ state: nextState, 2026-10-23T19:48:14.6409473Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T19:48:14.6409606Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T19:48:14.6409690Z 169 │ │ }), 2026-10-23T19:48:14.6409860Z 170 │ ├─▶ }); 2026-10-23T19:48:14.6410082Z · ╰──── Cannot access ref value during render 2026-10-23T19:48:14.6410144Z 171 │ } 2026-10-23T19:48:14.6410200Z ╰──── 2026-10-23T19:48:14.6410683Z  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-23T19:48:14.6410987Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6410990Z 2026-10-23T19:48:14.6411142Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6411408Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T19:48:14.6411692Z 153 │ recorderRef.current = recorder; 2026-10-23T19:48:14.6411856Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T19:48:14.6411972Z ·  ─────┬────────┬─── 2026-10-23T19:48:14.6412161Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6412284Z · ╰── This value is a ref 2026-10-23T19:48:14.6412351Z 155 │ recorder, 2026-10-23T19:48:14.6412404Z ╰──── 2026-10-23T19:48:14.6412873Z  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-23T19:48:14.6413174Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6413181Z 2026-10-23T19:48:14.6413331Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6413492Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T19:48:14.6413582Z 184 │ return () => subscription.remove(); 2026-10-23T19:48:14.6413649Z 185 │ }, [controller]); 2026-10-23T19:48:14.6413727Z ·  ─────┬──── 2026-10-23T19:48:14.6413876Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6413931Z 186 │ 2026-10-23T19:48:14.6413982Z ╰──── 2026-10-23T19:48:14.6414453Z  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-23T19:48:14.6414747Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6414750Z 2026-10-23T19:48:14.6414895Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6415054Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T19:48:14.6415141Z 184 │ return () => subscription.remove(); 2026-10-23T19:48:14.6415206Z 185 │ }, [controller]); 2026-10-23T19:48:14.6415285Z ·  ──────┬───── 2026-10-23T19:48:14.6415428Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6415480Z 186 │ 2026-10-23T19:48:14.6415536Z ╰──── 2026-10-23T19:48:14.6415999Z  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-23T19:48:14.6416286Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6416289Z 2026-10-23T19:48:14.6416432Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6416589Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T19:48:14.6416647Z 191 │ }, 2026-10-23T19:48:14.6416720Z 192 │ [controller, recorder], 2026-10-23T19:48:14.6416863Z ·  ─────┬──── 2026-10-23T19:48:14.6417037Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6417093Z 193 │ ); 2026-10-23T19:48:14.6417145Z ╰──── 2026-10-23T19:48:14.6417609Z  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-23T19:48:14.6417896Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6417898Z 2026-10-23T19:48:14.6418042Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6418204Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T19:48:14.6418299Z 174 │ const controller = session.controller; 2026-10-23T19:48:14.6418386Z 175 │ const recorder = recorderRef.current; 2026-10-23T19:48:14.6418493Z ·  ─────────┬───────── 2026-10-23T19:48:14.6418654Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6418707Z 176 │ 2026-10-23T19:48:14.6418758Z ╰──── 2026-10-23T19:48:14.6419217Z  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-23T19:48:14.6419510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6419516Z 2026-10-23T19:48:14.6419661Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6419855Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T19:48:14.6419910Z 191 │ }, 2026-10-23T19:48:14.6419983Z 192 │ [controller, recorder], 2026-10-23T19:48:14.6420073Z ·  ───────────┬────────── 2026-10-23T19:48:14.6420223Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6420276Z 193 │ ); 2026-10-23T19:48:14.6420327Z ╰──── 2026-10-23T19:48:14.6420874Z  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-23T19:48:14.6421193Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6421196Z 2026-10-23T19:48:14.6421337Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6421495Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T19:48:14.6421588Z 245 │ return () => clearInterval(intervalId); 2026-10-23T19:48:14.6421699Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T19:48:14.6421787Z ·  ─────┬──── 2026-10-23T19:48:14.6421944Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6421997Z 247 │ 2026-10-23T19:48:14.6422049Z ╰──── 2026-10-23T19:48:14.6422513Z  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-23T19:48:14.6422804Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6422807Z 2026-10-23T19:48:14.6422951Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6423108Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T19:48:14.6423200Z 245 │ return () => clearInterval(intervalId); 2026-10-23T19:48:14.6423308Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T19:48:14.6423443Z ·  ────────────────────────┬─────────────────────── 2026-10-23T19:48:14.6423606Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6423659Z 247 │ 2026-10-23T19:48:14.6423709Z ╰──── 2026-10-23T19:48:14.6424168Z  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-23T19:48:14.6424453Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6424456Z 2026-10-23T19:48:14.6424599Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6424760Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T19:48:14.6424830Z 260 │ setOwnerFocused, 2026-10-23T19:48:14.6424891Z 261 │ session, 2026-10-23T19:48:14.6424963Z ·  ───┬─── 2026-10-23T19:48:14.6425103Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6425162Z 262 │ stop, 2026-10-23T19:48:14.6425213Z ╰──── 2026-10-23T19:48:14.6425672Z  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-23T19:48:14.6425957Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6426026Z 2026-10-23T19:48:14.6426201Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6426357Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T19:48:14.6426413Z 250 │ 2026-10-23T19:48:14.6426553Z 251 │ ╭─▶ return { 2026-10-23T19:48:14.6426764Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T19:48:14.6426847Z 253 │ │ state, 2026-10-23T19:48:14.6426936Z 254 │ │ audioLevels, 2026-10-23T19:48:14.6427029Z 255 │ │ elapsedSeconds, 2026-10-23T19:48:14.6427160Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T19:48:14.6427249Z 257 │ │ ownerKey, 2026-10-23T19:48:14.6427331Z 258 │ │ label, 2026-10-23T19:48:14.6427421Z 259 │ │ focusedOwners, 2026-10-23T19:48:14.6427516Z 260 │ │ setOwnerFocused, 2026-10-23T19:48:14.6427597Z 261 │ │ session, 2026-10-23T19:48:14.6427675Z 262 │ │ stop, 2026-10-23T19:48:14.6427754Z 263 │ │ cancel, 2026-10-23T19:48:14.6427881Z 264 │ ├─▶ }; 2026-10-23T19:48:14.6428081Z · ╰──── Cannot access ref value during render 2026-10-23T19:48:14.6428136Z 265 │ } 2026-10-23T19:48:14.6428188Z ╰──── 2026-10-23T19:48:14.6428658Z  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-23T19:48:14.6428947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6428950Z 2026-10-23T19:48:14.6429109Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6429268Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T19:48:14.6429427Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T19:48:14.6429553Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T19:48:14.6429638Z ·  ─────┬───── 2026-10-23T19:48:14.6429805Z · ╰── `audioLevels` originates here 2026-10-23T19:48:14.6429925Z 123 │ const sessionRef = useRef(null); 2026-10-23T19:48:14.6430071Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T19:48:14.6430123Z 125 │ 2026-10-23T19:48:14.6430231Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T19:48:14.6430332Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T19:48:14.6430468Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T19:48:14.6430562Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T19:48:14.6430684Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T19:48:14.6430771Z 131 │ isFinished: status.isFinished, 2026-10-23T19:48:14.6430983Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T19:48:14.6431086Z 133 │ error: status.error, 2026-10-23T19:48:14.6431156Z 134 │ url: status.url, 2026-10-23T19:48:14.6431215Z 135 │ }); 2026-10-23T19:48:14.6431271Z 136 │ }, 2026-10-23T19:48:14.6431437Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T19:48:14.6431515Z 138 │ selectInput: (inputs) => { 2026-10-23T19:48:14.6431639Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T19:48:14.6431751Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T19:48:14.6431883Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T19:48:14.6431991Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T19:48:14.6432071Z 143 │ if (order !== known) { 2026-10-23T19:48:14.6432179Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T19:48:14.6432262Z 145 │ transform: (current) => ({ 2026-10-23T19:48:14.6432437Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T19:48:14.6432500Z 147 │ }), 2026-10-23T19:48:14.6432560Z 148 │ }); 2026-10-23T19:48:14.6432617Z 149 │ } 2026-10-23T19:48:14.6432727Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T19:48:14.6432784Z 151 │ }, 2026-10-23T19:48:14.6432839Z 152 │ }); 2026-10-23T19:48:14.6432923Z 153 │ recorderRef.current = recorder; 2026-10-23T19:48:14.6433024Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T19:48:14.6433087Z 155 │ recorder, 2026-10-23T19:48:14.6433191Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T19:48:14.6433279Z 157 │ requestPermission: async () => { 2026-10-23T19:48:14.6433410Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T19:48:14.6433565Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T19:48:14.6433621Z 160 │ }, 2026-10-23T19:48:14.6433731Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T19:48:14.6433837Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T19:48:14.6433940Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T19:48:14.6434019Z 164 │ onStateChange: (nextState) => 2026-10-23T19:48:14.6434084Z 165 │ setState({ 2026-10-23T19:48:14.6434154Z 166 │ state: nextState, 2026-10-23T19:48:14.6434266Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T19:48:14.6434367Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T19:48:14.6434426Z 169 │ }), 2026-10-23T19:48:14.6434482Z 170 │ }); 2026-10-23T19:48:14.6434534Z 171 │ } 2026-10-23T19:48:14.6434587Z 172 │ 2026-10-23T19:48:14.6434674Z 173 │ const session = sessionRef.current; 2026-10-23T19:48:14.6434761Z 174 │ const controller = session.controller; 2026-10-23T19:48:14.6434845Z 175 │ const recorder = recorderRef.current; 2026-10-23T19:48:14.6434898Z 176 │ 2026-10-23T19:48:14.6434964Z 177 │ useEffect(() => { 2026-10-23T19:48:14.6435114Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T19:48:14.6435254Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T19:48:14.6435461Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T19:48:14.6435596Z 181 │ // calls and route interruptions during capture. 2026-10-23T19:48:14.6435732Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T19:48:14.6435787Z 183 │ }); 2026-10-23T19:48:14.6435873Z 184 │ return () => subscription.remove(); 2026-10-23T19:48:14.6435937Z 185 │ }, [controller]); 2026-10-23T19:48:14.6435990Z 186 │ 2026-10-23T19:48:14.6436050Z 187 │ useEffect( 2026-10-23T19:48:14.6436112Z 188 │ () => () => { 2026-10-23T19:48:14.6436185Z 189 │ controller.dispose(); 2026-10-23T19:48:14.6436253Z 190 │ recorder.release(); 2026-10-23T19:48:14.6436308Z 191 │ }, 2026-10-23T19:48:14.6436378Z 192 │ [controller, recorder], 2026-10-23T19:48:14.6436432Z 193 │ ); 2026-10-23T19:48:14.6436484Z 194 │ 2026-10-23T19:48:14.6436548Z 195 │ useEffect(() => { 2026-10-23T19:48:14.6436648Z 196 │ if (state.phase !== "recording") return; 2026-10-23T19:48:14.6436702Z 197 │ 2026-10-23T19:48:14.6436849Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T19:48:14.6436955Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T19:48:14.6437037Z 200 │ void activation.catch(() => {}); 2026-10-23T19:48:14.6437100Z 201 │ return () => { 2026-10-23T19:48:14.6437249Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T19:48:14.6437387Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T19:48:14.6437442Z 204 │ }; 2026-10-23T19:48:14.6437520Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T19:48:14.6437571Z 206 │ 2026-10-23T19:48:14.6437634Z 207 │ useEffect(() => { 2026-10-23T19:48:14.6437774Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T19:48:14.6437829Z 209 │ 2026-10-23T19:48:14.6437950Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T19:48:14.6438106Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T19:48:14.6438209Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T19:48:14.6438287Z ·  ─────┬───── 2026-10-23T19:48:14.6438428Z · ╰── `audioLevels` cannot be modified 2026-10-23T19:48:14.6438484Z 213 │ } 2026-10-23T19:48:14.6438537Z ╰──── 2026-10-23T19:48:14.6438805Z  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-23T19:48:14.6439117Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6439121Z 2026-10-23T19:48:14.6439327Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T19:48:14.6439486Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T19:48:14.6439538Z 206 │ 2026-10-23T19:48:14.6439602Z 207 │ useEffect(() => { 2026-10-23T19:48:14.6439681Z ·  ───┬─── 2026-10-23T19:48:14.6439935Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T19:48:14.6440072Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T19:48:14.6440123Z 209 │ 2026-10-23T19:48:14.6440322Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T19:48:14.6440507Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T19:48:14.6440610Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T19:48:14.6440686Z ·  ─────┬───── 2026-10-23T19:48:14.6440822Z · ╰── This modifies `audioLevels` 2026-10-23T19:48:14.6440878Z 213 │ } 2026-10-23T19:48:14.6440929Z ╰──── 2026-10-23T19:48:14.6441270Z  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-23T19:48:14.6441576Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6441583Z 2026-10-23T19:48:14.6441950Z ⚠ 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-23T19:48:14.6442090Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T19:48:14.6442228Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T19:48:14.6442374Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T19:48:14.6442491Z ·  ─────────────────── 2026-10-23T19:48:14.6442555Z 1787 │ cwd, 2026-10-23T19:48:14.6442609Z ╰──── 2026-10-23T19:48:14.6442611Z 2026-10-23T19:48:14.6442990Z ⚠ 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-23T19:48:14.6443119Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-23T19:48:14.6443178Z 145 │ name, 2026-10-23T19:48:14.6443318Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T19:48:14.6443424Z ·  ────────────────────────── 2026-10-23T19:48:14.6443546Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T19:48:14.6443598Z ╰──── 2026-10-23T19:48:14.6443600Z 2026-10-23T19:48:14.6443862Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6444052Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-23T19:48:14.6444104Z 104 │ 2026-10-23T19:48:14.6444175Z 105 │ useEffect(() => { 2026-10-23T19:48:14.6444251Z ·  ────┬──── 2026-10-23T19:48:14.6444382Z · ╰── This is the containing effect 2026-10-23T19:48:14.6444462Z 106 │ clearReviewCommentTarget(); 2026-10-23T19:48:14.6444559Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T19:48:14.6444666Z ·  ────────────────┬─────────────── 2026-10-23T19:48:14.6444844Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6444916Z 108 │ }, [selectedSection?.id]); 2026-10-23T19:48:14.6444968Z ╰──── 2026-10-23T19:48:14.6445643Z  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-23T19:48:14.6446000Z  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-23T19:48:14.6446002Z 2026-10-23T19:48:14.6446259Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6446445Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T19:48:14.6446499Z 109 │ 2026-10-23T19:48:14.6446563Z 110 │ useEffect(() => { 2026-10-23T19:48:14.6446633Z ·  ────┬──── 2026-10-23T19:48:14.6446764Z · ╰── This is the containing effect 2026-10-23T19:48:14.6446855Z 111 │ if (activeCommentTarget === null) { 2026-10-23T19:48:14.6446959Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T19:48:14.6447067Z ·  ────────────────┬─────────────── 2026-10-23T19:48:14.6447246Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6447302Z 113 │ } 2026-10-23T19:48:14.6447354Z ╰──── 2026-10-23T19:48:14.6447957Z  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-23T19:48:14.6448282Z  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-23T19:48:14.6448288Z 2026-10-23T19:48:14.6448490Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6448675Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T19:48:14.6448772Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T19:48:14.6448844Z 108 │ }, [selectedSection?.id]); 2026-10-23T19:48:14.6448934Z ·  ─────────┬───────── 2026-10-23T19:48:14.6449099Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T19:48:14.6449155Z 109 │ 2026-10-23T19:48:14.6449206Z ╰──── 2026-10-23T19:48:14.6449567Z  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-23T19:48:14.6449937Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6449940Z 2026-10-23T19:48:14.6450214Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6450325Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-23T19:48:14.6450376Z 35 │ 2026-10-23T19:48:14.6450508Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-23T19:48:14.6450585Z ·  ─────┬──── 2026-10-23T19:48:14.6450722Z · ╰── 'claudeCaps' is declared here 2026-10-23T19:48:14.6450797Z 37 │ optionDescriptors: [ 2026-10-23T19:48:14.6450852Z ╰──── 2026-10-23T19:48:14.6451019Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6451022Z 2026-10-23T19:48:14.6451218Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6451413Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-23T19:48:14.6451522Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-23T19:48:14.6451617Z 223 │ 2026-10-23T19:48:14.6451725Z ·  ─────────────── 2026-10-23T19:48:14.6451816Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T19:48:14.6451868Z ╰──── 2026-10-23T19:48:14.6452014Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T19:48:14.6452024Z 2026-10-23T19:48:14.6452221Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6452369Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T19:48:14.6452446Z 226 │ { 2026-10-23T19:48:14.6459643Z ·  ────┬──── 2026-10-23T19:48:14.6459810Z · ╰── This is the containing effect 2026-10-23T19:48:14.6459912Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T19:48:14.6459995Z 103 │ setHighlightedLinesById({}); 2026-10-23T19:48:14.6460087Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6460264Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6460327Z 104 │ return; 2026-10-23T19:48:14.6460379Z ╰──── 2026-10-23T19:48:14.6460981Z  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-23T19:48:14.6461308Z  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-23T19:48:14.6461311Z 2026-10-23T19:48:14.6461512Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6461647Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-23T19:48:14.6461732Z 453 │ showAuxiliaryPane("inspector"); 2026-10-23T19:48:14.6461838Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-23T19:48:14.6461988Z ·  ──────┬────── ────┬─── 2026-10-23T19:48:14.6462190Z · │ ╰── Unnecessary dependency `threadId` 2026-10-23T19:48:14.6462341Z · ╰── Unnecessary dependency `environmentId` 2026-10-23T19:48:14.6462400Z 455 │ const { 2026-10-23T19:48:14.6462453Z ╰──── 2026-10-23T19:48:14.6462750Z  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-23T19:48:14.6463060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6463063Z 2026-10-23T19:48:14.6463253Z ⚠ react(static-components): Cannot create components during render 2026-10-23T19:48:14.6463391Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-23T19:48:14.6463455Z 492 │ // same check. 2026-10-23T19:48:14.6463583Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-23T19:48:14.6463705Z ·  ─────────────┬───────────── 2026-10-23T19:48:14.6463886Z · ╰── The component is created during render here 2026-10-23T19:48:14.6464036Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-23T19:48:14.6464156Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T19:48:14.6464287Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T19:48:14.6464453Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T19:48:14.6464560Z 498 │ setIsPullRefreshing(true); 2026-10-23T19:48:14.6464644Z 499 │ await refreshSelectedSection(); 2026-10-23T19:48:14.6464722Z 500 │ setIsPullRefreshing(false); 2026-10-23T19:48:14.6464776Z 501 │ }; 2026-10-23T19:48:14.6464921Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T19:48:14.6465063Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T19:48:14.6465169Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T19:48:14.6465254Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T19:48:14.6465343Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T19:48:14.6465412Z 507 │ files: reviewFiles, 2026-10-23T19:48:14.6465510Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T19:48:14.6465647Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T19:48:14.6465713Z 510 │ : undefined, 2026-10-23T19:48:14.6465807Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T19:48:14.6465930Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T19:48:14.6465993Z 513 │ : undefined, 2026-10-23T19:48:14.6466049Z 514 │ }); 2026-10-23T19:48:14.6466241Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T19:48:14.6466373Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T19:48:14.6466436Z 517 │ environmentId, 2026-10-23T19:48:14.6466498Z 518 │ threadId, 2026-10-23T19:48:14.6466565Z 519 │ selectedSection, 2026-10-23T19:48:14.6466635Z 520 │ nativeReviewDiffData, 2026-10-23T19:48:14.6466697Z 521 │ }); 2026-10-23T19:48:14.6466805Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T19:48:14.6466890Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T19:48:14.6466979Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T19:48:14.6467057Z 525 │ diff: selectedSection?.diff, 2026-10-23T19:48:14.6467135Z 526 │ data: nativeReviewDiffData, 2026-10-23T19:48:14.6467202Z 527 │ collapsedFileIds, 2026-10-23T19:48:14.6467264Z 528 │ viewedFileIds, 2026-10-23T19:48:14.6467375Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T19:48:14.6467473Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T19:48:14.6467528Z 531 │ }); 2026-10-23T19:48:14.6467600Z 532 │ const showcaseReviewKey = 2026-10-23T19:48:14.6467733Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T19:48:14.6467947Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T19:48:14.6468010Z 535 │ : null; 2026-10-23T19:48:14.6468176Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T19:48:14.6468255Z 537 │ nativeBridge.onDebug(event); 2026-10-23T19:48:14.6468312Z 538 │ if ( 2026-10-23T19:48:14.6468395Z 539 │ showcaseReviewKey === null || 2026-10-23T19:48:14.6468516Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T19:48:14.6468625Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T19:48:14.6468683Z 542 │ ) { 2026-10-23T19:48:14.6468744Z 543 │ return; 2026-10-23T19:48:14.6468798Z 544 │ } 2026-10-23T19:48:14.6468910Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T19:48:14.6469144Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T19:48:14.6469227Z 547 │ }; 2026-10-23T19:48:14.6469279Z 548 │ 2026-10-23T19:48:14.6469398Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T19:48:14.6469479Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T19:48:14.6469567Z 551 │ commentSelection.clearSelection(); 2026-10-23T19:48:14.6469687Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T19:48:14.6469795Z 553 │ toggleExpandedFile(fileId); 2026-10-23T19:48:14.6469850Z 554 │ } 2026-10-23T19:48:14.6469961Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T19:48:14.6470033Z 556 │ if (!nativeView) return; 2026-10-23T19:48:14.6470127Z 557 │ const result = await settlePromise(() => 2026-10-23T19:48:14.6470307Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T19:48:14.6470366Z 559 │ ); 2026-10-23T19:48:14.6470454Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T19:48:14.6470635Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T19:48:14.6470691Z 562 │ } 2026-10-23T19:48:14.6470743Z 563 │ }; 2026-10-23T19:48:14.6470828Z 564 │ const handleVisibleFileChange = ( 2026-10-23T19:48:14.6470960Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T19:48:14.6471017Z 566 │ ) => { 2026-10-23T19:48:14.6471125Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T19:48:14.6471293Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T19:48:14.6471347Z 569 │ }; 2026-10-23T19:48:14.6471432Z 570 │ const renderInspector = () => ( 2026-10-23T19:48:14.6471502Z 571 │ void handleSelectFile(fileId)} 2026-10-23T19:48:14.6472013Z 577 │ /> 2026-10-23T19:48:14.6472067Z 578 │ ); 2026-10-23T19:48:14.6472119Z 579 │ 2026-10-23T19:48:14.6472305Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T19:48:14.6472392Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T19:48:14.6472454Z 582 │ if (fileId) { 2026-10-23T19:48:14.6472542Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T19:48:14.6472623Z 584 │ toggleExpandedFile(fileId); 2026-10-23T19:48:14.6472677Z 585 │ } 2026-10-23T19:48:14.6472730Z 586 │ }; 2026-10-23T19:48:14.6472783Z 587 │ 2026-10-23T19:48:14.6472874Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T19:48:14.6472993Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T19:48:14.6473049Z 590 │ ) => { 2026-10-23T19:48:14.6473135Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T19:48:14.6473198Z 592 │ if (fileId) { 2026-10-23T19:48:14.6473274Z 593 │ toggleViewedFile(fileId); 2026-10-23T19:48:14.6473328Z 594 │ } 2026-10-23T19:48:14.6473381Z 595 │ }; 2026-10-23T19:48:14.6473433Z 596 │ 2026-10-23T19:48:14.6473506Z 597 │ const parsedDiffNotice = 2026-10-23T19:48:14.6473735Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T19:48:14.6473887Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T19:48:14.6474044Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T19:48:14.6474165Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T19:48:14.6474324Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T19:48:14.6474435Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T19:48:14.6474536Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T19:48:14.6474608Z 605 │ hasCachedSelectedDiff, 2026-10-23T19:48:14.6474674Z 606 │ hasAnyCachedDiff, 2026-10-23T19:48:14.6474728Z 607 │ }); 2026-10-23T19:48:14.6474816Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T19:48:14.6474908Z 609 │ void retryEnvironment(environmentId); 2026-10-23T19:48:14.6474966Z 610 │ }; 2026-10-23T19:48:14.6475052Z 611 │ const handleReturnToThread = () => { 2026-10-23T19:48:14.6475131Z 612 │ if (navigation.canGoBack()) { 2026-10-23T19:48:14.6475200Z 613 │ navigation.goBack(); 2026-10-23T19:48:14.6475261Z 614 │ return; 2026-10-23T19:48:14.6475315Z 615 │ } 2026-10-23T19:48:14.6475397Z 616 │ navigation.navigate("Thread", { 2026-10-23T19:48:14.6475486Z 617 │ environmentId: String(environmentId), 2026-10-23T19:48:14.6475564Z 618 │ threadId: String(threadId), 2026-10-23T19:48:14.6475619Z 619 │ }); 2026-10-23T19:48:14.6475673Z 620 │ }; 2026-10-23T19:48:14.6475750Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T19:48:14.6475823Z 622 │ selectedSection?.title, 2026-10-23T19:48:14.6475902Z 623 │ headerDiffSummary.additions, 2026-10-23T19:48:14.6475988Z 624 │ headerDiffSummary.deletions, 2026-10-23T19:48:14.6476043Z 625 │ ] 2026-10-23T19:48:14.6476149Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T19:48:14.6476215Z 627 │ .join(" · "); 2026-10-23T19:48:14.6476266Z 628 │ 2026-10-23T19:48:14.6476344Z 629 │ const showChangedFilesPane = 2026-10-23T19:48:14.6476417Z 630 │ !showConnectionNotice && 2026-10-23T19:48:14.6476493Z 631 │ selectedSection !== null && 2026-10-23T19:48:14.6476572Z 632 │ parsedDiff.kind === "files" && 2026-10-23T19:48:14.6476652Z 633 │ NativeReviewDiffView !== null; 2026-10-23T19:48:14.6476821Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T19:48:14.6476991Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T19:48:14.6477042Z 636 │ 2026-10-23T19:48:14.6477183Z 637 │ const listHeader = (() => { 2026-10-23T19:48:14.6477306Z 638 │ const children: ReactElement[] = []; 2026-10-23T19:48:14.6477358Z 639 │ 2026-10-23T19:48:14.6477419Z 640 │ if (error) { 2026-10-23T19:48:14.6477486Z 641 │ children.push( 2026-10-23T19:48:14.6477547Z 642 │ 2026-10-23T19:48:14.6478199Z 649 │ Review unavailable 2026-10-23T19:48:14.6478363Z 650 │ {error} 2026-10-23T19:48:14.6478428Z 651 │ , 2026-10-23T19:48:14.6478483Z 652 │ ); 2026-10-23T19:48:14.6478537Z 653 │ } 2026-10-23T19:48:14.6478589Z 654 │ 2026-10-23T19:48:14.6478660Z 655 │ if (parsedDiffNotice) { 2026-10-23T19:48:14.6478822Z 656 │ children.push(); 2026-10-23T19:48:14.6478876Z 657 │ } 2026-10-23T19:48:14.6478927Z 658 │ 2026-10-23T19:48:14.6479004Z 659 │ if (children.length === 0) { 2026-10-23T19:48:14.6479067Z 660 │ return null; 2026-10-23T19:48:14.6479121Z 661 │ } 2026-10-23T19:48:14.6479173Z 662 │ 2026-10-23T19:48:14.6479243Z 663 │ return <>{children}; 2026-10-23T19:48:14.6479299Z 664 │ })(); 2026-10-23T19:48:14.6479369Z 665 │ const headerSubtitle = [ 2026-10-23T19:48:14.6479454Z 666 │ headerDiffSummary.additions, 2026-10-23T19:48:14.6479535Z 667 │ headerDiffSummary.deletions, 2026-10-23T19:48:14.6479617Z 668 │ pendingReviewCommentCount > 0 2026-10-23T19:48:14.6479902Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T19:48:14.6479962Z 670 │ : null, 2026-10-23T19:48:14.6480015Z 671 │ ] 2026-10-23T19:48:14.6480081Z 672 │ .filter(Boolean) 2026-10-23T19:48:14.6480145Z 673 │ .join(" · "); 2026-10-23T19:48:14.6480280Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T19:48:14.6480333Z 675 │ 2026-10-23T19:48:14.6480392Z 676 │ return ( 2026-10-23T19:48:14.6480450Z 677 │ <> 2026-10-23T19:48:14.6480513Z 678 │ 2026-10-23T19:48:14.6481945Z 694 │ 2026-10-23T19:48:14.6482011Z 695 │ 2026-10-23T19:48:14.6482132Z 696 │ 2026-10-23T19:48:14.6482212Z 697 │ {showConnectionNotice ? ( 2026-10-23T19:48:14.6482353Z 698 │ 2026-10-23T19:48:14.6482443Z 699 │ 2026-10-23T19:48:14.6483460Z 711 │ 2026-10-23T19:48:14.6483618Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T19:48:14.6483678Z 713 │ 2026-10-23T19:48:14.6484128Z 719 │ 2026-10-23T19:48:14.6484486Z 723 │ {listHeader} 2026-10-23T19:48:14.6484608Z 724 │ 2026-10-23T19:48:14.6484690Z 725 │ { 2026-10-23T19:48:14.6490850Z ·  ────┬──── 2026-10-23T19:48:14.6490983Z · ╰── This is the containing effect 2026-10-23T19:48:14.6491050Z 57 │ scheduler.reset(); 2026-10-23T19:48:14.6491150Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T19:48:14.6491373Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T19:48:14.6491529Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T19:48:14.6491611Z ·  ───────┬─────── 2026-10-23T19:48:14.6491783Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6491898Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T19:48:14.6491950Z ╰──── 2026-10-23T19:48:14.6492552Z  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-23T19:48:14.6492881Z  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-23T19:48:14.6492886Z 2026-10-23T19:48:14.6493088Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6493261Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T19:48:14.6493341Z 62 │ return () => scheduler.cancel(); 2026-10-23T19:48:14.6493444Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T19:48:14.6493573Z ·  ───┬─── ─────┬───── 2026-10-23T19:48:14.6493766Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T19:48:14.6493904Z · ╰── Unnecessary dependency `enabled` 2026-10-23T19:48:14.6493957Z 64 │ 2026-10-23T19:48:14.6494016Z ╰──── 2026-10-23T19:48:14.6494315Z  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-23T19:48:14.6494624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6494627Z 2026-10-23T19:48:14.6494772Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6494894Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-23T19:48:14.6494960Z 183 │ "options", 2026-10-23T19:48:14.6495055Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T19:48:14.6495167Z ·  ────────────────┬─────────────── 2026-10-23T19:48:14.6495369Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6495467Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T19:48:14.6495519Z ╰──── 2026-10-23T19:48:14.6495989Z  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-23T19:48:14.6496278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6496281Z 2026-10-23T19:48:14.6496426Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6496546Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T19:48:14.6496701Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T19:48:14.6496830Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T19:48:14.6496944Z ·  ────────────────┬──────────────── 2026-10-23T19:48:14.6497138Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6497232Z 186 │ ) as NativeStackNavigationOptions) 2026-10-23T19:48:14.6497285Z ╰──── 2026-10-23T19:48:14.6497748Z  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-23T19:48:14.6498042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6498047Z 2026-10-23T19:48:14.6498205Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T19:48:14.6498333Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T19:48:14.6498444Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T19:48:14.6498540Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T19:48:14.6498640Z ·  ───────────────────────────── 2026-10-23T19:48:14.6498767Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T19:48:14.6498818Z ╰──── 2026-10-23T19:48:14.6498978Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T19:48:14.6498981Z 2026-10-23T19:48:14.6499213Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T19:48:14.6499338Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T19:48:14.6499396Z 730 │ ); 2026-10-23T19:48:14.6499571Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T19:48:14.6499669Z ·  ────── 2026-10-23T19:48:14.6499823Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T19:48:14.6499875Z ╰──── 2026-10-23T19:48:14.6500050Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T19:48:14.6500053Z 2026-10-23T19:48:14.6500528Z ⚠ 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-23T19:48:14.6500658Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T19:48:14.6500726Z 38 │ JSON.stringify( 2026-10-23T19:48:14.6500847Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T19:48:14.6500947Z ·  ──────────────────────── 2026-10-23T19:48:14.6501014Z 40 │ { name: "a" }, 2026-10-23T19:48:14.6501066Z ╰──── 2026-10-23T19:48:14.6501070Z 2026-10-23T19:48:14.6501283Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-23T19:48:14.6501408Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-23T19:48:14.6501461Z 78 │ 2026-10-23T19:48:14.6501599Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-23T19:48:14.6501757Z ·  ────────┬─────── 2026-10-23T19:48:14.6501941Z · ╰── 'describeSchedule' is declared here 2026-10-23T19:48:14.6502049Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-23T19:48:14.6502102Z ╰──── 2026-10-23T19:48:14.6502206Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6502209Z 2026-10-23T19:48:14.6502409Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-23T19:48:14.6502512Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-23T19:48:14.6502599Z 27 │ import * as Schema from "effect/Schema"; 2026-10-23T19:48:14.6502692Z 28 │ import { identity } from "effect/Function"; 2026-10-23T19:48:14.6502769Z ·  ────┬─── 2026-10-23T19:48:14.6502910Z · ╰── 'identity' is imported here 2026-10-23T19:48:14.6503000Z 29 │ import * as Layer from "effect/Layer"; 2026-10-23T19:48:14.6503051Z ╰──── 2026-10-23T19:48:14.6503149Z  help: Consider removing this import. 2026-10-23T19:48:14.6503152Z 2026-10-23T19:48:14.6503628Z ⚠ 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-23T19:48:14.6503813Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T19:48:14.6503886Z 520 │ })).delivery; 2026-10-23T19:48:14.6504087Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T19:48:14.6504210Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6504362Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T19:48:14.6504463Z 524 │ │ id: task.id, 2026-10-23T19:48:14.6504580Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T19:48:14.6504681Z 526 │ │ })).delivery; 2026-10-23T19:48:14.6504820Z 527 │ ╰─▶ } 2026-10-23T19:48:14.6504939Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T19:48:14.6504990Z ╰──── 2026-10-23T19:48:14.6504993Z 2026-10-23T19:48:14.6505432Z ⚠ 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-23T19:48:14.6505578Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T19:48:14.6505737Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T19:48:14.6505904Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T19:48:14.6506009Z ·  ──────────────────────── 2026-10-23T19:48:14.6506075Z 18 │ "review:write", 2026-10-23T19:48:14.6506129Z ╰──── 2026-10-23T19:48:14.6506131Z 2026-10-23T19:48:14.6506495Z ⚠ 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-23T19:48:14.6506609Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T19:48:14.6506675Z 19 │ ]); 2026-10-23T19:48:14.6506841Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T19:48:14.6506948Z ·  ──────────────────────── 2026-10-23T19:48:14.6507078Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T19:48:14.6507130Z ╰──── 2026-10-23T19:48:14.6507133Z 2026-10-23T19:48:14.6507495Z ⚠ 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-23T19:48:14.6507608Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T19:48:14.6507777Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T19:48:14.6507904Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T19:48:14.6508020Z ·  ──────────────────────── 2026-10-23T19:48:14.6508093Z 59 │ authenticated: true, 2026-10-23T19:48:14.6508144Z ╰──── 2026-10-23T19:48:14.6508147Z 2026-10-23T19:48:14.6508441Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6508569Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T19:48:14.6508624Z 217 │ 2026-10-23T19:48:14.6508773Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T19:48:14.6508866Z ·  ──────────┬────────── 2026-10-23T19:48:14.6509027Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T19:48:14.6509224Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T19:48:14.6509279Z ╰──── 2026-10-23T19:48:14.6509387Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6509390Z 2026-10-23T19:48:14.6509700Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6509852Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T19:48:14.6509904Z 220 │ 2026-10-23T19:48:14.6510038Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T19:48:14.6510141Z ·  ──────────────┬────────────── 2026-10-23T19:48:14.6510321Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T19:48:14.6510550Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T19:48:14.6510637Z ╰──── 2026-10-23T19:48:14.6510743Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6510745Z 2026-10-23T19:48:14.6510932Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6511072Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-23T19:48:14.6511234Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-23T19:48:14.6511325Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-23T19:48:14.6511408Z ·  ┬ 2026-10-23T19:48:14.6511543Z · ╰── '_' is declared here 2026-10-23T19:48:14.6511644Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T19:48:14.6511702Z ╰──── 2026-10-23T19:48:14.6511807Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6511809Z 2026-10-23T19:48:14.6511993Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6512128Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T19:48:14.6512185Z 133 │ ); 2026-10-23T19:48:14.6512291Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T19:48:14.6512389Z ·  ┬ 2026-10-23T19:48:14.6512531Z · ╰── '_' is declared here 2026-10-23T19:48:14.6512600Z 135 │ Effect.succeed( 2026-10-23T19:48:14.6512652Z ╰──── 2026-10-23T19:48:14.6512754Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6512763Z 2026-10-23T19:48:14.6512946Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6513080Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T19:48:14.6513137Z 177 │ }); 2026-10-23T19:48:14.6513236Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T19:48:14.6513324Z ·  ┬ 2026-10-23T19:48:14.6513459Z · ╰── '_' is declared here 2026-10-23T19:48:14.6513559Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T19:48:14.6513611Z ╰──── 2026-10-23T19:48:14.6513709Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6513712Z 2026-10-23T19:48:14.6513899Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6514036Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T19:48:14.6514092Z 202 │ ); 2026-10-23T19:48:14.6514188Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T19:48:14.6514279Z ·  ┬ 2026-10-23T19:48:14.6514416Z · ╰── '_' is declared here 2026-10-23T19:48:14.6514497Z 204 │ options.removeWorktreeFails 2026-10-23T19:48:14.6514548Z ╰──── 2026-10-23T19:48:14.6514647Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6514649Z 2026-10-23T19:48:14.6514829Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6514964Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T19:48:14.6515096Z 207 │ ); 2026-10-23T19:48:14.6515229Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T19:48:14.6515324Z ·  ┬ 2026-10-23T19:48:14.6515464Z · ╰── '_' is declared here 2026-10-23T19:48:14.6515550Z 209 │ options.deleteLocalBranchFails 2026-10-23T19:48:14.6515602Z ╰──── 2026-10-23T19:48:14.6515701Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6515704Z 2026-10-23T19:48:14.6515884Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6516017Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T19:48:14.6516073Z 212 │ ); 2026-10-23T19:48:14.6516187Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T19:48:14.6516293Z ·  ┬ 2026-10-23T19:48:14.6516439Z · ╰── '_' is declared here 2026-10-23T19:48:14.6516526Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T19:48:14.6516578Z ╰──── 2026-10-23T19:48:14.6516677Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6516680Z 2026-10-23T19:48:14.6516858Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6516993Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T19:48:14.6517050Z 253 │ ); 2026-10-23T19:48:14.6517145Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T19:48:14.6517232Z ·  ┬ 2026-10-23T19:48:14.6517373Z · ╰── '_' is declared here 2026-10-23T19:48:14.6517447Z 255 │ Effect.succeed({ 2026-10-23T19:48:14.6517500Z ╰──── 2026-10-23T19:48:14.6517600Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6517603Z 2026-10-23T19:48:14.6517786Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T19:48:14.6517922Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T19:48:14.6517980Z 263 │ ); 2026-10-23T19:48:14.6518130Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T19:48:14.6518225Z ·  ┬ 2026-10-23T19:48:14.6518364Z · ╰── '_' is declared here 2026-10-23T19:48:14.6518518Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T19:48:14.6518575Z ╰──── 2026-10-23T19:48:14.6518675Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6518677Z 2026-10-23T19:48:14.6519046Z ⚠ 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-23T19:48:14.6519173Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-23T19:48:14.6519314Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-23T19:48:14.6519446Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T19:48:14.6519556Z ·  ──────────────────────── 2026-10-23T19:48:14.6519813Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T19:48:14.6519904Z ╰──── 2026-10-23T19:48:14.6519907Z 2026-10-23T19:48:14.6520269Z ⚠ 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-23T19:48:14.6520398Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-23T19:48:14.6520500Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T19:48:14.6520661Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T19:48:14.6520777Z ·  ──────────────────────── 2026-10-23T19:48:14.6520843Z 256 │ return [ 2026-10-23T19:48:14.6520898Z ╰──── 2026-10-23T19:48:14.6520901Z 2026-10-23T19:48:14.6521061Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6521230Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T19:48:14.6521287Z 35 │ 2026-10-23T19:48:14.6521428Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T19:48:14.6521521Z ·  ────────┬──────── 2026-10-23T19:48:14.6521674Z · ╰── `inspectorProgress` originates here 2026-10-23T19:48:14.6521769Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T19:48:14.6521904Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T19:48:14.6521960Z 39 │ 2026-10-23T19:48:14.6522043Z 40 │ const onClosed = props.onClosed; 2026-10-23T19:48:14.6522116Z 41 │ useEffect(() => { 2026-10-23T19:48:14.6522212Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T19:48:14.6522442Z ·  ────────┬──────── 2026-10-23T19:48:14.6522610Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T19:48:14.6522730Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T19:48:14.6522818Z ╰──── 2026-10-23T19:48:14.6523168Z  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-23T19:48:14.6523495Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6523498Z 2026-10-23T19:48:14.6523693Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6523886Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T19:48:14.6524092Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T19:48:14.6524284Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T19:48:14.6524413Z ·  ──────────┬───────── 2026-10-23T19:48:14.6524602Z · ╰── `renderedContentWidth` originates here 2026-10-23T19:48:14.6524680Z 39 │ 2026-10-23T19:48:14.6524785Z 40 │ const onClosed = props.onClosed; 2026-10-23T19:48:14.6524898Z 41 │ useEffect(() => { 2026-10-23T19:48:14.6525023Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T19:48:14.6525242Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T19:48:14.6525325Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T19:48:14.6525450Z 45 │ (finished) => { 2026-10-23T19:48:14.6525624Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T19:48:14.6525738Z 47 │ runOnJS(onClosed)(); 2026-10-23T19:48:14.6525815Z 48 │ } 2026-10-23T19:48:14.6525909Z 49 │ }, 2026-10-23T19:48:14.6526010Z 50 │ ); 2026-10-23T19:48:14.6526176Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T19:48:14.6526271Z 52 │ renderedInspectorWidth.set( 2026-10-23T19:48:14.6526446Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T19:48:14.6526563Z 54 │ ); 2026-10-23T19:48:14.6526653Z 55 │ }, [ 2026-10-23T19:48:14.6526738Z 56 │ inspectorProgress, 2026-10-23T19:48:14.6526840Z 57 │ inspectorVisible, 2026-10-23T19:48:14.6526963Z 58 │ inspectorWidth, 2026-10-23T19:48:14.6527068Z 59 │ onClosed, 2026-10-23T19:48:14.6527158Z 60 │ renderedInspectorWidth, 2026-10-23T19:48:14.6527253Z 61 │ resizing, 2026-10-23T19:48:14.6527442Z 62 │ ]); 2026-10-23T19:48:14.6527562Z 63 │ 2026-10-23T19:48:14.6527644Z 64 │ useEffect(() => { 2026-10-23T19:48:14.6527770Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T19:48:14.6527896Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T19:48:14.6528033Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T19:48:14.6528147Z ·  ──────────┬───────── 2026-10-23T19:48:14.6528347Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T19:48:14.6528440Z 68 │ return; 2026-10-23T19:48:14.6528523Z ╰──── 2026-10-23T19:48:14.6528817Z  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-23T19:48:14.6529172Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6529178Z 2026-10-23T19:48:14.6529478Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6529637Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T19:48:14.6529729Z 168 │ 2026-10-23T19:48:14.6529874Z 169 │ const layerTest = Layer.succeed( 2026-10-23T19:48:14.6529985Z ·  ────┬──── 2026-10-23T19:48:14.6530249Z · ╰── 'layerTest' is declared here 2026-10-23T19:48:14.6530329Z 170 │ UsageService, 2026-10-23T19:48:14.6530422Z ╰──── 2026-10-23T19:48:14.6530570Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6530573Z 2026-10-23T19:48:14.6530875Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-23T19:48:14.6531088Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-23T19:48:14.6531183Z 14 │ import * as Layer from "effect/Layer"; 2026-10-23T19:48:14.6531399Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-23T19:48:14.6531520Z ·  ──┬── 2026-10-23T19:48:14.6531688Z · ╰── 'Scope' is imported here 2026-10-23T19:48:14.6531790Z 16 │ import * as Stream from "effect/Stream"; 2026-10-23T19:48:14.6531880Z ╰──── 2026-10-23T19:48:14.6532026Z  help: Consider removing this import. 2026-10-23T19:48:14.6532029Z 2026-10-23T19:48:14.6532545Z ⚠ 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-23T19:48:14.6532695Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-23T19:48:14.6532823Z 2382 │ let orphanedAt: number | undefined; 2026-10-23T19:48:14.6533112Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-23T19:48:14.6533372Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-23T19:48:14.6533560Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T19:48:14.6533712Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T19:48:14.6533849Z 2387 │ │ flush: () => { 2026-10-23T19:48:14.6534028Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T19:48:14.6534218Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T19:48:14.6534320Z 2390 │ │ }, 2026-10-23T19:48:14.6534430Z 2391 │ │ }; 2026-10-23T19:48:14.6534559Z 2392 │ │ 2026-10-23T19:48:14.6534754Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T19:48:14.6534878Z 2394 │ │ let requestChecks = 0; 2026-10-23T19:48:14.6535045Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T19:48:14.6535199Z 2396 │ │ executionMode: "async", 2026-10-23T19:48:14.6535363Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T19:48:14.6535501Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T19:48:14.6535674Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T19:48:14.6535811Z 2400 │ │ requestChecks += 1; 2026-10-23T19:48:14.6536008Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T19:48:14.6536256Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T19:48:14.6536374Z 2403 │ │ return true; 2026-10-23T19:48:14.6536497Z 2404 │ │ }, 2026-10-23T19:48:14.6536619Z 2405 │ │ }; 2026-10-23T19:48:14.6536732Z 2406 │ │ 2026-10-23T19:48:14.6536870Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T19:48:14.6537094Z 2408 │ │ ...WINDOW, 2026-10-23T19:48:14.6537291Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T19:48:14.6537539Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T19:48:14.6537635Z 2411 │ │ }; 2026-10-23T19:48:14.6537784Z 2412 │ │ const first = yield* service 2026-10-23T19:48:14.6537925Z 2413 │ │ .readSummary(input) 2026-10-23T19:48:14.6538055Z 2414 │ │ .pipe( 2026-10-23T19:48:14.6538179Z 2415 │ │ Effect.exit, 2026-10-23T19:48:14.6538381Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T19:48:14.6538525Z 2417 │ │ Effect.forkChild, 2026-10-23T19:48:14.6538648Z 2418 │ │ ); 2026-10-23T19:48:14.6538884Z 2419 │ │ requestFiber = first; 2026-10-23T19:48:14.6539039Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6539177Z 2421 │ │ dispatcher.flush(); 2026-10-23T19:48:14.6539280Z 2422 │ │ 2026-10-23T19:48:14.6539442Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T19:48:14.6539597Z 2424 │ │ Effect.match({ 2026-10-23T19:48:14.6539761Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T19:48:14.6539957Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T19:48:14.6540074Z 2427 │ │ }), 2026-10-23T19:48:14.6540266Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T19:48:14.6540418Z 2429 │ │ Effect.forkChild, 2026-10-23T19:48:14.6540536Z 2430 │ │ ); 2026-10-23T19:48:14.6540677Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T19:48:14.6540787Z 2432 │ │ dispatcher.flush(); 2026-10-23T19:48:14.6540971Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T19:48:14.6541124Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T19:48:14.6541274Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T19:48:14.6541402Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T19:48:14.6541636Z 2437 │ │ break; 2026-10-23T19:48:14.6541767Z 2438 │ │ } 2026-10-23T19:48:14.6541921Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T19:48:14.6542098Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T19:48:14.6542204Z 2441 │ │ } 2026-10-23T19:48:14.6542418Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T19:48:14.6542586Z 2443 │ ╰─▶ } 2026-10-23T19:48:14.6542659Z 2444 │ 2026-10-23T19:48:14.6542747Z ╰──── 2026-10-23T19:48:14.6542750Z 2026-10-23T19:48:14.6542997Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T19:48:14.6543226Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-23T19:48:14.6543345Z 294 │ } from "./device.ts"; 2026-10-23T19:48:14.6543479Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-23T19:48:14.6543579Z ·  ── 2026-10-23T19:48:14.6543691Z 296 │ import { 2026-10-23T19:48:14.6543758Z ╰──── 2026-10-23T19:48:14.6543880Z  help: Remove empty braces 2026-10-23T19:48:14.6543883Z 2026-10-23T19:48:14.6544228Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T19:48:14.6544407Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-23T19:48:14.6544514Z 20 │ [instanceId]: { 2026-10-23T19:48:14.6544609Z 21 │ ...(state[instanceId] ?? {}), 2026-10-23T19:48:14.6544754Z ·  ──────────────────────────── 2026-10-23T19:48:14.6544858Z 22 │ [model]: options, 2026-10-23T19:48:14.6544965Z ╰──── 2026-10-23T19:48:14.6545250Z  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-23T19:48:14.6545253Z 2026-10-23T19:48:14.6545748Z ⚠ 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-23T19:48:14.6545917Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T19:48:14.6546087Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T19:48:14.6546370Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T19:48:14.6546506Z ·  ──────────────────────── 2026-10-23T19:48:14.6546612Z 182 │ version: 1, 2026-10-23T19:48:14.6546689Z ╰──── 2026-10-23T19:48:14.6546692Z 2026-10-23T19:48:14.6546962Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T19:48:14.6547116Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-23T19:48:14.6547322Z 89 │ let cursor = prompt.length; 2026-10-23T19:48:14.6547461Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-23T19:48:14.6547603Z ·  ─────── 2026-10-23T19:48:14.6547710Z 91 │ let { start, end } = occurrence; 2026-10-23T19:48:14.6547804Z ╰──── 2026-10-23T19:48:14.6548115Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T19:48:14.6548121Z 2026-10-23T19:48:14.6548406Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6548568Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-23T19:48:14.6548725Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-23T19:48:14.6548823Z 84 │ useEffect(() => { 2026-10-23T19:48:14.6548927Z ·  ────┬──── 2026-10-23T19:48:14.6549097Z · ╰── This is the containing effect 2026-10-23T19:48:14.6549214Z 85 │ if (!actionState.isRunning) return; 2026-10-23T19:48:14.6549319Z 86 │ setNowMs(Date.now()); 2026-10-23T19:48:14.6549423Z ·  ────┬─── 2026-10-23T19:48:14.6549686Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6549915Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T19:48:14.6550104Z ╰──── 2026-10-23T19:48:14.6550739Z  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-23T19:48:14.6551103Z  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-23T19:48:14.6551106Z 2026-10-23T19:48:14.6551409Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T19:48:14.6551592Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T19:48:14.6551682Z 1619 │ 2026-10-23T19:48:14.6551934Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T19:48:14.6552079Z ·  ──────────────────┬────────────────── 2026-10-23T19:48:14.6552311Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T19:48:14.6552433Z 1621 │ const meta = response._meta; 2026-10-23T19:48:14.6552520Z ╰──── 2026-10-23T19:48:14.6552663Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6552665Z 2026-10-23T19:48:14.6552938Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6553125Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T19:48:14.6553212Z 407 │ 2026-10-23T19:48:14.6553320Z 408 │ const layer: Layer.Layer< 2026-10-23T19:48:14.6553409Z ·  ──┬── 2026-10-23T19:48:14.6553570Z · ╰── 'layer' is declared here 2026-10-23T19:48:14.6553791Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T19:48:14.6553882Z ╰──── 2026-10-23T19:48:14.6554002Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6554005Z 2026-10-23T19:48:14.6554201Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T19:48:14.6554376Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-23T19:48:14.6554469Z 265 │ 2026-10-23T19:48:14.6554614Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-23T19:48:14.6554707Z ·  ── 2026-10-23T19:48:14.6554797Z 267 │ } 2026-10-23T19:48:14.6554888Z ╰──── 2026-10-23T19:48:14.6555139Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T19:48:14.6555159Z 2026-10-23T19:48:14.6555441Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6555600Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-23T19:48:14.6555703Z 339 │ 2026-10-23T19:48:14.6555844Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-23T19:48:14.6555937Z ·  ────┬──── 2026-10-23T19:48:14.6556183Z · ╰── 'layerTest' is declared here 2026-10-23T19:48:14.6556405Z ╰──── 2026-10-23T19:48:14.6556549Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6556552Z 2026-10-23T19:48:14.6556735Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T19:48:14.6556915Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-23T19:48:14.6556995Z 465 │ 2026-10-23T19:48:14.6557163Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-23T19:48:14.6557250Z ·  ── 2026-10-23T19:48:14.6557339Z 467 │ } 2026-10-23T19:48:14.6557424Z ╰──── 2026-10-23T19:48:14.6557696Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T19:48:14.6557699Z 2026-10-23T19:48:14.6557892Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T19:48:14.6558088Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-23T19:48:14.6558174Z 1428 │ 2026-10-23T19:48:14.6558272Z 1429 │ for (const [] of [ 2026-10-23T19:48:14.6558374Z ·  ── 2026-10-23T19:48:14.6558492Z 1430 │ ["github", "github.com"], 2026-10-23T19:48:14.6558579Z ╰──── 2026-10-23T19:48:14.6558993Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T19:48:14.6558996Z 2026-10-23T19:48:14.6559281Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-23T19:48:14.6559422Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-23T19:48:14.6559513Z 55 │ 2026-10-23T19:48:14.6559658Z 56 │ function normalizeTerminalContextSelection( 2026-10-23T19:48:14.6559828Z ·  ────────────────┬──────────────── 2026-10-23T19:48:14.6560050Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-23T19:48:14.6560184Z 57 │ selection: TerminalContextSelection, 2026-10-23T19:48:14.6560269Z ╰──── 2026-10-23T19:48:14.6560410Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6560413Z 2026-10-23T19:48:14.6560635Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T19:48:14.6560790Z ╭─[apps/mobile/src/Stack.tsx:1044:21] 2026-10-23T19:48:14.6560887Z 1043 │ } 2026-10-23T19:48:14.6561327Z ·  ───────────────────────────────────────────── 2026-10-23T19:48:14.6561434Z 1045 │ screenListeners={{ 2026-10-23T19:48:14.6561534Z ╰──── 2026-10-23T19:48:14.6562027Z  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-23T19:48:14.6562030Z 2026-10-23T19:48:14.6562361Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6562534Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-23T19:48:14.6562645Z 345 │ 2026-10-23T19:48:14.6562783Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-23T19:48:14.6562917Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6563108Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-23T19:48:14.6566736Z 347 │ ProviderAdapterRegistryV2, 2026-10-23T19:48:14.6566799Z ╰──── 2026-10-23T19:48:14.6566910Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6566913Z 2026-10-23T19:48:14.6567178Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6567332Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-23T19:48:14.6567473Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-23T19:48:14.6567543Z 356 │ useEffect(() => { 2026-10-23T19:48:14.6567625Z ·  ────┬──── 2026-10-23T19:48:14.6567764Z · ╰── This is the containing effect 2026-10-23T19:48:14.6567855Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T19:48:14.6567920Z 358 │ return; 2026-10-23T19:48:14.6567977Z 359 │ } 2026-10-23T19:48:14.6568076Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T19:48:14.6568171Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T19:48:14.6568278Z ·  ──────────────┬────────────── 2026-10-23T19:48:14.6568460Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6568523Z 362 │ return; 2026-10-23T19:48:14.6568574Z ╰──── 2026-10-23T19:48:14.6569182Z  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-23T19:48:14.6569513Z  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-23T19:48:14.6569516Z 2026-10-23T19:48:14.6569809Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6569965Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T19:48:14.6570018Z 447 │ 2026-10-23T19:48:14.6570085Z 448 │ useEffect(() => { 2026-10-23T19:48:14.6570158Z ·  ────┬──── 2026-10-23T19:48:14.6570392Z · ╰── This is the containing effect 2026-10-23T19:48:14.6570534Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T19:48:14.6570596Z 450 │ return; 2026-10-23T19:48:14.6570652Z 451 │ } 2026-10-23T19:48:14.6570800Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T19:48:14.6570935Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T19:48:14.6571047Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T19:48:14.6571104Z 455 │ } 2026-10-23T19:48:14.6571344Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T19:48:14.6571473Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T19:48:14.6571580Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T19:48:14.6571654Z 459 │ const directProject = 2026-10-23T19:48:14.6571731Z 460 │ projects.find( 2026-10-23T19:48:14.6571801Z 461 │ (project) => 2026-10-23T19:48:14.6571977Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T19:48:14.6572041Z 463 │ ) ?? null; 2026-10-23T19:48:14.6572094Z 464 │ 2026-10-23T19:48:14.6572163Z 465 │ if (directProject) { 2026-10-23T19:48:14.6572306Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T19:48:14.6572445Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T19:48:14.6572611Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T19:48:14.6572749Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T19:48:14.6572814Z 470 │ return; 2026-10-23T19:48:14.6572881Z 471 │ } 2026-10-23T19:48:14.6572983Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T19:48:14.6573044Z 473 │ if ( 2026-10-23T19:48:14.6573189Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T19:48:14.6573293Z 475 │ selectedProject.id !== directProject.id 2026-10-23T19:48:14.6573352Z 476 │ ) { 2026-10-23T19:48:14.6573439Z 477 │ setProject(directProject); 2026-10-23T19:48:14.6573504Z 478 │ return; 2026-10-23T19:48:14.6573565Z 479 │ } 2026-10-23T19:48:14.6573647Z 480 │ if (!flow.draftKey) return; 2026-10-23T19:48:14.6573788Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T19:48:14.6573933Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T19:48:14.6574051Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T19:48:14.6574132Z 484 │ workspaceSelection: { 2026-10-23T19:48:14.6574203Z 485 │ mode: "local", 2026-10-23T19:48:14.6574311Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T19:48:14.6574450Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T19:48:14.6574532Z 488 │ startFromOrigin: false, 2026-10-23T19:48:14.6574595Z 489 │ }, 2026-10-23T19:48:14.6574655Z 490 │ }); 2026-10-23T19:48:14.6574713Z 491 │ } 2026-10-23T19:48:14.6574842Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T19:48:14.6574903Z 493 │ if ( 2026-10-23T19:48:14.6575046Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T19:48:14.6575250Z 495 │ selectedProject.id === directProject.id 2026-10-23T19:48:14.6575350Z 496 │ ) { 2026-10-23T19:48:14.6575414Z 497 │ return; 2026-10-23T19:48:14.6575471Z 498 │ } 2026-10-23T19:48:14.6575553Z 499 │ setProject(directProject); 2026-10-23T19:48:14.6575614Z 500 │ return; 2026-10-23T19:48:14.6575671Z 501 │ } 2026-10-23T19:48:14.6575725Z 502 │ 2026-10-23T19:48:14.6575804Z 503 │ if (projects.length > 0) { 2026-10-23T19:48:14.6575903Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T19:48:14.6576013Z ·  ──────────────┬────────────── 2026-10-23T19:48:14.6576199Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6576255Z 505 │ } 2026-10-23T19:48:14.6576308Z ╰──── 2026-10-23T19:48:14.6576913Z  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-23T19:48:14.6577240Z  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-23T19:48:14.6577243Z 2026-10-23T19:48:14.6577501Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6577654Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T19:48:14.6577708Z 545 │ 2026-10-23T19:48:14.6577775Z 546 │ useEffect(() => { 2026-10-23T19:48:14.6577853Z ·  ────┬──── 2026-10-23T19:48:14.6577987Z · ╰── This is the containing effect 2026-10-23T19:48:14.6578085Z 547 │ const shareId = props.incomingShareId; 2026-10-23T19:48:14.6578168Z 548 │ const draftKey = flow.draftKey; 2026-10-23T19:48:14.6578270Z 549 │ const destinationProject = selectedProject; 2026-10-23T19:48:14.6578412Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T19:48:14.6578541Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T19:48:14.6578633Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T19:48:14.6578711Z 553 │ !initialEnvironmentId || 2026-10-23T19:48:14.6578781Z 554 │ !initialProjectId || 2026-10-23T19:48:14.6578914Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T19:48:14.6579029Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T19:48:14.6579090Z 557 │ if ( 2026-10-23T19:48:14.6579153Z 558 │ !shareId || 2026-10-23T19:48:14.6579218Z 559 │ !draftKey || 2026-10-23T19:48:14.6579291Z 560 │ !destinationProject || 2026-10-23T19:48:14.6579379Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T19:48:14.6579470Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T19:48:14.6579528Z 563 │ ) { 2026-10-23T19:48:14.6579589Z 564 │ return; 2026-10-23T19:48:14.6579644Z 565 │ } 2026-10-23T19:48:14.6579739Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T19:48:14.6579835Z 567 │ if ( 2026-10-23T19:48:14.6579949Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T19:48:14.6580063Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T19:48:14.6580119Z 570 │ ) { 2026-10-23T19:48:14.6580255Z 571 │ return; 2026-10-23T19:48:14.6580341Z 572 │ } 2026-10-23T19:48:14.6580393Z 573 │ 2026-10-23T19:48:14.6580464Z 574 │ if (!incomingShare) { 2026-10-23T19:48:14.6580664Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T19:48:14.6580797Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T19:48:14.6580863Z 577 │ Dialog.alert( 2026-10-23T19:48:14.6580949Z 578 │ "Shared content unavailable", 2026-10-23T19:48:14.6581124Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T19:48:14.6581185Z 580 │ ); 2026-10-23T19:48:14.6581240Z 581 │ } 2026-10-23T19:48:14.6581300Z 582 │ return; 2026-10-23T19:48:14.6581355Z 583 │ } 2026-10-23T19:48:14.6581414Z 584 │ 2026-10-23T19:48:14.6581475Z 585 │ if ( 2026-10-23T19:48:14.6581637Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T19:48:14.6581741Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T19:48:14.6581796Z 588 │ ) { 2026-10-23T19:48:14.6581855Z 589 │ return; 2026-10-23T19:48:14.6581909Z 590 │ } 2026-10-23T19:48:14.6581962Z 591 │ 2026-10-23T19:48:14.6582102Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T19:48:14.6582227Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T19:48:14.6582283Z 594 │ } 2026-10-23T19:48:14.6582391Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T19:48:14.6582459Z 596 │ const draftBackup = 2026-10-23T19:48:14.6582651Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T19:48:14.6582793Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T19:48:14.6582884Z 599 │ const importToken = Symbol(importKey); 2026-10-23T19:48:14.6582962Z 600 │ let didReserveShare = false; 2026-10-23T19:48:14.6583039Z 601 │ let didConsumeShare = false; 2026-10-23T19:48:14.6583122Z 602 │ let needsDraftRestore = false; 2026-10-23T19:48:14.6583234Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T19:48:14.6583318Z 604 │ setImportingShareKey(importKey); 2026-10-23T19:48:14.6583407Z ·  ──────────┬───────── 2026-10-23T19:48:14.6583582Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6583650Z 605 │ void (async () => { 2026-10-23T19:48:14.6583702Z ╰──── 2026-10-23T19:48:14.6584306Z  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-23T19:48:14.6584629Z  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-23T19:48:14.6584632Z 2026-10-23T19:48:14.6584837Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6584992Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T19:48:14.6585067Z 523 │ props.initialProjectRef, 2026-10-23T19:48:14.6585141Z 524 │ props.incomingShareId, 2026-10-23T19:48:14.6585304Z ·  ──────────┬────────── 2026-10-23T19:48:14.6585513Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T19:48:14.6585585Z 525 │ props.pendingTaskId, 2026-10-23T19:48:14.6585638Z ╰──── 2026-10-23T19:48:14.6585934Z  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-23T19:48:14.6586245Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6586247Z 2026-10-23T19:48:14.6586464Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6586619Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T19:48:14.6586740Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T19:48:14.6586811Z 543 │ flow.loadBranches(); 2026-10-23T19:48:14.6586883Z ·  ──┬─ 2026-10-23T19:48:14.6587010Z · ╰── Missing dependency `flow` 2026-10-23T19:48:14.6587103Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T19:48:14.6587190Z ·  ────────┬──────── 2026-10-23T19:48:14.6587391Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T19:48:14.6587444Z 545 │ 2026-10-23T19:48:14.6587498Z ╰──── 2026-10-23T19:48:14.6587925Z  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-23T19:48:14.6588240Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6588242Z 2026-10-23T19:48:14.6588442Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6588593Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T19:48:14.6588658Z 765 │ flow.draftKey, 2026-10-23T19:48:14.6588736Z 766 │ hasImportedIncomingShare, 2026-10-23T19:48:14.6588828Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6589006Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T19:48:14.6589147Z 767 │ incomingShare, 2026-10-23T19:48:14.6589270Z 768 │ isIncomingShareInboxLoading, 2026-10-23T19:48:14.6589367Z ·  ─────────────┬───────────── 2026-10-23T19:48:14.6589551Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T19:48:14.6589632Z 769 │ isIncomingShareUnavailable, 2026-10-23T19:48:14.6589705Z 770 │ props.incomingShareId, 2026-10-23T19:48:14.6589834Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T19:48:14.6589925Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T19:48:14.6590000Z 773 │ releaseShareReservation, 2026-10-23T19:48:14.6590067Z 774 │ reserveShare, 2026-10-23T19:48:14.6590153Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T19:48:14.6590221Z 776 │ selectedProject, 2026-10-23T19:48:14.6590291Z 777 │ shareImportAttempt, 2026-10-23T19:48:14.6590385Z ·  ─────────┬──────── 2026-10-23T19:48:14.6590554Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T19:48:14.6590610Z 778 │ ]); 2026-10-23T19:48:14.6590663Z ╰──── 2026-10-23T19:48:14.6590956Z  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-23T19:48:14.6591265Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6591269Z 2026-10-23T19:48:14.6591552Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T19:48:14.6591688Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-23T19:48:14.6591748Z 284 │ }, 2026-10-23T19:48:14.6591830Z 285 │ (effect, flow, stopSessions) => 2026-10-23T19:48:14.6591922Z ·  ──────┬───── 2026-10-23T19:48:14.6592071Z · ╰── 'stopSessions' is declared here 2026-10-23T19:48:14.6592138Z 286 │ effect.pipe( 2026-10-23T19:48:14.6592190Z ╰──── 2026-10-23T19:48:14.6592293Z  help: Consider removing this parameter. 2026-10-23T19:48:14.6592296Z 2026-10-23T19:48:14.6592512Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6592685Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-23T19:48:14.6592767Z 369 │ mountedRef.current = false; 2026-10-23T19:48:14.6592849Z 370 │ flow.setBranchQuery(""); 2026-10-23T19:48:14.6592923Z ·  ──┬─ 2026-10-23T19:48:14.6593051Z · ╰── Missing dependency `flow` 2026-10-23T19:48:14.6593108Z 371 │ }; 2026-10-23T19:48:14.6593181Z 372 │ }, [flow.setBranchQuery]); 2026-10-23T19:48:14.6593269Z ·  ─────────┬───────── 2026-10-23T19:48:14.6593477Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T19:48:14.6593530Z 373 │ 2026-10-23T19:48:14.6593581Z ╰──── 2026-10-23T19:48:14.6594002Z  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-23T19:48:14.6594383Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6594419Z 2026-10-23T19:48:14.6594848Z ⚠ 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-23T19:48:14.6594997Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T19:48:14.6595077Z 262 │ ...(update._meta !== undefined 2026-10-23T19:48:14.6595246Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T19:48:14.6595335Z ·  ───────── 2026-10-23T19:48:14.6595397Z 264 │ : {}), 2026-10-23T19:48:14.6595448Z ╰──── 2026-10-23T19:48:14.6595455Z 2026-10-23T19:48:14.6595670Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T19:48:14.6595809Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T19:48:14.6595863Z 21 │ 2026-10-23T19:48:14.6596018Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T19:48:14.6596105Z ·  ────────┬─────── 2026-10-23T19:48:14.6596256Z · ╰── 'summarizePayload' is declared here 2026-10-23T19:48:14.6596364Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T19:48:14.6596415Z ╰──── 2026-10-23T19:48:14.6596521Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6596524Z 2026-10-23T19:48:14.6596720Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T19:48:14.6596870Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T19:48:14.6596925Z  80 │ 2026-10-23T19:48:14.6597201Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T19:48:14.6597325Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T19:48:14.6597448Z  83 │ │ ): Effect.fn.Return { 2026-10-23T19:48:14.6597617Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T19:48:14.6597754Z  85 │ │ const connections = new Map(); 2026-10-23T19:48:14.6597825Z  86 │ │ 2026-10-23T19:48:14.6598047Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T19:48:14.6598149Z  88 │ │ Effect.suspend(() => { 2026-10-23T19:48:14.6598288Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T19:48:14.6598399Z  90 │ │ return connection === undefined 2026-10-23T19:48:14.6598616Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T19:48:14.6598729Z  92 │ │ : Effect.succeed(connection); 2026-10-23T19:48:14.6598805Z  93 │ │ }); 2026-10-23T19:48:14.6598876Z  94 │ │ 2026-10-23T19:48:14.6598963Z  95 │ │ const send = ( 2026-10-23T19:48:14.6599134Z  96 │ │ connection: Connection, 2026-10-23T19:48:14.6599258Z  97 │ │ message: unknown, 2026-10-23T19:48:14.6599417Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T19:48:14.6599534Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T19:48:14.6599640Z 100 │ │ Effect.gen(function* () { 2026-10-23T19:48:14.6599795Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T19:48:14.6599939Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T19:48:14.6600154Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T19:48:14.6600235Z 104 │ │ } 2026-10-23T19:48:14.6600373Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T19:48:14.6600476Z 106 │ │ try: (signal) => 2026-10-23T19:48:14.6600608Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T19:48:14.6600711Z 108 │ │ method: "POST", 2026-10-23T19:48:14.6600803Z 109 │ │ signal, 2026-10-23T19:48:14.6600901Z 110 │ │ headers: { 2026-10-23T19:48:14.6601029Z 111 │ │ "content-type": "application/json", 2026-10-23T19:48:14.6601171Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T19:48:14.6601303Z 113 │ │ authorization: options.authorization, 2026-10-23T19:48:14.6601436Z 114 │ │ ...(connection.sessionId === null 2026-10-23T19:48:14.6601533Z 115 │ │ ? {} 2026-10-23T19:48:14.6601679Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T19:48:14.6601812Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T19:48:14.6601905Z 118 │ │ ? {} 2026-10-23T19:48:14.6602073Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T19:48:14.6602158Z 120 │ │ }, 2026-10-23T19:48:14.6602247Z 121 │ │ body, 2026-10-23T19:48:14.6602332Z 122 │ │ }), 2026-10-23T19:48:14.6602440Z 123 │ │ catch: bridgeError, 2026-10-23T19:48:14.6602525Z 124 │ │ }); 2026-10-23T19:48:14.6602736Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T19:48:14.6602838Z 126 │ │ if (!response.ok) { 2026-10-23T19:48:14.6602946Z 127 │ │ yield* Effect.promise( 2026-10-23T19:48:14.6603130Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T19:48:14.6603211Z 129 │ │ ); 2026-10-23T19:48:14.6603323Z 130 │ │ return yield* Effect.fail( 2026-10-23T19:48:14.6603534Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T19:48:14.6603688Z 132 │ │ ); 2026-10-23T19:48:14.6603798Z 133 │ │ } 2026-10-23T19:48:14.6604008Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T19:48:14.6604129Z 135 │ │ for (const payload of payloads) { 2026-10-23T19:48:14.6604346Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T19:48:14.6604424Z 137 │ │ } 2026-10-23T19:48:14.6604522Z 138 │ │ return payloads; 2026-10-23T19:48:14.6604646Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T19:48:14.6604722Z 140 │ │ ); 2026-10-23T19:48:14.6604792Z 141 │ │ 2026-10-23T19:48:14.6604972Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T19:48:14.6605101Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T19:48:14.6605286Z 144 │ │ ): Effect.fn.Return { 2026-10-23T19:48:14.6605449Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T19:48:14.6605575Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T19:48:14.6605698Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T19:48:14.6605802Z 148 │ │ if (sessionId !== null) { 2026-10-23T19:48:14.6605932Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T19:48:14.6606033Z 150 │ │ try: (signal) => 2026-10-23T19:48:14.6606166Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T19:48:14.6606266Z 152 │ │ method: "DELETE", 2026-10-23T19:48:14.6606356Z 153 │ │ signal, 2026-10-23T19:48:14.6606450Z 154 │ │ headers: { 2026-10-23T19:48:14.6606581Z 155 │ │ authorization: options.authorization, 2026-10-23T19:48:14.6606700Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T19:48:14.6606833Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T19:48:14.6606923Z 158 │ │ ? {} 2026-10-23T19:48:14.6607092Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T19:48:14.6607179Z 160 │ │ }, 2026-10-23T19:48:14.6607260Z 161 │ │ }), 2026-10-23T19:48:14.6607359Z 162 │ │ catch: bridgeError, 2026-10-23T19:48:14.6607437Z 163 │ │ }); 2026-10-23T19:48:14.6607571Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T19:48:14.6607682Z 165 │ │ return yield* Effect.fail( 2026-10-23T19:48:14.6607790Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T19:48:14.6607976Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T19:48:14.6608058Z 168 │ │ ), 2026-10-23T19:48:14.6608138Z 169 │ │ ); 2026-10-23T19:48:14.6608284Z 170 │ │ } 2026-10-23T19:48:14.6608432Z 171 │ │ yield* Effect.promise( 2026-10-23T19:48:14.6608611Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T19:48:14.6608689Z 173 │ │ ); 2026-10-23T19:48:14.6608762Z 174 │ │ } 2026-10-23T19:48:14.6608846Z 175 │ │ return {}; 2026-10-23T19:48:14.6608920Z 176 │ │ }); 2026-10-23T19:48:14.6608989Z 177 │ │ 2026-10-23T19:48:14.6609067Z 178 │ │ return { 2026-10-23T19:48:14.6609241Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T19:48:14.6609370Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T19:48:14.6609481Z 181 │ │ return yield* Effect.fail( 2026-10-23T19:48:14.6609665Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T19:48:14.6609743Z 183 │ │ ); 2026-10-23T19:48:14.6609850Z 184 │ │ } 2026-10-23T19:48:14.6609978Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T19:48:14.6610189Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T19:48:14.6610264Z 187 │ │ } 2026-10-23T19:48:14.6610422Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T19:48:14.6610544Z 189 │ │ connections.set(connectionId, { 2026-10-23T19:48:14.6610666Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T19:48:14.6610763Z 191 │ │ sessionId: null, 2026-10-23T19:48:14.6610871Z 192 │ │ protocolVersion: null, 2026-10-23T19:48:14.6610972Z 193 │ │ nextRequestId: 0, 2026-10-23T19:48:14.6611050Z 194 │ │ }); 2026-10-23T19:48:14.6611154Z 195 │ │ return { connectionId }; 2026-10-23T19:48:14.6611231Z 196 │ │ }), 2026-10-23T19:48:14.6611608Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T19:48:14.6611772Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T19:48:14.6611901Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T19:48:14.6612032Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T19:48:14.6612130Z 201 │ │ jsonrpc: "2.0", 2026-10-23T19:48:14.6612211Z 202 │ │ id, 2026-10-23T19:48:14.6612315Z 203 │ │ method: request.method, 2026-10-23T19:48:14.6612476Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T19:48:14.6612554Z 205 │ │ }); 2026-10-23T19:48:14.6612743Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T19:48:14.6612865Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T19:48:14.6613058Z 208 │ │ if (envelope === null) { 2026-10-23T19:48:14.6613209Z 209 │ │ return yield* Effect.fail( 2026-10-23T19:48:14.6613398Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T19:48:14.6613476Z 211 │ │ ); 2026-10-23T19:48:14.6613553Z 212 │ │ } 2026-10-23T19:48:14.6613670Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T19:48:14.6613869Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T19:48:14.6613943Z 215 │ │ } 2026-10-23T19:48:14.6614117Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T19:48:14.6614193Z 217 │ │ }), 2026-10-23T19:48:14.6614391Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T19:48:14.6614558Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T19:48:14.6614664Z 220 │ │ yield* send(connection, { 2026-10-23T19:48:14.6614762Z 221 │ │ jsonrpc: "2.0", 2026-10-23T19:48:14.6614865Z 222 │ │ method: request.method, 2026-10-23T19:48:14.6615023Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T19:48:14.6615101Z 224 │ │ }); 2026-10-23T19:48:14.6615176Z 225 │ │ }), 2026-10-23T19:48:14.6615262Z 226 │ │ disconnect, 2026-10-23T19:48:14.6615376Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T19:48:14.6615477Z 228 │ │ Effect.forEach( 2026-10-23T19:48:14.6615583Z 229 │ │ [...connections.keys()], 2026-10-23T19:48:14.6615756Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T19:48:14.6615856Z 231 │ │ { discard: true }, 2026-10-23T19:48:14.6615934Z 232 │ │ ), 2026-10-23T19:48:14.6616011Z 233 │ │ ), 2026-10-23T19:48:14.6616087Z 234 │ │ }; 2026-10-23T19:48:14.6616214Z 235 │ ╰─▶ }); 2026-10-23T19:48:14.6616268Z ╰──── 2026-10-23T19:48:14.6616697Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T19:48:14.6616769Z 2026-10-23T19:48:14.6617110Z ⚠ 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-23T19:48:14.6617258Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T19:48:14.6617419Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T19:48:14.6617591Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T19:48:14.6617679Z ·  ───────── 2026-10-23T19:48:14.6617862Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T19:48:14.6617914Z ╰──── 2026-10-23T19:48:14.6617917Z 2026-10-23T19:48:14.6618259Z ⚠ 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-23T19:48:14.6618408Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T19:48:14.6618579Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T19:48:14.6618758Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T19:48:14.6618843Z ·  ───────── 2026-10-23T19:48:14.6618899Z 52 │ } 2026-10-23T19:48:14.6618951Z ╰──── 2026-10-23T19:48:14.6618954Z 2026-10-23T19:48:14.6619285Z ⚠ 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-23T19:48:14.6619431Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T19:48:14.6619498Z 54 │ assert.equal( 2026-10-23T19:48:14.6619670Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T19:48:14.6619744Z ·  ───────── 2026-10-23T19:48:14.6619828Z 56 │ true, 2026-10-23T19:48:14.6619880Z ╰──── 2026-10-23T19:48:14.6619883Z 2026-10-23T19:48:14.6620216Z ⚠ 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-23T19:48:14.6620358Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T19:48:14.6620419Z 58 │ assert.equal( 2026-10-23T19:48:14.6620609Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T19:48:14.6620685Z ·  ───────── 2026-10-23T19:48:14.6620743Z 60 │ true, 2026-10-23T19:48:14.6620794Z ╰──── 2026-10-23T19:48:14.6620796Z 2026-10-23T19:48:14.6621128Z ⚠ 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-23T19:48:14.6621279Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T19:48:14.6621334Z 102 │ 2026-10-23T19:48:14.6621503Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T19:48:14.6621590Z ·  ───────── 2026-10-23T19:48:14.6621646Z 104 │ }); 2026-10-23T19:48:14.6621699Z ╰──── 2026-10-23T19:48:14.6621701Z 2026-10-23T19:48:14.6622029Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6622215Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-23T19:48:14.6622376Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-23T19:48:14.6622443Z 29 │ useEffect(() => { 2026-10-23T19:48:14.6622514Z ·  ────┬──── 2026-10-23T19:48:14.6622646Z · ╰── This is the containing effect 2026-10-23T19:48:14.6622770Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T19:48:14.6622877Z ·  ───┬─── 2026-10-23T19:48:14.6623073Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6623152Z 31 │ }, [key, live, snapshot]); 2026-10-23T19:48:14.6623207Z ╰──── 2026-10-23T19:48:14.6623815Z  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-23T19:48:14.6624140Z  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-23T19:48:14.6624143Z 2026-10-23T19:48:14.6624400Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6624542Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T19:48:14.6624603Z 3754 │ 2026-10-23T19:48:14.6624809Z 3755 │ const layer: Layer.Layer = 2026-10-23T19:48:14.6624882Z ·  ──┬── 2026-10-23T19:48:14.6625008Z · ╰── 'layer' is declared here 2026-10-23T19:48:14.6625074Z 3756 │ Layer.effect( 2026-10-23T19:48:14.6625129Z ╰──── 2026-10-23T19:48:14.6625233Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6625237Z 2026-10-23T19:48:14.6625405Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T19:48:14.6625596Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T19:48:14.6625650Z 52 │ 2026-10-23T19:48:14.6625717Z 53 │ for (const {} of [ 2026-10-23T19:48:14.6625795Z ·  ── 2026-10-23T19:48:14.6625865Z 54 │ { healthy: true }, 2026-10-23T19:48:14.6625918Z ╰──── 2026-10-23T19:48:14.6626148Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T19:48:14.6626151Z 2026-10-23T19:48:14.6626336Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T19:48:14.6626493Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T19:48:14.6626666Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T19:48:14.6626746Z 602 │ const gesture = Gesture.Pan() 2026-10-23T19:48:14.6626834Z ·  ─┬─ 2026-10-23T19:48:14.6627055Z · ╰── `Pan` may be a component 2026-10-23T19:48:14.6627162Z 603 │ .enabled(!props.disabled) 2026-10-23T19:48:14.6627214Z ╰──── 2026-10-23T19:48:14.6627487Z  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-23T19:48:14.6627931Z  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-23T19:48:14.6627934Z 2026-10-23T19:48:14.6628194Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6628359Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-23T19:48:14.6628485Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-23T19:48:14.6628552Z 284 │ useEffect(() => { 2026-10-23T19:48:14.6628626Z ·  ────┬──── 2026-10-23T19:48:14.6628760Z · ╰── This is the containing effect 2026-10-23T19:48:14.6628847Z 285 │ setNow(new Date().toISOString()); 2026-10-23T19:48:14.6628916Z ·  ───┬── 2026-10-23T19:48:14.6629083Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6629223Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T19:48:14.6629276Z ╰──── 2026-10-23T19:48:14.6629992Z  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-23T19:48:14.6630318Z  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-23T19:48:14.6630321Z 2026-10-23T19:48:14.6630524Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6630690Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T19:48:14.6630823Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T19:48:14.6630913Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T19:48:14.6631016Z ·  ───────┬────── 2026-10-23T19:48:14.6631190Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T19:48:14.6631305Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T19:48:14.6631356Z ╰──── 2026-10-23T19:48:14.6631649Z  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-23T19:48:14.6631959Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6631962Z 2026-10-23T19:48:14.6632131Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6632295Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T19:48:14.6632469Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T19:48:14.6632663Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T19:48:14.6632787Z ·  ─────┬──── 2026-10-23T19:48:14.6632956Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6633036Z 357 │ const id = setTimeout(() => { 2026-10-23T19:48:14.6633089Z ╰──── 2026-10-23T19:48:14.6633375Z  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-23T19:48:14.6633668Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6633670Z 2026-10-23T19:48:14.6634122Z ⚠ 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-23T19:48:14.6634252Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-23T19:48:14.6634424Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-23T19:48:14.6634613Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T19:48:14.6634730Z ·  ─────────────────── 2026-10-23T19:48:14.6634839Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T19:48:14.6634893Z ╰──── 2026-10-23T19:48:14.6634896Z 2026-10-23T19:48:14.6635348Z ⚠ 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-23T19:48:14.6635474Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-23T19:48:14.6635659Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-23T19:48:14.6635769Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-23T19:48:14.6635886Z ·  ─────────────────── 2026-10-23T19:48:14.6636006Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-23T19:48:14.6636059Z ╰──── 2026-10-23T19:48:14.6636061Z 2026-10-23T19:48:14.6636258Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-23T19:48:14.6636407Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-23T19:48:14.6636546Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-23T19:48:14.6636663Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-23T19:48:14.6636735Z ·  ──┬── 2026-10-23T19:48:14.6636863Z · ╰── 'Image' is imported here 2026-10-23T19:48:14.6636917Z 18 │ 2026-10-23T19:48:14.6636969Z ╰──── 2026-10-23T19:48:14.6637068Z  help: Consider removing this import. 2026-10-23T19:48:14.6637071Z 2026-10-23T19:48:14.6637276Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T19:48:14.6637419Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-23T19:48:14.6637656Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T19:48:14.6637781Z 224 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6637875Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6638341Z · ╰── 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-23T19:48:14.6638416Z 225 │ mostRecentEventCount, 2026-10-23T19:48:14.6638472Z 226 │ ); 2026-10-23T19:48:14.6638597Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T19:48:14.6638734Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T19:48:14.6638945Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6639032Z 228 │ const assumedValue = props.value; 2026-10-23T19:48:14.6639085Z ╰──── 2026-10-23T19:48:14.6639256Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T19:48:14.6639567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6639570Z 2026-10-23T19:48:14.6639812Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6639955Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-23T19:48:14.6640101Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T19:48:14.6640198Z 235 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6640292Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6640750Z · ╰── 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-23T19:48:14.6640823Z 236 │ controlledEventCount, 2026-10-23T19:48:14.6640889Z 237 │ assumedValue, 2026-10-23T19:48:14.6640945Z 238 │ ); 2026-10-23T19:48:14.6641101Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T19:48:14.6641240Z ·  ───────────┬────────── 2026-10-23T19:48:14.6641519Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T19:48:14.6641641Z 240 │ const acceptNativeEvent = useCallback( 2026-10-23T19:48:14.6641692Z ╰──── 2026-10-23T19:48:14.6642117Z  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-23T19:48:14.6642429Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6642432Z 2026-10-23T19:48:14.6642578Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6642724Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T19:48:14.6642853Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T19:48:14.6642969Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T19:48:14.6643089Z ·  ─────────────┬──────────── 2026-10-23T19:48:14.6643256Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6643313Z 161 │ }); 2026-10-23T19:48:14.6643367Z ╰──── 2026-10-23T19:48:14.6643834Z  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-23T19:48:14.6644131Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6644136Z 2026-10-23T19:48:14.6644282Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6644425Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T19:48:14.6644549Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T19:48:14.6644663Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T19:48:14.6644781Z ·  ─────────────┬──────────── 2026-10-23T19:48:14.6644988Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6645045Z 161 │ }); 2026-10-23T19:48:14.6645097Z ╰──── 2026-10-23T19:48:14.6645566Z  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-23T19:48:14.6645857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6645861Z 2026-10-23T19:48:14.6646005Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6646149Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-23T19:48:14.6646205Z 161 │ }); 2026-10-23T19:48:14.6646297Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T19:48:14.6646432Z ·  ─────────┬────────────┬─── 2026-10-23T19:48:14.6646700Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6646847Z · ╰── This value is a ref 2026-10-23T19:48:14.6646921Z 163 │ return JSON.stringify( 2026-10-23T19:48:14.6646972Z ╰──── 2026-10-23T19:48:14.6647434Z  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-23T19:48:14.6647722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6647725Z 2026-10-23T19:48:14.6647870Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6648017Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-23T19:48:14.6648090Z 203 │ mostRecentEventCount, 2026-10-23T19:48:14.6648179Z 204 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6648285Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6648474Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6648530Z 205 │ ); 2026-10-23T19:48:14.6648583Z ╰──── 2026-10-23T19:48:14.6649046Z  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-23T19:48:14.6649340Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6649345Z 2026-10-23T19:48:14.6649489Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6649631Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-23T19:48:14.6649703Z 209 │ mostRecentEventCount, 2026-10-23T19:48:14.6649828Z 210 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6649932Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6650121Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6650177Z 211 │ ); 2026-10-23T19:48:14.6650229Z ╰──── 2026-10-23T19:48:14.6650698Z  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-23T19:48:14.6650990Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6650992Z 2026-10-23T19:48:14.6651181Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T19:48:14.6651386Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-23T19:48:14.6651508Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T19:48:14.6651620Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T19:48:14.6651730Z ·  ─────────┬──────── 2026-10-23T19:48:14.6652288Z · ╰── 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-23T19:48:14.6652387Z 161 │ }); 2026-10-23T19:48:14.6652478Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T19:48:14.6652549Z 163 │ return JSON.stringify( 2026-10-23T19:48:14.6652714Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T19:48:14.6652783Z 165 │ const record = 2026-10-23T19:48:14.6652862Z 166 │ token.type === "context" 2026-10-23T19:48:14.6653028Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T19:48:14.6653096Z 168 │ : undefined; 2026-10-23T19:48:14.6653212Z 169 │ const presentation = contextChipPresentation( 2026-10-23T19:48:14.6653325Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T19:48:14.6653389Z 171 │ record, 2026-10-23T19:48:14.6653448Z 172 │ ); 2026-10-23T19:48:14.6653532Z 173 │ const icon = contextChipIcon( 2026-10-23T19:48:14.6653599Z 174 │ presentation, 2026-10-23T19:48:14.6653742Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T19:48:14.6653801Z 176 │ ); 2026-10-23T19:48:14.6653864Z 177 │ return { 2026-10-23T19:48:14.6653934Z 178 │ type: token.type, 2026-10-23T19:48:14.6654010Z 179 │ source: token.source, 2026-10-23T19:48:14.6654082Z 180 │ start: token.start, 2026-10-23T19:48:14.6654149Z 181 │ end: token.end, 2026-10-23T19:48:14.6654233Z 182 │ accent: presentation.accent, 2026-10-23T19:48:14.6654300Z 183 │ label: 2026-10-23T19:48:14.6654381Z 184 │ token.type === "skill" 2026-10-23T19:48:14.6654489Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T19:48:14.6654570Z 186 │ : token.type === "context" 2026-10-23T19:48:14.6654806Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T19:48:14.6654890Z 188 │ : basename(token.value), 2026-10-23T19:48:14.6655035Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T19:48:14.6655127Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T19:48:14.6655215Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T19:48:14.6655273Z 192 │ }; 2026-10-23T19:48:14.6655331Z 193 │ }), 2026-10-23T19:48:14.6655390Z 194 │ ); 2026-10-23T19:48:14.6655493Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T19:48:14.6655615Z ·  ────────────────────┬──────────────────── 2026-10-23T19:48:14.6655816Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6655955Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T19:48:14.6656007Z ╰──── 2026-10-23T19:48:14.6656213Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T19:48:14.6656526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6656529Z 2026-10-23T19:48:14.6656792Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T19:48:14.6656967Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T19:48:14.6657100Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T19:48:14.6657203Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T19:48:14.6657295Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6657754Z · ╰── 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-23T19:48:14.6657846Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T19:48:14.6657909Z 252 │ value, 2026-10-23T19:48:14.6657989Z 253 │ selection: nextSelection, 2026-10-23T19:48:14.6658051Z 254 │ }); 2026-10-23T19:48:14.6658141Z 255 │ return acknowledgedEventCount; 2026-10-23T19:48:14.6658196Z 256 │ }, 2026-10-23T19:48:14.6658251Z 257 │ [], 2026-10-23T19:48:14.6658321Z ·  ─┬ 2026-10-23T19:48:14.6658502Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6658558Z 258 │ ); 2026-10-23T19:48:14.6658609Z ╰──── 2026-10-23T19:48:14.6658815Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T19:48:14.6659127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6659129Z 2026-10-23T19:48:14.6659364Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T19:48:14.6659483Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T19:48:14.6659535Z 11 │ 2026-10-23T19:48:14.6659632Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T19:48:14.6659734Z ·  ────────────┬──────────── 2026-10-23T19:48:14.6659935Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T19:48:14.6660001Z 13 │ readonly thread: { 2026-10-23T19:48:14.6660053Z ╰──── 2026-10-23T19:48:14.6660159Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6660162Z 2026-10-23T19:48:14.6660420Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6660562Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5] 2026-10-23T19:48:14.6660626Z 2107 │ ); 2026-10-23T19:48:14.6660693Z 2108 │ useEffect(() => { 2026-10-23T19:48:14.6660767Z ·  ────┬──── 2026-10-23T19:48:14.6660900Z · ╰── This is the containing effect 2026-10-23T19:48:14.6660976Z 2109 │ setExpandedVideo(null); 2026-10-23T19:48:14.6661061Z ·  ────────┬─────── 2026-10-23T19:48:14.6661231Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6661304Z 2110 │ setExpandedFile(null); 2026-10-23T19:48:14.6661356Z ╰──── 2026-10-23T19:48:14.6662029Z  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-23T19:48:14.6662388Z  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-23T19:48:14.6662391Z 2026-10-23T19:48:14.6662620Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T19:48:14.6662753Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T19:48:14.6662892Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T19:48:14.6663035Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T19:48:14.6663133Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6663303Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T19:48:14.6663464Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T19:48:14.6663516Z ╰──── 2026-10-23T19:48:14.6663615Z  help: Consider removing this import. 2026-10-23T19:48:14.6663618Z 2026-10-23T19:48:14.6663822Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T19:48:14.6663954Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T19:48:14.6664013Z 87 │ import { 2026-10-23T19:48:14.6664079Z 88 │ createContext, 2026-10-23T19:48:14.6664154Z ·  ──────┬────── 2026-10-23T19:48:14.6664291Z · ╰── 'createContext' is imported here 2026-10-23T19:48:14.6664354Z 89 │ memo, 2026-10-23T19:48:14.6664408Z ╰──── 2026-10-23T19:48:14.6664504Z  help: Consider removing this import. 2026-10-23T19:48:14.6664507Z 2026-10-23T19:48:14.6664719Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T19:48:14.6664853Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-23T19:48:14.6664912Z 102 │ import { 2026-10-23T19:48:14.6664979Z 103 │ ActivityIndicator, 2026-10-23T19:48:14.6665062Z ·  ────────┬──────── 2026-10-23T19:48:14.6665207Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T19:48:14.6665265Z 104 │ Image, 2026-10-23T19:48:14.6665315Z ╰──── 2026-10-23T19:48:14.6665412Z  help: Consider removing this import. 2026-10-23T19:48:14.6665414Z 2026-10-23T19:48:14.6665687Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T19:48:14.6665852Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-23T19:48:14.6665914Z 109 │ Pressable, 2026-10-23T19:48:14.6665977Z 110 │ ScrollView, 2026-10-23T19:48:14.6666051Z ·  ─────┬──── 2026-10-23T19:48:14.6666183Z · ╰── 'ScrollView' is imported here 2026-10-23T19:48:14.6666245Z 111 │ StyleSheet, 2026-10-23T19:48:14.6666299Z ╰──── 2026-10-23T19:48:14.6666395Z  help: Consider removing this import. 2026-10-23T19:48:14.6666397Z 2026-10-23T19:48:14.6666596Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T19:48:14.6666736Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-23T19:48:14.6666800Z 111 │ StyleSheet, 2026-10-23T19:48:14.6666868Z 112 │ Text as NativeText, 2026-10-23T19:48:14.6666948Z ·  ─────┬──── 2026-10-23T19:48:14.6667085Z · ╰── 'NativeText' is imported here 2026-10-23T19:48:14.6667152Z 113 │ type ColorValue, 2026-10-23T19:48:14.6667204Z ╰──── 2026-10-23T19:48:14.6667298Z  help: Consider removing this import. 2026-10-23T19:48:14.6667301Z 2026-10-23T19:48:14.6667513Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T19:48:14.6667646Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-23T19:48:14.6667783Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T19:48:14.6667915Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T19:48:14.6668007Z ·  ─────────┬──────── 2026-10-23T19:48:14.6668162Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T19:48:14.6668311Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T19:48:14.6668365Z ╰──── 2026-10-23T19:48:14.6668460Z  help: Consider removing this import. 2026-10-23T19:48:14.6668462Z 2026-10-23T19:48:14.6668682Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T19:48:14.6668815Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-23T19:48:14.6668951Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T19:48:14.6669082Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T19:48:14.6669176Z ·  ─────────┬───────── 2026-10-23T19:48:14.6669329Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T19:48:14.6669388Z 138 │ import { 2026-10-23T19:48:14.6669438Z ╰──── 2026-10-23T19:48:14.6669533Z  help: Consider removing this import. 2026-10-23T19:48:14.6669536Z 2026-10-23T19:48:14.6669749Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T19:48:14.6669908Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-23T19:48:14.6670056Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T19:48:14.6670190Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T19:48:14.6670350Z ·  ────────┬─────── 2026-10-23T19:48:14.6670531Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T19:48:14.6670672Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T19:48:14.6670722Z ╰──── 2026-10-23T19:48:14.6670817Z  help: Consider removing this import. 2026-10-23T19:48:14.6670820Z 2026-10-23T19:48:14.6671039Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T19:48:14.6671171Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-23T19:48:14.6671253Z 154 │ attachmentVideoPreviewSource, 2026-10-23T19:48:14.6671325Z 155 │ mediaVideoPreviewUri, 2026-10-23T19:48:14.6671410Z ·  ──────────┬───────── 2026-10-23T19:48:14.6671568Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T19:48:14.6671643Z 156 │ mediaVideoThumbnailKey, 2026-10-23T19:48:14.6671695Z ╰──── 2026-10-23T19:48:14.6671790Z  help: Consider removing this import. 2026-10-23T19:48:14.6671793Z 2026-10-23T19:48:14.6672018Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T19:48:14.6672150Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-23T19:48:14.6672221Z 155 │ mediaVideoPreviewUri, 2026-10-23T19:48:14.6672294Z 156 │ mediaVideoThumbnailKey, 2026-10-23T19:48:14.6672382Z ·  ───────────┬────────── 2026-10-23T19:48:14.6672538Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T19:48:14.6672626Z 157 │ type MediaVideoPreviewSource, 2026-10-23T19:48:14.6672680Z ╰──── 2026-10-23T19:48:14.6672775Z  help: Consider removing this import. 2026-10-23T19:48:14.6672778Z 2026-10-23T19:48:14.6672988Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T19:48:14.6673119Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-23T19:48:14.6673190Z 156 │ mediaVideoThumbnailKey, 2026-10-23T19:48:14.6673270Z 157 │ type MediaVideoPreviewSource, 2026-10-23T19:48:14.6673365Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6673529Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T19:48:14.6673616Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-23T19:48:14.6673668Z ╰──── 2026-10-23T19:48:14.6673767Z  help: Consider removing this import. 2026-10-23T19:48:14.6673772Z 2026-10-23T19:48:14.6673972Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T19:48:14.6674104Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-23T19:48:14.6674281Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T19:48:14.6674419Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T19:48:14.6674510Z ·  ───────┬─────── 2026-10-23T19:48:14.6674660Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T19:48:14.6674720Z 166 │ import { 2026-10-23T19:48:14.6674771Z ╰──── 2026-10-23T19:48:14.6674865Z  help: Consider removing this import. 2026-10-23T19:48:14.6674940Z 2026-10-23T19:48:14.6675209Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T19:48:14.6675340Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-23T19:48:14.6675398Z 179 │ import { 2026-10-23T19:48:14.6675473Z 180 │ resolveMarkdownFontSizes, 2026-10-23T19:48:14.6675564Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6675723Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T19:48:14.6675811Z 181 │ resolveNativeMarkdownTypography, 2026-10-23T19:48:14.6675862Z ╰──── 2026-10-23T19:48:14.6675957Z  help: Consider removing this import. 2026-10-23T19:48:14.6675959Z 2026-10-23T19:48:14.6676186Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T19:48:14.6676323Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-23T19:48:14.6676455Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T19:48:14.6676592Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T19:48:14.6676687Z ·  ───────────┬────────── 2026-10-23T19:48:14.6676851Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T19:48:14.6676908Z 186 │ import { 2026-10-23T19:48:14.6676960Z ╰──── 2026-10-23T19:48:14.6677055Z  help: Consider removing this import. 2026-10-23T19:48:14.6677058Z 2026-10-23T19:48:14.6677323Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T19:48:14.6677456Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-23T19:48:14.6677535Z 187 │ normalizeNativeMarkdownUrl, 2026-10-23T19:48:14.6677631Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T19:48:14.6677743Z ·  ──────────────────┬────────────────── 2026-10-23T19:48:14.6677941Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T19:48:14.6678015Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T19:48:14.6678069Z ╰──── 2026-10-23T19:48:14.6678164Z  help: Consider removing this import. 2026-10-23T19:48:14.6678167Z 2026-10-23T19:48:14.6678391Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T19:48:14.6678594Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-23T19:48:14.6678726Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T19:48:14.6678799Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T19:48:14.6678887Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6679045Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T19:48:14.6679131Z 190 │ resolveMarkdownLinkPresentation, 2026-10-23T19:48:14.6679183Z ╰──── 2026-10-23T19:48:14.6679276Z  help: Consider removing this import. 2026-10-23T19:48:14.6679278Z 2026-10-23T19:48:14.6679507Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T19:48:14.6679640Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10] 2026-10-23T19:48:14.6679749Z 227 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T19:48:14.6679933Z 228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T19:48:14.6680031Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6680199Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T19:48:14.6680258Z 229 │ import { 2026-10-23T19:48:14.6680309Z ╰──── 2026-10-23T19:48:14.6680406Z  help: Consider removing this import. 2026-10-23T19:48:14.6680408Z 2026-10-23T19:48:14.6680619Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T19:48:14.6680750Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3] 2026-10-23T19:48:14.6680815Z 231 │ useAssetUrl, 2026-10-23T19:48:14.6680882Z 232 │ useAssetUrlState, 2026-10-23T19:48:14.6680969Z ·  ────────┬─────── 2026-10-23T19:48:14.6681114Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T19:48:14.6681183Z 233 │ useRefreshAssetUrl, 2026-10-23T19:48:14.6681234Z ╰──── 2026-10-23T19:48:14.6681330Z  help: Consider removing this import. 2026-10-23T19:48:14.6681332Z 2026-10-23T19:48:14.6681533Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6681671Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7] 2026-10-23T19:48:14.6681743Z 2110 │ setExpandedFile(null); 2026-10-23T19:48:14.6681904Z 2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T19:48:14.6682134Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T19:48:14.6682428Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T19:48:14.6682625Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T19:48:14.6682790Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T19:48:14.6682932Z 2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T19:48:14.6682984Z ╰──── 2026-10-23T19:48:14.6683280Z  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-23T19:48:14.6683748Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6683784Z 2026-10-23T19:48:14.6683988Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6684125Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7] 2026-10-23T19:48:14.6684223Z 2577 │ reportHeaderMaterialVisibility(false); 2026-10-23T19:48:14.6684339Z 2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T19:48:14.6684421Z ·  ──────┬────── 2026-10-23T19:48:14.6684572Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T19:48:14.6684627Z 2579 │ 2026-10-23T19:48:14.6684679Z ╰──── 2026-10-23T19:48:14.6684981Z  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-23T19:48:14.6685292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6685294Z 2026-10-23T19:48:14.6685493Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6685629Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7] 2026-10-23T19:48:14.6685685Z 2593 │ } 2026-10-23T19:48:14.6685820Z 2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T19:48:14.6685900Z ·  ──────┬───── 2026-10-23T19:48:14.6686049Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T19:48:14.6686107Z 2595 │ 2026-10-23T19:48:14.6686162Z ╰──── 2026-10-23T19:48:14.6686451Z  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-23T19:48:14.6686760Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6686762Z 2026-10-23T19:48:14.6686961Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6687096Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7] 2026-10-23T19:48:14.6687153Z 2750 │ } 2026-10-23T19:48:14.6687338Z 2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T19:48:14.6687542Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T19:48:14.6687799Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T19:48:14.6688004Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T19:48:14.6688160Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T19:48:14.6688215Z 2752 │ 2026-10-23T19:48:14.6688267Z ╰──── 2026-10-23T19:48:14.6688561Z  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-23T19:48:14.6688949Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6688985Z 2026-10-23T19:48:14.6689169Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T19:48:14.6689302Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9] 2026-10-23T19:48:14.6689359Z 602 │ }; 2026-10-23T19:48:14.6689477Z 603 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T19:48:14.6689667Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T19:48:14.6689935Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T19:48:14.6690137Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T19:48:14.6690305Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T19:48:14.6690361Z 604 │ ); 2026-10-23T19:48:14.6690413Z ╰──── 2026-10-23T19:48:14.6690727Z  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-23T19:48:14.6691036Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6691038Z 2026-10-23T19:48:14.6691435Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T19:48:14.6691568Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T19:48:14.6691671Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T19:48:14.6691833Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T19:48:14.6691966Z 159 │ │ constructor(data: Record) { 2026-10-23T19:48:14.6692087Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T19:48:14.6692164Z 161 │ │ } 2026-10-23T19:48:14.6692290Z 162 │ ╰─▶ }, 2026-10-23T19:48:14.6692358Z 163 │ clipboard: { 2026-10-23T19:48:14.6692411Z ╰──── 2026-10-23T19:48:14.6692580Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T19:48:14.6692582Z 2026-10-23T19:48:14.6692757Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6692919Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-23T19:48:14.6693100Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-23T19:48:14.6693269Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T19:48:14.6693408Z ·  ─────┬──── 2026-10-23T19:48:14.6693594Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6693731Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T19:48:14.6693962Z ╰──── 2026-10-23T19:48:14.6694291Z  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-23T19:48:14.6694585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6694588Z 2026-10-23T19:48:14.6694755Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6694915Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T19:48:14.6694995Z 717 │ const snoozePresets = useMemo( 2026-10-23T19:48:14.6695173Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T19:48:14.6695311Z ·  ─────┬──── 2026-10-23T19:48:14.6695496Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6695615Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T19:48:14.6695666Z ╰──── 2026-10-23T19:48:14.6695940Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.6696232Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6696235Z 2026-10-23T19:48:14.6696417Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T19:48:14.6696576Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T19:48:14.6696754Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T19:48:14.6696871Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T19:48:14.6696966Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6697142Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T19:48:14.6697196Z 720 │ ); 2026-10-23T19:48:14.6697248Z ╰──── 2026-10-23T19:48:14.6697560Z  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-23T19:48:14.6697948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6697994Z 2026-10-23T19:48:14.6698176Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T19:48:14.6698329Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T19:48:14.6698399Z 764 │ thread.pinnedAt, 2026-10-23T19:48:14.6698463Z 765 │ variant, 2026-10-23T19:48:14.6698536Z ·  ───┬─── 2026-10-23T19:48:14.6698672Z · ╰── Unnecessary dependency `variant` 2026-10-23T19:48:14.6698729Z 766 │ ], 2026-10-23T19:48:14.6698782Z ╰──── 2026-10-23T19:48:14.6699095Z  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-23T19:48:14.6699413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6699420Z 2026-10-23T19:48:14.6699616Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6699814Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T19:48:14.6699946Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T19:48:14.6700082Z 1215 │ 2026-10-23T19:48:14.6700198Z ·  ────────────────────────── 2026-10-23T19:48:14.6700308Z 1216 │ 2026-10-23T19:48:14.6700361Z ╰──── 2026-10-23T19:48:14.6700514Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T19:48:14.6700518Z 2026-10-23T19:48:14.6700781Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6700935Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T19:48:14.6700994Z 510 │ }, []); 2026-10-23T19:48:14.6701061Z 511 │ useEffect(() => { 2026-10-23T19:48:14.6701133Z ·  ────┬──── 2026-10-23T19:48:14.6701264Z · ╰── This is the containing effect 2026-10-23T19:48:14.6701350Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T19:48:14.6701441Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6701621Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6701726Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T19:48:14.6701780Z ╰──── 2026-10-23T19:48:14.6702378Z  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-23T19:48:14.6702697Z  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-23T19:48:14.6702700Z 2026-10-23T19:48:14.6702959Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6703179Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T19:48:14.6703367Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T19:48:14.6703434Z 870 │ useEffect(() => { 2026-10-23T19:48:14.6703505Z ·  ────┬──── 2026-10-23T19:48:14.6703635Z · ╰── This is the containing effect 2026-10-23T19:48:14.6703796Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T19:48:14.6703910Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T19:48:14.6704007Z ·  ─────────────┬──────────── 2026-10-23T19:48:14.6704183Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6704239Z 873 │ } 2026-10-23T19:48:14.6704291Z ╰──── 2026-10-23T19:48:14.6704895Z  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-23T19:48:14.6705220Z  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-23T19:48:14.6705223Z 2026-10-23T19:48:14.6705481Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6705636Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T19:48:14.6705690Z 1117 │ 2026-10-23T19:48:14.6705761Z 1118 │ useEffect(() => { 2026-10-23T19:48:14.6705837Z ·  ────┬──── 2026-10-23T19:48:14.6705968Z · ╰── This is the containing effect 2026-10-23T19:48:14.6706047Z 1119 │ setAnchorMessageId(null); 2026-10-23T19:48:14.6706133Z ·  ─────────┬──────── 2026-10-23T19:48:14.6706304Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6706385Z 1120 │ setSubmittedMessageId(null); 2026-10-23T19:48:14.6706437Z ╰──── 2026-10-23T19:48:14.6707042Z  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-23T19:48:14.6707367Z  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-23T19:48:14.6707369Z 2026-10-23T19:48:14.6707573Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6707724Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T19:48:14.6707810Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T19:48:14.6707910Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T19:48:14.6708052Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T19:48:14.6708263Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T19:48:14.6708494Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T19:48:14.6708651Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T19:48:14.6708704Z ╰──── 2026-10-23T19:48:14.6708998Z  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-23T19:48:14.6709308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6709310Z 2026-10-23T19:48:14.6709510Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6709664Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T19:48:14.6709757Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T19:48:14.6709955Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T19:48:14.6710050Z ·  ────────────┬─────────── 2026-10-23T19:48:14.6710234Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T19:48:14.6710343Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T19:48:14.6710398Z ╰──── 2026-10-23T19:48:14.6710692Z  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-23T19:48:14.6711002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6711009Z 2026-10-23T19:48:14.6711212Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6711369Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T19:48:14.6711440Z 1124 │ freeze.set(false); 2026-10-23T19:48:14.6711523Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T19:48:14.6711620Z ·  ────────┬──────── 2026-10-23T19:48:14.6711788Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T19:48:14.6711842Z 1126 │ 2026-10-23T19:48:14.6711893Z ╰──── 2026-10-23T19:48:14.6712183Z  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-23T19:48:14.6712496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6712501Z 2026-10-23T19:48:14.6712659Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6712811Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T19:48:14.6712920Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T19:48:14.6713026Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T19:48:14.6713123Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6713286Z · ╰── `floatingControlCoverage` originates here 2026-10-23T19:48:14.6713412Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T19:48:14.6713539Z 953 │ ); 2026-10-23T19:48:14.6713639Z 954 │ useEffect(() => { 2026-10-23T19:48:14.6713743Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T19:48:14.6713834Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6713997Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T19:48:14.6714123Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T19:48:14.6714176Z ╰──── 2026-10-23T19:48:14.6714438Z  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-23T19:48:14.6714742Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6714745Z 2026-10-23T19:48:14.6714907Z ⚠ react(immutability): This value cannot be modified 2026-10-23T19:48:14.6715062Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T19:48:14.6715246Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T19:48:14.6715373Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T19:48:14.6715485Z ·  ────────────────┬──────────────── 2026-10-23T19:48:14.6715674Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T19:48:14.6715804Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T19:48:14.6715858Z 966 │ ); 2026-10-23T19:48:14.6715930Z 967 │ useAnimatedReaction( 2026-10-23T19:48:14.6715989Z 968 │ () => 2026-10-23T19:48:14.6716087Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T19:48:14.6716180Z 970 │ floatingControlCoverage.value + 2026-10-23T19:48:14.6716376Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T19:48:14.6716441Z 972 │ (value) => { 2026-10-23T19:48:14.6716555Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T19:48:14.6716665Z ·  ────────────────┬──────────────── 2026-10-23T19:48:14.6716859Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T19:48:14.6716915Z 974 │ }, 2026-10-23T19:48:14.6716966Z ╰──── 2026-10-23T19:48:14.6717232Z  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-23T19:48:14.6717613Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T19:48:14.6717646Z 2026-10-23T19:48:14.6717903Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6718039Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-23T19:48:14.6718092Z 57 │ 2026-10-23T19:48:14.6718157Z 58 │ useEffect(() => { 2026-10-23T19:48:14.6718230Z ·  ────┬──── 2026-10-23T19:48:14.6718360Z · ╰── This is the containing effect 2026-10-23T19:48:14.6718455Z 59 │ const controller = new AbortController(); 2026-10-23T19:48:14.6718528Z 60 │ setLoadState("pending"); 2026-10-23T19:48:14.6718612Z ·  ──────┬───── 2026-10-23T19:48:14.6718782Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6718940Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T19:48:14.6718993Z ╰──── 2026-10-23T19:48:14.6719592Z  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-23T19:48:14.6719937Z  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-23T19:48:14.6719940Z 2026-10-23T19:48:14.6720145Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6720281Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T19:48:14.6720364Z 70 │ return () => controller.abort(); 2026-10-23T19:48:14.6720460Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T19:48:14.6720631Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T19:48:14.6720855Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T19:48:14.6721056Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T19:48:14.6721195Z · ╰── Unnecessary dependency `player_0` 2026-10-23T19:48:14.6721256Z 72 │ 2026-10-23T19:48:14.6721311Z ╰──── 2026-10-23T19:48:14.6721604Z  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-23T19:48:14.6721914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6721916Z 2026-10-23T19:48:14.6722084Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6722216Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-23T19:48:14.6722336Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-23T19:48:14.6722433Z 1996 │ createdAt: new Date().toISOString(), 2026-10-23T19:48:14.6722599Z ·  ─────┬──── 2026-10-23T19:48:14.6722772Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6722880Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-23T19:48:14.6722935Z ╰──── 2026-10-23T19:48:14.6723212Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.6723504Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6723507Z 2026-10-23T19:48:14.6723676Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6723827Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T19:48:14.6723963Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T19:48:14.6724119Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T19:48:14.6724236Z ·  ─────┬──── 2026-10-23T19:48:14.6724397Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6724458Z 373 │ return ( 2026-10-23T19:48:14.6724509Z ╰──── 2026-10-23T19:48:14.6724784Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.6725074Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6725082Z 2026-10-23T19:48:14.6725249Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6725399Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T19:48:14.6725493Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T19:48:14.6725622Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T19:48:14.6725733Z ·  ─────┬──── 2026-10-23T19:48:14.6725889Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6725945Z 854 │ } 2026-10-23T19:48:14.6725995Z ╰──── 2026-10-23T19:48:14.6726277Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.6726571Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6726574Z 2026-10-23T19:48:14.6726832Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6726965Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T19:48:14.6727154Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T19:48:14.6727228Z 154 │ useLayoutEffect(() => { 2026-10-23T19:48:14.6727308Z ·  ───────┬─────── 2026-10-23T19:48:14.6727441Z · ╰── This is the containing effect 2026-10-23T19:48:14.6727595Z 155 │ if (faviconRequest === null) return; 2026-10-23T19:48:14.6727682Z 156 │ 2026-10-23T19:48:14.6727814Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T19:48:14.6727911Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T19:48:14.6728001Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6729300Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6729378Z 159 │ return endRequest; 2026-10-23T19:48:14.6729431Z ╰──── 2026-10-23T19:48:14.6730068Z  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-23T19:48:14.6730399Z  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-23T19:48:14.6730406Z 2026-10-23T19:48:14.6730577Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6730715Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T19:48:14.6730850Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T19:48:14.6730997Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T19:48:14.6731120Z ·  ─────┬──── 2026-10-23T19:48:14.6731372Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6731475Z 141 │ onSelect={(selected) => { 2026-10-23T19:48:14.6731526Z ╰──── 2026-10-23T19:48:14.6731800Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.6732090Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6732093Z 2026-10-23T19:48:14.6732369Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-23T19:48:14.6732515Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-23T19:48:14.6732569Z 60 │ ) { 2026-10-23T19:48:14.6732744Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-23T19:48:14.6732828Z ·  ──────┬────── 2026-10-23T19:48:14.6732969Z · ╰── 'useDragRegion' is declared here 2026-10-23T19:48:14.6733060Z 62 │ const isInline = props.mode === "inline"; 2026-10-23T19:48:14.6733112Z ╰──── 2026-10-23T19:48:14.6733217Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6733220Z 2026-10-23T19:48:14.6733479Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T19:48:14.6733621Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T19:48:14.6733776Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T19:48:14.6733955Z 12 │ this.onmessage = listener; 2026-10-23T19:48:14.6734088Z ·  ───────── 2026-10-23T19:48:14.6734143Z 13 │ } 2026-10-23T19:48:14.6734195Z ╰──── 2026-10-23T19:48:14.6734512Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T19:48:14.6734514Z 2026-10-23T19:48:14.6734717Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T19:48:14.6734857Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T19:48:14.6734924Z 15 │ constructor() { 2026-10-23T19:48:14.6734992Z 16 │ source = this; 2026-10-23T19:48:14.6735065Z ·  ────── 2026-10-23T19:48:14.6735120Z 17 │ } 2026-10-23T19:48:14.6735171Z ╰──── 2026-10-23T19:48:14.6735453Z  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-23T19:48:14.6735459Z 2026-10-23T19:48:14.6735606Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6735756Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T19:48:14.6735938Z 151 │ 2026-10-23T19:48:14.6736017Z 152 │ {props.children(open)} 2026-10-23T19:48:14.6736107Z ·  ──┬─ 2026-10-23T19:48:14.6736266Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6736328Z 153 │ 2026-10-23T19:48:14.6736386Z ╰──── 2026-10-23T19:48:14.6736861Z  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-23T19:48:14.6737154Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6737157Z 2026-10-23T19:48:14.6737354Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T19:48:14.6737504Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T19:48:14.6737587Z 139 │ if (action.id !== undefined) { 2026-10-23T19:48:14.6737666Z 140 │ props.onPressAction?.({ 2026-10-23T19:48:14.6737742Z ·  ──┬── 2026-10-23T19:48:14.6737877Z · ╰── Missing dependency `props` 2026-10-23T19:48:14.6737969Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T19:48:14.6738115Z 142 │ } as Parameters>[0]); 2026-10-23T19:48:14.6738171Z 143 │ } 2026-10-23T19:48:14.6738227Z 144 │ }, 2026-10-23T19:48:14.6738309Z 145 │ [close, props.onPressAction], 2026-10-23T19:48:14.6738403Z ·  ─────────┬───────── 2026-10-23T19:48:14.6738616Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T19:48:14.6738670Z 146 │ ); 2026-10-23T19:48:14.6738723Z ╰──── 2026-10-23T19:48:14.6739282Z  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-23T19:48:14.6739627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6739630Z 2026-10-23T19:48:14.6739891Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T19:48:14.6740057Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T19:48:14.6740112Z 1397 │ 2026-10-23T19:48:14.6740202Z 1398 │ function assertUserMessagesExclude( 2026-10-23T19:48:14.6740305Z ·  ────────────┬──────────── 2026-10-23T19:48:14.6740481Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T19:48:14.6740593Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T19:48:14.6740646Z ╰──── 2026-10-23T19:48:14.6740750Z  help: Consider removing this declaration. 2026-10-23T19:48:14.6740752Z 2026-10-23T19:48:14.6740953Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-23T19:48:14.6741045Z ╭─[apps/web/src/types.ts:22:3] 2026-10-23T19:48:14.6741117Z 21 │ EnvironmentThreadShell, 2026-10-23T19:48:14.6741183Z 22 │ ThreadRunSummary, 2026-10-23T19:48:14.6741262Z ·  ────────┬─────── 2026-10-23T19:48:14.6741405Z · ╰── 'ThreadRunSummary' is imported here 2026-10-23T19:48:14.6741475Z 23 │ ThreadRuntimeSummary, 2026-10-23T19:48:14.6741532Z ╰──── 2026-10-23T19:48:14.6741636Z  help: Consider removing this import. 2026-10-23T19:48:14.6741639Z 2026-10-23T19:48:14.6741826Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T19:48:14.6741943Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T19:48:14.6741998Z 7 │ () => 2026-10-23T19:48:14.6742064Z 8 │ Gesture.Hover() 2026-10-23T19:48:14.6742141Z ·  ──┬── 2026-10-23T19:48:14.6742273Z · ╰── `Hover` may be a component 2026-10-23T19:48:14.6742347Z 9 │ .manualActivation(true) 2026-10-23T19:48:14.6742399Z ╰──── 2026-10-23T19:48:14.6742749Z  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-23T19:48:14.6743229Z  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-23T19:48:14.6743231Z 2026-10-23T19:48:14.6743435Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T19:48:14.6743573Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T19:48:14.6743739Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T19:48:14.6743831Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6743923Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6744387Z · ╰── 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-23T19:48:14.6744463Z 227 │ mostRecentEventCount, 2026-10-23T19:48:14.6744519Z 228 │ ); 2026-10-23T19:48:14.6744646Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T19:48:14.6744782Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T19:48:14.6744985Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6745070Z 230 │ const assumedValue = props.value; 2026-10-23T19:48:14.6745123Z ╰──── 2026-10-23T19:48:14.6745291Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T19:48:14.6745609Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6745615Z 2026-10-23T19:48:14.6745829Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6745965Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T19:48:14.6746111Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T19:48:14.6746200Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6746292Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6746753Z · ╰── 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-23T19:48:14.6746829Z 238 │ controlledEventCount, 2026-10-23T19:48:14.6746894Z 239 │ assumedValue, 2026-10-23T19:48:14.6746949Z 240 │ ); 2026-10-23T19:48:14.6747107Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T19:48:14.6747244Z ·  ───────────┬────────── 2026-10-23T19:48:14.6747454Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T19:48:14.6747544Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T19:48:14.6747597Z ╰──── 2026-10-23T19:48:14.6748089Z  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-23T19:48:14.6748433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6748436Z 2026-10-23T19:48:14.6748581Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6748719Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T19:48:14.6748846Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T19:48:14.6748961Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T19:48:14.6749079Z ·  ─────────────┬──────────── 2026-10-23T19:48:14.6749251Z · ╰── Cannot access ref value during render 2026-10-23T19:48:14.6749310Z 163 │ }); 2026-10-23T19:48:14.6749362Z ╰──── 2026-10-23T19:48:14.6749857Z  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-23T19:48:14.6750148Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6750151Z 2026-10-23T19:48:14.6750295Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6750434Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T19:48:14.6750555Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T19:48:14.6750672Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T19:48:14.6750791Z ·  ─────────────┬──────────── 2026-10-23T19:48:14.6750997Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6751053Z 163 │ }); 2026-10-23T19:48:14.6751104Z ╰──── 2026-10-23T19:48:14.6751568Z  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-23T19:48:14.6751856Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6751863Z 2026-10-23T19:48:14.6752009Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6752147Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T19:48:14.6752201Z 163 │ }); 2026-10-23T19:48:14.6752292Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T19:48:14.6752416Z ·  ─────────┬────────────┬─── 2026-10-23T19:48:14.6752605Z · │ ╰── Cannot update ref value during render 2026-10-23T19:48:14.6752720Z · ╰── This value is a ref 2026-10-23T19:48:14.6752793Z 165 │ return JSON.stringify( 2026-10-23T19:48:14.6752844Z ╰──── 2026-10-23T19:48:14.6753381Z  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-23T19:48:14.6753703Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6753706Z 2026-10-23T19:48:14.6753848Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6753984Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T19:48:14.6754057Z 205 │ mostRecentEventCount, 2026-10-23T19:48:14.6754145Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6754252Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6754446Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6754504Z 207 │ ); 2026-10-23T19:48:14.6754555Z ╰──── 2026-10-23T19:48:14.6755014Z  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-23T19:48:14.6755302Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6755305Z 2026-10-23T19:48:14.6755448Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6755582Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T19:48:14.6755652Z 211 │ mostRecentEventCount, 2026-10-23T19:48:14.6755744Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T19:48:14.6755849Z ·  ───────────────┬─────────────── 2026-10-23T19:48:14.6756037Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6756091Z 213 │ ); 2026-10-23T19:48:14.6756142Z ╰──── 2026-10-23T19:48:14.6756605Z  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-23T19:48:14.6756892Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6756894Z 2026-10-23T19:48:14.6757088Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T19:48:14.6757224Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T19:48:14.6757347Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T19:48:14.6757459Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T19:48:14.6757569Z ·  ─────────┬──────── 2026-10-23T19:48:14.6758033Z · ╰── 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-23T19:48:14.6758089Z 163 │ }); 2026-10-23T19:48:14.6758179Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T19:48:14.6758322Z 165 │ return JSON.stringify( 2026-10-23T19:48:14.6758517Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T19:48:14.6758584Z 167 │ const record = 2026-10-23T19:48:14.6758664Z 168 │ token.type === "context" 2026-10-23T19:48:14.6758828Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T19:48:14.6758893Z 170 │ : undefined; 2026-10-23T19:48:14.6759003Z 171 │ const presentation = contextChipPresentation( 2026-10-23T19:48:14.6759114Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T19:48:14.6759177Z 173 │ record, 2026-10-23T19:48:14.6759235Z 174 │ ); 2026-10-23T19:48:14.6759319Z 175 │ const icon = contextChipIcon( 2026-10-23T19:48:14.6759388Z 176 │ presentation, 2026-10-23T19:48:14.6759535Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T19:48:14.6759595Z 178 │ ); 2026-10-23T19:48:14.6759656Z 179 │ return { 2026-10-23T19:48:14.6759727Z 180 │ type: token.type, 2026-10-23T19:48:14.6759824Z 181 │ source: token.source, 2026-10-23T19:48:14.6759896Z 182 │ start: token.start, 2026-10-23T19:48:14.6759963Z 183 │ end: token.end, 2026-10-23T19:48:14.6760048Z 184 │ accent: presentation.accent, 2026-10-23T19:48:14.6760110Z 185 │ label: 2026-10-23T19:48:14.6760187Z 186 │ token.type === "skill" 2026-10-23T19:48:14.6760296Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T19:48:14.6760378Z 188 │ : token.type === "context" 2026-10-23T19:48:14.6760618Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T19:48:14.6760703Z 190 │ : basename(token.value), 2026-10-23T19:48:14.6760848Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T19:48:14.6760941Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T19:48:14.6761029Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T19:48:14.6761086Z 194 │ }; 2026-10-23T19:48:14.6761143Z 195 │ }), 2026-10-23T19:48:14.6761198Z 196 │ ); 2026-10-23T19:48:14.6761299Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T19:48:14.6761419Z ·  ────────────────────┬──────────────────── 2026-10-23T19:48:14.6761618Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6761765Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T19:48:14.6761819Z ╰──── 2026-10-23T19:48:14.6762026Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T19:48:14.6762337Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6762340Z 2026-10-23T19:48:14.6762529Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T19:48:14.6762666Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T19:48:14.6762797Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T19:48:14.6762900Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T19:48:14.6763064Z ·  ───────────┬─────────── 2026-10-23T19:48:14.6763557Z · ╰── 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-23T19:48:14.6763649Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T19:48:14.6763710Z 254 │ value, 2026-10-23T19:48:14.6763788Z 255 │ selection: nextSelection, 2026-10-23T19:48:14.6763846Z 256 │ }); 2026-10-23T19:48:14.6763930Z 257 │ return acknowledgedEventCount; 2026-10-23T19:48:14.6763986Z 258 │ }, 2026-10-23T19:48:14.6764041Z 259 │ [], 2026-10-23T19:48:14.6764109Z ·  ─┬ 2026-10-23T19:48:14.6764298Z · ╰── This dependency list is missing values used by the callback 2026-10-23T19:48:14.6764355Z 260 │ ); 2026-10-23T19:48:14.6764407Z ╰──── 2026-10-23T19:48:14.6764614Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T19:48:14.6764924Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6764927Z 2026-10-23T19:48:14.6765160Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T19:48:14.6765300Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T19:48:14.6765423Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T19:48:14.6765671Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T19:48:14.6765794Z 986 │ │ (approval) => approval.requestId, 2026-10-23T19:48:14.6765928Z 987 │ ╰─▶ ); 2026-10-23T19:48:14.6766067Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T19:48:14.6766119Z ╰──── 2026-10-23T19:48:14.6766195Z  help: Switch to `Set` 2026-10-23T19:48:14.6766198Z 2026-10-23T19:48:14.6766400Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6766530Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-23T19:48:14.6766587Z 81 │ }, 2026-10-23T19:48:14.6766648Z 82 │ [draftKey], 2026-10-23T19:48:14.6766723Z ·  ────┬─── 2026-10-23T19:48:14.6766935Z · ╰── Unnecessary dependency `draftKey` 2026-10-23T19:48:14.6767161Z 83 │ ); 2026-10-23T19:48:14.6767212Z ╰──── 2026-10-23T19:48:14.6767506Z  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-23T19:48:14.6767815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6767818Z 2026-10-23T19:48:14.6767964Z ⚠ react(refs): Cannot access refs during render 2026-10-23T19:48:14.6768080Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T19:48:14.6768263Z 53 │ const child = children as ReactElement>; 2026-10-23T19:48:14.6768440Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T19:48:14.6768547Z 55 │ │ onTouchStart: (event) => { 2026-10-23T19:48:14.6768705Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T19:48:14.6768861Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T19:48:14.6768990Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T19:48:14.6769158Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T19:48:14.6769271Z 60 │ │ pendingPress.current = null; 2026-10-23T19:48:14.6769396Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T19:48:14.6769476Z 62 │ │ }, 2026-10-23T19:48:14.6769576Z 63 │ │ onPress: (event) => { 2026-10-23T19:48:14.6769747Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T19:48:14.6769908Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T19:48:14.6770075Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T19:48:14.6770266Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T19:48:14.6770352Z 68 │ │ return; 2026-10-23T19:48:14.6770429Z 69 │ │ } 2026-10-23T19:48:14.6770574Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T19:48:14.6770746Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T19:48:14.6770912Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T19:48:14.6771012Z 73 │ │ event.persist(); 2026-10-23T19:48:14.6771171Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T19:48:14.6771361Z 75 │ │ return; 2026-10-23T19:48:14.6771438Z 76 │ │ } 2026-10-23T19:48:14.6771552Z 77 │ │ child.props.onPress?.(event); 2026-10-23T19:48:14.6771627Z 78 │ │ }, 2026-10-23T19:48:14.6771759Z 79 │ ├─▶ }); 2026-10-23T19:48:14.6772087Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T19:48:14.6772234Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T19:48:14.6772286Z ╰──── 2026-10-23T19:48:14.6772753Z  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-23T19:48:14.6773043Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T19:48:14.6773046Z 2026-10-23T19:48:14.6773313Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6773468Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-23T19:48:14.6773521Z 55 │ 2026-10-23T19:48:14.6773587Z 56 │ useEffect(() => { 2026-10-23T19:48:14.6773660Z ·  ────┬──── 2026-10-23T19:48:14.6773790Z · ╰── This is the containing effect 2026-10-23T19:48:14.6773860Z 57 │ setDecodedSize(null); 2026-10-23T19:48:14.6773939Z ·  ───────┬────── 2026-10-23T19:48:14.6774109Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6774178Z 58 │ }, [props.sourceKey]); 2026-10-23T19:48:14.6774229Z ╰──── 2026-10-23T19:48:14.6774838Z  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-23T19:48:14.6775167Z  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-23T19:48:14.6775170Z 2026-10-23T19:48:14.6775427Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6775579Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T19:48:14.6775630Z 59 │ 2026-10-23T19:48:14.6775694Z 60 │ useEffect(() => { 2026-10-23T19:48:14.6775765Z ·  ────┬──── 2026-10-23T19:48:14.6775897Z · ╰── This is the containing effect 2026-10-23T19:48:14.6775968Z 61 │ setFailedUri(null); 2026-10-23T19:48:14.6776043Z ·  ──────┬───── 2026-10-23T19:48:14.6776210Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6776274Z 62 │ }, [props.uri]); 2026-10-23T19:48:14.6776325Z ╰──── 2026-10-23T19:48:14.6776926Z  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-23T19:48:14.6777314Z  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-23T19:48:14.6777349Z 2026-10-23T19:48:14.6777565Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T19:48:14.6777716Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T19:48:14.6777840Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T19:48:14.6778019Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T19:48:14.6778109Z ·  ────────┬──────── 2026-10-23T19:48:14.6778258Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T19:48:14.6778311Z 8 │ 2026-10-23T19:48:14.6778364Z ╰──── 2026-10-23T19:48:14.6778463Z  help: Consider removing this import. 2026-10-23T19:48:14.6778465Z 2026-10-23T19:48:14.6778673Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6778825Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T19:48:14.6778894Z 57 │ setDecodedSize(null); 2026-10-23T19:48:14.6778963Z 58 │ }, [props.sourceKey]); 2026-10-23T19:48:14.6779044Z ·  ───────┬─────── 2026-10-23T19:48:14.6779199Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T19:48:14.6779252Z 59 │ 2026-10-23T19:48:14.6779303Z ╰──── 2026-10-23T19:48:14.6779595Z  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-23T19:48:14.6779940Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6779946Z 2026-10-23T19:48:14.6780147Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6780296Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T19:48:14.6780365Z 61 │ setFailedUri(null); 2026-10-23T19:48:14.6780429Z 62 │ }, [props.uri]); 2026-10-23T19:48:14.6780503Z ·  ────┬──── 2026-10-23T19:48:14.6780645Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T19:48:14.6780697Z 63 │ 2026-10-23T19:48:14.6780747Z ╰──── 2026-10-23T19:48:14.6781036Z  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-23T19:48:14.6781350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6781355Z 2026-10-23T19:48:14.6781523Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T19:48:14.6781669Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-23T19:48:14.6781783Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-23T19:48:14.6781947Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-23T19:48:14.6782072Z ·  ─────┬──── 2026-10-23T19:48:14.6782242Z · ╰── Cannot call impure function 2026-10-23T19:48:14.6782370Z 179 │ } 2026-10-23T19:48:14.6782457Z ╰──── 2026-10-23T19:48:14.6782734Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T19:48:14.6783027Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T19:48:14.6783030Z 2026-10-23T19:48:14.6783285Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6783422Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T19:48:14.6783527Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T19:48:14.6783591Z 67 │ useEffect(() => { 2026-10-23T19:48:14.6783665Z ·  ────┬──── 2026-10-23T19:48:14.6783795Z · ╰── This is the containing effect 2026-10-23T19:48:14.6783859Z 68 │ setUri(null); 2026-10-23T19:48:14.6783928Z ·  ───┬── 2026-10-23T19:48:14.6784092Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6784155Z 69 │ setError(null); 2026-10-23T19:48:14.6784207Z ╰──── 2026-10-23T19:48:14.6784807Z  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-23T19:48:14.6785131Z  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-23T19:48:14.6785135Z 2026-10-23T19:48:14.6785335Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T19:48:14.6785471Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T19:48:14.6785526Z 90 │ }; 2026-10-23T19:48:14.6785602Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T19:48:14.6785718Z ·  ──────┬───── ───┬─── 2026-10-23T19:48:14.6785899Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T19:48:14.6786048Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T19:48:14.6786189Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T19:48:14.6786242Z ╰──── 2026-10-23T19:48:14.6786533Z  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-23T19:48:14.6786842Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6786845Z 2026-10-23T19:48:14.6787058Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T19:48:14.6787200Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T19:48:14.6787266Z 212 │ useEffect(() => { 2026-10-23T19:48:14.6787381Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T19:48:14.6787548Z ·  ──┬── 2026-10-23T19:48:14.6787735Z · ╰── Missing dependency `props` 2026-10-23T19:48:14.6787842Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T19:48:14.6787956Z ·  ──────────┬───────── 2026-10-23T19:48:14.6788184Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T19:48:14.6788258Z 215 │ const { source } = props; 2026-10-23T19:48:14.6788308Z ╰──── 2026-10-23T19:48:14.6788730Z  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-23T19:48:14.6789048Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T19:48:14.6789053Z 2026-10-23T19:48:14.6789249Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T19:48:14.6789396Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T19:48:14.6789504Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T19:48:14.6789672Z 267 │ 2026-10-23T19:48:14.6789854Z ·  ─────────────────────────────────────────────────────── 2026-10-23T19:48:14.6789932Z 268 │ 2026-10-23T19:48:14.6792244Z 817 │ 2026-10-23T19:48:14.6792361Z ·  ──────────────────── 2026-10-23T19:48:14.6792455Z 818 │ 2026-10-23T19:48:14.6793465Z 832 │ 2026-10-23T19:48:14.6793585Z ·  ──────────────────── 2026-10-23T19:48:14.6793686Z 833 │ 2026-10-23T19:48:14.6793737Z ╰──── 2026-10-23T19:48:14.6793963Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T19:48:14.6794100Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T19:48:14.6794102Z 2026-10-23T19:48:14.6794362Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T19:48:14.6794508Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T19:48:14.6794567Z 61 │ }, []); 2026-10-23T19:48:14.6794631Z 62 │ useEffect(() => { 2026-10-23T19:48:14.6794701Z ·  ────┬──── 2026-10-23T19:48:14.6794831Z · ╰── This is the containing effect 2026-10-23T19:48:14.6794980Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T19:48:14.6795108Z ·  ───────┬────── 2026-10-23T19:48:14.6795316Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T19:48:14.6795397Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T19:48:14.6795448Z ╰──── 2026-10-23T19:48:14.6796049Z  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-23T19:48:14.6796442Z  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-23T19:48:14.6796479Z 2026-10-23T19:48:14.6796561Z Found 0 errors and 362 warnings in 5399 files (5.9s, 8 threads) 2026-10-23T19:48:14.7280219Z Post job cleanup. 2026-10-23T19:48:14.7899989Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-23T19:48:14.7974718Z Post job cleanup. 2026-10-23T19:48:14.8776777Z ##[start-action display=Cache full pnpm store;id=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.__actions_cache] 2026-10-23T19:48:14.9103110Z Post job cleanup. 2026-10-23T19:48:14.9819057Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c, not saving cache. 2026-10-23T19:48:14.9856343Z ##[end-action id=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.__actions_cache;outcome=success;conclusion=success;duration_ms=107] 2026-10-23T19:48:14.9857712Z ##[start-action display=Cache Vite+;id=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.vp_cache] 2026-10-23T19:48:14.9882984Z Post job cleanup. 2026-10-23T19:48:15.0534385Z 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-23T19:48:15.0570339Z ##[end-action id=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.vp_cache;outcome=success;conclusion=success;duration_ms=71] 2026-10-23T19:48:15.0604603Z Post job cleanup. 2026-10-23T19:48:15.1026080Z [command]/usr/local/bin/git version 2026-10-23T19:48:15.1061729Z git version 2.55.0 2026-10-23T19:48:15.1083291Z Temporarily overriding HOME='/home/runner/_work/_temp/8cba991d-d5fe-4de1-b661-1d9fe3412dd9' before making global git config changes 2026-10-23T19:48:15.1083662Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T19:48:15.1087268Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T19:48:15.1115244Z Removing SSH command configuration 2026-10-23T19:48:15.1118267Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T19:48:15.1143227Z [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-23T19:48:15.1279135Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-23T19:48:15.1299982Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-23T19:48:15.1345753Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-23T19:48:15.1363271Z ##[group]Run '/job_completed.sh' 2026-10-23T19:48:15.1370845Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T19:48:15.1371020Z env: 2026-10-23T19:48:15.1371136Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 256 2026-10-23T19:48:15.1372228Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372 2026-10-23T19:48:15.1372376Z BLACKSMITH_CHECK_RUN_ID: 120621802502 2026-10-23T19:48:15.1372523Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T19:48:15.1372675Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T19:48:15.1372820Z ##[endgroup] 2026-10-23T19:48:15.1453786Z Docker container cache not activated, skipping hash computation. 2026-10-23T19:48:15.1690320Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-23T19:48:15.1731743Z Cleaning up orphan processes