2026-10-24T02:58:15.0654560Z Current runner version: '2.338.1' 2026-10-24T02:58:15.0658950Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-vcuzwklhgqzz5yvr' 2026-10-24T02:58:15.0659852Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T02:58:15.0660892Z Machine name: 'ip-172-31-73-130' 2026-10-24T02:58:15.0662694Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T02:58:15.0663985Z Contents: read 2026-10-24T02:58:15.0664411Z Metadata: read 2026-10-24T02:58:15.0664805Z ##[endgroup] 2026-10-24T02:58:15.0666192Z Secret source: Actions 2026-10-24T02:58:15.0666839Z Cache mode: write 2026-10-24T02:58:15.0667341Z Prepare workflow directory 2026-10-24T02:58:15.0860248Z Prepare all required actions 2026-10-24T02:58:15.0891135Z Getting action download info 2026-10-24T02:58:15.2161824Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T02:58:15.2544758Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T02:58:15.3594194Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T02:58:15.3632578Z Complete job name: Lint 2026-10-24T02:58:15.3999940Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T02:58:15.4062462Z ##[group]Run '/setup.sh' 2026-10-24T02:58:15.4072901Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:58:15.4073333Z env: 2026-10-24T02:58:15.4073559Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:15.4073842Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:15.4074122Z BLACKSMITH_CHECK_RUN_ID: 120760135878 2026-10-24T02:58:15.4074403Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T02:58:15.4074664Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T02:58:15.4074914Z ##[endgroup] 2026-10-24T02:58:15.4292370Z Logging daemon started (blacksmithd for logs) 2026-10-24T02:58:15.4370759Z Results daemon started (blacksmithd for results) 2026-10-24T02:58:15.4500771Z Background adoption and SSH setup started (PID: 3170) 2026-10-24T02:58:15.4502841Z 2026-10-24T02:58:15.4503204Z ---------------------------------------- 2026-10-24T02:58:15.4503738Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40056371240/jobs/120760135878 2026-10-24T02:58:15.4504139Z SSH Access (using your GitHub SSH key): 2026-10-24T02:58:15.4504553Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-vcuzwklhgqzz5yvr.vm.blacksmith.sh 2026-10-24T02:58:15.4504853Z 2026-10-24T02:58:15.4504962Z No GitHub SSH key? Add one at: 2026-10-24T02:58:15.4505450Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T02:58:15.4505847Z 2026-10-24T02:58:15.4505946Z ---------------------------------------- 2026-10-24T02:58:15.4506114Z 2026-10-24T02:58:15.4506252Z VM ID: blacksmith-8vcpu-ubuntu-2404-vcuzwklhgqzz5yvr 2026-10-24T02:58:15.4506564Z Host: production-152.236.30.167-x8664 2026-10-24T02:58:15.4506828Z Host Agent PID: 3651927 2026-10-24T02:58:15.4507065Z Host Agent Git SHA: 1637818df 2026-10-24T02:58:15.4507314Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T02:58:15.4507584Z Blacksmith Host Generation: gen 2 2026-10-24T02:58:15.4507857Z Petname: production-emerging-yeti-07649bbd 2026-10-24T02:58:15.4508132Z Region: us-east 2026-10-24T02:58:15.4508354Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T02:58:15.4512615Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T02:58:15.4512937Z 2026-10-24T02:58:15.4513053Z Enabling Blacksmith transparent cache 2026-10-24T02:58:15.4798938Z ##[group]Run actions/checkout@v6 2026-10-24T02:58:15.4799238Z with: 2026-10-24T02:58:15.4799554Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T02:58:15.4799946Z sparse-checkout-cone-mode: false 2026-10-24T02:58:15.4800213Z repository: pingdotgg/t3code 2026-10-24T02:58:15.4802166Z token: *** 2026-10-24T02:58:15.4802370Z ssh-strict: true 2026-10-24T02:58:15.4802585Z ssh-user: git 2026-10-24T02:58:15.4802804Z persist-credentials: true 2026-10-24T02:58:15.4803208Z clean: true 2026-10-24T02:58:15.4803414Z fetch-depth: 1 2026-10-24T02:58:15.4803622Z fetch-tags: false 2026-10-24T02:58:15.4803844Z show-progress: true 2026-10-24T02:58:15.4804063Z lfs: false 2026-10-24T02:58:15.4804266Z submodules: false 2026-10-24T02:58:15.4804543Z set-safe-directory: true 2026-10-24T02:58:15.4804794Z allow-unsafe-pr-checkout: false 2026-10-24T02:58:15.4805040Z env: 2026-10-24T02:58:15.4805273Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:15.4805559Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:15.4805837Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:15.4806094Z ##[endgroup] 2026-10-24T02:58:15.5965138Z Syncing repository: pingdotgg/t3code 2026-10-24T02:58:15.5966029Z ##[group]Getting Git version info 2026-10-24T02:58:15.5966346Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T02:58:15.5966805Z [command]/usr/local/bin/git version 2026-10-24T02:58:15.6033037Z git version 2.55.0 2026-10-24T02:58:15.6044091Z ##[endgroup] 2026-10-24T02:58:15.6051208Z Temporarily overriding HOME='/home/runner/_work/_temp/f5ada102-225c-4f25-860e-2ee50129524a' before making global git config changes 2026-10-24T02:58:15.6051834Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T02:58:15.6054458Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T02:58:15.6083399Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T02:58:15.6085009Z ##[group]Determining repository object format 2026-10-24T02:58:15.6086137Z ##[endgroup] 2026-10-24T02:58:15.6086482Z ##[group]Initializing the repository 2026-10-24T02:58:15.6088356Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T02:58:15.6122127Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T02:58:15.6122584Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T02:58:15.6123043Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T02:58:15.6123392Z hint: call: 2026-10-24T02:58:15.6123589Z hint: 2026-10-24T02:58:15.6123847Z hint: git config --global init.defaultBranch 2026-10-24T02:58:15.6124144Z hint: 2026-10-24T02:58:15.6124421Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T02:58:15.6124861Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T02:58:15.6125212Z hint: 2026-10-24T02:58:15.6125413Z hint: git branch -m 2026-10-24T02:58:15.6125644Z hint: 2026-10-24T02:58:15.6125943Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T02:58:15.6126403Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T02:58:15.6127229Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T02:58:15.6148438Z ##[endgroup] 2026-10-24T02:58:15.6148801Z ##[group]Disabling automatic garbage collection 2026-10-24T02:58:15.6151169Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T02:58:15.6173828Z ##[endgroup] 2026-10-24T02:58:15.6174158Z ##[group]Setting up auth 2026-10-24T02:58:15.6174489Z Removing SSH command configuration 2026-10-24T02:58:15.6177901Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T02:58:15.6199023Z [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-24T02:58:15.6316257Z Removing HTTP extra header 2026-10-24T02:58:15.6318902Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T02:58:15.6339163Z [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-24T02:58:15.6429452Z Removing includeIf entries pointing to credentials config files 2026-10-24T02:58:15.6432619Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T02:58:15.6452501Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T02:58:15.6542312Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-6ecfa95d-ad4f-45da-93fe-ce4efc820b13.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T02:58:15.6566383Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-6ecfa95d-ad4f-45da-93fe-ce4efc820b13.config 2026-10-24T02:58:15.6585057Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-6ecfa95d-ad4f-45da-93fe-ce4efc820b13.config 2026-10-24T02:58:15.6602668Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-6ecfa95d-ad4f-45da-93fe-ce4efc820b13.config 2026-10-24T02:58:15.6622092Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-6ecfa95d-ad4f-45da-93fe-ce4efc820b13.config 2026-10-24T02:58:15.6638257Z ##[endgroup] 2026-10-24T02:58:15.6638609Z ##[group]Fetching the repository 2026-10-24T02:58:15.6642578Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +0c89fa8e28edb814fc9f86207e70538fd8e81288:refs/remotes/pull/24314/merge 2026-10-24T02:58:15.9473197Z From https://github.com/pingdotgg/t3code 2026-10-24T02:58:15.9474140Z * [new ref] 0c89fa8e28edb814fc9f86207e70538fd8e81288 -> pull/24314/merge 2026-10-24T02:58:15.9496474Z ##[endgroup] 2026-10-24T02:58:15.9497230Z ##[group]Determining the checkout info 2026-10-24T02:58:15.9498019Z ##[endgroup] 2026-10-24T02:58:15.9498677Z ##[group]Setting up sparse checkout 2026-10-24T02:58:15.9501760Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T02:58:15.9527472Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T02:58:15.9543992Z .git/info/sparse-checkout 2026-10-24T02:58:15.9548468Z ##[endgroup] 2026-10-24T02:58:15.9549218Z ##[group]Checking out the ref 2026-10-24T02:58:15.9551437Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24314/merge 2026-10-24T02:58:22.8796793Z Updating files: 0% (1/6319) 2026-10-24T02:58:22.8823840Z Updating files: 1% (64/6319) 2026-10-24T02:58:22.8840754Z Updating files: 2% (127/6319) 2026-10-24T02:58:22.8859615Z Updating files: 3% (190/6319) 2026-10-24T02:58:22.8881550Z Updating files: 4% (253/6319) 2026-10-24T02:58:22.8911605Z Updating files: 5% (316/6319) 2026-10-24T02:58:22.8931932Z Updating files: 6% (380/6319) 2026-10-24T02:58:22.8994266Z Updating files: 7% (443/6319) 2026-10-24T02:58:22.9030216Z Updating files: 8% (506/6319) 2026-10-24T02:58:22.9057447Z Updating files: 9% (569/6319) 2026-10-24T02:58:22.9343737Z Updating files: 10% (632/6319) 2026-10-24T02:58:22.9360584Z Updating files: 11% (696/6319) 2026-10-24T02:58:22.9370859Z Updating files: 12% (759/6319) 2026-10-24T02:58:22.9384076Z Updating files: 13% (822/6319) 2026-10-24T02:58:22.9399751Z Updating files: 14% (885/6319) 2026-10-24T02:58:22.9416744Z Updating files: 15% (948/6319) 2026-10-24T02:58:22.9435688Z Updating files: 16% (1012/6319) 2026-10-24T02:58:22.9449920Z Updating files: 17% (1075/6319) 2026-10-24T02:58:22.9467803Z Updating files: 18% (1138/6319) 2026-10-24T02:58:22.9482070Z Updating files: 19% (1201/6319) 2026-10-24T02:58:22.9503397Z Updating files: 20% (1264/6319) 2026-10-24T02:58:22.9521282Z Updating files: 21% (1327/6319) 2026-10-24T02:58:22.9538608Z Updating files: 22% (1391/6319) 2026-10-24T02:58:22.9552189Z Updating files: 23% (1454/6319) 2026-10-24T02:58:22.9567072Z Updating files: 24% (1517/6319) 2026-10-24T02:58:22.9581753Z Updating files: 25% (1580/6319) 2026-10-24T02:58:22.9595096Z Updating files: 26% (1643/6319) 2026-10-24T02:58:22.9608029Z Updating files: 27% (1707/6319) 2026-10-24T02:58:22.9626905Z Updating files: 28% (1770/6319) 2026-10-24T02:58:22.9658130Z Updating files: 29% (1833/6319) 2026-10-24T02:58:22.9678269Z Updating files: 30% (1896/6319) 2026-10-24T02:58:22.9701145Z Updating files: 31% (1959/6319) 2026-10-24T02:58:22.9729390Z Updating files: 32% (2023/6319) 2026-10-24T02:58:22.9761892Z Updating files: 33% (2086/6319) 2026-10-24T02:58:22.9772597Z Updating files: 34% (2149/6319) 2026-10-24T02:58:22.9826958Z Updating files: 34% (2168/6319) 2026-10-24T02:58:22.9884965Z Updating files: 35% (2212/6319) 2026-10-24T02:58:22.9918911Z Updating files: 36% (2275/6319) 2026-10-24T02:58:22.9954011Z Updating files: 37% (2339/6319) 2026-10-24T02:58:22.9997332Z Updating files: 38% (2402/6319) 2026-10-24T02:58:23.0022536Z Updating files: 39% (2465/6319) 2026-10-24T02:58:23.0053877Z Updating files: 40% (2528/6319) 2026-10-24T02:58:23.0083632Z Updating files: 41% (2591/6319) 2026-10-24T02:58:23.0099004Z Updating files: 42% (2654/6319) 2026-10-24T02:58:23.0108475Z Updating files: 43% (2718/6319) 2026-10-24T02:58:23.0128325Z Updating files: 44% (2781/6319) 2026-10-24T02:58:23.0155881Z Updating files: 45% (2844/6319) 2026-10-24T02:58:23.0179469Z Updating files: 46% (2907/6319) 2026-10-24T02:58:23.0208148Z Updating files: 47% (2970/6319) 2026-10-24T02:58:23.0236035Z Updating files: 48% (3034/6319) 2026-10-24T02:58:23.0264908Z Updating files: 49% (3097/6319) 2026-10-24T02:58:23.0301000Z Updating files: 50% (3160/6319) 2026-10-24T02:58:23.0315567Z Updating files: 51% (3223/6319) 2026-10-24T02:58:23.0350233Z Updating files: 52% (3286/6319) 2026-10-24T02:58:23.0373168Z Updating files: 53% (3350/6319) 2026-10-24T02:58:23.0394679Z Updating files: 54% (3413/6319) 2026-10-24T02:58:23.0417002Z Updating files: 55% (3476/6319) 2026-10-24T02:58:23.0433961Z Updating files: 56% (3539/6319) 2026-10-24T02:58:23.0450232Z Updating files: 57% (3602/6319) 2026-10-24T02:58:23.0468156Z Updating files: 58% (3666/6319) 2026-10-24T02:58:23.0824010Z Updating files: 59% (3729/6319) 2026-10-24T02:58:23.0837733Z Updating files: 60% (3792/6319) 2026-10-24T02:58:23.0853618Z Updating files: 61% (3855/6319) 2026-10-24T02:58:23.0870646Z Updating files: 62% (3918/6319) 2026-10-24T02:58:23.0891140Z Updating files: 63% (3981/6319) 2026-10-24T02:58:23.0916821Z Updating files: 64% (4045/6319) 2026-10-24T02:58:23.0937290Z Updating files: 65% (4108/6319) 2026-10-24T02:58:23.0954621Z Updating files: 66% (4171/6319) 2026-10-24T02:58:23.0978532Z Updating files: 67% (4234/6319) 2026-10-24T02:58:23.0991041Z Updating files: 68% (4297/6319) 2026-10-24T02:58:23.1009204Z Updating files: 69% (4361/6319) 2026-10-24T02:58:23.1021562Z Updating files: 70% (4424/6319) 2026-10-24T02:58:23.1037141Z Updating files: 71% (4487/6319) 2026-10-24T02:58:23.1053253Z Updating files: 72% (4550/6319) 2026-10-24T02:58:23.1077823Z Updating files: 73% (4613/6319) 2026-10-24T02:58:23.1328818Z Updating files: 74% (4677/6319) 2026-10-24T02:58:23.1510457Z Updating files: 75% (4740/6319) 2026-10-24T02:58:23.1535044Z Updating files: 76% (4803/6319) 2026-10-24T02:58:23.1555928Z Updating files: 77% (4866/6319) 2026-10-24T02:58:23.1582537Z Updating files: 78% (4929/6319) 2026-10-24T02:58:23.1602053Z Updating files: 79% (4993/6319) 2026-10-24T02:58:23.1619138Z Updating files: 80% (5056/6319) 2026-10-24T02:58:23.1639526Z Updating files: 81% (5119/6319) 2026-10-24T02:58:23.1657910Z Updating files: 82% (5182/6319) 2026-10-24T02:58:23.1674513Z Updating files: 83% (5245/6319) 2026-10-24T02:58:23.1696064Z Updating files: 84% (5308/6319) 2026-10-24T02:58:23.1715013Z Updating files: 85% (5372/6319) 2026-10-24T02:58:23.1736691Z Updating files: 86% (5435/6319) 2026-10-24T02:58:23.1803720Z Updating files: 87% (5498/6319) 2026-10-24T02:58:23.1834103Z Updating files: 88% (5561/6319) 2026-10-24T02:58:23.1850836Z Updating files: 89% (5624/6319) 2026-10-24T02:58:23.1876509Z Updating files: 90% (5688/6319) 2026-10-24T02:58:23.1909053Z Updating files: 91% (5751/6319) 2026-10-24T02:58:23.1923386Z Updating files: 92% (5814/6319) 2026-10-24T02:58:23.1938701Z Updating files: 93% (5877/6319) 2026-10-24T02:58:23.1959002Z Updating files: 94% (5940/6319) 2026-10-24T02:58:23.1982782Z Updating files: 95% (6004/6319) 2026-10-24T02:58:23.2033739Z Updating files: 96% (6067/6319) 2026-10-24T02:58:23.2058673Z Updating files: 97% (6130/6319) 2026-10-24T02:58:23.2102959Z Updating files: 98% (6193/6319) 2026-10-24T02:58:23.2121120Z Updating files: 99% (6256/6319) 2026-10-24T02:58:23.2121377Z Updating files: 100% (6319/6319) 2026-10-24T02:58:23.2121534Z Updating files: 100% (6319/6319), done. 2026-10-24T02:58:23.2268022Z Note: switching to 'refs/remotes/pull/24314/merge'. 2026-10-24T02:58:23.2268202Z 2026-10-24T02:58:23.2268354Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T02:58:23.2268695Z changes and commit them, and you can discard any commits you make in this 2026-10-24T02:58:23.2269023Z state without impacting any branches by switching back to a branch. 2026-10-24T02:58:23.2269208Z 2026-10-24T02:58:23.2269354Z If you want to create a new branch to retain commits you create, you may 2026-10-24T02:58:23.2269676Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T02:58:23.2269846Z 2026-10-24T02:58:23.2269943Z git switch -c 2026-10-24T02:58:23.2270072Z 2026-10-24T02:58:23.2270160Z Or undo this operation with: 2026-10-24T02:58:23.2270586Z 2026-10-24T02:58:23.2270723Z git switch - 2026-10-24T02:58:23.2270859Z 2026-10-24T02:58:23.2271034Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T02:58:23.2271240Z 2026-10-24T02:58:23.2271494Z HEAD is now at 0c89fa8 Merge a3424bfae625ab19759d099a36d7a601846bb170 into 26c3625f484eadd4d5b6ca5a3dd1f8f8bd5533b4 2026-10-24T02:58:23.2280786Z ##[endgroup] 2026-10-24T02:58:23.2311177Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T02:58:23.2328077Z 0c89fa8e28edb814fc9f86207e70538fd8e81288 2026-10-24T02:58:23.2401728Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T02:58:23.2401980Z files="$(git ls-files .github/pr-assets)" 2026-10-24T02:58:23.2402181Z if test -n "$files"; then 2026-10-24T02:58:23.2402418Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T02:58:23.2402652Z  exit 1 2026-10-24T02:58:23.2402781Z fi 2026-10-24T02:58:23.2414955Z shell: /usr/bin/bash -e {0} 2026-10-24T02:58:23.2415112Z env: 2026-10-24T02:58:23.2415251Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:23.2415420Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:23.2415607Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:23.2415769Z ##[endgroup] 2026-10-24T02:58:23.2552637Z Prepare all required actions 2026-10-24T02:58:23.2552980Z Getting action download info 2026-10-24T02:58:23.3424833Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T02:58:23.4306544Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T02:58:23.4306736Z env: 2026-10-24T02:58:23.4306873Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:23.4307043Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:23.4307209Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:23.4307365Z ##[endgroup] 2026-10-24T02:58:23.4385887Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T02:58:23.4426989Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T02:58:23.4427457Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T02:58:23.4427772Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T02:58:23.4428042Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T02:58:23.4440164Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:58:23.4440382Z env: 2026-10-24T02:58:23.4440516Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:23.4440682Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:23.4440858Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:23.4441013Z ##[endgroup] 2026-10-24T02:58:23.4509112Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=12] 2026-10-24T02:58:23.4510557Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T02:58:23.4554423Z ##[group]Run actions/cache@v6 2026-10-24T02:58:23.4554578Z with: 2026-10-24T02:58:23.4554703Z path: ~/.vite-plus 2026-10-24T02:58:23.4554887Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T02:58:23.4555108Z enableCrossOsArchive: false 2026-10-24T02:58:23.4555258Z fail-on-cache-miss: false 2026-10-24T02:58:23.4555403Z lookup-only: false 2026-10-24T02:58:23.4555532Z save-always: false 2026-10-24T02:58:23.4555661Z env: 2026-10-24T02:58:23.4555790Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:23.4555957Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:23.4556119Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:23.4556270Z ##[endgroup] 2026-10-24T02:58:23.6596785Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T02:58:24.0354653Z Received 170349591 of 170349591 (100.0%), 464.2 MBs/sec 2026-10-24T02:58:24.0356612Z Cache Size: ~162 MB (170349591 B) 2026-10-24T02:58:24.0453565Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/3c369061-282c-45d5-bcef-f38282d8c970/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T02:58:24.6203357Z Cache restored successfully 2026-10-24T02:58:24.6336475Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T02:58:24.6391222Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1188] 2026-10-24T02:58:24.6393737Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T02:58:24.6414537Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T02:58:24.6414809Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T02:58:24.6414980Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T02:58:24.6427564Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:58:24.6427728Z env: 2026-10-24T02:58:24.6427843Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:24.6427989Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:24.6428142Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:24.6428271Z ##[endgroup] 2026-10-24T02:58:24.6464205Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T02:58:24.6470734Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=7] 2026-10-24T02:58:24.6471984Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T02:58:24.6475318Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T02:58:24.6476352Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T02:58:24.6501919Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T02:58:24.6502140Z store_path="$(vp pm cache dir)" 2026-10-24T02:58:24.6502344Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T02:58:24.6512745Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:58:24.6512925Z env: 2026-10-24T02:58:24.6513036Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:24.6513388Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:24.6513541Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:24.6513712Z ##[endgroup] 2026-10-24T02:58:24.6641503Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=16] 2026-10-24T02:58:24.6642715Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T02:58:24.6961649Z ##[group]Run actions/cache@v6 2026-10-24T02:58:24.6961796Z with: 2026-10-24T02:58:24.6961919Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T02:58:24.6962174Z key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-24T02:58:24.6962422Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T02:58:24.6962573Z enableCrossOsArchive: false 2026-10-24T02:58:24.6962702Z fail-on-cache-miss: false 2026-10-24T02:58:24.6962843Z lookup-only: false 2026-10-24T02:58:24.6962951Z save-always: false 2026-10-24T02:58:24.6963073Z env: 2026-10-24T02:58:24.6963180Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:24.6963326Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:24.6963469Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:24.6963596Z ##[endgroup] 2026-10-24T02:58:24.8928556Z Cache hit for: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-24T02:58:25.9274454Z Received 239075328 of 995020926 (24.0%), 225.5 MBs/sec 2026-10-24T02:58:26.9649383Z Received 939524096 of 995020926 (94.4%), 437.5 MBs/sec 2026-10-24T02:58:27.0535042Z Received 995020926 of 995020926 (100.0%), 444.0 MBs/sec 2026-10-24T02:58:27.0535937Z Cache Size: ~949 MB (995020926 B) 2026-10-24T02:58:27.0562481Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/421e5dd3-3e44-42b2-a367-4db1b4115d1b/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T02:58:32.0355896Z Cache restored successfully 2026-10-24T02:58:32.0800932Z Cache restored from key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-24T02:58:32.0867079Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7422] 2026-10-24T02:58:32.0869030Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T02:58:32.0879031Z ##[group]Run vp install 2026-10-24T02:58:32.0879169Z vp install 2026-10-24T02:58:32.0890943Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:58:32.0891113Z env: 2026-10-24T02:58:32.0891228Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:32.0891378Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:32.0891524Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:32.0891658Z ##[endgroup] 2026-10-24T02:58:32.1181922Z Scope: all 33 workspace projects 2026-10-24T02:58:32.2143548Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T02:58:32.4475917Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T02:58:32.4476414Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T02:58:32.4476771Z Virtual store is at: node_modules/.pnpm 2026-10-24T02:58:34.6530474Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.4s) 2026-10-24T02:58:34.6530783Z Lockfile is up to date, resolution step is skipped 2026-10-24T02:58:34.6685222Z Packages: +1721 2026-10-24T02:58:34.6685398Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T02:58:34.6960318Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T02:58:35.5440227Z . prepare$ vp config --no-agent 2026-10-24T02:58:35.6311539Z . prepare: Done 2026-10-24T02:58:35.6325073Z 2026-10-24T02:58:35.6325209Z devDependencies: 2026-10-24T02:58:35.6325476Z + @coderabbitai/config 1.1.0 2026-10-24T02:58:35.6325674Z + @shadcn/lint 0.1.5 2026-10-24T02:58:35.6325888Z + @types/node 24.12.4 2026-10-24T02:58:35.6326061Z + knip 6.34.0 2026-10-24T02:58:35.6326258Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T02:58:35.6326475Z + vite-plus 1.3.0 2026-10-24T02:58:35.6326582Z 2026-10-24T02:58:35.6338238Z Done in 3.5s using pnpm v12.14.0 2026-10-24T02:58:35.6478376Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3560] 2026-10-24T02:58:35.6900642Z ##[group]Run actions/cache@v6 2026-10-24T02:58:35.6900902Z with: 2026-10-24T02:58:35.6901067Z path: ~/.cache/electron 2026-10-24T02:58:35.6901401Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T02:58:35.6901766Z enableCrossOsArchive: false 2026-10-24T02:58:35.6901907Z fail-on-cache-miss: false 2026-10-24T02:58:35.6902025Z lookup-only: false 2026-10-24T02:58:35.6902138Z save-always: false 2026-10-24T02:58:35.6902243Z env: 2026-10-24T02:58:35.6902347Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:35.6902496Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:35.6902647Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:35.6902777Z ##[endgroup] 2026-10-24T02:58:35.8822339Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T02:58:36.0397209Z Received 122906203 of 122906203 (100.0%), 819.7 MBs/sec 2026-10-24T02:58:36.0397655Z Cache Size: ~117 MB (122906203 B) 2026-10-24T02:58:36.0450235Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/b683572d-ad7d-4fdb-8505-a3e969b7898a/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T02:58:36.1121302Z Cache restored successfully 2026-10-24T02:58:36.1269075Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T02:58:36.1365265Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T02:58:36.1365714Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T02:58:36.1383936Z shell: /usr/bin/bash -e {0} 2026-10-24T02:58:36.1384153Z env: 2026-10-24T02:58:36.1384551Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:36.1384796Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:36.1385037Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:36.1385269Z ##[endgroup] 2026-10-24T02:58:36.3039704Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T02:58:36.8455818Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T02:58:36.8471479Z 2026-10-24T02:58:36.8563432Z ##[group]Run vp run knip:check 2026-10-24T02:58:36.8563682Z vp run knip:check 2026-10-24T02:58:36.8575678Z shell: /usr/bin/bash -e {0} 2026-10-24T02:58:36.8575806Z env: 2026-10-24T02:58:36.8575916Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:36.8576065Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:36.8576204Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:36.8576343Z ##[endgroup] 2026-10-24T02:58:36.9972239Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T02:58:40.5544571Z 2026-10-24T02:58:40.5548551Z $ 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-24T02:58:48.4094006Z 2026-10-24T02:58:48.4095077Z --- 2026-10-24T02:58:48.4095442Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T02:58:48.4171498Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T02:58:48.4171965Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T02:58:48.4186251Z shell: /usr/bin/bash -e {0} 2026-10-24T02:58:48.4186393Z env: 2026-10-24T02:58:48.4186509Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:48.4186660Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:48.4186823Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:48.4186959Z ##[endgroup] 2026-10-24T02:58:48.5567023Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T02:58:48.7290239Z 2026-10-24T02:58:48.7354637Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T02:58:48.7354850Z vp run --filter t3 generate --check 2026-10-24T02:58:48.7366524Z shell: /usr/bin/bash -e {0} 2026-10-24T02:58:48.7366651Z env: 2026-10-24T02:58:48.7366783Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:48.7366932Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:48.7367071Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:48.7367203Z ##[endgroup] 2026-10-24T02:58:48.8768354Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T02:58:49.0202060Z 2026-10-24T02:58:49.0276093Z ##[group]Run vp check 2026-10-24T02:58:49.0276251Z vp check 2026-10-24T02:58:49.0288547Z shell: /usr/bin/bash -e {0} 2026-10-24T02:58:49.0288673Z env: 2026-10-24T02:58:49.0288787Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:49.0288939Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:49.0289079Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:58:49.0289209Z ##[endgroup] 2026-10-24T02:58:49.5497503Z pass: All 5676 files are correctly formatted (385ms, 8 threads) 2026-10-24T02:58:54.8317458Z warn: Lint warnings found 2026-10-24T02:58:54.8318853Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T02:58:54.8319444Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T02:58:54.8320042Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T02:58:54.8320511Z 35 │ instanceId === configured ? true : false, 2026-10-24T02:58:54.8320897Z ·  ──────────────────────────────────────── 2026-10-24T02:58:54.8321182Z 36 │ ); 2026-10-24T02:58:54.8321372Z ╰──── 2026-10-24T02:58:54.8321606Z  help: Remove this ternary operator 2026-10-24T02:58:54.8321787Z 2026-10-24T02:58:54.8322992Z ⚠ 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-24T02:58:54.8323883Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-24T02:58:54.8324254Z 2382 │ let orphanedAt: number | undefined; 2026-10-24T02:58:54.8324805Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T02:58:54.8325328Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-24T02:58:54.8325664Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T02:58:54.8326092Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T02:58:54.8326480Z 2387 │ │ flush: () => { 2026-10-24T02:58:54.8326867Z 2388 │ │ let task: (() => void) | undefined; 2026-10-24T02:58:54.8327318Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T02:58:54.8327687Z 2390 │ │ }, 2026-10-24T02:58:54.8327994Z 2391 │ │ }; 2026-10-24T02:58:54.8328259Z 2392 │ │ 2026-10-24T02:58:54.8328651Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T02:58:54.8328931Z 2394 │ │ let requestChecks = 0; 2026-10-24T02:58:54.8329176Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T02:58:54.8329419Z 2396 │ │ executionMode: "async", 2026-10-24T02:58:54.8329660Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-24T02:58:54.8329932Z 2398 │ │ shouldYield: (fiber) => { 2026-10-24T02:58:54.8330193Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-24T02:58:54.8330431Z 2400 │ │ requestChecks += 1; 2026-10-24T02:58:54.8330751Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T02:58:54.8331123Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-24T02:58:54.8331481Z 2403 │ │ return true; 2026-10-24T02:58:54.8331777Z 2404 │ │ }, 2026-10-24T02:58:54.8332026Z 2405 │ │ }; 2026-10-24T02:58:54.8332187Z 2406 │ │ 2026-10-24T02:58:54.8332391Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-24T02:58:54.8332725Z 2408 │ │ ...WINDOW, 2026-10-24T02:58:54.8332997Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T02:58:54.8333341Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T02:58:54.8333600Z 2411 │ │ }; 2026-10-24T02:58:54.8333809Z 2412 │ │ const first = yield* service 2026-10-24T02:58:54.8334034Z 2413 │ │ .readSummary(input) 2026-10-24T02:58:54.8334239Z 2414 │ │ .pipe( 2026-10-24T02:58:54.8334436Z 2415 │ │ Effect.exit, 2026-10-24T02:58:54.8334702Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T02:58:54.8334965Z 2417 │ │ Effect.forkChild, 2026-10-24T02:58:54.8335162Z 2418 │ │ ); 2026-10-24T02:58:54.8335357Z 2419 │ │ requestFiber = first; 2026-10-24T02:58:54.8335575Z 2420 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8335791Z 2421 │ │ dispatcher.flush(); 2026-10-24T02:58:54.8335973Z 2422 │ │ 2026-10-24T02:58:54.8336203Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T02:58:54.8336454Z 2424 │ │ Effect.match({ 2026-10-24T02:58:54.8336680Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-24T02:58:54.8336928Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-24T02:58:54.8337146Z 2427 │ │ }), 2026-10-24T02:58:54.8337392Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T02:58:54.8337644Z 2429 │ │ Effect.forkChild, 2026-10-24T02:58:54.8337830Z 2430 │ │ ); 2026-10-24T02:58:54.8338026Z 2431 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8338239Z 2432 │ │ dispatcher.flush(); 2026-10-24T02:58:54.8338477Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T02:58:54.8338722Z 2434 │ │ if (secondExit === undefined) { 2026-10-24T02:58:54.8338956Z 2435 │ │ second.interruptUnsafe(); 2026-10-24T02:58:54.8339184Z 2436 │ │ orphanedAt = interruptAt; 2026-10-24T02:58:54.8339394Z 2437 │ │ break; 2026-10-24T02:58:54.8339699Z 2438 │ │ } 2026-10-24T02:58:54.8339962Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T02:58:54.8340241Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T02:58:54.8340474Z 2441 │ │ } 2026-10-24T02:58:54.8340716Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T02:58:54.8340994Z 2443 │ ╰─▶ } 2026-10-24T02:58:54.8341184Z 2444 │ 2026-10-24T02:58:54.8341299Z ╰──── 2026-10-24T02:58:54.8341356Z 2026-10-24T02:58:54.8341877Z ⚠ 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-24T02:58:54.8342439Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-24T02:58:54.8342709Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T02:58:54.8343034Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T02:58:54.8343338Z ·  ─────────────────── 2026-10-24T02:58:54.8343548Z 1044 │ expect(encoded).not.toContain(url); 2026-10-24T02:58:54.8343714Z ╰──── 2026-10-24T02:58:54.8343769Z 2026-10-24T02:58:54.8344035Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8344618Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T02:58:54.8344900Z 339 │ 2026-10-24T02:58:54.8345061Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T02:58:54.8345250Z ·  ────┬──── 2026-10-24T02:58:54.8345466Z · ╰── 'layerTest' is declared here 2026-10-24T02:58:54.8345648Z ╰──── 2026-10-24T02:58:54.8345805Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8345922Z 2026-10-24T02:58:54.8346173Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8346577Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T02:58:54.8346799Z 10577 │ 2026-10-24T02:58:54.8346931Z 10578 │ const layer: Layer.Layer< 2026-10-24T02:58:54.8347099Z ·  ──┬── 2026-10-24T02:58:54.8347307Z · ╰── 'layer' is declared here 2026-10-24T02:58:54.8347532Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T02:58:54.8347690Z ╰──── 2026-10-24T02:58:54.8347850Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8347964Z 2026-10-24T02:58:54.8348167Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T02:58:54.8348482Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T02:58:54.8348681Z 37 │ get isConnected() { 2026-10-24T02:58:54.8348857Z 38 │ let current: FakeElement | null = this; 2026-10-24T02:58:54.8349032Z ·  ─────── 2026-10-24T02:58:54.8349188Z 39 │ while (current?.parent) { 2026-10-24T02:58:54.8349339Z ╰──── 2026-10-24T02:58:54.8349658Z  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-24T02:58:54.8349962Z 2026-10-24T02:58:54.8350141Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T02:58:54.8350430Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T02:58:54.8350689Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T02:58:54.8350913Z 194 │ const codes = new Array(count); 2026-10-24T02:58:54.8351131Z ·  ──────────────────────── 2026-10-24T02:58:54.8351345Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T02:58:54.8351515Z ╰──── 2026-10-24T02:58:54.8352051Z  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-24T02:58:54.8352468Z 2026-10-24T02:58:54.8352717Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T02:58:54.8353131Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T02:58:54.8353368Z 959 │ 2026-10-24T02:58:54.8353535Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T02:58:54.8353775Z ·  ──────────────────┬───────────────── 2026-10-24T02:58:54.8354086Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T02:58:54.8354383Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T02:58:54.8354555Z ╰──── 2026-10-24T02:58:54.8354717Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8354831Z 2026-10-24T02:58:54.8355047Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:58:54.8355382Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T02:58:54.8355588Z 113 │ const declared = { 2026-10-24T02:58:54.8355767Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T02:58:54.8355983Z ·  ──────────────────────────────── 2026-10-24T02:58:54.8356328Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T02:58:54.8356536Z ╰──── 2026-10-24T02:58:54.8356859Z  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-24T02:58:54.8357115Z 2026-10-24T02:58:54.8357331Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:58:54.8357667Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T02:58:54.8357888Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T02:58:54.8358099Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T02:58:54.8358336Z ·  ──────────────────────────────────────── 2026-10-24T02:58:54.8358555Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T02:58:54.8358720Z ╰──── 2026-10-24T02:58:54.8359031Z  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-24T02:58:54.8359277Z 2026-10-24T02:58:54.8359498Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:58:54.8359833Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T02:58:54.8360113Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T02:58:54.8360326Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T02:58:54.8360557Z ·  ──────────────────────────────────── 2026-10-24T02:58:54.8360739Z 117 │ }; 2026-10-24T02:58:54.8360860Z ╰──── 2026-10-24T02:58:54.8361166Z  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-24T02:58:54.8361416Z 2026-10-24T02:58:54.8361807Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8362299Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T02:58:54.8362517Z 1443 │ 2026-10-24T02:58:54.8362687Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T02:58:54.8362932Z ·  ───────────────────┬─────────────────── 2026-10-24T02:58:54.8363249Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T02:58:54.8363560Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T02:58:54.8363744Z ╰──── 2026-10-24T02:58:54.8363901Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8364021Z 2026-10-24T02:58:54.8364275Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8364672Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T02:58:54.8364887Z 1679 │ 2026-10-24T02:58:54.8365020Z 1680 │ const layer: Layer.Layer< 2026-10-24T02:58:54.8365180Z ·  ──┬── 2026-10-24T02:58:54.8365389Z · ╰── 'layer' is declared here 2026-10-24T02:58:54.8365611Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T02:58:54.8365776Z ╰──── 2026-10-24T02:58:54.8365931Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8366047Z 2026-10-24T02:58:54.8366267Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T02:58:54.8366660Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T02:58:54.8366906Z 1997 │ assert.equal( 2026-10-24T02:58:54.8367150Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T02:58:54.8367385Z ·  ────── 2026-10-24T02:58:54.8367558Z 1999 │ "authoritative answer", 2026-10-24T02:58:54.8367706Z ╰──── 2026-10-24T02:58:54.8367932Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T02:58:54.8368107Z 2026-10-24T02:58:54.8368602Z ⚠ 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-24T02:58:54.8369187Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T02:58:54.8369594Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T02:58:54.8370054Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T02:58:54.8370474Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8370879Z 3953 │ ╰─▶ } 2026-10-24T02:58:54.8371227Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T02:58:54.8371519Z ╰──── 2026-10-24T02:58:54.8371577Z 2026-10-24T02:58:54.8372026Z ⚠ 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-24T02:58:54.8372608Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T02:58:54.8372985Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T02:58:54.8373332Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T02:58:54.8373609Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8373867Z 6064 │ ╰─▶ } 2026-10-24T02:58:54.8374167Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T02:58:54.8389584Z ╰──── 2026-10-24T02:58:54.8389706Z 2026-10-24T02:58:54.8390447Z ⚠ 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-24T02:58:54.8391248Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T02:58:54.8391513Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T02:58:54.8391815Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T02:58:54.8392103Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8392368Z 6199 │ ╰─▶ } 2026-10-24T02:58:54.8392672Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T02:58:54.8392897Z ╰──── 2026-10-24T02:58:54.8392955Z 2026-10-24T02:58:54.8393265Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8393712Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T02:58:54.8393937Z 345 │ 2026-10-24T02:58:54.8394106Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T02:58:54.8394326Z ·  ────────────┬─────────── 2026-10-24T02:58:54.8394593Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T02:58:54.8394833Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T02:58:54.8394983Z ╰──── 2026-10-24T02:58:54.8395149Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8395269Z 2026-10-24T02:58:54.8395493Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T02:58:54.8395973Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T02:58:54.8396230Z 730 │ ); 2026-10-24T02:58:54.8396473Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T02:58:54.8396744Z ·  ────── 2026-10-24T02:58:54.8396967Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T02:58:54.8397136Z ╰──── 2026-10-24T02:58:54.8397366Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T02:58:54.8397535Z 2026-10-24T02:58:54.8397709Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.8398022Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T02:58:54.8398223Z 185 │ 2026-10-24T02:58:54.8398391Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T02:58:54.8398583Z ·  ── 2026-10-24T02:58:54.8398725Z 187 │ } 2026-10-24T02:58:54.8398841Z ╰──── 2026-10-24T02:58:54.8399127Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.8399351Z 2026-10-24T02:58:54.8399517Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.8399815Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T02:58:54.8400064Z 188 │ 2026-10-24T02:58:54.8400188Z 189 │ for (const {} of [ 2026-10-24T02:58:54.8400343Z ·  ── 2026-10-24T02:58:54.8400518Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T02:58:54.8400674Z ╰──── 2026-10-24T02:58:54.8400961Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.8401187Z 2026-10-24T02:58:54.8401348Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.8401648Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T02:58:54.8401847Z 310 │ 2026-10-24T02:58:54.8402035Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T02:58:54.8402237Z ·  ── 2026-10-24T02:58:54.8402376Z 312 │ } 2026-10-24T02:58:54.8402489Z ╰──── 2026-10-24T02:58:54.8402761Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.8402980Z 2026-10-24T02:58:54.8403146Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.8403440Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T02:58:54.8403633Z 313 │ 2026-10-24T02:58:54.8403752Z 314 │ for (const {} of [ 2026-10-24T02:58:54.8403898Z ·  ── 2026-10-24T02:58:54.8404032Z 315 │ { 2026-10-24T02:58:54.8404143Z ╰──── 2026-10-24T02:58:54.8404414Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.8404634Z 2026-10-24T02:58:54.8405116Z ⚠ 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-24T02:58:54.8405743Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T02:58:54.8405996Z 27 │ ) { 2026-10-24T02:58:54.8406255Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8406581Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T02:58:54.8406850Z 30 │ │ if (predicate(available)) return available; 2026-10-24T02:58:54.8407084Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8407315Z 32 │ ╰─▶ } 2026-10-24T02:58:54.8407620Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T02:58:54.8407852Z ╰──── 2026-10-24T02:58:54.8407909Z 2026-10-24T02:58:54.8408357Z ⚠ 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-24T02:58:54.8408873Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T02:58:54.8409176Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T02:58:54.8409530Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T02:58:54.8409830Z ·  ─────────────────── 2026-10-24T02:58:54.8410097Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T02:58:54.8410269Z ╰──── 2026-10-24T02:58:54.8410329Z 2026-10-24T02:58:54.8410769Z ⚠ 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-24T02:58:54.8411286Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T02:58:54.8411595Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T02:58:54.8411885Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T02:58:54.8412119Z ·  ─────────────────── 2026-10-24T02:58:54.8412356Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T02:58:54.8412545Z ╰──── 2026-10-24T02:58:54.8412603Z 2026-10-24T02:58:54.8412831Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T02:58:54.8413175Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T02:58:54.8413358Z 11 │ 2026-10-24T02:58:54.8413517Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T02:58:54.8413739Z ·  ────────────┬──────────── 2026-10-24T02:58:54.8414026Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T02:58:54.8414259Z 13 │ readonly thread: { 2026-10-24T02:58:54.8414401Z ╰──── 2026-10-24T02:58:54.8414559Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8414680Z 2026-10-24T02:58:54.8414887Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T02:58:54.8415248Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T02:58:54.8415508Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T02:58:54.8415789Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T02:58:54.8416038Z ·  ─────┬───── 2026-10-24T02:58:54.8416282Z · ╰── 'HostProcess' is imported here 2026-10-24T02:58:54.8416478Z 26 │ 2026-10-24T02:58:54.8416592Z ╰──── 2026-10-24T02:58:54.8416742Z  help: Consider removing this import. 2026-10-24T02:58:54.8416857Z 2026-10-24T02:58:54.8417132Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8417552Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T02:58:54.8417810Z 123 │ const path = yield* Path.Path; 2026-10-24T02:58:54.8418032Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T02:58:54.8418254Z ·  ──────┬───── 2026-10-24T02:58:54.8418495Z · ╰── 'serverConfig' is declared here 2026-10-24T02:58:54.8418783Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T02:58:54.8418991Z ╰──── 2026-10-24T02:58:54.8419154Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8419270Z 2026-10-24T02:58:54.8428320Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8428780Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T02:58:54.8429072Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T02:58:54.8429350Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T02:58:54.8429598Z ·  ───────┬────── 2026-10-24T02:58:54.8429856Z · ╰── 'serverSettings' is declared here 2026-10-24T02:58:54.8430176Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T02:58:54.8430376Z ╰──── 2026-10-24T02:58:54.8430537Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8430657Z 2026-10-24T02:58:54.8430862Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T02:58:54.8431192Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T02:58:54.8431378Z 78 │ 2026-10-24T02:58:54.8431581Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T02:58:54.8431822Z ·  ────────┬─────── 2026-10-24T02:58:54.8432077Z · ╰── 'describeSchedule' is declared here 2026-10-24T02:58:54.8432332Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T02:58:54.8432506Z ╰──── 2026-10-24T02:58:54.8432662Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8432781Z 2026-10-24T02:58:54.8433138Z ⚠ 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-24T02:58:54.8433599Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T02:58:54.8433888Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T02:58:54.8434180Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T02:58:54.8434539Z ·  ─────────────────── 2026-10-24T02:58:54.8434775Z 1787 │ cwd, 2026-10-24T02:58:54.8434906Z ╰──── 2026-10-24T02:58:54.8434965Z 2026-10-24T02:58:54.8435134Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8435419Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T02:58:54.8435652Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T02:58:54.8435927Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T02:58:54.8436210Z ·  ─────┬──── 2026-10-24T02:58:54.8436502Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8436751Z 822 │ return AsyncResult.failure( 2026-10-24T02:58:54.8436901Z ╰──── 2026-10-24T02:58:54.8437235Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8437802Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8438085Z 2026-10-24T02:58:54.8438250Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8438536Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T02:58:54.8438740Z 708 │ const wokeAt = resolved 2026-10-24T02:58:54.8438965Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T02:58:54.8439228Z ·  ─────┬──── 2026-10-24T02:58:54.8439509Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8439725Z 710 │ : null; 2026-10-24T02:58:54.8439890Z ╰──── 2026-10-24T02:58:54.8440218Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8440767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8441044Z 2026-10-24T02:58:54.8441558Z ⚠ 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-24T02:58:54.8442181Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T02:58:54.8442438Z 520 │ })).delivery; 2026-10-24T02:58:54.8442729Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T02:58:54.8443034Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8443306Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T02:58:54.8443559Z 524 │ │ id: task.id, 2026-10-24T02:58:54.8443790Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T02:58:54.8444020Z 526 │ │ })).delivery; 2026-10-24T02:58:54.8444277Z 527 │ ╰─▶ } 2026-10-24T02:58:54.8444541Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T02:58:54.8444721Z ╰──── 2026-10-24T02:58:54.8444779Z 2026-10-24T02:58:54.8444983Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T02:58:54.8445341Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T02:58:54.8445573Z 1782 │ assert.equal( 2026-10-24T02:58:54.8445802Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T02:58:54.8446056Z ·  ────────────────────────── 2026-10-24T02:58:54.8446251Z 1784 │ stored.attachments[0]?.id, 2026-10-24T02:58:54.8446403Z ╰──── 2026-10-24T02:58:54.8446638Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T02:58:54.8446816Z 2026-10-24T02:58:54.8447070Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8447475Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-24T02:58:54.8447695Z 412 │ 2026-10-24T02:58:54.8447883Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T02:58:54.8448092Z ·  ──┬── 2026-10-24T02:58:54.8448305Z · ╰── 'layer' is declared here 2026-10-24T02:58:54.8448490Z ╰──── 2026-10-24T02:58:54.8448653Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8448769Z 2026-10-24T02:58:54.8449013Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T02:58:54.8449366Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-24T02:58:54.8449598Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T02:58:54.8449880Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T02:58:54.8450112Z ·  ─────────────── 2026-10-24T02:58:54.8450273Z 510 │ ) 2026-10-24T02:58:54.8450391Z ╰──── 2026-10-24T02:58:54.8450598Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T02:58:54.8450759Z 2026-10-24T02:58:54.8450948Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.8451239Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T02:58:54.8451482Z 457 │ ): Array { 2026-10-24T02:58:54.8451707Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T02:58:54.8451932Z ·  ┬ 2026-10-24T02:58:54.8452186Z · ╰── '_' is declared here 2026-10-24T02:58:54.8452455Z 459 │ for (const b of data) { 2026-10-24T02:58:54.8452598Z ╰──── 2026-10-24T02:58:54.8452758Z  help: Consider removing this parameter. 2026-10-24T02:58:54.8452873Z 2026-10-24T02:58:54.8453044Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8453363Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T02:58:54.8453629Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T02:58:54.8453926Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T02:58:54.8454222Z ·  ─────┬──── 2026-10-24T02:58:54.8454517Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8454741Z 179 │ } 2026-10-24T02:58:54.8454857Z ╰──── 2026-10-24T02:58:54.8455195Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8455756Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8456038Z 2026-10-24T02:58:54.8456291Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T02:58:54.8456644Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T02:58:54.8456828Z 55 │ 2026-10-24T02:58:54.8456990Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T02:58:54.8457224Z ·  ────────────────┬──────────────── 2026-10-24T02:58:54.8457530Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T02:58:54.8457803Z 57 │ selection: TerminalContextSelection, 2026-10-24T02:58:54.8457962Z ╰──── 2026-10-24T02:58:54.8458118Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8458236Z 2026-10-24T02:58:54.8458606Z ⚠ 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-24T02:58:54.8459066Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T02:58:54.8459334Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T02:58:54.8459712Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T02:58:54.8460069Z ·  ──────────────────────── 2026-10-24T02:58:54.8460323Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T02:58:54.8460523Z ╰──── 2026-10-24T02:58:54.8460581Z 2026-10-24T02:58:54.8460943Z ⚠ 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-24T02:58:54.8461396Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T02:58:54.8461697Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T02:58:54.8462005Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T02:58:54.8462281Z ·  ──────────────────────── 2026-10-24T02:58:54.8462460Z 257 │ return [ 2026-10-24T02:58:54.8462583Z ╰──── 2026-10-24T02:58:54.8462642Z 2026-10-24T02:58:54.8462840Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T02:58:54.8463133Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T02:58:54.8463335Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T02:58:54.8463530Z 28 │ import { identity } from "effect/Function"; 2026-10-24T02:58:54.8463712Z ·  ────┬─── 2026-10-24T02:58:54.8463943Z · ╰── 'identity' is imported here 2026-10-24T02:58:54.8464167Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T02:58:54.8464319Z ╰──── 2026-10-24T02:58:54.8464468Z  help: Consider removing this import. 2026-10-24T02:58:54.8464579Z 2026-10-24T02:58:54.8464770Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T02:58:54.8465050Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T02:58:54.8465241Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T02:58:54.8465424Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T02:58:54.8465597Z ·  ──┬── 2026-10-24T02:58:54.8465812Z · ╰── 'Fiber' is imported here 2026-10-24T02:58:54.8466047Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T02:58:54.8466212Z ╰──── 2026-10-24T02:58:54.8466366Z  help: Consider removing this import. 2026-10-24T02:58:54.8466478Z 2026-10-24T02:58:54.8466673Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T02:58:54.8466954Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T02:58:54.8467139Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T02:58:54.8467328Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T02:58:54.8467513Z ·  ────┬─── 2026-10-24T02:58:54.8467738Z · ╰── 'Schedule' is imported here 2026-10-24T02:58:54.8467959Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T02:58:54.8468111Z ╰──── 2026-10-24T02:58:54.8468259Z  help: Consider removing this import. 2026-10-24T02:58:54.8468371Z 2026-10-24T02:58:54.8468671Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8469046Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-24T02:58:54.8469314Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T02:58:54.8469679Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T02:58:54.8470035Z ·  ────────────┬─────────── 2026-10-24T02:58:54.8470317Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T02:58:54.8470648Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T02:58:54.8470876Z ╰──── 2026-10-24T02:58:54.8471032Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8471210Z 2026-10-24T02:58:54.8471606Z ⚠ 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-24T02:58:54.8472057Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T02:58:54.8472245Z 145 │ name, 2026-10-24T02:58:54.8472452Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T02:58:54.8472709Z ·  ────────────────────────── 2026-10-24T02:58:54.8472944Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T02:58:54.8473130Z ╰──── 2026-10-24T02:58:54.8473187Z 2026-10-24T02:58:54.8473381Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.8473720Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T02:58:54.8473962Z 35 │ { 2026-10-24T02:58:54.8507871Z 169 │ const record = 2026-10-24T02:58:54.8508043Z 170 │ token.type === "context" 2026-10-24T02:58:54.8508311Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T02:58:54.8508548Z 172 │ : undefined; 2026-10-24T02:58:54.8508741Z 173 │ const presentation = contextChipPresentation( 2026-10-24T02:58:54.8508974Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T02:58:54.8509168Z 175 │ record, 2026-10-24T02:58:54.8509305Z 176 │ ); 2026-10-24T02:58:54.8509463Z 177 │ const icon = contextChipIcon( 2026-10-24T02:58:54.8509711Z 178 │ presentation, 2026-10-24T02:58:54.8510027Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T02:58:54.8510238Z 180 │ ); 2026-10-24T02:58:54.8510373Z 181 │ return { 2026-10-24T02:58:54.8510520Z 182 │ type: token.type, 2026-10-24T02:58:54.8510683Z 183 │ source: token.source, 2026-10-24T02:58:54.8510856Z 184 │ start: token.start, 2026-10-24T02:58:54.8511013Z 185 │ end: token.end, 2026-10-24T02:58:54.8511254Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T02:58:54.8511475Z 187 │ label: 2026-10-24T02:58:54.8511632Z 188 │ token.type === "skill" 2026-10-24T02:58:54.8511839Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T02:58:54.8512054Z 190 │ : token.type === "context" 2026-10-24T02:58:54.8512396Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T02:58:54.8512710Z 192 │ : basename(token.value), 2026-10-24T02:58:54.8512956Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T02:58:54.8513211Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T02:58:54.8513414Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T02:58:54.8513581Z 196 │ }; 2026-10-24T02:58:54.8513713Z 197 │ }), 2026-10-24T02:58:54.8513838Z 198 │ ); 2026-10-24T02:58:54.8514040Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T02:58:54.8514340Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T02:58:54.8514699Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8515034Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T02:58:54.8515241Z ╰──── 2026-10-24T02:58:54.8515503Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:58:54.8516019Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8516315Z 2026-10-24T02:58:54.8516502Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:58:54.8516827Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T02:58:54.8517158Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T02:58:54.8517447Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T02:58:54.8517659Z ·  ───────────┬─────────── 2026-10-24T02:58:54.8518220Z · ╰── 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-24T02:58:54.8518721Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T02:58:54.8518895Z 256 │ value, 2026-10-24T02:58:54.8519050Z 257 │ selection: nextSelection, 2026-10-24T02:58:54.8519209Z 258 │ }); 2026-10-24T02:58:54.8519362Z 259 │ return acknowledgedEventCount; 2026-10-24T02:58:54.8519523Z 260 │ }, 2026-10-24T02:58:54.8519648Z 261 │ [], 2026-10-24T02:58:54.8519793Z ·  ─┬ 2026-10-24T02:58:54.8520095Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8520325Z 262 │ ); 2026-10-24T02:58:54.8520448Z ╰──── 2026-10-24T02:58:54.8520709Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:58:54.8521223Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8521517Z 2026-10-24T02:58:54.8521731Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:58:54.8522071Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T02:58:54.8522294Z 89 │ let cursor = prompt.length; 2026-10-24T02:58:54.8522504Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T02:58:54.8522731Z ·  ─────── 2026-10-24T02:58:54.8522933Z 91 │ let { start, end } = occurrence; 2026-10-24T02:58:54.8523088Z ╰──── 2026-10-24T02:58:54.8523403Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:58:54.8523653Z 2026-10-24T02:58:54.8523855Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T02:58:54.8524144Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T02:58:54.8524326Z 21 │ EnvironmentThreadShell, 2026-10-24T02:58:54.8524484Z 22 │ ThreadRunSummary, 2026-10-24T02:58:54.8524650Z ·  ────────┬─────── 2026-10-24T02:58:54.8524895Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T02:58:54.8525118Z 23 │ ThreadRuntimeSummary, 2026-10-24T02:58:54.8525258Z ╰──── 2026-10-24T02:58:54.8525413Z  help: Consider removing this import. 2026-10-24T02:58:54.8525526Z 2026-10-24T02:58:54.8525722Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T02:58:54.8526139Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T02:58:54.8526430Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T02:58:54.8526695Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T02:58:54.8526896Z ·  ──┬── 2026-10-24T02:58:54.8527110Z · ╰── 'Image' is imported here 2026-10-24T02:58:54.8527371Z 18 │ 2026-10-24T02:58:54.8527514Z ╰──── 2026-10-24T02:58:54.8527670Z  help: Consider removing this import. 2026-10-24T02:58:54.8527787Z 2026-10-24T02:58:54.8527989Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T02:58:54.8528332Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T02:58:54.8528643Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T02:58:54.8528907Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T02:58:54.8529106Z ·  ───────────┬─────────── 2026-10-24T02:58:54.8529668Z · ╰── 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-24T02:58:54.8530196Z 227 │ mostRecentEventCount, 2026-10-24T02:58:54.8530345Z 228 │ ); 2026-10-24T02:58:54.8530532Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T02:58:54.8530807Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T02:58:54.8531140Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8531414Z 230 │ const assumedValue = props.value; 2026-10-24T02:58:54.8531570Z ╰──── 2026-10-24T02:58:54.8531796Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T02:58:54.8532285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8532588Z 2026-10-24T02:58:54.8532806Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:58:54.8533154Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T02:58:54.8533450Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T02:58:54.8533695Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T02:58:54.8533891Z ·  ───────────┬─────────── 2026-10-24T02:58:54.8534449Z · ╰── 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-24T02:58:54.8534929Z 238 │ controlledEventCount, 2026-10-24T02:58:54.8535090Z 239 │ assumedValue, 2026-10-24T02:58:54.8535232Z 240 │ ); 2026-10-24T02:58:54.8535457Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T02:58:54.8535759Z ·  ───────────┬────────── 2026-10-24T02:58:54.8536107Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T02:58:54.8536389Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T02:58:54.8536552Z ╰──── 2026-10-24T02:58:54.8537030Z  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-24T02:58:54.8537779Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8538104Z 2026-10-24T02:58:54.8538246Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8538546Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T02:58:54.8538818Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T02:58:54.8539073Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T02:58:54.8539317Z ·  ─────────────┬──────────── 2026-10-24T02:58:54.8544023Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8544244Z 163 │ }); 2026-10-24T02:58:54.8544370Z ╰──── 2026-10-24T02:58:54.8544894Z  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-24T02:58:54.8545615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8545893Z 2026-10-24T02:58:54.8546036Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8546334Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T02:58:54.8546611Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T02:58:54.8546946Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T02:58:54.8547264Z ·  ─────────────┬──────────── 2026-10-24T02:58:54.8547646Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8547978Z 163 │ }); 2026-10-24T02:58:54.8548105Z ╰──── 2026-10-24T02:58:54.8548641Z  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-24T02:58:54.8549352Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8549635Z 2026-10-24T02:58:54.8549780Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8550135Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T02:58:54.8550348Z 163 │ }); 2026-10-24T02:58:54.8550510Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T02:58:54.8550745Z ·  ─────────┬────────────┬─── 2026-10-24T02:58:54.8551066Z · │ ╰── Cannot update ref value during render 2026-10-24T02:58:54.8551360Z · ╰── This value is a ref 2026-10-24T02:58:54.8551567Z 165 │ return JSON.stringify( 2026-10-24T02:58:54.8551720Z ╰──── 2026-10-24T02:58:54.8552316Z  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-24T02:58:54.8553161Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8553439Z 2026-10-24T02:58:54.8553584Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8553876Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T02:58:54.8554099Z 205 │ mostRecentEventCount, 2026-10-24T02:58:54.8554278Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T02:58:54.8554491Z ·  ───────────────┬─────────────── 2026-10-24T02:58:54.8554786Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8555021Z 207 │ ); 2026-10-24T02:58:54.8555141Z ╰──── 2026-10-24T02:58:54.8555654Z  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-24T02:58:54.8556354Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8556628Z 2026-10-24T02:58:54.8556771Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8557060Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T02:58:54.8557279Z 211 │ mostRecentEventCount, 2026-10-24T02:58:54.8557453Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T02:58:54.8557665Z ·  ───────────────┬─────────────── 2026-10-24T02:58:54.8557964Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8558194Z 213 │ ); 2026-10-24T02:58:54.8558310Z ╰──── 2026-10-24T02:58:54.8558820Z  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-24T02:58:54.8559520Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8559793Z 2026-10-24T02:58:54.8560019Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:58:54.8560400Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T02:58:54.8560706Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T02:58:54.8560956Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T02:58:54.8561191Z ·  ─────────┬──────── 2026-10-24T02:58:54.8561766Z · ╰── 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-24T02:58:54.8562228Z 163 │ }); 2026-10-24T02:58:54.8562384Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T02:58:54.8562562Z 165 │ return JSON.stringify( 2026-10-24T02:58:54.8562819Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T02:58:54.8563061Z 167 │ const record = 2026-10-24T02:58:54.8563227Z 168 │ token.type === "context" 2026-10-24T02:58:54.8563488Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T02:58:54.8563720Z 170 │ : undefined; 2026-10-24T02:58:54.8563914Z 171 │ const presentation = contextChipPresentation( 2026-10-24T02:58:54.8564148Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T02:58:54.8564339Z 173 │ record, 2026-10-24T02:58:54.8564479Z 174 │ ); 2026-10-24T02:58:54.8564634Z 175 │ const icon = contextChipIcon( 2026-10-24T02:58:54.8564800Z 176 │ presentation, 2026-10-24T02:58:54.8570823Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T02:58:54.8571047Z 178 │ ); 2026-10-24T02:58:54.8571181Z 179 │ return { 2026-10-24T02:58:54.8571327Z 180 │ type: token.type, 2026-10-24T02:58:54.8571488Z 181 │ source: token.source, 2026-10-24T02:58:54.8571652Z 182 │ start: token.start, 2026-10-24T02:58:54.8571807Z 183 │ end: token.end, 2026-10-24T02:58:54.8572041Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T02:58:54.8572255Z 185 │ label: 2026-10-24T02:58:54.8572405Z 186 │ token.type === "skill" 2026-10-24T02:58:54.8572611Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T02:58:54.8572814Z 188 │ : token.type === "context" 2026-10-24T02:58:54.8573148Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T02:58:54.8573457Z 190 │ : basename(token.value), 2026-10-24T02:58:54.8573703Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T02:58:54.8573947Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T02:58:54.8574146Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T02:58:54.8574308Z 194 │ }; 2026-10-24T02:58:54.8574433Z 195 │ }), 2026-10-24T02:58:54.8574553Z 196 │ ); 2026-10-24T02:58:54.8574751Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T02:58:54.8575054Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T02:58:54.8575403Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8575823Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T02:58:54.8576062Z ╰──── 2026-10-24T02:58:54.8576327Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:58:54.8576836Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8577132Z 2026-10-24T02:58:54.8577324Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:58:54.8577649Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T02:58:54.8577931Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T02:58:54.8578171Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T02:58:54.8578388Z ·  ───────────┬─────────── 2026-10-24T02:58:54.8578947Z · ╰── 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-24T02:58:54.8579525Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T02:58:54.8579758Z 254 │ value, 2026-10-24T02:58:54.8579962Z 255 │ selection: nextSelection, 2026-10-24T02:58:54.8580119Z 256 │ }); 2026-10-24T02:58:54.8580273Z 257 │ return acknowledgedEventCount; 2026-10-24T02:58:54.8580431Z 258 │ }, 2026-10-24T02:58:54.8580553Z 259 │ [], 2026-10-24T02:58:54.8580687Z ·  ─┬ 2026-10-24T02:58:54.8580948Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8581188Z 260 │ ); 2026-10-24T02:58:54.8581305Z ╰──── 2026-10-24T02:58:54.8581566Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:58:54.8582074Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8582370Z 2026-10-24T02:58:54.8582575Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T02:58:54.8582896Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T02:58:54.8583132Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T02:58:54.8583409Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T02:58:54.8583704Z 159 │ │ constructor(data: Record) { 2026-10-24T02:58:54.8583962Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T02:58:54.8584168Z 161 │ │ } 2026-10-24T02:58:54.8584384Z 162 │ ╰─▶ }, 2026-10-24T02:58:54.8584585Z 163 │ clipboard: { 2026-10-24T02:58:54.8584717Z ╰──── 2026-10-24T02:58:54.8584941Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T02:58:54.8585111Z 2026-10-24T02:58:54.8585393Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8585811Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T02:58:54.8586025Z 14 │ 2026-10-24T02:58:54.8586248Z 15 │ const legacyCredentials = { 2026-10-24T02:58:54.8586464Z ·  ────────┬──────── 2026-10-24T02:58:54.8586707Z · ╰── 'legacyCredentials' is declared here 2026-10-24T02:58:54.8586921Z 16 │ version: 1 as const, 2026-10-24T02:58:54.8587057Z ╰──── 2026-10-24T02:58:54.8587220Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8587340Z 2026-10-24T02:58:54.8587482Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8587752Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T02:58:54.8587943Z 184 │ "options", 2026-10-24T02:58:54.8588121Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T02:58:54.8588338Z ·  ────────────────┬─────────────── 2026-10-24T02:58:54.8588654Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8588938Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T02:58:54.8589102Z ╰──── 2026-10-24T02:58:54.8589624Z  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-24T02:58:54.8590373Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8590649Z 2026-10-24T02:58:54.8590794Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8591068Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T02:58:54.8591290Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T02:58:54.8591495Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T02:58:54.8591713Z ·  ────────────────┬──────────────── 2026-10-24T02:58:54.8592011Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8592289Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T02:58:54.8592447Z ╰──── 2026-10-24T02:58:54.8592966Z  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-24T02:58:54.8593673Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8593949Z 2026-10-24T02:58:54.8594225Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T02:58:54.8594612Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T02:58:54.8594807Z 248 │ }, 2026-10-24T02:58:54.8594957Z 249 │ (effect, flow, stopSessions) => 2026-10-24T02:58:54.8595151Z ·  ──────┬───── 2026-10-24T02:58:54.8595400Z · ╰── 'stopSessions' is declared here 2026-10-24T02:58:54.8595615Z 250 │ effect.pipe( 2026-10-24T02:58:54.8595748Z ╰──── 2026-10-24T02:58:54.8595906Z  help: Consider removing this parameter. 2026-10-24T02:58:54.8596024Z 2026-10-24T02:58:54.8596409Z ⚠ 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-24T02:58:54.8596887Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T02:58:54.8597200Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T02:58:54.8597537Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T02:58:54.8597794Z ·  ───────── 2026-10-24T02:58:54.8598072Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T02:58:54.8598304Z ╰──── 2026-10-24T02:58:54.8598362Z 2026-10-24T02:58:54.8598693Z ⚠ 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-24T02:58:54.8599133Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T02:58:54.8599452Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T02:58:54.8599797Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T02:58:54.8600119Z ·  ───────── 2026-10-24T02:58:54.8600271Z 52 │ } 2026-10-24T02:58:54.8600388Z ╰──── 2026-10-24T02:58:54.8600443Z 2026-10-24T02:58:54.8600767Z ⚠ 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-24T02:58:54.8601210Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T02:58:54.8601427Z 54 │ assert.equal( 2026-10-24T02:58:54.8601675Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T02:58:54.8601920Z ·  ───────── 2026-10-24T02:58:54.8602062Z 56 │ true, 2026-10-24T02:58:54.8602184Z ╰──── 2026-10-24T02:58:54.8602240Z 2026-10-24T02:58:54.8602560Z ⚠ 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-24T02:58:54.8603004Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T02:58:54.8603217Z 58 │ assert.equal( 2026-10-24T02:58:54.8603477Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T02:58:54.8603737Z ·  ───────── 2026-10-24T02:58:54.8603883Z 60 │ true, 2026-10-24T02:58:54.8604002Z ╰──── 2026-10-24T02:58:54.8604060Z 2026-10-24T02:58:54.8604383Z ⚠ 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-24T02:58:54.8604826Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T02:58:54.8605037Z 102 │ 2026-10-24T02:58:54.8605263Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T02:58:54.8605522Z ·  ───────── 2026-10-24T02:58:54.8605672Z 104 │ }); 2026-10-24T02:58:54.8605782Z ╰──── 2026-10-24T02:58:54.8605841Z 2026-10-24T02:58:54.8606109Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T02:58:54.8606484Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-24T02:58:54.8606691Z 233 │ 2026-10-24T02:58:54.8606866Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T02:58:54.8607081Z ·  ───────┬────── 2026-10-24T02:58:54.8607323Z · ╰── 'nonEmptyString' is declared here 2026-10-24T02:58:54.8607614Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T02:58:54.8607815Z ╰──── 2026-10-24T02:58:54.8607980Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8608099Z 2026-10-24T02:58:54.8608268Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.8608587Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T02:58:54.8608795Z 465 │ 2026-10-24T02:58:54.8608963Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T02:58:54.8609153Z ·  ── 2026-10-24T02:58:54.8609304Z 467 │ } 2026-10-24T02:58:54.8609415Z ╰──── 2026-10-24T02:58:54.8609702Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.8609936Z 2026-10-24T02:58:54.8610153Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T02:58:54.8610470Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T02:58:54.8610728Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T02:58:54.8610942Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T02:58:54.8611120Z ·  ─┬─ 2026-10-24T02:58:54.8611336Z · ╰── 'Arr' is imported here 2026-10-24T02:58:54.8611551Z 5 │ import * as Order from "effect/Order"; 2026-10-24T02:58:54.8611706Z ╰──── 2026-10-24T02:58:54.8611859Z  help: Consider removing this import. 2026-10-24T02:58:54.8611977Z 2026-10-24T02:58:54.8612165Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T02:58:54.8612489Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T02:58:54.8612705Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T02:58:54.8612886Z 5 │ import * as Order from "effect/Order"; 2026-10-24T02:58:54.8613057Z ·  ──┬── 2026-10-24T02:58:54.8613279Z · ╰── 'Order' is imported here 2026-10-24T02:58:54.8613521Z 6 │ 2026-10-24T02:58:54.8613665Z ╰──── 2026-10-24T02:58:54.8613821Z  help: Consider removing this import. 2026-10-24T02:58:54.8613937Z 2026-10-24T02:58:54.8614140Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T02:58:54.8614497Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T02:58:54.8614740Z 3 │ AuthProvidersManageScope, 2026-10-24T02:58:54.8614902Z 4 │ type AuthSessionState, 2026-10-24T02:58:54.8615072Z ·  ────────┬─────── 2026-10-24T02:58:54.8615316Z · ╰── 'AuthSessionState' is imported here 2026-10-24T02:58:54.8615526Z 5 │ type EnvironmentId, 2026-10-24T02:58:54.8615666Z ╰──── 2026-10-24T02:58:54.8615815Z  help: Consider removing this import. 2026-10-24T02:58:54.8615936Z 2026-10-24T02:58:54.8616401Z ⚠ 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-24T02:58:54.8616962Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T02:58:54.8617181Z 168 │ }); 2026-10-24T02:58:54.8617451Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T02:58:54.8617831Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T02:58:54.8618128Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8618387Z 172 │ ╰─▶ } 2026-10-24T02:58:54.8618582Z 173 │ 2026-10-24T02:58:54.8618699Z ╰──── 2026-10-24T02:58:54.8618756Z 2026-10-24T02:58:54.8619213Z ⚠ 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-24T02:58:54.8619969Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T02:58:54.8620232Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T02:58:54.8620554Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T02:58:54.8620867Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T02:58:54.8621122Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8621374Z 181 │ ╰─▶ } 2026-10-24T02:58:54.8621567Z 182 │ 2026-10-24T02:58:54.8621683Z ╰──── 2026-10-24T02:58:54.8621742Z 2026-10-24T02:58:54.8622195Z ⚠ 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-24T02:58:54.8622748Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T02:58:54.8623029Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T02:58:54.8623356Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T02:58:54.8623727Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T02:58:54.8624094Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T02:58:54.8624372Z 310 │ │ break; 2026-10-24T02:58:54.8624555Z 311 │ │ } 2026-10-24T02:58:54.8624758Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8625005Z 313 │ ╰─▶ } 2026-10-24T02:58:54.8625192Z 314 │ 2026-10-24T02:58:54.8625312Z ╰──── 2026-10-24T02:58:54.8625370Z 2026-10-24T02:58:54.8625824Z ⚠ 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-24T02:58:54.8626389Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-24T02:58:54.8626637Z 1227 │ yield* harness.replaceSession; 2026-10-24T02:58:54.8626953Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8627295Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T02:58:54.8627541Z 1230 │ │ break; 2026-10-24T02:58:54.8627724Z 1231 │ │ } 2026-10-24T02:58:54.8627933Z 1232 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8628184Z 1233 │ ╰─▶ } 2026-10-24T02:58:54.8628403Z 1234 │ yield* Queue.offer( 2026-10-24T02:58:54.8628553Z ╰──── 2026-10-24T02:58:54.8628613Z 2026-10-24T02:58:54.8629066Z ⚠ 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-24T02:58:54.8629624Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-24T02:58:54.8629913Z 1336 │ yield* harness.replaceSession; 2026-10-24T02:58:54.8630241Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8630591Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T02:58:54.8630864Z 1339 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8631121Z 1340 │ ╰─▶ } 2026-10-24T02:58:54.8631387Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T02:58:54.8631585Z ╰──── 2026-10-24T02:58:54.8631641Z 2026-10-24T02:58:54.8631902Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8632279Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T02:58:54.8632524Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T02:58:54.8632717Z 84 │ useEffect(() => { 2026-10-24T02:58:54.8632874Z ·  ────┬──── 2026-10-24T02:58:54.8633093Z · ╰── This is the containing effect 2026-10-24T02:58:54.8633376Z 85 │ if (!actionState.isRunning) return; 2026-10-24T02:58:54.8633577Z 86 │ setNowMs(Date.now()); 2026-10-24T02:58:54.8633737Z ·  ────┬─── 2026-10-24T02:58:54.8633987Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8634281Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T02:58:54.8634465Z ╰──── 2026-10-24T02:58:54.8635115Z  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-24T02:58:54.8635974Z  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-24T02:58:54.8636283Z 2026-10-24T02:58:54.8636485Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T02:58:54.8636816Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T02:58:54.8637032Z 1 │ import type { 2026-10-24T02:58:54.8637170Z 2 │ EnvironmentId, 2026-10-24T02:58:54.8637327Z ·  ──────┬────── 2026-10-24T02:58:54.8637554Z · ╰── 'EnvironmentId' is imported here 2026-10-24T02:58:54.8637781Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T02:58:54.8637938Z ╰──── 2026-10-24T02:58:54.8638092Z  help: Consider removing this import. 2026-10-24T02:58:54.8638205Z 2026-10-24T02:58:54.8638432Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:58:54.8638771Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T02:58:54.8639005Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T02:58:54.8639257Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T02:58:54.8639555Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T02:58:54.8639763Z 347 │ }; 2026-10-24T02:58:54.8639931Z ╰──── 2026-10-24T02:58:54.8640252Z  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-24T02:58:54.8640512Z 2026-10-24T02:58:54.8640730Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T02:58:54.8641063Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T02:58:54.8641341Z 447 │ const favorites = 2026-10-24T02:58:54.8641537Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T02:58:54.8641752Z ·  ───┬── 2026-10-24T02:58:54.8641978Z · ╰── For this reduce 2026-10-24T02:58:54.8642193Z 449 │ const exists = current.some( 2026-10-24T02:58:54.8642468Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T02:58:54.8642704Z 451 │ ); 2026-10-24T02:58:54.8642849Z 452 │ return change.favorite 2026-10-24T02:58:54.8643010Z 453 │ ? exists 2026-10-24T02:58:54.8643152Z 454 │ ? current 2026-10-24T02:58:54.8643371Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T02:58:54.8643666Z ·  ─────┬──── 2026-10-24T02:58:54.8643912Z · ╰── From this spread 2026-10-24T02:58:54.8644109Z 456 │ : current.filter( 2026-10-24T02:58:54.8644247Z ╰──── 2026-10-24T02:58:54.8644512Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T02:58:54.8644875Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T02:58:54.8645046Z 2026-10-24T02:58:54.8645232Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T02:58:54.8645534Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T02:58:54.8645726Z 464 │ null; 2026-10-24T02:58:54.8645912Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T02:58:54.8646138Z ·  ──────────┬───────── 2026-10-24T02:58:54.8646367Z · ╰── From this accumulator 2026-10-24T02:58:54.8646600Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T02:58:54.8646785Z ·  ─┬─ 2026-10-24T02:58:54.8646969Z · ╰── For this loop 2026-10-24T02:58:54.8647220Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T02:58:54.8647434Z 468 │ hiddenModels: [], 2026-10-24T02:58:54.8647589Z 469 │ modelOrder: [], 2026-10-24T02:58:54.8647733Z 470 │ }; 2026-10-24T02:58:54.8647979Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T02:58:54.8648272Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T02:58:54.8648479Z 473 │ nextModelPreferences = { 2026-10-24T02:58:54.8648654Z 474 │ ...nextModelPreferences, 2026-10-24T02:58:54.8648858Z ·  ───────────┬─────────── 2026-10-24T02:58:54.8649083Z · ╰── From this spread 2026-10-24T02:58:54.8649321Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T02:58:54.8649504Z ╰──── 2026-10-24T02:58:54.8649712Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T02:58:54.8650069Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T02:58:54.8650232Z 2026-10-24T02:58:54.8650700Z ⚠ 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-24T02:58:54.8651258Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T02:58:54.8651461Z 225 │ ) { 2026-10-24T02:58:54.8651733Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8652036Z 227 │ │ const socket = sockets[index]; 2026-10-24T02:58:54.8652250Z 228 │ │ if (socket) { 2026-10-24T02:58:54.8652447Z 229 │ │ return socket; 2026-10-24T02:58:54.8652633Z 230 │ │ } 2026-10-24T02:58:54.8652827Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8653069Z 232 │ ╰─▶ } 2026-10-24T02:58:54.8653428Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T02:58:54.8653694Z ╰──── 2026-10-24T02:58:54.8653750Z 2026-10-24T02:58:54.8654207Z ⚠ 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-24T02:58:54.8654754Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T02:58:54.8654955Z 239 │ ) { 2026-10-24T02:58:54.8655223Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8655625Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T02:58:54.8655929Z 242 │ │ if (request) { 2026-10-24T02:58:54.8656131Z 243 │ │ return request; 2026-10-24T02:58:54.8656317Z 244 │ │ } 2026-10-24T02:58:54.8656511Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8656751Z 246 │ ╰─▶ } 2026-10-24T02:58:54.8657048Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T02:58:54.8657271Z ╰──── 2026-10-24T02:58:54.8657330Z 2026-10-24T02:58:54.8657784Z ⚠ 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-24T02:58:54.8658332Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T02:58:54.8658538Z 130 │ ) { 2026-10-24T02:58:54.8658815Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8659137Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T02:58:54.8659364Z 133 │ │ return; 2026-10-24T02:58:54.8659683Z 134 │ │ } 2026-10-24T02:58:54.8659929Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8660193Z 136 │ ╰─▶ } 2026-10-24T02:58:54.8660492Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T02:58:54.8660715Z ╰──── 2026-10-24T02:58:54.8660776Z 2026-10-24T02:58:54.8661295Z ⚠ 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-24T02:58:54.8661879Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T02:58:54.8662180Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T02:58:54.8662602Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T02:58:54.8662940Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8663194Z 254 │ ╰─▶ } 2026-10-24T02:58:54.8663462Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T02:58:54.8663656Z ╰──── 2026-10-24T02:58:54.8663714Z 2026-10-24T02:58:54.8664165Z ⚠ 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-24T02:58:54.8664709Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T02:58:54.8664906Z 257 │ 2026-10-24T02:58:54.8665220Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T02:58:54.8665550Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8665802Z 260 │ ╰─▶ } 2026-10-24T02:58:54.8666046Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T02:58:54.8666224Z ╰──── 2026-10-24T02:58:54.8666281Z 2026-10-24T02:58:54.8666735Z ⚠ 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-24T02:58:54.8667284Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T02:58:54.8667486Z 321 │ ); 2026-10-24T02:58:54.8667817Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T02:58:54.8668152Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8668408Z 324 │ ╰─▶ } 2026-10-24T02:58:54.8668600Z 325 │ 2026-10-24T02:58:54.8668716Z ╰──── 2026-10-24T02:58:54.8668772Z 2026-10-24T02:58:54.8669222Z ⚠ 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-24T02:58:54.8669763Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T02:58:54.8670106Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T02:58:54.8670522Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T02:58:54.8670849Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8671149Z 332 │ ╰─▶ } 2026-10-24T02:58:54.8671420Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T02:58:54.8671592Z ╰──── 2026-10-24T02:58:54.8671648Z 2026-10-24T02:58:54.8671862Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:58:54.8672205Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T02:58:54.8672479Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T02:58:54.8672729Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T02:58:54.8672963Z ·  ─────── 2026-10-24T02:58:54.8673191Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T02:58:54.8673373Z ╰──── 2026-10-24T02:58:54.8673691Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:58:54.8673945Z 2026-10-24T02:58:54.8674168Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:58:54.8674513Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T02:58:54.8674727Z 20 │ [instanceId]: { 2026-10-24T02:58:54.8674889Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T02:58:54.8675093Z ·  ──────────────────────────── 2026-10-24T02:58:54.8675272Z 22 │ [model]: options, 2026-10-24T02:58:54.8675414Z ╰──── 2026-10-24T02:58:54.8675735Z  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-24T02:58:54.8675993Z 2026-10-24T02:58:54.8676259Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8676616Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T02:58:54.8676793Z 35 │ 2026-10-24T02:58:54.8676985Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T02:58:54.8677206Z ·  ─────┬──── 2026-10-24T02:58:54.8677438Z · ╰── 'claudeCaps' is declared here 2026-10-24T02:58:54.8677646Z 37 │ optionDescriptors: [ 2026-10-24T02:58:54.8677789Z ╰──── 2026-10-24T02:58:54.8677948Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8678068Z 2026-10-24T02:58:54.8678299Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T02:58:54.8678659Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-24T02:58:54.8678873Z 227 │ ): string { 2026-10-24T02:58:54.8679098Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T02:58:54.8679376Z ·  ────── 2026-10-24T02:58:54.8679625Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T02:58:54.8679822Z ╰──── 2026-10-24T02:58:54.8680083Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T02:58:54.8680263Z 2026-10-24T02:58:54.8680495Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T02:58:54.8680902Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T02:58:54.8681199Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T02:58:54.8681566Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T02:58:54.8681909Z 986 │ │ (approval) => approval.requestId, 2026-10-24T02:58:54.8682172Z 987 │ ╰─▶ ); 2026-10-24T02:58:54.8682449Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T02:58:54.8682651Z ╰──── 2026-10-24T02:58:54.8682786Z  help: Switch to `Set` 2026-10-24T02:58:54.8682882Z 2026-10-24T02:58:54.8683083Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.8683451Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T02:58:54.8683692Z 87 │
  • new Promise((resolve) => setImmediate(resolve))); 2026-10-24T02:58:54.8687964Z 143 │ ╰─▶ } 2026-10-24T02:58:54.8688196Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T02:58:54.8688354Z ╰──── 2026-10-24T02:58:54.8688414Z 2026-10-24T02:58:54.8688614Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8688921Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T02:58:54.8689126Z 28 │ getPendingThreadOrder(); 2026-10-24T02:58:54.8689300Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T02:58:54.8689524Z ·  ────┬──── ───────┬────── 2026-10-24T02:58:54.8689837Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T02:58:54.8690195Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T02:58:54.8690404Z 30 │ return pending; 2026-10-24T02:58:54.8690535Z ╰──── 2026-10-24T02:58:54.8690944Z  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-24T02:58:54.8691568Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8691863Z 2026-10-24T02:58:54.8692321Z ⚠ 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-24T02:58:54.8692892Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T02:58:54.8693172Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T02:58:54.8693514Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T02:58:54.8693844Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T02:58:54.8694096Z 137 │ │ if (predicate(lastState)) { 2026-10-24T02:58:54.8694316Z 138 │ │ return lastState; 2026-10-24T02:58:54.8694507Z 139 │ │ } 2026-10-24T02:58:54.8694701Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8694941Z 141 │ ╰─▶ } 2026-10-24T02:58:54.8695150Z 142 │ return yield* Effect.die( 2026-10-24T02:58:54.8695296Z ╰──── 2026-10-24T02:58:54.8695354Z 2026-10-24T02:58:54.8695560Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8695896Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-24T02:58:54.8696125Z 1314 │ queuedMessagesByThreadKey, 2026-10-24T02:58:54.8696284Z 1315 │ retryTick, 2026-10-24T02:58:54.8696444Z ·  ────┬──── 2026-10-24T02:58:54.8696672Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T02:58:54.8696890Z 1316 │ restoreQueuedMessage, 2026-10-24T02:58:54.8697032Z ╰──── 2026-10-24T02:58:54.8697383Z  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-24T02:58:54.8697970Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8698271Z 2026-10-24T02:58:54.8698504Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T02:58:54.8698886Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-24T02:58:54.8699118Z 264 │ ): boolean { 2026-10-24T02:58:54.8699344Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T02:58:54.8699761Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T02:58:54.8700104Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T02:58:54.8700313Z ╰──── 2026-10-24T02:58:54.8700445Z  help: Switch to `Set` 2026-10-24T02:58:54.8700543Z 2026-10-24T02:58:54.8700774Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.8701100Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T02:58:54.8701284Z 265 │ 2026-10-24T02:58:54.8701453Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T02:58:54.8701646Z ·  ── 2026-10-24T02:58:54.8701795Z 267 │ } 2026-10-24T02:58:54.8701906Z ╰──── 2026-10-24T02:58:54.8702194Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.8702415Z 2026-10-24T02:58:54.8702637Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:58:54.8702985Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T02:58:54.8703196Z 1021 │ instanceId, 2026-10-24T02:58:54.8703431Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T02:58:54.8703720Z ·  ────────────────────────────────────────────────── 2026-10-24T02:58:54.8703919Z 1023 │ ]), 2026-10-24T02:58:54.8704048Z ╰──── 2026-10-24T02:58:54.8704364Z  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-24T02:58:54.8704618Z 2026-10-24T02:58:54.8705078Z ⚠ 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-24T02:58:54.8705627Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T02:58:54.8705826Z 93 │ ) { 2026-10-24T02:58:54.8706100Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:58:54.8706462Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T02:58:54.8706756Z 96 │ │ if (predicate(project)) return project; 2026-10-24T02:58:54.8706990Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.8707229Z 98 │ ╰─▶ } 2026-10-24T02:58:54.8707510Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T02:58:54.8707717Z ╰──── 2026-10-24T02:58:54.8707775Z 2026-10-24T02:58:54.8708034Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T02:58:54.8708467Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T02:58:54.8708806Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T02:58:54.8709046Z 12 │ this.onmessage = listener; 2026-10-24T02:58:54.8709232Z ·  ───────── 2026-10-24T02:58:54.8709384Z 13 │ } 2026-10-24T02:58:54.8709506Z ╰──── 2026-10-24T02:58:54.8709916Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T02:58:54.8710220Z 2026-10-24T02:58:54.8710423Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T02:58:54.8710757Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T02:58:54.8710979Z 15 │ constructor() { 2026-10-24T02:58:54.8711134Z 16 │ source = this; 2026-10-24T02:58:54.8711293Z ·  ────── 2026-10-24T02:58:54.8711437Z 17 │ } 2026-10-24T02:58:54.8711555Z ╰──── 2026-10-24T02:58:54.8711883Z  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-24T02:58:54.8712142Z 2026-10-24T02:58:54.8712331Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.8712689Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-24T02:58:54.8712923Z 813 │
    { 2026-10-24T02:58:54.8720329Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T02:58:54.8720606Z ·  ──────────────────────── 2026-10-24T02:58:54.8720783Z 18 │ "review:write", 2026-10-24T02:58:54.8720925Z ╰──── 2026-10-24T02:58:54.8720984Z 2026-10-24T02:58:54.8721344Z ⚠ 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-24T02:58:54.8721783Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T02:58:54.8721966Z 19 │ ]); 2026-10-24T02:58:54.8722195Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T02:58:54.8722465Z ·  ──────────────────────── 2026-10-24T02:58:54.8722706Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T02:58:54.8722902Z ╰──── 2026-10-24T02:58:54.8722959Z 2026-10-24T02:58:54.8723315Z ⚠ 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-24T02:58:54.8723758Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T02:58:54.8724050Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T02:58:54.8724352Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T02:58:54.8724593Z ·  ──────────────────────── 2026-10-24T02:58:54.8724780Z 59 │ authenticated: true, 2026-10-24T02:58:54.8724919Z ╰──── 2026-10-24T02:58:54.8724976Z 2026-10-24T02:58:54.8725171Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.8725511Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T02:58:54.8725783Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T02:58:54.8726002Z 223 │ 2026-10-24T02:58:54.8726222Z ·  ─────────────── 2026-10-24T02:58:54.8726430Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T02:58:54.8726595Z ╰──── 2026-10-24T02:58:54.8726797Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T02:58:54.8726952Z 2026-10-24T02:58:54.8727145Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.8727480Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T02:58:54.8727712Z 226 │ > { 2026-10-24T02:58:54.8731691Z ·  ────────┬─────── 2026-10-24T02:58:54.8731937Z · ╰── 'summarizePayload' is declared here 2026-10-24T02:58:54.8732196Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T02:58:54.8732364Z ╰──── 2026-10-24T02:58:54.8768137Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8768307Z 2026-10-24T02:58:54.8768595Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8768942Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T02:58:54.8769184Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T02:58:54.8769397Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T02:58:54.8769671Z ·  ──────┬────── ────┬─── 2026-10-24T02:58:54.8770065Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T02:58:54.8770397Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T02:58:54.8770612Z 455 │ const { 2026-10-24T02:58:54.8770740Z ╰──── 2026-10-24T02:58:54.8771100Z  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-24T02:58:54.8771695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8771985Z 2026-10-24T02:58:54.8772171Z ⚠ react(static-components): Cannot create components during render 2026-10-24T02:58:54.8772490Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T02:58:54.8772700Z 492 │ // same check. 2026-10-24T02:58:54.8772906Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T02:58:54.8773168Z ·  ─────────────┬───────────── 2026-10-24T02:58:54.8773468Z · ╰── The component is created during render here 2026-10-24T02:58:54.8773941Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T02:58:54.8774266Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T02:58:54.8774534Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T02:58:54.8774766Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T02:58:54.8774960Z 498 │ setIsPullRefreshing(true); 2026-10-24T02:58:54.8775138Z 499 │ await refreshSelectedSection(); 2026-10-24T02:58:54.8775317Z 500 │ setIsPullRefreshing(false); 2026-10-24T02:58:54.8775469Z 501 │ }; 2026-10-24T02:58:54.8775675Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T02:58:54.8775970Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T02:58:54.8776230Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T02:58:54.8776442Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T02:58:54.8776635Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T02:58:54.8776815Z 507 │ files: reviewFiles, 2026-10-24T02:58:54.8776997Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T02:58:54.8777250Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T02:58:54.8777453Z 510 │ : undefined, 2026-10-24T02:58:54.8777630Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T02:58:54.8777861Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T02:58:54.8778058Z 513 │ : undefined, 2026-10-24T02:58:54.8778190Z 514 │ }); 2026-10-24T02:58:54.8778442Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T02:58:54.8778765Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T02:58:54.8778969Z 517 │ environmentId, 2026-10-24T02:58:54.8779110Z 518 │ threadId, 2026-10-24T02:58:54.8779248Z 519 │ selectedSection, 2026-10-24T02:58:54.8779402Z 520 │ nativeReviewDiffData, 2026-10-24T02:58:54.8779698Z 521 │ }); 2026-10-24T02:58:54.8779903Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T02:58:54.8780116Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T02:58:54.8780309Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T02:58:54.8780493Z 525 │ diff: selectedSection?.diff, 2026-10-24T02:58:54.8780663Z 526 │ data: nativeReviewDiffData, 2026-10-24T02:58:54.8780828Z 527 │ collapsedFileIds, 2026-10-24T02:58:54.8780973Z 528 │ viewedFileIds, 2026-10-24T02:58:54.8781163Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T02:58:54.8781449Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T02:58:54.8781655Z 531 │ }); 2026-10-24T02:58:54.8781790Z 532 │ const showcaseReviewKey = 2026-10-24T02:58:54.8782013Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T02:58:54.8782357Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T02:58:54.8782620Z 535 │ : null; 2026-10-24T02:58:54.8782859Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T02:58:54.8783105Z 537 │ nativeBridge.onDebug(event); 2026-10-24T02:58:54.8783265Z 538 │ if ( 2026-10-24T02:58:54.8783412Z 539 │ showcaseReviewKey === null || 2026-10-24T02:58:54.8783640Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T02:58:54.8783887Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T02:58:54.8784072Z 542 │ ) { 2026-10-24T02:58:54.8784198Z 543 │ return; 2026-10-24T02:58:54.8784328Z 544 │ } 2026-10-24T02:58:54.8784502Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T02:58:54.8784789Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T02:58:54.8785016Z 547 │ }; 2026-10-24T02:58:54.8785128Z 548 │ 2026-10-24T02:58:54.8785304Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T02:58:54.8785514Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T02:58:54.8785703Z 551 │ commentSelection.clearSelection(); 2026-10-24T02:58:54.8785928Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T02:58:54.8786142Z 553 │ toggleExpandedFile(fileId); 2026-10-24T02:58:54.8786295Z 554 │ } 2026-10-24T02:58:54.8786476Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T02:58:54.8786674Z 556 │ if (!nativeView) return; 2026-10-24T02:58:54.8786855Z 557 │ const result = await settlePromise(() => 2026-10-24T02:58:54.8787139Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T02:58:54.8787369Z 559 │ ); 2026-10-24T02:58:54.8787524Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T02:58:54.8787806Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T02:58:54.8788045Z 562 │ } 2026-10-24T02:58:54.8788158Z 563 │ }; 2026-10-24T02:58:54.8788300Z 564 │ const handleVisibleFileChange = ( 2026-10-24T02:58:54.8788534Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T02:58:54.8788736Z 566 │ ) => { 2026-10-24T02:58:54.8788914Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T02:58:54.8789201Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T02:58:54.8789430Z 569 │ }; 2026-10-24T02:58:54.8789568Z 570 │ const renderInspector = () => ( 2026-10-24T02:58:54.8789737Z 571 │ void handleSelectFile(fileId)} 2026-10-24T02:58:54.8790921Z 577 │ /> 2026-10-24T02:58:54.8791043Z 578 │ ); 2026-10-24T02:58:54.8791154Z 579 │ 2026-10-24T02:58:54.8791454Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T02:58:54.8791753Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T02:58:54.8791924Z 582 │ if (fileId) { 2026-10-24T02:58:54.8792081Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T02:58:54.8792260Z 584 │ toggleExpandedFile(fileId); 2026-10-24T02:58:54.8792409Z 585 │ } 2026-10-24T02:58:54.8792524Z 586 │ }; 2026-10-24T02:58:54.8792638Z 587 │ 2026-10-24T02:58:54.8792783Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T02:58:54.8793010Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T02:58:54.8793196Z 590 │ ) => { 2026-10-24T02:58:54.8793346Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T02:58:54.8793512Z 592 │ if (fileId) { 2026-10-24T02:58:54.8793667Z 593 │ toggleViewedFile(fileId); 2026-10-24T02:58:54.8793823Z 594 │ } 2026-10-24T02:58:54.8793942Z 595 │ }; 2026-10-24T02:58:54.8794057Z 596 │ 2026-10-24T02:58:54.8794187Z 597 │ const parsedDiffNotice = 2026-10-24T02:58:54.8794441Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T02:58:54.8794726Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T02:58:54.8795020Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T02:58:54.8795306Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T02:58:54.8795600Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T02:58:54.8795876Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T02:58:54.8796101Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T02:58:54.8796294Z 605 │ hasCachedSelectedDiff, 2026-10-24T02:58:54.8796451Z 606 │ hasAnyCachedDiff, 2026-10-24T02:58:54.8796596Z 607 │ }); 2026-10-24T02:58:54.8796746Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T02:58:54.8796943Z 609 │ void retryEnvironment(environmentId); 2026-10-24T02:58:54.8797099Z 610 │ }; 2026-10-24T02:58:54.8797245Z 611 │ const handleReturnToThread = () => { 2026-10-24T02:58:54.8797425Z 612 │ if (navigation.canGoBack()) { 2026-10-24T02:58:54.8797594Z 613 │ navigation.goBack(); 2026-10-24T02:58:54.8797742Z 614 │ return; 2026-10-24T02:58:54.8797871Z 615 │ } 2026-10-24T02:58:54.8798015Z 616 │ navigation.navigate("Thread", { 2026-10-24T02:58:54.8798205Z 617 │ environmentId: String(environmentId), 2026-10-24T02:58:54.8798391Z 618 │ threadId: String(threadId), 2026-10-24T02:58:54.8798540Z 619 │ }); 2026-10-24T02:58:54.8798666Z 620 │ }; 2026-10-24T02:58:54.8798804Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T02:58:54.8798974Z 622 │ selectedSection?.title, 2026-10-24T02:58:54.8799140Z 623 │ headerDiffSummary.additions, 2026-10-24T02:58:54.8799321Z 624 │ headerDiffSummary.deletions, 2026-10-24T02:58:54.8799470Z 625 │ ] 2026-10-24T02:58:54.8799629Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T02:58:54.8799812Z 627 │ .join(" · "); 2026-10-24T02:58:54.8799981Z 628 │ 2026-10-24T02:58:54.8800115Z 629 │ const showChangedFilesPane = 2026-10-24T02:58:54.8800280Z 630 │ !showConnectionNotice && 2026-10-24T02:58:54.8800445Z 631 │ selectedSection !== null && 2026-10-24T02:58:54.8800617Z 632 │ parsedDiff.kind === "files" && 2026-10-24T02:58:54.8800792Z 633 │ NativeReviewDiffView !== null; 2026-10-24T02:58:54.8801117Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T02:58:54.8801497Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T02:58:54.8801726Z 636 │ 2026-10-24T02:58:54.8801854Z 637 │ const listHeader = (() => { 2026-10-24T02:58:54.8802033Z 638 │ const children: ReactElement[] = []; 2026-10-24T02:58:54.8802185Z 639 │ 2026-10-24T02:58:54.8802304Z 640 │ if (error) { 2026-10-24T02:58:54.8802443Z 641 │ children.push( 2026-10-24T02:58:54.8802583Z 642 │ 2026-10-24T02:58:54.8803873Z 649 │ Review unavailable 2026-10-24T02:58:54.8804191Z 650 │ {error} 2026-10-24T02:58:54.8804411Z 651 │ , 2026-10-24T02:58:54.8804542Z 652 │ ); 2026-10-24T02:58:54.8804660Z 653 │ } 2026-10-24T02:58:54.8804777Z 654 │ 2026-10-24T02:58:54.8804905Z 655 │ if (parsedDiffNotice) { 2026-10-24T02:58:54.8805151Z 656 │ children.push(); 2026-10-24T02:58:54.8805369Z 657 │ } 2026-10-24T02:58:54.8805484Z 658 │ 2026-10-24T02:58:54.8805558Z 659 │ if (children.length === 0) { 2026-10-24T02:58:54.8805622Z 660 │ return null; 2026-10-24T02:58:54.8805680Z 661 │ } 2026-10-24T02:58:54.8805734Z 662 │ 2026-10-24T02:58:54.8805803Z 663 │ return <>{children}; 2026-10-24T02:58:54.8805857Z 664 │ })(); 2026-10-24T02:58:54.8805927Z 665 │ const headerSubtitle = [ 2026-10-24T02:58:54.8806005Z 666 │ headerDiffSummary.additions, 2026-10-24T02:58:54.8806082Z 667 │ headerDiffSummary.deletions, 2026-10-24T02:58:54.8806162Z 668 │ pendingReviewCommentCount > 0 2026-10-24T02:58:54.8806329Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T02:58:54.8806389Z 670 │ : null, 2026-10-24T02:58:54.8806442Z 671 │ ] 2026-10-24T02:58:54.8806507Z 672 │ .filter(Boolean) 2026-10-24T02:58:54.8806570Z 673 │ .join(" · "); 2026-10-24T02:58:54.8806703Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T02:58:54.8806756Z 675 │ 2026-10-24T02:58:54.8806820Z 676 │ return ( 2026-10-24T02:58:54.8806878Z 677 │ <> 2026-10-24T02:58:54.8806942Z 678 │ 2026-10-24T02:58:54.8808324Z 694 │ 2026-10-24T02:58:54.8808393Z 695 │ 2026-10-24T02:58:54.8808512Z 696 │ 2026-10-24T02:58:54.8808590Z 697 │ {showConnectionNotice ? ( 2026-10-24T02:58:54.8808727Z 698 │ 2026-10-24T02:58:54.8808817Z 699 │ 2026-10-24T02:58:54.8809816Z 711 │ 2026-10-24T02:58:54.8810016Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T02:58:54.8810081Z 713 │ 2026-10-24T02:58:54.8810519Z 719 │ 2026-10-24T02:58:54.8810869Z 723 │ {listHeader} 2026-10-24T02:58:54.8810983Z 724 │ 2026-10-24T02:58:54.8811064Z 725 │ { 2026-10-24T02:58:54.8813181Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T02:58:54.8813314Z  85 │ │ const connections = new Map(); 2026-10-24T02:58:54.8813384Z  86 │ │ 2026-10-24T02:58:54.8813594Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T02:58:54.8813702Z  88 │ │ Effect.suspend(() => { 2026-10-24T02:58:54.8813839Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T02:58:54.8813948Z  90 │ │ return connection === undefined 2026-10-24T02:58:54.8814155Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T02:58:54.8814264Z  92 │ │ : Effect.succeed(connection); 2026-10-24T02:58:54.8814342Z  93 │ │ }); 2026-10-24T02:58:54.8814410Z  94 │ │ 2026-10-24T02:58:54.8814493Z  95 │ │ const send = ( 2026-10-24T02:58:54.8814591Z  96 │ │ connection: Connection, 2026-10-24T02:58:54.8814683Z  97 │ │ message: unknown, 2026-10-24T02:58:54.8814843Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T02:58:54.8814959Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T02:58:54.8815063Z 100 │ │ Effect.gen(function* () { 2026-10-24T02:58:54.8815184Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T02:58:54.8815323Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T02:58:54.8815532Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T02:58:54.8815609Z 104 │ │ } 2026-10-24T02:58:54.8815739Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T02:58:54.8815843Z 106 │ │ try: (signal) => 2026-10-24T02:58:54.8815975Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T02:58:54.8816074Z 108 │ │ method: "POST", 2026-10-24T02:58:54.8816167Z 109 │ │ signal, 2026-10-24T02:58:54.8816262Z 110 │ │ headers: { 2026-10-24T02:58:54.8816387Z 111 │ │ "content-type": "application/json", 2026-10-24T02:58:54.8816525Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T02:58:54.8816656Z 113 │ │ authorization: options.authorization, 2026-10-24T02:58:54.8816779Z 114 │ │ ...(connection.sessionId === null 2026-10-24T02:58:54.8816871Z 115 │ │ ? {} 2026-10-24T02:58:54.8817057Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T02:58:54.8817215Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T02:58:54.8817305Z 118 │ │ ? {} 2026-10-24T02:58:54.8817470Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T02:58:54.8817553Z 120 │ │ }, 2026-10-24T02:58:54.8817643Z 121 │ │ body, 2026-10-24T02:58:54.8817726Z 122 │ │ }), 2026-10-24T02:58:54.8817827Z 123 │ │ catch: bridgeError, 2026-10-24T02:58:54.8817905Z 124 │ │ }); 2026-10-24T02:58:54.8818117Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T02:58:54.8818218Z 126 │ │ if (!response.ok) { 2026-10-24T02:58:54.8818324Z 127 │ │ yield* Effect.promise( 2026-10-24T02:58:54.8818501Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T02:58:54.8818583Z 129 │ │ ); 2026-10-24T02:58:54.8818694Z 130 │ │ return yield* Effect.fail( 2026-10-24T02:58:54.8818900Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T02:58:54.8818978Z 132 │ │ ); 2026-10-24T02:58:54.8819058Z 133 │ │ } 2026-10-24T02:58:54.8819269Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T02:58:54.8819391Z 135 │ │ for (const payload of payloads) { 2026-10-24T02:58:54.8819706Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T02:58:54.8819782Z 137 │ │ } 2026-10-24T02:58:54.8819921Z 138 │ │ return payloads; 2026-10-24T02:58:54.8820046Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T02:58:54.8820120Z 140 │ │ ); 2026-10-24T02:58:54.8820188Z 141 │ │ 2026-10-24T02:58:54.8820361Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T02:58:54.8820490Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T02:58:54.8820675Z 144 │ │ ): Effect.fn.Return { 2026-10-24T02:58:54.8820831Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T02:58:54.8820957Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T02:58:54.8821077Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T02:58:54.8821179Z 148 │ │ if (sessionId !== null) { 2026-10-24T02:58:54.8821304Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T02:58:54.8821399Z 150 │ │ try: (signal) => 2026-10-24T02:58:54.8821527Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T02:58:54.8821694Z 152 │ │ method: "DELETE", 2026-10-24T02:58:54.8821823Z 153 │ │ signal, 2026-10-24T02:58:54.8821916Z 154 │ │ headers: { 2026-10-24T02:58:54.8822044Z 155 │ │ authorization: options.authorization, 2026-10-24T02:58:54.8822162Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T02:58:54.8822290Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T02:58:54.8822381Z 158 │ │ ? {} 2026-10-24T02:58:54.8822542Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T02:58:54.8822625Z 160 │ │ }, 2026-10-24T02:58:54.8822709Z 161 │ │ }), 2026-10-24T02:58:54.8822811Z 162 │ │ catch: bridgeError, 2026-10-24T02:58:54.8822889Z 163 │ │ }); 2026-10-24T02:58:54.8823018Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T02:58:54.8823128Z 165 │ │ return yield* Effect.fail( 2026-10-24T02:58:54.8823237Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T02:58:54.8823417Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T02:58:54.8823498Z 168 │ │ ), 2026-10-24T02:58:54.8823576Z 169 │ │ ); 2026-10-24T02:58:54.8823652Z 170 │ │ } 2026-10-24T02:58:54.8823754Z 171 │ │ yield* Effect.promise( 2026-10-24T02:58:54.8823934Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T02:58:54.8824012Z 173 │ │ ); 2026-10-24T02:58:54.8824085Z 174 │ │ } 2026-10-24T02:58:54.8824168Z 175 │ │ return {}; 2026-10-24T02:58:54.8824240Z 176 │ │ }); 2026-10-24T02:58:54.8824307Z 177 │ │ 2026-10-24T02:58:54.8824386Z 178 │ │ return { 2026-10-24T02:58:54.8824555Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T02:58:54.8824673Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T02:58:54.8824778Z 181 │ │ return yield* Effect.fail( 2026-10-24T02:58:54.8824964Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T02:58:54.8825044Z 183 │ │ ); 2026-10-24T02:58:54.8825119Z 184 │ │ } 2026-10-24T02:58:54.8825244Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T02:58:54.8825448Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T02:58:54.8825522Z 187 │ │ } 2026-10-24T02:58:54.8825676Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T02:58:54.8825788Z 189 │ │ connections.set(connectionId, { 2026-10-24T02:58:54.8825903Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T02:58:54.8826044Z 191 │ │ sessionId: null, 2026-10-24T02:58:54.8826176Z 192 │ │ protocolVersion: null, 2026-10-24T02:58:54.8826276Z 193 │ │ nextRequestId: 0, 2026-10-24T02:58:54.8826352Z 194 │ │ }); 2026-10-24T02:58:54.8826453Z 195 │ │ return { connectionId }; 2026-10-24T02:58:54.8826529Z 196 │ │ }), 2026-10-24T02:58:54.8826698Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T02:58:54.8826855Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T02:58:54.8826978Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T02:58:54.8827109Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T02:58:54.8827208Z 201 │ │ jsonrpc: "2.0", 2026-10-24T02:58:54.8827287Z 202 │ │ id, 2026-10-24T02:58:54.8827391Z 203 │ │ method: request.method, 2026-10-24T02:58:54.8827547Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T02:58:54.8827623Z 205 │ │ }); 2026-10-24T02:58:54.8827804Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T02:58:54.8827925Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T02:58:54.8828028Z 208 │ │ if (envelope === null) { 2026-10-24T02:58:54.8828136Z 209 │ │ return yield* Effect.fail( 2026-10-24T02:58:54.8828322Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T02:58:54.8828405Z 211 │ │ ); 2026-10-24T02:58:54.8828480Z 212 │ │ } 2026-10-24T02:58:54.8828599Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T02:58:54.8828789Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T02:58:54.8828863Z 215 │ │ } 2026-10-24T02:58:54.8829030Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T02:58:54.8829104Z 217 │ │ }), 2026-10-24T02:58:54.8829289Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T02:58:54.8829488Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T02:58:54.8829616Z 220 │ │ yield* send(connection, { 2026-10-24T02:58:54.8829712Z 221 │ │ jsonrpc: "2.0", 2026-10-24T02:58:54.8829812Z 222 │ │ method: request.method, 2026-10-24T02:58:54.8830009Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T02:58:54.8830087Z 224 │ │ }); 2026-10-24T02:58:54.8830162Z 225 │ │ }), 2026-10-24T02:58:54.8830246Z 226 │ │ disconnect, 2026-10-24T02:58:54.8830357Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T02:58:54.8830453Z 228 │ │ Effect.forEach( 2026-10-24T02:58:54.8830562Z 229 │ │ [...connections.keys()], 2026-10-24T02:58:54.8830730Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T02:58:54.8830830Z 231 │ │ { discard: true }, 2026-10-24T02:58:54.8830907Z 232 │ │ ), 2026-10-24T02:58:54.8830982Z 233 │ │ ), 2026-10-24T02:58:54.8831054Z 234 │ │ }; 2026-10-24T02:58:54.8831180Z 235 │ ╰─▶ }); 2026-10-24T02:58:54.8831234Z ╰──── 2026-10-24T02:58:54.8831482Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T02:58:54.8831485Z 2026-10-24T02:58:54.8831772Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T02:58:54.8831943Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T02:58:54.8832007Z 472 │ onFilters, 2026-10-24T02:58:54.8832078Z 473 │ authorOptions = [], 2026-10-24T02:58:54.8832156Z ·  ── 2026-10-24T02:58:54.8832221Z 474 │ labelOptions = [], 2026-10-24T02:58:54.8832275Z ╰──── 2026-10-24T02:58:54.8832591Z  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-24T02:58:54.8832594Z 2026-10-24T02:58:54.8832870Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T02:58:54.8833042Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T02:58:54.8833111Z 473 │ authorOptions = [], 2026-10-24T02:58:54.8833178Z 474 │ labelOptions = [], 2026-10-24T02:58:54.8833253Z ·  ── 2026-10-24T02:58:54.8833317Z 475 │ optionScope, 2026-10-24T02:58:54.8833369Z ╰──── 2026-10-24T02:58:54.8833680Z  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-24T02:58:54.8833682Z 2026-10-24T02:58:54.8833934Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8834057Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T02:58:54.8834111Z 727 │ 2026-10-24T02:58:54.8834238Z 728 │ const layer = layerWithOptions(); 2026-10-24T02:58:54.8834336Z ·  ──┬── 2026-10-24T02:58:54.8834460Z · ╰── 'layer' is declared here 2026-10-24T02:58:54.8834513Z ╰──── 2026-10-24T02:58:54.8834618Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8834621Z 2026-10-24T02:58:54.8834873Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8835035Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T02:58:54.8835088Z 100 │ 2026-10-24T02:58:54.8835154Z 101 │ useEffect(() => { 2026-10-24T02:58:54.8835225Z ·  ────┬──── 2026-10-24T02:58:54.8835353Z · ╰── This is the containing effect 2026-10-24T02:58:54.8835462Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T02:58:54.8835547Z 103 │ setHighlightedLinesById({}); 2026-10-24T02:58:54.8835640Z ·  ───────────┬─────────── 2026-10-24T02:58:54.8835812Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8835875Z 104 │ return; 2026-10-24T02:58:54.8835926Z ╰──── 2026-10-24T02:58:54.8836512Z  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-24T02:58:54.8836838Z  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-24T02:58:54.8836843Z 2026-10-24T02:58:54.8837094Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8837268Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T02:58:54.8837322Z 55 │ 2026-10-24T02:58:54.8837388Z 56 │ useEffect(() => { 2026-10-24T02:58:54.8837459Z ·  ────┬──── 2026-10-24T02:58:54.8837587Z · ╰── This is the containing effect 2026-10-24T02:58:54.8837654Z 57 │ scheduler.reset(); 2026-10-24T02:58:54.8837752Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T02:58:54.8837836Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T02:58:54.8837958Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T02:58:54.8838041Z ·  ───────┬─────── 2026-10-24T02:58:54.8838206Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8838318Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T02:58:54.8838372Z ╰──── 2026-10-24T02:58:54.8838954Z  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-24T02:58:54.8839272Z  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-24T02:58:54.8839324Z 2026-10-24T02:58:54.8839549Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8839722Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T02:58:54.8839804Z 62 │ return () => scheduler.cancel(); 2026-10-24T02:58:54.8839915Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T02:58:54.8840071Z ·  ───┬─── ─────┬───── 2026-10-24T02:58:54.8840260Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T02:58:54.8840397Z · ╰── Unnecessary dependency `enabled` 2026-10-24T02:58:54.8840452Z 64 │ 2026-10-24T02:58:54.8840504Z ╰──── 2026-10-24T02:58:54.8840797Z  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-24T02:58:54.8841107Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8841110Z 2026-10-24T02:58:54.8841360Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8841544Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T02:58:54.8841596Z 104 │ 2026-10-24T02:58:54.8841660Z 105 │ useEffect(() => { 2026-10-24T02:58:54.8841732Z ·  ────┬──── 2026-10-24T02:58:54.8841864Z · ╰── This is the containing effect 2026-10-24T02:58:54.8841946Z 106 │ clearReviewCommentTarget(); 2026-10-24T02:58:54.8842042Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T02:58:54.8842150Z ·  ────────────────┬─────────────── 2026-10-24T02:58:54.8842323Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8842395Z 108 │ }, [selectedSection?.id]); 2026-10-24T02:58:54.8842447Z ╰──── 2026-10-24T02:58:54.8843030Z  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-24T02:58:54.8843349Z  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-24T02:58:54.8843354Z 2026-10-24T02:58:54.8843604Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8843785Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T02:58:54.8843837Z 109 │ 2026-10-24T02:58:54.8843901Z 110 │ useEffect(() => { 2026-10-24T02:58:54.8843972Z ·  ────┬──── 2026-10-24T02:58:54.8844099Z · ╰── This is the containing effect 2026-10-24T02:58:54.8844186Z 111 │ if (activeCommentTarget === null) { 2026-10-24T02:58:54.8844285Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T02:58:54.8844438Z ·  ────────────────┬─────────────── 2026-10-24T02:58:54.8844639Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8844694Z 113 │ } 2026-10-24T02:58:54.8844746Z ╰──── 2026-10-24T02:58:54.8845325Z  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-24T02:58:54.8845637Z  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-24T02:58:54.8845639Z 2026-10-24T02:58:54.8845840Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8846022Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T02:58:54.8846118Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T02:58:54.8846193Z 108 │ }, [selectedSection?.id]); 2026-10-24T02:58:54.8846279Z ·  ─────────┬───────── 2026-10-24T02:58:54.8846438Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T02:58:54.8846492Z 109 │ 2026-10-24T02:58:54.8846543Z ╰──── 2026-10-24T02:58:54.8846827Z  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-24T02:58:54.8847134Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8847139Z 2026-10-24T02:58:54.8847410Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T02:58:54.8847539Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T02:58:54.8847595Z 284 │ }, 2026-10-24T02:58:54.8847675Z 285 │ (effect, flow, stopSessions) => 2026-10-24T02:58:54.8847767Z ·  ──────┬───── 2026-10-24T02:58:54.8847913Z · ╰── 'stopSessions' is declared here 2026-10-24T02:58:54.8847981Z 286 │ effect.pipe( 2026-10-24T02:58:54.8848030Z ╰──── 2026-10-24T02:58:54.8848134Z  help: Consider removing this parameter. 2026-10-24T02:58:54.8848136Z 2026-10-24T02:58:54.8848286Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8848440Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T02:58:54.8848497Z 493 │ > 2026-10-24T02:58:54.8848576Z 494 │ {props.children(close)} 2026-10-24T02:58:54.8848664Z ·  ──┬── 2026-10-24T02:58:54.8848819Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8848896Z 495 │ 2026-10-24T02:58:54.8848948Z ╰──── 2026-10-24T02:58:54.8849452Z  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-24T02:58:54.8849761Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8849764Z 2026-10-24T02:58:54.8849984Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T02:58:54.8850108Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T02:58:54.8850218Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T02:58:54.8850288Z 187 │ let next = initial; 2026-10-24T02:58:54.8850358Z ·  ──┬─ 2026-10-24T02:58:54.8850476Z · ╰── From this accumulator 2026-10-24T02:58:54.8850558Z 188 │ let receivedSnapshot = false; 2026-10-24T02:58:54.8850635Z 189 │ for (const item of items) { 2026-10-24T02:58:54.8850709Z ·  ─┬─ 2026-10-24T02:58:54.8850813Z · ╰── For this loop 2026-10-24T02:58:54.8850902Z 190 │ if (item.kind === "synchronized") { 2026-10-24T02:58:54.8850969Z 191 │ waiting = false; 2026-10-24T02:58:54.8851060Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T02:58:54.8851176Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T02:58:54.8851261Z ·  ───┬─── 2026-10-24T02:58:54.8851389Z · ╰── From this spread 2026-10-24T02:58:54.8851448Z 194 │ } 2026-10-24T02:58:54.8851497Z ╰──── 2026-10-24T02:58:54.8851651Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T02:58:54.8851810Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T02:58:54.8851815Z 2026-10-24T02:58:54.8852066Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8852232Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:327:7] 2026-10-24T02:58:54.8852290Z 322 │ }; 2026-10-24T02:58:54.8852357Z 323 │ useEffect(() => { 2026-10-24T02:58:54.8852429Z ·  ────┬──── 2026-10-24T02:58:54.8852556Z · ╰── This is the containing effect 2026-10-24T02:58:54.8852656Z 324 │ if (!guidesEnabled && section === "guide") { 2026-10-24T02:58:54.8852750Z 325 │ requestedSection.current = "overview"; 2026-10-24T02:58:54.8852915Z 326 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T02:58:54.8853029Z 327 │ setSection("overview"); 2026-10-24T02:58:54.8853137Z ·  ─────┬──── 2026-10-24T02:58:54.8853305Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8853361Z 328 │ } 2026-10-24T02:58:54.8853412Z ╰──── 2026-10-24T02:58:54.8853996Z  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-24T02:58:54.8854312Z  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-24T02:58:54.8854315Z 2026-10-24T02:58:54.8854518Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T02:58:54.8854686Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:6] 2026-10-24T02:58:54.8854781Z 324 │ if (!guidesEnabled && section === "guide") { 2026-10-24T02:58:54.8854877Z 325 │ requestedSection.current = "overview"; 2026-10-24T02:58:54.8854958Z ·  ────────┬─────── 2026-10-24T02:58:54.8855398Z · ╰── 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-24T02:58:54.8855558Z 326 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T02:58:54.8855712Z ·  ─────────┬───────── ──────┬────── 2026-10-24T02:58:54.8856196Z · │ ╰── 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-24T02:58:54.8856632Z · ╰── 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-24T02:58:54.8856707Z 327 │ setSection("overview"); 2026-10-24T02:58:54.8856762Z 328 │ } 2026-10-24T02:58:54.8856852Z 329 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T02:58:54.8856968Z ·  ──────────────────┬───────────────── 2026-10-24T02:58:54.8857161Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8857244Z 330 │ const tabContent = activityContent; 2026-10-24T02:58:54.8857298Z ╰──── 2026-10-24T02:58:54.8857463Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T02:58:54.8857771Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8857773Z 2026-10-24T02:58:54.8857973Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T02:58:54.8858139Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:864:6] 2026-10-24T02:58:54.8858239Z 847 │ if ( 2026-10-24T02:58:54.8858378Z 848 │ lastSelection.current.path === route.params.path && 2026-10-24T02:58:54.8858458Z ·  ──────┬────── 2026-10-24T02:58:54.8858880Z · ╰── 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-24T02:58:54.8859012Z 849 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T02:58:54.8859067Z 850 │ ) 2026-10-24T02:58:54.8859130Z 851 │ return; 2026-10-24T02:58:54.8859301Z 852 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T02:58:54.8859491Z 853 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T02:58:54.8859628Z 854 │ setJumpPath(route.params.path); 2026-10-24T02:58:54.8859711Z 855 │ setSelectedRowId(null); 2026-10-24T02:58:54.8859787Z 856 │ jumpStarted.current = false; 2026-10-24T02:58:54.8859982Z 857 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T02:58:54.8860077Z 858 │ if (!file || !nativeView.current) return; 2026-10-24T02:58:54.8860164Z ·  ─────┬──── 2026-10-24T02:58:54.8860588Z · ╰── 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-24T02:58:54.8860713Z 859 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T02:58:54.8860790Z 860 │ jumpStarted.current = true; 2026-10-24T02:58:54.8860932Z 861 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T02:58:54.8861016Z 862 │ jumpStarted.current = false; 2026-10-24T02:58:54.8861069Z 863 │ }); 2026-10-24T02:58:54.8861262Z 864 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T02:58:54.8861461Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T02:58:54.8861675Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.8861783Z 865 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T02:58:54.8861835Z ╰──── 2026-10-24T02:58:54.8861999Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T02:58:54.8862312Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8862318Z 2026-10-24T02:58:54.8862498Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T02:58:54.8862634Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T02:58:54.8862719Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T02:58:54.8862811Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T02:58:54.8862889Z ·  ──┬── 2026-10-24T02:58:54.8863021Z · ╰── 'Scope' is imported here 2026-10-24T02:58:54.8863108Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T02:58:54.8863161Z ╰──── 2026-10-24T02:58:54.8863322Z  help: Consider removing this import. 2026-10-24T02:58:54.8863378Z 2026-10-24T02:58:54.8863576Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8863708Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:25] 2026-10-24T02:58:54.8863839Z 532 │ // range) the boundary string is identical and the chain would die. 2026-10-24T02:58:54.8863926Z 533 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T02:58:54.8864032Z ·  ───────┬────── 2026-10-24T02:58:54.8864195Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T02:58:54.8864331Z 534 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T02:58:54.8864383Z ╰──── 2026-10-24T02:58:54.8864675Z  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-24T02:58:54.8864981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8864983Z 2026-10-24T02:58:54.8865151Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8865277Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:524:53] 2026-10-24T02:58:54.8865360Z 523 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T02:58:54.8865514Z 524 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T02:58:54.8865634Z ·  ─────┬──── 2026-10-24T02:58:54.8865803Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8865882Z 525 │ const id = setTimeout(() => { 2026-10-24T02:58:54.8865934Z ╰──── 2026-10-24T02:58:54.8866212Z  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-24T02:58:54.8866501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8866504Z 2026-10-24T02:58:54.8866920Z ⚠ 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-24T02:58:54.8867066Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T02:58:54.8867149Z 262 │ ...(update._meta !== undefined 2026-10-24T02:58:54.8867315Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T02:58:54.8867403Z ·  ───────── 2026-10-24T02:58:54.8867464Z 264 │ : {}), 2026-10-24T02:58:54.8867517Z ╰──── 2026-10-24T02:58:54.8867520Z 2026-10-24T02:58:54.8867717Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T02:58:54.8867848Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T02:58:54.8867921Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T02:58:54.8867993Z 3 │ type AuthSessionState, 2026-10-24T02:58:54.8868076Z ·  ────────┬─────── 2026-10-24T02:58:54.8868276Z · ╰── 'AuthSessionState' is imported here 2026-10-24T02:58:54.8868375Z 4 │ sessionGrantsScope, 2026-10-24T02:58:54.8868429Z ╰──── 2026-10-24T02:58:54.8868525Z  help: Consider removing this import. 2026-10-24T02:58:54.8868527Z 2026-10-24T02:58:54.8868725Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8868865Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T02:58:54.8868961Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T02:58:54.8869041Z 257 │ }, [props.path, targetIndex]); 2026-10-24T02:58:54.8869118Z ·  ─────┬──── 2026-10-24T02:58:54.8869259Z · ╰── Unnecessary dependency `props.path` 2026-10-24T02:58:54.8869313Z 258 │ 2026-10-24T02:58:54.8869372Z ╰──── 2026-10-24T02:58:54.8869658Z  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-24T02:58:54.8869999Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8870002Z 2026-10-24T02:58:54.8870190Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.8870337Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T02:58:54.8870409Z 292 │ 2026-10-24T02:58:54.8871481Z ·  ─────────── 2026-10-24T02:58:54.8871548Z 310 │ {body} 2026-10-24T02:58:54.8871601Z ╰──── 2026-10-24T02:58:54.8871743Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T02:58:54.8871793Z 2026-10-24T02:58:54.8871990Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8872137Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T02:58:54.8872267Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T02:58:54.8872422Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T02:58:54.8872532Z ·  ─────┬──── 2026-10-24T02:58:54.8872692Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8872753Z 373 │ return ( 2026-10-24T02:58:54.8872806Z ╰──── 2026-10-24T02:58:54.8873081Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8873370Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8873373Z 2026-10-24T02:58:54.8873541Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8873684Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T02:58:54.8873778Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T02:58:54.8873904Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T02:58:54.8874013Z ·  ─────┬──── 2026-10-24T02:58:54.8874171Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8874231Z 854 │ } 2026-10-24T02:58:54.8874282Z ╰──── 2026-10-24T02:58:54.8874550Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8874836Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8874839Z 2026-10-24T02:58:54.8875036Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T02:58:54.8875168Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T02:58:54.8875239Z 2 │ AuthFilesystemReadScope, 2026-10-24T02:58:54.8875308Z 3 │ type AuthSessionState, 2026-10-24T02:58:54.8875393Z ·  ────────┬─────── 2026-10-24T02:58:54.8875542Z · ╰── 'AuthSessionState' is imported here 2026-10-24T02:58:54.8875619Z 4 │ type FilesystemBrowseEntry, 2026-10-24T02:58:54.8875671Z ╰──── 2026-10-24T02:58:54.8875770Z  help: Consider removing this import. 2026-10-24T02:58:54.8875772Z 2026-10-24T02:58:54.8876025Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8876162Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T02:58:54.8876217Z 150 │ 2026-10-24T02:58:54.8876285Z 151 │ useEffect(() => { 2026-10-24T02:58:54.8876355Z ·  ────┬──── 2026-10-24T02:58:54.8876482Z · ╰── This is the containing effect 2026-10-24T02:58:54.8876620Z 152 │ if (!controlledSelectedPath) { 2026-10-24T02:58:54.8876711Z 153 │ return; 2026-10-24T02:58:54.8876764Z 154 │ } 2026-10-24T02:58:54.8876848Z 155 │ setExpandedPaths((current) => { 2026-10-24T02:58:54.8876929Z ·  ────────┬─────── 2026-10-24T02:58:54.8877095Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8877217Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T02:58:54.8877270Z ╰──── 2026-10-24T02:58:54.8877856Z  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-24T02:58:54.8878179Z  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-24T02:58:54.8878184Z 2026-10-24T02:58:54.8878364Z ⚠ react(static-components): Cannot create components during render 2026-10-24T02:58:54.8878521Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T02:58:54.8878607Z 196 │ const { onInput, onResize } = props; 2026-10-24T02:58:54.8878752Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T02:58:54.8878881Z ·  ────────────────┬─────────────── 2026-10-24T02:58:54.8879064Z · ╰── The component is created during render here 2026-10-24T02:58:54.8879193Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T02:58:54.8879251Z 199 │ 2026-10-24T02:58:54.8879316Z 200 │ useEffect(() => { 2026-10-24T02:58:54.8879405Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T02:58:54.8879489Z 202 │ terminalKey: props.terminalKey, 2026-10-24T02:58:54.8879566Z 203 │ native: hasNativeSurface, 2026-10-24T02:58:54.8879697Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T02:58:54.8879778Z 205 │ bufferLen: props.buffer.length, 2026-10-24T02:58:54.8879895Z 206 │ isRunning: props.isRunning, 2026-10-24T02:58:54.8879957Z 207 │ }); 2026-10-24T02:58:54.8880117Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T02:58:54.8880203Z 209 │ const handleNativeInput = useCallback( 2026-10-24T02:58:54.8880323Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T02:58:54.8880423Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T02:58:54.8880486Z 212 │ return; 2026-10-24T02:58:54.8880540Z 213 │ } 2026-10-24T02:58:54.8880630Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T02:58:54.8880781Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T02:58:54.8880841Z 216 │ }); 2026-10-24T02:58:54.8880926Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T02:58:54.8880983Z 218 │ }, 2026-10-24T02:58:54.8881081Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T02:58:54.8881136Z 220 │ ); 2026-10-24T02:58:54.8881223Z 221 │ const handleNativeResize = useCallback( 2026-10-24T02:58:54.8881339Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T02:58:54.8881404Z 223 │ onResize({ 2026-10-24T02:58:54.8881535Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T02:58:54.8881642Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T02:58:54.8881701Z 226 │ }); 2026-10-24T02:58:54.8881757Z 227 │ }, 2026-10-24T02:58:54.8881820Z 228 │ [onResize], 2026-10-24T02:58:54.8881873Z 229 │ ); 2026-10-24T02:58:54.8881926Z 230 │ 2026-10-24T02:58:54.8882008Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T02:58:54.8882068Z 232 │ return ( 2026-10-24T02:58:54.8882147Z 233 │ 2026-10-24T02:58:54.8882228Z 234 │ Promise.resolve()); 2026-10-24T02:58:54.8884345Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T02:58:54.8884441Z 226 │ │ if (!pending) { 2026-10-24T02:58:54.8884539Z 227 │ │ idlePasses++; 2026-10-24T02:58:54.8884642Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T02:58:54.8884728Z 229 │ │ return; 2026-10-24T02:58:54.8884807Z 230 │ │ } 2026-10-24T02:58:54.8884893Z 231 │ │ continue; 2026-10-24T02:58:54.8884968Z 232 │ │ } 2026-10-24T02:58:54.8885068Z 233 │ │ idlePasses = 0; 2026-10-24T02:58:54.8885187Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T02:58:54.8885398Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T02:58:54.8885474Z 236 │ │ ); 2026-10-24T02:58:54.8885581Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T02:58:54.8885685Z 238 │ │ pending.resolve(exit); 2026-10-24T02:58:54.8885764Z 239 │ │ }); 2026-10-24T02:58:54.8885891Z 240 │ ╰─▶ } 2026-10-24T02:58:54.8885949Z 241 │ }, 2026-10-24T02:58:54.8886000Z ╰──── 2026-10-24T02:58:54.8886002Z 2026-10-24T02:58:54.8886197Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8886382Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T02:58:54.8886437Z 276 │ 2026-10-24T02:58:54.8886613Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T02:58:54.8886706Z 278 │ │ ...nativeProps, 2026-10-24T02:58:54.8886847Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T02:58:54.8886938Z 280 │ │ ref: nativeRef, 2026-10-24T02:58:54.8887065Z 281 │ ├─▶ }); 2026-10-24T02:58:54.8887296Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8887359Z 282 │ } 2026-10-24T02:58:54.8887413Z ╰──── 2026-10-24T02:58:54.8887869Z  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-24T02:58:54.8888156Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8888158Z 2026-10-24T02:58:54.8888607Z ⚠ 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-24T02:58:54.8888731Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T02:58:54.8888802Z 38 │ JSON.stringify( 2026-10-24T02:58:54.8888923Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T02:58:54.8889019Z ·  ──────────────────────── 2026-10-24T02:58:54.8889087Z 40 │ { name: "a" }, 2026-10-24T02:58:54.8889137Z ╰──── 2026-10-24T02:58:54.8889139Z 2026-10-24T02:58:54.8889305Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8889435Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-24T02:58:54.8889552Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T02:58:54.8889643Z 1996 │ createdAt: new Date().toISOString(), 2026-10-24T02:58:54.8889736Z ·  ─────┬──── 2026-10-24T02:58:54.8889922Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8890031Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T02:58:54.8890083Z ╰──── 2026-10-24T02:58:54.8890354Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8890644Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8890646Z 2026-10-24T02:58:54.8890809Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.8890941Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T02:58:54.8891072Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T02:58:54.8891340Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T02:58:54.8891506Z ·  ─────┬──── 2026-10-24T02:58:54.8891673Z · ╰── Cannot call impure function 2026-10-24T02:58:54.8891768Z 141 │ onSelect={(selected) => { 2026-10-24T02:58:54.8891820Z ╰──── 2026-10-24T02:58:54.8892088Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.8892375Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.8892377Z 2026-10-24T02:58:54.8892533Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8892705Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T02:58:54.8892811Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T02:58:54.8892896Z 66 │ const progress = useSharedValue(0); 2026-10-24T02:58:54.8892968Z ·  ────┬─── 2026-10-24T02:58:54.8893100Z · ╰── `progress` originates here 2026-10-24T02:58:54.8893166Z 67 │ useEffect(() => { 2026-10-24T02:58:54.8893291Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T02:58:54.8893359Z ·  ────┬─── 2026-10-24T02:58:54.8893492Z · ╰── `progress` cannot be modified 2026-10-24T02:58:54.8893571Z 69 │ }, [expanded, progress]); 2026-10-24T02:58:54.8893626Z ╰──── 2026-10-24T02:58:54.8893886Z  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-24T02:58:54.8894189Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8894192Z 2026-10-24T02:58:54.8894466Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8894609Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12366:7] 2026-10-24T02:58:54.8894666Z 12365 │ 2026-10-24T02:58:54.8894805Z 12366 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T02:58:54.8894896Z ·  ────────┬─────── 2026-10-24T02:58:54.8895045Z · ╰── 'layerUnavailable' is declared here 2026-10-24T02:58:54.8895115Z 12367 │ OrchestratorV2, 2026-10-24T02:58:54.8895165Z ╰──── 2026-10-24T02:58:54.8895272Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8895274Z 2026-10-24T02:58:54.8895417Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8895574Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T02:58:54.8895730Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T02:58:54.8895854Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T02:58:54.8895973Z ·  ───────────┬────────── 2026-10-24T02:58:54.8896196Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8896343Z 123 │ const sessionRef = useRef(null); 2026-10-24T02:58:54.8896397Z ╰──── 2026-10-24T02:58:54.8896856Z  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-24T02:58:54.8897140Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8897142Z 2026-10-24T02:58:54.8897284Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8897441Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T02:58:54.8897498Z 125 │ 2026-10-24T02:58:54.8897606Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:58:54.8897695Z ·  ─────────┬──────── 2026-10-24T02:58:54.8897840Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8897941Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:58:54.8897995Z ╰──── 2026-10-24T02:58:54.8898449Z  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-24T02:58:54.8898735Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8898744Z 2026-10-24T02:58:54.8898882Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8899037Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T02:58:54.8899090Z 125 │ 2026-10-24T02:58:54.8899197Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:58:54.8899284Z ·  ─────────┬───────── 2026-10-24T02:58:54.8899485Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8899621Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:58:54.8899674Z ╰──── 2026-10-24T02:58:54.8900263Z  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-24T02:58:54.8900581Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8900584Z 2026-10-24T02:58:54.8900723Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8900880Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T02:58:54.8900931Z 125 │ 2026-10-24T02:58:54.8901038Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:58:54.8901151Z ·  ─────────┬───────── 2026-10-24T02:58:54.8901322Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8901420Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:58:54.8901473Z ╰──── 2026-10-24T02:58:54.8901929Z  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-24T02:58:54.8902211Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8902213Z 2026-10-24T02:58:54.8902353Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8902505Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T02:58:54.8902559Z 125 │ 2026-10-24T02:58:54.8902667Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:58:54.8902780Z ·  ──────────┬───────── 2026-10-24T02:58:54.8902941Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8903040Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:58:54.8903092Z ╰──── 2026-10-24T02:58:54.8903545Z  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-24T02:58:54.8903824Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8903827Z 2026-10-24T02:58:54.8903970Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8904128Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T02:58:54.8904238Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:58:54.8904429Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:58:54.8904597Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T02:58:54.8904724Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T02:58:54.8904875Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T02:58:54.8905042Z 131 │ │ isFinished: status.isFinished, 2026-10-24T02:58:54.8905241Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T02:58:54.8905343Z 133 │ │ error: status.error, 2026-10-24T02:58:54.8905441Z 134 │ │ url: status.url, 2026-10-24T02:58:54.8905522Z 135 │ │ }); 2026-10-24T02:58:54.8905598Z 136 │ │ }, 2026-10-24T02:58:54.8905791Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T02:58:54.8905898Z 138 │ │ selectInput: (inputs) => { 2026-10-24T02:58:54.8906051Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T02:58:54.8906200Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T02:58:54.8906363Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T02:58:54.8906502Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T02:58:54.8906603Z 143 │ │ if (order !== known) { 2026-10-24T02:58:54.8906739Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T02:58:54.8906850Z 145 │ │ transform: (current) => ({ 2026-10-24T02:58:54.8907052Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T02:58:54.8907137Z 147 │ │ }), 2026-10-24T02:58:54.8907218Z 148 │ │ }); 2026-10-24T02:58:54.8907300Z 149 │ │ } 2026-10-24T02:58:54.8907440Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T02:58:54.8907518Z 151 │ │ }, 2026-10-24T02:58:54.8907647Z 152 │ ├─▶ }); 2026-10-24T02:58:54.8907875Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.8907961Z 153 │ recorderRef.current = recorder; 2026-10-24T02:58:54.8908014Z ╰──── 2026-10-24T02:58:54.8908470Z  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-24T02:58:54.8908758Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8908763Z 2026-10-24T02:58:54.8908902Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8909060Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T02:58:54.8909120Z 152 │ }); 2026-10-24T02:58:54.8909201Z 153 │ recorderRef.current = recorder; 2026-10-24T02:58:54.8909310Z ·  ─────┬─────────┬─── 2026-10-24T02:58:54.8909493Z · │ ╰── Cannot update ref value during render 2026-10-24T02:58:54.8909609Z · ╰── This value is a ref 2026-10-24T02:58:54.8909773Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:58:54.8909872Z ╰──── 2026-10-24T02:58:54.8910368Z  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-24T02:58:54.8910656Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8910658Z 2026-10-24T02:58:54.8910800Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8910957Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T02:58:54.8911039Z 153 │ recorderRef.current = recorder; 2026-10-24T02:58:54.8911233Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:58:54.8911322Z 155 │ │ recorder, 2026-10-24T02:58:54.8911450Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T02:58:54.8911562Z 157 │ │ requestPermission: async () => { 2026-10-24T02:58:54.8911724Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T02:58:54.8911913Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T02:58:54.8911990Z 160 │ │ }, 2026-10-24T02:58:54.8912126Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T02:58:54.8912261Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T02:58:54.8912400Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T02:58:54.8912513Z 164 │ │ onStateChange: (nextState) => 2026-10-24T02:58:54.8912600Z 165 │ │ setState({ 2026-10-24T02:58:54.8916118Z 166 │ │ state: nextState, 2026-10-24T02:58:54.8916284Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T02:58:54.8916411Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T02:58:54.8916490Z 169 │ │ }), 2026-10-24T02:58:54.8916619Z 170 │ ├─▶ }); 2026-10-24T02:58:54.8916823Z · ╰──── Cannot access ref value during render 2026-10-24T02:58:54.8916884Z 171 │ } 2026-10-24T02:58:54.8916934Z ╰──── 2026-10-24T02:58:54.8917392Z  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-24T02:58:54.8917679Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8917682Z 2026-10-24T02:58:54.8917824Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8917979Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T02:58:54.8918060Z 153 │ recorderRef.current = recorder; 2026-10-24T02:58:54.8918236Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:58:54.8918381Z ·  ─────┬────────┬─── 2026-10-24T02:58:54.8918562Z · │ ╰── Cannot update ref value during render 2026-10-24T02:58:54.8918676Z · ╰── This value is a ref 2026-10-24T02:58:54.8918741Z 155 │ recorder, 2026-10-24T02:58:54.8918792Z ╰──── 2026-10-24T02:58:54.8919248Z  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-24T02:58:54.8919541Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8919546Z 2026-10-24T02:58:54.8919685Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8919839Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T02:58:54.8919983Z 184 │ return () => subscription.remove(); 2026-10-24T02:58:54.8920051Z 185 │ }, [controller]); 2026-10-24T02:58:54.8920125Z ·  ─────┬──── 2026-10-24T02:58:54.8920269Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8920324Z 186 │ 2026-10-24T02:58:54.8920373Z ╰──── 2026-10-24T02:58:54.8920828Z  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-24T02:58:54.8921116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8921118Z 2026-10-24T02:58:54.8921258Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8921410Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T02:58:54.8921494Z 184 │ return () => subscription.remove(); 2026-10-24T02:58:54.8921556Z 185 │ }, [controller]); 2026-10-24T02:58:54.8921631Z ·  ──────┬───── 2026-10-24T02:58:54.8921769Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8921821Z 186 │ 2026-10-24T02:58:54.8921870Z ╰──── 2026-10-24T02:58:54.8922326Z  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-24T02:58:54.8922608Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8922611Z 2026-10-24T02:58:54.8922751Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8922901Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T02:58:54.8922957Z 191 │ }, 2026-10-24T02:58:54.8923028Z 192 │ [controller, recorder], 2026-10-24T02:58:54.8923101Z ·  ─────┬──── 2026-10-24T02:58:54.8923294Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8923377Z 193 │ ); 2026-10-24T02:58:54.8923431Z ╰──── 2026-10-24T02:58:54.8923883Z  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-24T02:58:54.8924162Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8924164Z 2026-10-24T02:58:54.8924302Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8924456Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T02:58:54.8924549Z 174 │ const controller = session.controller; 2026-10-24T02:58:54.8924635Z 175 │ const recorder = recorderRef.current; 2026-10-24T02:58:54.8924736Z ·  ─────────┬───────── 2026-10-24T02:58:54.8924896Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8924948Z 176 │ 2026-10-24T02:58:54.8924998Z ╰──── 2026-10-24T02:58:54.8925449Z  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-24T02:58:54.8925730Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8925733Z 2026-10-24T02:58:54.8925877Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8926031Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T02:58:54.8926086Z 191 │ }, 2026-10-24T02:58:54.8926155Z 192 │ [controller, recorder], 2026-10-24T02:58:54.8926243Z ·  ───────────┬────────── 2026-10-24T02:58:54.8926386Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8926441Z 193 │ ); 2026-10-24T02:58:54.8926492Z ╰──── 2026-10-24T02:58:54.8926941Z  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-24T02:58:54.8927224Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8927229Z 2026-10-24T02:58:54.8927367Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8927517Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T02:58:54.8927608Z 245 │ return () => clearInterval(intervalId); 2026-10-24T02:58:54.8927715Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T02:58:54.8927801Z ·  ─────┬──── 2026-10-24T02:58:54.8927952Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8928005Z 247 │ 2026-10-24T02:58:54.8928055Z ╰──── 2026-10-24T02:58:54.8928563Z  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-24T02:58:54.8928882Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8928884Z 2026-10-24T02:58:54.8929021Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8929173Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T02:58:54.8929262Z 245 │ return () => clearInterval(intervalId); 2026-10-24T02:58:54.8929368Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T02:58:54.8929499Z ·  ────────────────────────┬─────────────────────── 2026-10-24T02:58:54.8929659Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8929711Z 247 │ 2026-10-24T02:58:54.8929761Z ╰──── 2026-10-24T02:58:54.8930239Z  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-24T02:58:54.8930521Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8930524Z 2026-10-24T02:58:54.8930664Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8930819Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T02:58:54.8930889Z 260 │ setOwnerFocused, 2026-10-24T02:58:54.8930949Z 261 │ session, 2026-10-24T02:58:54.8931019Z ·  ───┬─── 2026-10-24T02:58:54.8931154Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.8931212Z 262 │ stop, 2026-10-24T02:58:54.8931261Z ╰──── 2026-10-24T02:58:54.8931712Z  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-24T02:58:54.8931992Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8931994Z 2026-10-24T02:58:54.8932179Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8932357Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T02:58:54.8932411Z 250 │ 2026-10-24T02:58:54.8932548Z 251 │ ╭─▶ return { 2026-10-24T02:58:54.8932753Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T02:58:54.8932832Z 253 │ │ state, 2026-10-24T02:58:54.8932919Z 254 │ │ audioLevels, 2026-10-24T02:58:54.8933012Z 255 │ │ elapsedSeconds, 2026-10-24T02:58:54.8933141Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T02:58:54.8933220Z 257 │ │ ownerKey, 2026-10-24T02:58:54.8933307Z 258 │ │ label, 2026-10-24T02:58:54.8933398Z 259 │ │ focusedOwners, 2026-10-24T02:58:54.8933490Z 260 │ │ setOwnerFocused, 2026-10-24T02:58:54.8933568Z 261 │ │ session, 2026-10-24T02:58:54.8933644Z 262 │ │ stop, 2026-10-24T02:58:54.8933720Z 263 │ │ cancel, 2026-10-24T02:58:54.8933847Z 264 │ ├─▶ }; 2026-10-24T02:58:54.8934041Z · ╰──── Cannot access ref value during render 2026-10-24T02:58:54.8934097Z 265 │ } 2026-10-24T02:58:54.8934149Z ╰──── 2026-10-24T02:58:54.8934608Z  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-24T02:58:54.8934890Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8934892Z 2026-10-24T02:58:54.8935045Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8935199Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T02:58:54.8935354Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T02:58:54.8935475Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T02:58:54.8935551Z ·  ─────┬───── 2026-10-24T02:58:54.8935688Z · ╰── `audioLevels` originates here 2026-10-24T02:58:54.8935810Z 123 │ const sessionRef = useRef(null); 2026-10-24T02:58:54.8935952Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T02:58:54.8936004Z 125 │ 2026-10-24T02:58:54.8936109Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:58:54.8936205Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:58:54.8936341Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T02:58:54.8936432Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T02:58:54.8936551Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T02:58:54.8936636Z 131 │ isFinished: status.isFinished, 2026-10-24T02:58:54.8936829Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T02:58:54.8936929Z 133 │ error: status.error, 2026-10-24T02:58:54.8936995Z 134 │ url: status.url, 2026-10-24T02:58:54.8937053Z 135 │ }); 2026-10-24T02:58:54.8937110Z 136 │ }, 2026-10-24T02:58:54.8937272Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T02:58:54.8937350Z 138 │ selectInput: (inputs) => { 2026-10-24T02:58:54.8937470Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T02:58:54.8937583Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T02:58:54.8937710Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T02:58:54.8937815Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T02:58:54.8937887Z 143 │ if (order !== known) { 2026-10-24T02:58:54.8937996Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T02:58:54.8938078Z 145 │ transform: (current) => ({ 2026-10-24T02:58:54.8938247Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T02:58:54.8938307Z 147 │ }), 2026-10-24T02:58:54.8938366Z 148 │ }); 2026-10-24T02:58:54.8938421Z 149 │ } 2026-10-24T02:58:54.8938528Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T02:58:54.8938583Z 151 │ }, 2026-10-24T02:58:54.8938638Z 152 │ }); 2026-10-24T02:58:54.8938716Z 153 │ recorderRef.current = recorder; 2026-10-24T02:58:54.8938815Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:58:54.8938877Z 155 │ recorder, 2026-10-24T02:58:54.8938973Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T02:58:54.8939060Z 157 │ requestPermission: async () => { 2026-10-24T02:58:54.8939190Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T02:58:54.8939343Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T02:58:54.8939398Z 160 │ }, 2026-10-24T02:58:54.8939634Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T02:58:54.8939755Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T02:58:54.8939884Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T02:58:54.8939977Z 164 │ onStateChange: (nextState) => 2026-10-24T02:58:54.8940040Z 165 │ setState({ 2026-10-24T02:58:54.8940109Z 166 │ state: nextState, 2026-10-24T02:58:54.8940213Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T02:58:54.8940312Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T02:58:54.8940373Z 169 │ }), 2026-10-24T02:58:54.8940428Z 170 │ }); 2026-10-24T02:58:54.8940481Z 171 │ } 2026-10-24T02:58:54.8940531Z 172 │ 2026-10-24T02:58:54.8940613Z 173 │ const session = sessionRef.current; 2026-10-24T02:58:54.8940699Z 174 │ const controller = session.controller; 2026-10-24T02:58:54.8940781Z 175 │ const recorder = recorderRef.current; 2026-10-24T02:58:54.8940831Z 176 │ 2026-10-24T02:58:54.8940895Z 177 │ useEffect(() => { 2026-10-24T02:58:54.8941041Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T02:58:54.8941176Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T02:58:54.8941310Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T02:58:54.8941488Z 181 │ // calls and route interruptions during capture. 2026-10-24T02:58:54.8941657Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T02:58:54.8941712Z 183 │ }); 2026-10-24T02:58:54.8941795Z 184 │ return () => subscription.remove(); 2026-10-24T02:58:54.8941859Z 185 │ }, [controller]); 2026-10-24T02:58:54.8941910Z 186 │ 2026-10-24T02:58:54.8941969Z 187 │ useEffect( 2026-10-24T02:58:54.8942029Z 188 │ () => () => { 2026-10-24T02:58:54.8942099Z 189 │ controller.dispose(); 2026-10-24T02:58:54.8942167Z 190 │ recorder.release(); 2026-10-24T02:58:54.8942221Z 191 │ }, 2026-10-24T02:58:54.8942290Z 192 │ [controller, recorder], 2026-10-24T02:58:54.8942343Z 193 │ ); 2026-10-24T02:58:54.8942394Z 194 │ 2026-10-24T02:58:54.8942455Z 195 │ useEffect(() => { 2026-10-24T02:58:54.8942550Z 196 │ if (state.phase !== "recording") return; 2026-10-24T02:58:54.8942603Z 197 │ 2026-10-24T02:58:54.8942747Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T02:58:54.8942849Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T02:58:54.8942928Z 200 │ void activation.catch(() => {}); 2026-10-24T02:58:54.8942990Z 201 │ return () => { 2026-10-24T02:58:54.8943138Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T02:58:54.8943275Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T02:58:54.8943330Z 204 │ }; 2026-10-24T02:58:54.8943407Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T02:58:54.8943457Z 206 │ 2026-10-24T02:58:54.8943517Z 207 │ useEffect(() => { 2026-10-24T02:58:54.8943653Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T02:58:54.8943706Z 209 │ 2026-10-24T02:58:54.8943826Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T02:58:54.8943974Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T02:58:54.8944074Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T02:58:54.8944149Z ·  ─────┬───── 2026-10-24T02:58:54.8944286Z · ╰── `audioLevels` cannot be modified 2026-10-24T02:58:54.8944339Z 213 │ } 2026-10-24T02:58:54.8944390Z ╰──── 2026-10-24T02:58:54.8944651Z  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-24T02:58:54.8944956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8944961Z 2026-10-24T02:58:54.8945156Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:58:54.8945310Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T02:58:54.8945363Z 206 │ 2026-10-24T02:58:54.8945425Z 207 │ useEffect(() => { 2026-10-24T02:58:54.8945499Z ·  ───┬─── 2026-10-24T02:58:54.8945723Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T02:58:54.8945857Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T02:58:54.8945908Z 209 │ 2026-10-24T02:58:54.8946025Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T02:58:54.8946234Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T02:58:54.8946361Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T02:58:54.8946436Z ·  ─────┬───── 2026-10-24T02:58:54.8946563Z · ╰── This modifies `audioLevels` 2026-10-24T02:58:54.8946618Z 213 │ } 2026-10-24T02:58:54.8946669Z ╰──── 2026-10-24T02:58:54.8947001Z  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-24T02:58:54.8947299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8947303Z 2026-10-24T02:58:54.8947568Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8947705Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T02:58:54.8947757Z 913 │ 2026-10-24T02:58:54.8947942Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T02:58:54.8948015Z ·  ─────┬───── 2026-10-24T02:58:54.8948149Z · ╰── 'layerDaemon' is declared here 2026-10-24T02:58:54.8948235Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T02:58:54.8948285Z ╰──── 2026-10-24T02:58:54.8948384Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8948387Z 2026-10-24T02:58:54.8948526Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.8948696Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T02:58:54.8948779Z 26 │ const latestInput = useRef(input); 2026-10-24T02:58:54.8948852Z 27 │ latestInput.current = input; 2026-10-24T02:58:54.8948960Z ·  ─────┬─────────┬─── 2026-10-24T02:58:54.8949140Z · │ ╰── Cannot update ref value during render 2026-10-24T02:58:54.8949252Z · ╰── This value is a ref 2026-10-24T02:58:54.8949325Z 28 │ const mounted = useRef(true); 2026-10-24T02:58:54.8949376Z ╰──── 2026-10-24T02:58:54.8949841Z  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-24T02:58:54.8950174Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.8950177Z 2026-10-24T02:58:54.8950330Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8950492Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T02:58:54.8950546Z 90 │ }) { 2026-10-24T02:58:54.8950657Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T02:58:54.8950732Z ·  ────┬─── 2026-10-24T02:58:54.8950858Z · ╰── `rotation` originates here 2026-10-24T02:58:54.8950927Z 92 │ useLayoutEffect(() => { 2026-10-24T02:58:54.8951114Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T02:58:54.8951213Z ·  ────┬─── 2026-10-24T02:58:54.8951339Z · ╰── `rotation` cannot be modified 2026-10-24T02:58:54.8951413Z 94 │ }, [props.hidden, rotation]); 2026-10-24T02:58:54.8951464Z ╰──── 2026-10-24T02:58:54.8951722Z  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-24T02:58:54.8952019Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8952021Z 2026-10-24T02:58:54.8952173Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8952344Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T02:58:54.8952439Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T02:58:54.8952570Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T02:58:54.8952656Z ·  ────────┬──────── 2026-10-24T02:58:54.8952801Z · ╰── `loadingVisibility` originates here 2026-10-24T02:58:54.8952869Z 268 │ useLayoutEffect(() => { 2026-10-24T02:58:54.8953022Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T02:58:54.8953102Z ·  ────────┬──────── 2026-10-24T02:58:54.8953246Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T02:58:54.8953337Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T02:58:54.8953386Z ╰──── 2026-10-24T02:58:54.8953651Z  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-24T02:58:54.8953951Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8953954Z 2026-10-24T02:58:54.8954105Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8954270Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T02:58:54.8954323Z 325 │ }) { 2026-10-24T02:58:54.8954477Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T02:58:54.8954565Z ·  ─────────┬───────── 2026-10-24T02:58:54.8954720Z · ╰── `recordingVisibility` originates here 2026-10-24T02:58:54.8954789Z 327 │ useLayoutEffect(() => { 2026-10-24T02:58:54.8954974Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T02:58:54.8955059Z ·  ─────────┬───────── 2026-10-24T02:58:54.8955207Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T02:58:54.8955295Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T02:58:54.8955346Z ╰──── 2026-10-24T02:58:54.8955599Z  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-24T02:58:54.8955944Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8955981Z 2026-10-24T02:58:54.8956424Z ⚠ 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-24T02:58:54.8956558Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T02:58:54.8956692Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T02:58:54.8956869Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T02:58:54.8956974Z ·  ──────────────────────── 2026-10-24T02:58:54.8957036Z 182 │ version: 1, 2026-10-24T02:58:54.8957088Z ╰──── 2026-10-24T02:58:54.8957091Z 2026-10-24T02:58:54.8957296Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.8957457Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-24T02:58:54.8957511Z 214 │ } 2026-10-24T02:58:54.8957579Z 215 │ }, [wrappedRender]); 2026-10-24T02:58:54.8957658Z ·  ──────┬────── 2026-10-24T02:58:54.8957804Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T02:58:54.8957855Z 216 │ 2026-10-24T02:58:54.8957907Z ╰──── 2026-10-24T02:58:54.8958194Z  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-24T02:58:54.8958504Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8958509Z 2026-10-24T02:58:54.8958745Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:58:54.8958902Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-24T02:58:54.8958959Z 816 │ > 2026-10-24T02:58:54.8959067Z 817 │ 2026-10-24T02:58:54.8959181Z ·  ──────────────────── 2026-10-24T02:58:54.8959273Z 818 │ 2026-10-24T02:58:54.8960373Z 832 │ 2026-10-24T02:58:54.8960490Z ·  ──────────────────── 2026-10-24T02:58:54.8960588Z 833 │ 2026-10-24T02:58:54.8960638Z ╰──── 2026-10-24T02:58:54.8960854Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:58:54.8960994Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:58:54.8960999Z 2026-10-24T02:58:54.8961199Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T02:58:54.8961300Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T02:58:54.8961439Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T02:58:54.8961551Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T02:58:54.8961636Z ·  ──────┬────── 2026-10-24T02:58:54.8961775Z · ╰── 'HookForwarder' is imported here 2026-10-24T02:58:54.8961876Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T02:58:54.8961925Z ╰──── 2026-10-24T02:58:54.8962020Z  help: Consider removing this import. 2026-10-24T02:58:54.8962028Z 2026-10-24T02:58:54.8962181Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8962336Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T02:58:54.8962389Z 35 │ 2026-10-24T02:58:54.8962522Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T02:58:54.8962606Z ·  ────────┬──────── 2026-10-24T02:58:54.8962751Z · ╰── `inspectorProgress` originates here 2026-10-24T02:58:54.8962842Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T02:58:54.8962971Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T02:58:54.8963023Z 39 │ 2026-10-24T02:58:54.8963101Z 40 │ const onClosed = props.onClosed; 2026-10-24T02:58:54.8963170Z 41 │ useEffect(() => { 2026-10-24T02:58:54.8963261Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T02:58:54.8963341Z ·  ────────┬──────── 2026-10-24T02:58:54.8963485Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T02:58:54.8963561Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T02:58:54.8963612Z ╰──── 2026-10-24T02:58:54.8963871Z  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-24T02:58:54.8964170Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8964172Z 2026-10-24T02:58:54.8964323Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8964528Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T02:58:54.8964726Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T02:58:54.8964856Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T02:58:54.8964943Z ·  ──────────┬───────── 2026-10-24T02:58:54.8965091Z · ╰── `renderedContentWidth` originates here 2026-10-24T02:58:54.8965144Z 39 │ 2026-10-24T02:58:54.8965224Z 40 │ const onClosed = props.onClosed; 2026-10-24T02:58:54.8965290Z 41 │ useEffect(() => { 2026-10-24T02:58:54.8965375Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T02:58:54.8965449Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T02:58:54.8965520Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T02:58:54.8965586Z 45 │ (finished) => { 2026-10-24T02:58:54.8965727Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T02:58:54.8965801Z 47 │ runOnJS(onClosed)(); 2026-10-24T02:58:54.8965856Z 48 │ } 2026-10-24T02:58:54.8965911Z 49 │ }, 2026-10-24T02:58:54.8965962Z 50 │ ); 2026-10-24T02:58:54.8966091Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T02:58:54.8966168Z 52 │ renderedInspectorWidth.set( 2026-10-24T02:58:54.8966307Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T02:58:54.8966361Z 54 │ ); 2026-10-24T02:58:54.8966415Z 55 │ }, [ 2026-10-24T02:58:54.8966482Z 56 │ inspectorProgress, 2026-10-24T02:58:54.8966546Z 57 │ inspectorVisible, 2026-10-24T02:58:54.8966609Z 58 │ inspectorWidth, 2026-10-24T02:58:54.8966669Z 59 │ onClosed, 2026-10-24T02:58:54.8966747Z 60 │ renderedInspectorWidth, 2026-10-24T02:58:54.8966805Z 61 │ resizing, 2026-10-24T02:58:54.8966858Z 62 │ ]); 2026-10-24T02:58:54.8966909Z 63 │ 2026-10-24T02:58:54.8966972Z 64 │ useEffect(() => { 2026-10-24T02:58:54.8967061Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T02:58:54.8967146Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T02:58:54.8967242Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T02:58:54.8967327Z ·  ──────────┬───────── 2026-10-24T02:58:54.8967482Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T02:58:54.8967540Z 68 │ return; 2026-10-24T02:58:54.8967591Z ╰──── 2026-10-24T02:58:54.8967846Z  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-24T02:58:54.8968155Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8968160Z 2026-10-24T02:58:54.8968413Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8968580Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T02:58:54.8968633Z 118 │ 2026-10-24T02:58:54.8968695Z 119 │ useEffect(() => { 2026-10-24T02:58:54.8968766Z ·  ────┬──── 2026-10-24T02:58:54.8968895Z · ╰── This is the containing effect 2026-10-24T02:58:54.8968977Z 120 │ if (orientationSettled) return; 2026-10-24T02:58:54.8969138Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T02:58:54.8969240Z 122 │ if (orientation === null) { 2026-10-24T02:58:54.8969321Z 123 │ setOrientationSettled(true); 2026-10-24T02:58:54.8969409Z ·  ──────────┬────────── 2026-10-24T02:58:54.8969576Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8969636Z 124 │ return; 2026-10-24T02:58:54.8969689Z ╰──── 2026-10-24T02:58:54.8970302Z  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-24T02:58:54.8970618Z  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-24T02:58:54.8970625Z 2026-10-24T02:58:54.8970873Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8971041Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T02:58:54.8971093Z 292 │ 2026-10-24T02:58:54.8971158Z 293 │ useEffect(() => { 2026-10-24T02:58:54.8971226Z ·  ────┬──── 2026-10-24T02:58:54.8971353Z · ╰── This is the containing effect 2026-10-24T02:58:54.8971410Z 294 │ if ( 2026-10-24T02:58:54.8971475Z 295 │ scene === null || 2026-10-24T02:58:54.8971552Z 296 │ requestedScene === null || 2026-10-24T02:58:54.8971627Z 297 │ scene !== requestedScene || 2026-10-24T02:58:54.8971694Z 298 │ !hasFixture || 2026-10-24T02:58:54.8971768Z 299 │ !orientationSettled || 2026-10-24T02:58:54.8971834Z 300 │ !themeApplied || 2026-10-24T02:58:54.8971949Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T02:58:54.8972080Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T02:58:54.8972134Z 303 │ ) { 2026-10-24T02:58:54.8972203Z 304 │ setReadyScene(null); 2026-10-24T02:58:54.8972280Z ·  ──────┬────── 2026-10-24T02:58:54.8972445Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8972505Z 305 │ return; 2026-10-24T02:58:54.8972555Z ╰──── 2026-10-24T02:58:54.8973141Z  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-24T02:58:54.8973454Z  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-24T02:58:54.8973457Z 2026-10-24T02:58:54.8973719Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.8973883Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T02:58:54.8973952Z 127 │ let cancelled = false; 2026-10-24T02:58:54.8974041Z 128 │ let lastOutcome: string | null = null; 2026-10-24T02:58:54.8974169Z ·  ─────┬───── 2026-10-24T02:58:54.8974328Z · ╰── 'lastOutcome' is declared here 2026-10-24T02:58:54.8974502Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T02:58:54.8974552Z ╰──── 2026-10-24T02:58:54.8974655Z  help: Consider removing this declaration. 2026-10-24T02:58:54.8974658Z 2026-10-24T02:58:54.8974840Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T02:58:54.8974953Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T02:58:54.8975010Z 7 │ () => 2026-10-24T02:58:54.8975075Z 8 │ Gesture.Hover() 2026-10-24T02:58:54.8975148Z ·  ──┬── 2026-10-24T02:58:54.8975281Z · ╰── `Hover` may be a component 2026-10-24T02:58:54.8975360Z 9 │ .manualActivation(true) 2026-10-24T02:58:54.8975412Z ╰──── 2026-10-24T02:58:54.8975685Z  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-24T02:58:54.8976125Z  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-24T02:58:54.8976127Z 2026-10-24T02:58:54.8976305Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:58:54.8976489Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T02:58:54.8976556Z 115 │ return [...commands]; 2026-10-24T02:58:54.8976691Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T02:58:54.8976808Z ·  ─────────┬───────── 2026-10-24T02:58:54.8976988Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T02:58:54.8977040Z 117 │ 2026-10-24T02:58:54.8977089Z ╰──── 2026-10-24T02:58:54.8977394Z  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-24T02:58:54.8977695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.8977698Z 2026-10-24T02:58:54.8977909Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:58:54.8978032Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T02:58:54.8978128Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T02:58:54.8978211Z 259 │ for (const edit of edits.reverse()) 2026-10-24T02:58:54.8978304Z ·  ─────── 2026-10-24T02:58:54.8978465Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T02:58:54.8978514Z ╰──── 2026-10-24T02:58:54.8978768Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:58:54.8978771Z 2026-10-24T02:58:54.8978975Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:58:54.8979144Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T02:58:54.8979256Z 289 │ visit(parser.parse(markdown)); 2026-10-24T02:58:54.8979338Z 290 │ for (const edit of edits.reverse()) 2026-10-24T02:58:54.8979645Z ·  ─────── 2026-10-24T02:58:54.8979804Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T02:58:54.8979891Z ╰──── 2026-10-24T02:58:54.8980154Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:58:54.8980157Z 2026-10-24T02:58:54.8980360Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:58:54.8980480Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T02:58:54.8980565Z 343 │ visit(parser.parse(markdown)); 2026-10-24T02:58:54.8980668Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T02:58:54.8980768Z ·  ─────── 2026-10-24T02:58:54.8980927Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T02:58:54.8980978Z ╰──── 2026-10-24T02:58:54.8981227Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:58:54.8981229Z 2026-10-24T02:58:54.8981479Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.8981627Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-24T02:58:54.8981681Z 398 │ 2026-10-24T02:58:54.8981751Z 399 │ useEffect(() => { 2026-10-24T02:58:54.8981825Z ·  ────┬──── 2026-10-24T02:58:54.8981952Z · ╰── This is the containing effect 2026-10-24T02:58:54.8982042Z 400 │ setInspectorSelection((current) => { 2026-10-24T02:58:54.8982126Z ·  ──────────┬────────── 2026-10-24T02:58:54.8982291Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.8982393Z 401 │ if (props.renderInspector === undefined) { 2026-10-24T02:58:54.8982444Z ╰──── 2026-10-24T02:58:54.8983087Z  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-24T02:58:54.8983442Z  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-24T02:58:54.8983444Z 2026-10-24T02:58:54.8983651Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T02:58:54.8983801Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-24T02:58:54.8983959Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T02:58:54.8984124Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-24T02:58:54.8984220Z 529 │ │ 2026-10-24T02:58:54.8984828Z 534 │ ╰─▶ ); 2026-10-24T02:58:54.8984908Z 535 │ const FilesInspector = () => 2026-10-24T02:58:54.8984958Z ╰──── 2026-10-24T02:58:54.8985173Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T02:58:54.8985176Z 2026-10-24T02:58:54.8985380Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T02:58:54.8985533Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-24T02:58:54.8985593Z 534 │ ); 2026-10-24T02:58:54.8985754Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-24T02:58:54.8985905Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T02:58:54.8986010Z 537 │ │ 2026-10-24T02:58:54.8986953Z 545 │ ╰─▶ ) : null; 2026-10-24T02:58:54.8987102Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T02:58:54.8987152Z ╰──── 2026-10-24T02:58:54.8987364Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T02:58:54.8987366Z 2026-10-24T02:58:54.8987521Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8987682Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T02:58:54.8987786Z 107 │ ); 2026-10-24T02:58:54.8987963Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T02:58:54.8988052Z ·  ─────────┬──────── 2026-10-24T02:58:54.8988201Z · ╰── `separationProgress` originates here 2026-10-24T02:58:54.8988251Z 109 │ 2026-10-24T02:58:54.8988316Z 110 │ useEffect(() => { 2026-10-24T02:58:54.8988486Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T02:58:54.8988570Z ·  ─────────┬──────── 2026-10-24T02:58:54.8988718Z · ╰── `separationProgress` cannot be modified 2026-10-24T02:58:54.8988824Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T02:58:54.8988875Z ╰──── 2026-10-24T02:58:54.8989140Z  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-24T02:58:54.8989447Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8989449Z 2026-10-24T02:58:54.8989599Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8989756Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T02:58:54.8989874Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T02:58:54.8990016Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T02:58:54.8990098Z ·  ──────┬───── 2026-10-24T02:58:54.8990238Z · ╰── `capsuleWidth` originates here 2026-10-24T02:58:54.8990351Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T02:58:54.8990465Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.8990566Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T02:58:54.8990659Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T02:58:54.8990720Z 134 │ return; 2026-10-24T02:58:54.8990775Z 135 │ } 2026-10-24T02:58:54.8990879Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T02:58:54.8990963Z 137 │ measuredWidthRef.current = width; 2026-10-24T02:58:54.8991104Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T02:58:54.8991178Z ·  ──────┬───── 2026-10-24T02:58:54.8991314Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T02:58:54.8991374Z 139 │ }; 2026-10-24T02:58:54.8991427Z ╰──── 2026-10-24T02:58:54.8991682Z  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-24T02:58:54.8991979Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8991982Z 2026-10-24T02:58:54.8992134Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.8992294Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T02:58:54.8992403Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T02:58:54.8992514Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T02:58:54.8992643Z ·  ──────┬───── 2026-10-24T02:58:54.8992808Z · ╰── `capsuleWidth` originates here 2026-10-24T02:58:54.8992916Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T02:58:54.8993025Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.8993125Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T02:58:54.8993218Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T02:58:54.8993278Z 134 │ return; 2026-10-24T02:58:54.8993330Z 135 │ } 2026-10-24T02:58:54.8993434Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T02:58:54.8993517Z 137 │ measuredWidthRef.current = width; 2026-10-24T02:58:54.8993656Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T02:58:54.8993707Z 139 │ }; 2026-10-24T02:58:54.8993802Z 140 │ const hasStatus = props.status !== null; 2026-10-24T02:58:54.8993936Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T02:58:54.8994001Z 142 │ useEffect(() => { 2026-10-24T02:58:54.8994065Z 143 │ if (!hasStatus) { 2026-10-24T02:58:54.8994150Z 144 │ measuredWidthRef.current = null; 2026-10-24T02:58:54.8994228Z 145 │ capsuleWidth.value = null; 2026-10-24T02:58:54.8994304Z ·  ──────┬───── 2026-10-24T02:58:54.8994441Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T02:58:54.8994495Z 146 │ } 2026-10-24T02:58:54.8994548Z ╰──── 2026-10-24T02:58:54.8994802Z  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-24T02:58:54.8995103Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8995108Z 2026-10-24T02:58:54.8995306Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:58:54.8995464Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T02:58:54.8995595Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T02:58:54.8995658Z 142 │ useEffect(() => { 2026-10-24T02:58:54.8995734Z ·  ───┬─── 2026-10-24T02:58:54.8995953Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T02:58:54.8996018Z 143 │ if (!hasStatus) { 2026-10-24T02:58:54.8996107Z 144 │ measuredWidthRef.current = null; 2026-10-24T02:58:54.8996187Z 145 │ capsuleWidth.value = null; 2026-10-24T02:58:54.8996262Z ·  ──────┬───── 2026-10-24T02:58:54.8996395Z · ╰── This modifies `capsuleWidth` 2026-10-24T02:58:54.8996447Z 146 │ } 2026-10-24T02:58:54.8996498Z ╰──── 2026-10-24T02:58:54.8996834Z  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-24T02:58:54.8997129Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8997131Z 2026-10-24T02:58:54.8997375Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:58:54.8997567Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T02:58:54.8997675Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T02:58:54.8997790Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.8997910Z ·  ───────────────┬─────────────── 2026-10-24T02:58:54.8998143Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T02:58:54.8998246Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T02:58:54.8998341Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T02:58:54.8998400Z 134 │ return; 2026-10-24T02:58:54.8998453Z 135 │ } 2026-10-24T02:58:54.8998564Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T02:58:54.8998651Z 137 │ measuredWidthRef.current = width; 2026-10-24T02:58:54.8998791Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T02:58:54.8998864Z ·  ──────┬───── 2026-10-24T02:58:54.8998996Z · ╰── This modifies `capsuleWidth` 2026-10-24T02:58:54.8999050Z 139 │ }; 2026-10-24T02:58:54.8999102Z ╰──── 2026-10-24T02:58:54.8999432Z  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-24T02:58:54.8999729Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.8999731Z 2026-10-24T02:58:54.8999898Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9000084Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T02:58:54.9000226Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T02:58:54.9000357Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T02:58:54.9000430Z ·  ────┬─── 2026-10-24T02:58:54.9000558Z · ╰── `rotation` originates here 2026-10-24T02:58:54.9000610Z 172 │ 2026-10-24T02:58:54.9000677Z 173 │ useLayoutEffect(() => { 2026-10-24T02:58:54.9000809Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T02:58:54.9000879Z ·  ────┬─── 2026-10-24T02:58:54.9001014Z · ╰── `rotation` cannot be modified 2026-10-24T02:58:54.9001111Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T02:58:54.9001163Z ╰──── 2026-10-24T02:58:54.9001418Z  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-24T02:58:54.9001715Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9001717Z 2026-10-24T02:58:54.9001905Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.9002053Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T02:58:54.9002122Z 1245 │ { 2026-10-24T02:58:54.9004421Z ·  ────┬──── 2026-10-24T02:58:54.9004546Z · ╰── This is the containing effect 2026-10-24T02:58:54.9004641Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T02:58:54.9004702Z 358 │ return; 2026-10-24T02:58:54.9004755Z 359 │ } 2026-10-24T02:58:54.9004849Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T02:58:54.9004942Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T02:58:54.9005043Z ·  ──────────────┬────────────── 2026-10-24T02:58:54.9005215Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9005272Z 362 │ return; 2026-10-24T02:58:54.9005323Z ╰──── 2026-10-24T02:58:54.9005957Z  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-24T02:58:54.9006301Z  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-24T02:58:54.9006303Z 2026-10-24T02:58:54.9006549Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9006696Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T02:58:54.9006749Z 447 │ 2026-10-24T02:58:54.9006813Z 448 │ useEffect(() => { 2026-10-24T02:58:54.9006881Z ·  ────┬──── 2026-10-24T02:58:54.9007008Z · ╰── This is the containing effect 2026-10-24T02:58:54.9007108Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T02:58:54.9007173Z 450 │ return; 2026-10-24T02:58:54.9007228Z 451 │ } 2026-10-24T02:58:54.9007367Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T02:58:54.9007498Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T02:58:54.9007602Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T02:58:54.9007653Z 455 │ } 2026-10-24T02:58:54.9007792Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T02:58:54.9007918Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T02:58:54.9008021Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T02:58:54.9008090Z 459 │ const directProject = 2026-10-24T02:58:54.9008157Z 460 │ projects.find( 2026-10-24T02:58:54.9008222Z 461 │ (project) => 2026-10-24T02:58:54.9008401Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T02:58:54.9008463Z 463 │ ) ?? null; 2026-10-24T02:58:54.9008514Z 464 │ 2026-10-24T02:58:54.9008582Z 465 │ if (directProject) { 2026-10-24T02:58:54.9008717Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T02:58:54.9008852Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T02:58:54.9009008Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T02:58:54.9009140Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T02:58:54.9009202Z 470 │ return; 2026-10-24T02:58:54.9009257Z 471 │ } 2026-10-24T02:58:54.9009353Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T02:58:54.9009414Z 473 │ if ( 2026-10-24T02:58:54.9009559Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T02:58:54.9009662Z 475 │ selectedProject.id !== directProject.id 2026-10-24T02:58:54.9009721Z 476 │ ) { 2026-10-24T02:58:54.9009804Z 477 │ setProject(directProject); 2026-10-24T02:58:54.9009892Z 478 │ return; 2026-10-24T02:58:54.9009948Z 479 │ } 2026-10-24T02:58:54.9010028Z 480 │ if (!flow.draftKey) return; 2026-10-24T02:58:54.9010167Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T02:58:54.9010307Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T02:58:54.9010412Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T02:58:54.9010490Z 484 │ workspaceSelection: { 2026-10-24T02:58:54.9010610Z 485 │ mode: "local", 2026-10-24T02:58:54.9010743Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T02:58:54.9010875Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T02:58:54.9010955Z 488 │ startFromOrigin: false, 2026-10-24T02:58:54.9011015Z 489 │ }, 2026-10-24T02:58:54.9011075Z 490 │ }); 2026-10-24T02:58:54.9011130Z 491 │ } 2026-10-24T02:58:54.9011256Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T02:58:54.9011314Z 493 │ if ( 2026-10-24T02:58:54.9011450Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T02:58:54.9011547Z 495 │ selectedProject.id === directProject.id 2026-10-24T02:58:54.9011605Z 496 │ ) { 2026-10-24T02:58:54.9011665Z 497 │ return; 2026-10-24T02:58:54.9011724Z 498 │ } 2026-10-24T02:58:54.9011806Z 499 │ setProject(directProject); 2026-10-24T02:58:54.9011866Z 500 │ return; 2026-10-24T02:58:54.9011919Z 501 │ } 2026-10-24T02:58:54.9011969Z 502 │ 2026-10-24T02:58:54.9012049Z 503 │ if (projects.length > 0) { 2026-10-24T02:58:54.9012143Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T02:58:54.9012249Z ·  ──────────────┬────────────── 2026-10-24T02:58:54.9012424Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9012480Z 505 │ } 2026-10-24T02:58:54.9012531Z ╰──── 2026-10-24T02:58:54.9013117Z  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-24T02:58:54.9013434Z  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-24T02:58:54.9013437Z 2026-10-24T02:58:54.9013686Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9013835Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T02:58:54.9013887Z 545 │ 2026-10-24T02:58:54.9013952Z 546 │ useEffect(() => { 2026-10-24T02:58:54.9014021Z ·  ────┬──── 2026-10-24T02:58:54.9014149Z · ╰── This is the containing effect 2026-10-24T02:58:54.9014245Z 547 │ const shareId = props.incomingShareId; 2026-10-24T02:58:54.9014330Z 548 │ const draftKey = flow.draftKey; 2026-10-24T02:58:54.9014428Z 549 │ const destinationProject = selectedProject; 2026-10-24T02:58:54.9014569Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T02:58:54.9014695Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T02:58:54.9014783Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T02:58:54.9014855Z 553 │ !initialEnvironmentId || 2026-10-24T02:58:54.9014924Z 554 │ !initialProjectId || 2026-10-24T02:58:54.9015051Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T02:58:54.9015153Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T02:58:54.9015209Z 557 │ if ( 2026-10-24T02:58:54.9015271Z 558 │ !shareId || 2026-10-24T02:58:54.9015388Z 559 │ !draftKey || 2026-10-24T02:58:54.9015487Z 560 │ !destinationProject || 2026-10-24T02:58:54.9015573Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T02:58:54.9015661Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T02:58:54.9015718Z 563 │ ) { 2026-10-24T02:58:54.9015775Z 564 │ return; 2026-10-24T02:58:54.9015828Z 565 │ } 2026-10-24T02:58:54.9015923Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T02:58:54.9015979Z 567 │ if ( 2026-10-24T02:58:54.9016086Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T02:58:54.9016194Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T02:58:54.9016249Z 570 │ ) { 2026-10-24T02:58:54.9016308Z 571 │ return; 2026-10-24T02:58:54.9016359Z 572 │ } 2026-10-24T02:58:54.9016409Z 573 │ 2026-10-24T02:58:54.9016480Z 574 │ if (!incomingShare) { 2026-10-24T02:58:54.9016673Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T02:58:54.9016798Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T02:58:54.9016863Z 577 │ Dialog.alert( 2026-10-24T02:58:54.9016946Z 578 │ "Shared content unavailable", 2026-10-24T02:58:54.9017115Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T02:58:54.9017172Z 580 │ ); 2026-10-24T02:58:54.9017225Z 581 │ } 2026-10-24T02:58:54.9017283Z 582 │ return; 2026-10-24T02:58:54.9017335Z 583 │ } 2026-10-24T02:58:54.9017385Z 584 │ 2026-10-24T02:58:54.9017440Z 585 │ if ( 2026-10-24T02:58:54.9017602Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T02:58:54.9017700Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T02:58:54.9017754Z 588 │ ) { 2026-10-24T02:58:54.9017811Z 589 │ return; 2026-10-24T02:58:54.9017864Z 590 │ } 2026-10-24T02:58:54.9017913Z 591 │ 2026-10-24T02:58:54.9018050Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T02:58:54.9018167Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T02:58:54.9018219Z 594 │ } 2026-10-24T02:58:54.9018322Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T02:58:54.9018394Z 596 │ const draftBackup = 2026-10-24T02:58:54.9018577Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T02:58:54.9018711Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T02:58:54.9018804Z 599 │ const importToken = Symbol(importKey); 2026-10-24T02:58:54.9018885Z 600 │ let didReserveShare = false; 2026-10-24T02:58:54.9018961Z 601 │ let didConsumeShare = false; 2026-10-24T02:58:54.9019039Z 602 │ let needsDraftRestore = false; 2026-10-24T02:58:54.9019145Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T02:58:54.9019229Z 604 │ setImportingShareKey(importKey); 2026-10-24T02:58:54.9019313Z ·  ──────────┬───────── 2026-10-24T02:58:54.9019499Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9019642Z 605 │ void (async () => { 2026-10-24T02:58:54.9019693Z ╰──── 2026-10-24T02:58:54.9020374Z  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-24T02:58:54.9020728Z  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-24T02:58:54.9020731Z 2026-10-24T02:58:54.9020929Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9021078Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T02:58:54.9021152Z 523 │ props.initialProjectRef, 2026-10-24T02:58:54.9021224Z 524 │ props.incomingShareId, 2026-10-24T02:58:54.9021308Z ·  ──────────┬────────── 2026-10-24T02:58:54.9021478Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T02:58:54.9021550Z 525 │ props.pendingTaskId, 2026-10-24T02:58:54.9021601Z ╰──── 2026-10-24T02:58:54.9021886Z  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-24T02:58:54.9022192Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9022195Z 2026-10-24T02:58:54.9022406Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:58:54.9022552Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T02:58:54.9022665Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T02:58:54.9022735Z 543 │ flow.loadBranches(); 2026-10-24T02:58:54.9022807Z ·  ──┬─ 2026-10-24T02:58:54.9022929Z · ╰── Missing dependency `flow` 2026-10-24T02:58:54.9023020Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T02:58:54.9023102Z ·  ────────┬──────── 2026-10-24T02:58:54.9023296Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T02:58:54.9023348Z 545 │ 2026-10-24T02:58:54.9023400Z ╰──── 2026-10-24T02:58:54.9023809Z  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-24T02:58:54.9024116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9024122Z 2026-10-24T02:58:54.9024318Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9024465Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T02:58:54.9024528Z 765 │ flow.draftKey, 2026-10-24T02:58:54.9024604Z 766 │ hasImportedIncomingShare, 2026-10-24T02:58:54.9024693Z ·  ────────────┬─────────── 2026-10-24T02:58:54.9024863Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T02:58:54.9024926Z 767 │ incomingShare, 2026-10-24T02:58:54.9025004Z 768 │ isIncomingShareInboxLoading, 2026-10-24T02:58:54.9025098Z ·  ─────────────┬───────────── 2026-10-24T02:58:54.9025327Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T02:58:54.9025436Z 769 │ isIncomingShareUnavailable, 2026-10-24T02:58:54.9025506Z 770 │ props.incomingShareId, 2026-10-24T02:58:54.9025598Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T02:58:54.9025683Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T02:58:54.9025755Z 773 │ releaseShareReservation, 2026-10-24T02:58:54.9025818Z 774 │ reserveShare, 2026-10-24T02:58:54.9025903Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T02:58:54.9025969Z 776 │ selectedProject, 2026-10-24T02:58:54.9026035Z 777 │ shareImportAttempt, 2026-10-24T02:58:54.9026120Z ·  ─────────┬──────── 2026-10-24T02:58:54.9026285Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T02:58:54.9026342Z 778 │ ]); 2026-10-24T02:58:54.9026391Z ╰──── 2026-10-24T02:58:54.9026676Z  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-24T02:58:54.9026980Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9026983Z 2026-10-24T02:58:54.9027257Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.9027402Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T02:58:54.9027454Z 60 │ ) { 2026-10-24T02:58:54.9027626Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T02:58:54.9027709Z ·  ──────┬────── 2026-10-24T02:58:54.9027848Z · ╰── 'useDragRegion' is declared here 2026-10-24T02:58:54.9027935Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T02:58:54.9027988Z ╰──── 2026-10-24T02:58:54.9028093Z  help: Consider removing this declaration. 2026-10-24T02:58:54.9028095Z 2026-10-24T02:58:54.9028248Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9028399Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T02:58:54.9028454Z  86 │ 2026-10-24T02:58:54.9028546Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-24T02:58:54.9028627Z ·  ──────┬───── 2026-10-24T02:58:54.9028811Z · ╰── `cardCoverage` originates here 2026-10-24T02:58:54.9028920Z  88 │ const barHeightRef = useRef(0); 2026-10-24T02:58:54.9029000Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T02:58:54.9029085Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T02:58:54.9029175Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T02:58:54.9029243Z  92 │ if (!cardCoverage) { 2026-10-24T02:58:54.9029307Z  93 │ return; 2026-10-24T02:58:54.9029361Z  94 │ } 2026-10-24T02:58:54.9029506Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T02:58:54.9029593Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T02:58:54.9029652Z  97 │ return; 2026-10-24T02:58:54.9029708Z  98 │ } 2026-10-24T02:58:54.9029786Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:58:54.9029883Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:58:54.9029998Z ·  ──────┬───── 2026-10-24T02:58:54.9030145Z · ╰── `cardCoverage` cannot be modified 2026-10-24T02:58:54.9030203Z 101 │ return; 2026-10-24T02:58:54.9030256Z ╰──── 2026-10-24T02:58:54.9030544Z  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-24T02:58:54.9030843Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9030845Z 2026-10-24T02:58:54.9030996Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9031157Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T02:58:54.9031240Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T02:58:54.9031325Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T02:58:54.9031400Z ·  ─────┬──── 2026-10-24T02:58:54.9031535Z · ╰── `cardHeight` originates here 2026-10-24T02:58:54.9031627Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T02:58:54.9031695Z  92 │ if (!cardCoverage) { 2026-10-24T02:58:54.9031752Z  93 │ return; 2026-10-24T02:58:54.9031807Z  94 │ } 2026-10-24T02:58:54.9031953Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T02:58:54.9032039Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T02:58:54.9032095Z  97 │ return; 2026-10-24T02:58:54.9032151Z  98 │ } 2026-10-24T02:58:54.9032239Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:58:54.9032324Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:58:54.9032380Z 101 │ return; 2026-10-24T02:58:54.9032435Z 102 │ } 2026-10-24T02:58:54.9032536Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T02:58:54.9032629Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T02:58:54.9032713Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T02:58:54.9032770Z 106 │ }); 2026-10-24T02:58:54.9032839Z 107 │ }, [cardCoverage]); 2026-10-24T02:58:54.9032920Z 108 │ const handleBarLayout = useCallback( 2026-10-24T02:58:54.9033000Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.9033127Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:58:54.9033196Z 111 │ notifyCoverage(); 2026-10-24T02:58:54.9033251Z 112 │ }, 2026-10-24T02:58:54.9033376Z 113 │ [notifyCoverage], 2026-10-24T02:58:54.9033461Z 114 │ ); 2026-10-24T02:58:54.9033544Z 115 │ const handleCardLayout = useCallback( 2026-10-24T02:58:54.9033623Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.9033749Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:58:54.9033862Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T02:58:54.9033938Z ·  ─────┬──── 2026-10-24T02:58:54.9034072Z · ╰── `cardHeight` cannot be modified 2026-10-24T02:58:54.9034141Z 119 │ notifyCoverage(); 2026-10-24T02:58:54.9034193Z ╰──── 2026-10-24T02:58:54.9034452Z  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-24T02:58:54.9034755Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9034760Z 2026-10-24T02:58:54.9034958Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:58:54.9035112Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T02:58:54.9035196Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T02:58:54.9035287Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T02:58:54.9035392Z ·  ───┬─── 2026-10-24T02:58:54.9035628Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T02:58:54.9035697Z  92 │ if (!cardCoverage) { 2026-10-24T02:58:54.9035763Z  93 │ return; 2026-10-24T02:58:54.9035819Z  94 │ } 2026-10-24T02:58:54.9035966Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T02:58:54.9036052Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T02:58:54.9036108Z  97 │ return; 2026-10-24T02:58:54.9036164Z  98 │ } 2026-10-24T02:58:54.9036246Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:58:54.9036328Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:58:54.9036405Z ·  ──────┬───── 2026-10-24T02:58:54.9036539Z · ╰── This modifies `cardCoverage` 2026-10-24T02:58:54.9036604Z 101 │ return; 2026-10-24T02:58:54.9036656Z ╰──── 2026-10-24T02:58:54.9036994Z  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-24T02:58:54.9037296Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9037299Z 2026-10-24T02:58:54.9037495Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:58:54.9037648Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T02:58:54.9037728Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:58:54.9037807Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:58:54.9037886Z ·  ──────┬───── 2026-10-24T02:58:54.9038016Z · ╰── This modifies `cardCoverage` 2026-10-24T02:58:54.9038126Z 101 │ return; 2026-10-24T02:58:54.9038293Z 102 │ } 2026-10-24T02:58:54.9038396Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T02:58:54.9038491Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T02:58:54.9038575Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T02:58:54.9038630Z 106 │ }); 2026-10-24T02:58:54.9038696Z 107 │ }, [cardCoverage]); 2026-10-24T02:58:54.9038779Z 108 │ const handleBarLayout = useCallback( 2026-10-24T02:58:54.9038857Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.9038963Z ·  ───────────────┬─────────────── 2026-10-24T02:58:54.9039182Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T02:58:54.9039307Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:58:54.9039362Z ╰──── 2026-10-24T02:58:54.9039695Z  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-24T02:58:54.9040042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9040044Z 2026-10-24T02:58:54.9040241Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:58:54.9040395Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T02:58:54.9040478Z 115 │ const handleCardLayout = useCallback( 2026-10-24T02:58:54.9040560Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T02:58:54.9040669Z ·  ───────────────┬─────────────── 2026-10-24T02:58:54.9040885Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T02:58:54.9041010Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:58:54.9041124Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T02:58:54.9041200Z ·  ─────┬──── 2026-10-24T02:58:54.9041329Z · ╰── This modifies `cardHeight` 2026-10-24T02:58:54.9041395Z 119 │ notifyCoverage(); 2026-10-24T02:58:54.9041448Z ╰──── 2026-10-24T02:58:54.9041776Z  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-24T02:58:54.9042077Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9042081Z 2026-10-24T02:58:54.9042335Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9042491Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T02:58:54.9042604Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T02:58:54.9042673Z 38 │ useLayoutEffect(() => { 2026-10-24T02:58:54.9042749Z ·  ───────┬─────── 2026-10-24T02:58:54.9042878Z · ╰── This is the containing effect 2026-10-24T02:58:54.9042941Z 39 │ reset(); 2026-10-24T02:58:54.9043010Z 40 │ setInitialized(true); 2026-10-24T02:58:54.9043140Z ·  ───────┬────── 2026-10-24T02:58:54.9043335Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9043396Z 41 │ }, [reset]); 2026-10-24T02:58:54.9043450Z ╰──── 2026-10-24T02:58:54.9044037Z  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-24T02:58:54.9044352Z  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-24T02:58:54.9044356Z 2026-10-24T02:58:54.9044609Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9044767Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T02:58:54.9044820Z 88 │ 2026-10-24T02:58:54.9044886Z 89 │ useEffect(() => { 2026-10-24T02:58:54.9044954Z ·  ────┬──── 2026-10-24T02:58:54.9045082Z · ╰── This is the containing effect 2026-10-24T02:58:54.9045237Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T02:58:54.9045338Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T02:58:54.9045403Z 92 │ let active = true; 2026-10-24T02:58:54.9045499Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T02:58:54.9045583Z ·  ─────────┬───────── 2026-10-24T02:58:54.9045765Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9045917Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T02:58:54.9045969Z ╰──── 2026-10-24T02:58:54.9046990Z  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-24T02:58:54.9047306Z  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-24T02:58:54.9047308Z 2026-10-24T02:58:54.9047550Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:58:54.9047703Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T02:58:54.9047763Z 289 │ return ( 2026-10-24T02:58:54.9047895Z 290 │ 2026-10-24T02:58:54.9048147Z ·  ───────────── 2026-10-24T02:58:54.9048215Z 291 │ {props.children} 2026-10-24T02:58:54.9048267Z ╰──── 2026-10-24T02:58:54.9048488Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:58:54.9048627Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:58:54.9048629Z 2026-10-24T02:58:54.9048918Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:58:54.9049106Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T02:58:54.9049165Z 653 │ return ( 2026-10-24T02:58:54.9049284Z 654 │ 2026-10-24T02:58:54.9049396Z ·  ───────────── 2026-10-24T02:58:54.9049464Z 655 │ {props.children} 2026-10-24T02:58:54.9049516Z ╰──── 2026-10-24T02:58:54.9049733Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:58:54.9049908Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:58:54.9049913Z 2026-10-24T02:58:54.9050145Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:58:54.9050305Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T02:58:54.9050373Z 1461 │ return ( 2026-10-24T02:58:54.9050533Z 1462 │ 2026-10-24T02:58:54.9050661Z ·  ──────────────────── 2026-10-24T02:58:54.9050759Z 1463 │ { 2026-10-24T02:58:54.9051787Z ·  ────┬──── 2026-10-24T02:58:54.9051916Z · ╰── This is the containing effect 2026-10-24T02:58:54.9051998Z 119 │ void refreshNotifications(); 2026-10-24T02:58:54.9052086Z ·  ──────────┬───────── 2026-10-24T02:58:54.9052259Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9052401Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T02:58:54.9052453Z ╰──── 2026-10-24T02:58:54.9053084Z  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-24T02:58:54.9053431Z  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-24T02:58:54.9053434Z 2026-10-24T02:58:54.9053684Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9053868Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T02:58:54.9053920Z 125 │ 2026-10-24T02:58:54.9053988Z 126 │ useEffect(() => { 2026-10-24T02:58:54.9054062Z ·  ────┬──── 2026-10-24T02:58:54.9054191Z · ╰── This is the containing effect 2026-10-24T02:58:54.9054257Z 127 │ if (!isLoaded) { 2026-10-24T02:58:54.9054345Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T02:58:54.9054434Z ·  ──────────┬────────── 2026-10-24T02:58:54.9054603Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9054665Z 129 │ return; 2026-10-24T02:58:54.9054715Z ╰──── 2026-10-24T02:58:54.9055305Z  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-24T02:58:54.9055619Z  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-24T02:58:54.9055621Z 2026-10-24T02:58:54.9055869Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9056025Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T02:58:54.9056085Z 434 │ : null; 2026-10-24T02:58:54.9056152Z 435 │ useEffect(() => { 2026-10-24T02:58:54.9056221Z ·  ────┬──── 2026-10-24T02:58:54.9056347Z · ╰── This is the containing effect 2026-10-24T02:58:54.9056404Z 436 │ if ( 2026-10-24T02:58:54.9056487Z 437 │ props.active === false || 2026-10-24T02:58:54.9056566Z 438 │ activeDraftKey !== null || 2026-10-24T02:58:54.9056648Z 439 │ editingPendingTask !== null || 2026-10-24T02:58:54.9056722Z 440 │ selectedProject === null 2026-10-24T02:58:54.9056778Z 441 │ ) { 2026-10-24T02:58:54.9056838Z 442 │ return; 2026-10-24T02:58:54.9056891Z 443 │ } 2026-10-24T02:58:54.9056960Z 444 │ setActiveDraftKey( 2026-10-24T02:58:54.9057043Z ·  ────────┬──────── 2026-10-24T02:58:54.9057208Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9057279Z 445 │ createNewTaskDraft({ 2026-10-24T02:58:54.9057334Z ╰──── 2026-10-24T02:58:54.9057968Z  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-24T02:58:54.9058307Z  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-24T02:58:54.9058310Z 2026-10-24T02:58:54.9058542Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:58:54.9058702Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T02:58:54.9058807Z 1243 │ 2026-10-24T02:58:54.9059002Z 1244 │ {props.children} 2026-10-24T02:58:54.9059118Z ·  ───────────── 2026-10-24T02:58:54.9059194Z 1245 │ 2026-10-24T02:58:54.9059245Z ╰──── 2026-10-24T02:58:54.9059535Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:58:54.9059706Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:58:54.9059709Z 2026-10-24T02:58:54.9059909Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.9060074Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-24T02:58:54.9060255Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T02:58:54.9060425Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T02:58:54.9060561Z ·  ─────┬──── 2026-10-24T02:58:54.9060738Z · ╰── Cannot call impure function 2026-10-24T02:58:54.9060874Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T02:58:54.9060927Z ╰──── 2026-10-24T02:58:54.9061206Z  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-24T02:58:54.9061496Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.9061498Z 2026-10-24T02:58:54.9061666Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.9061822Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-24T02:58:54.9061902Z 717 │ const snoozePresets = useMemo( 2026-10-24T02:58:54.9062079Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T02:58:54.9062205Z ·  ─────┬──── 2026-10-24T02:58:54.9062381Z · ╰── Cannot call impure function 2026-10-24T02:58:54.9062497Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T02:58:54.9062549Z ╰──── 2026-10-24T02:58:54.9062882Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:58:54.9063207Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.9063209Z 2026-10-24T02:58:54.9063388Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:58:54.9063540Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-24T02:58:54.9063715Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T02:58:54.9063827Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T02:58:54.9063920Z ·  ────────────┬─────────── 2026-10-24T02:58:54.9064100Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T02:58:54.9064158Z 720 │ ); 2026-10-24T02:58:54.9064208Z ╰──── 2026-10-24T02:58:54.9064517Z  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-24T02:58:54.9064823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9064826Z 2026-10-24T02:58:54.9065002Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:58:54.9065151Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-24T02:58:54.9065218Z 764 │ thread.pinnedAt, 2026-10-24T02:58:54.9065281Z 765 │ variant, 2026-10-24T02:58:54.9065362Z ·  ───┬─── 2026-10-24T02:58:54.9065496Z · ╰── Unnecessary dependency `variant` 2026-10-24T02:58:54.9065554Z 766 │ ], 2026-10-24T02:58:54.9065606Z ╰──── 2026-10-24T02:58:54.9065914Z  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-24T02:58:54.9066220Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9066222Z 2026-10-24T02:58:54.9066411Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.9066573Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-24T02:58:54.9066703Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T02:58:54.9068348Z 1215 │ 2026-10-24T02:58:54.9068469Z ·  ────────────────────────── 2026-10-24T02:58:54.9068578Z 1216 │ 2026-10-24T02:58:54.9068629Z ╰──── 2026-10-24T02:58:54.9068774Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T02:58:54.9068777Z 2026-10-24T02:58:54.9069031Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.9069159Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T02:58:54.9069214Z 3404 │ 2026-10-24T02:58:54.9069479Z 3405 │ const layer: Layer.Layer = 2026-10-24T02:58:54.9069578Z ·  ──┬── 2026-10-24T02:58:54.9069703Z · ╰── 'layer' is declared here 2026-10-24T02:58:54.9069768Z 3406 │ Layer.effect( 2026-10-24T02:58:54.9069818Z ╰──── 2026-10-24T02:58:54.9069931Z  help: Consider removing this declaration. 2026-10-24T02:58:54.9069934Z 2026-10-24T02:58:54.9070156Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:58:54.9070315Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T02:58:54.9070418Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T02:58:54.9070602Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T02:58:54.9070746Z ·  ─────┬───── 2026-10-24T02:58:54.9070943Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T02:58:54.9071021Z 101 │ const readEditor = useCallback( 2026-10-24T02:58:54.9071071Z ╰──── 2026-10-24T02:58:54.9071376Z  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-24T02:58:54.9071681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9071683Z 2026-10-24T02:58:54.9071864Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:58:54.9072021Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T02:58:54.9072082Z 120 │ setEditor, 2026-10-24T02:58:54.9072145Z 121 │ startEditor, 2026-10-24T02:58:54.9072220Z ·  ─────┬───── 2026-10-24T02:58:54.9072361Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T02:58:54.9072423Z 122 │ hasChanges, 2026-10-24T02:58:54.9072474Z ╰──── 2026-10-24T02:58:54.9072779Z  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-24T02:58:54.9073088Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9073093Z 2026-10-24T02:58:54.9073344Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9073491Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-24T02:58:54.9073550Z 510 │ }, []); 2026-10-24T02:58:54.9073615Z 511 │ useEffect(() => { 2026-10-24T02:58:54.9073686Z ·  ────┬──── 2026-10-24T02:58:54.9073811Z · ╰── This is the containing effect 2026-10-24T02:58:54.9073897Z 512 │ setKeyboardStateSuspect(false); 2026-10-24T02:58:54.9073986Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9074206Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9074334Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T02:58:54.9074384Z ╰──── 2026-10-24T02:58:54.9074968Z  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-24T02:58:54.9075280Z  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-24T02:58:54.9075284Z 2026-10-24T02:58:54.9075534Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9075689Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-24T02:58:54.9075844Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T02:58:54.9075909Z 870 │ useEffect(() => { 2026-10-24T02:58:54.9075979Z ·  ────┬──── 2026-10-24T02:58:54.9076103Z · ╰── This is the containing effect 2026-10-24T02:58:54.9076260Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T02:58:54.9076370Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T02:58:54.9076464Z ·  ─────────────┬──────────── 2026-10-24T02:58:54.9076634Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9076690Z 873 │ } 2026-10-24T02:58:54.9076740Z ╰──── 2026-10-24T02:58:54.9077329Z  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-24T02:58:54.9077645Z  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-24T02:58:54.9077647Z 2026-10-24T02:58:54.9077896Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9078048Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-24T02:58:54.9078100Z 1117 │ 2026-10-24T02:58:54.9078171Z 1118 │ useEffect(() => { 2026-10-24T02:58:54.9078241Z ·  ────┬──── 2026-10-24T02:58:54.9078369Z · ╰── This is the containing effect 2026-10-24T02:58:54.9078445Z 1119 │ setAnchorMessageId(null); 2026-10-24T02:58:54.9078528Z ·  ─────────┬──────── 2026-10-24T02:58:54.9078693Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9078773Z 1120 │ setSubmittedMessageId(null); 2026-10-24T02:58:54.9078824Z ╰──── 2026-10-24T02:58:54.9079406Z  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-24T02:58:54.9079767Z  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-24T02:58:54.9079802Z 2026-10-24T02:58:54.9080041Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9080191Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-24T02:58:54.9080273Z 512 │ setKeyboardStateSuspect(false); 2026-10-24T02:58:54.9080369Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T02:58:54.9080503Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T02:58:54.9080706Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T02:58:54.9080865Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T02:58:54.9080992Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T02:58:54.9081041Z ╰──── 2026-10-24T02:58:54.9081326Z  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-24T02:58:54.9081626Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9081628Z 2026-10-24T02:58:54.9081823Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9081973Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-24T02:58:54.9082060Z 1066 │ userInputInsetProgress.set(1); 2026-10-24T02:58:54.9082221Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T02:58:54.9082313Z ·  ────────────┬─────────── 2026-10-24T02:58:54.9082487Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T02:58:54.9082591Z 1068 │ const showContent = props.showContent ?? true; 2026-10-24T02:58:54.9082643Z ╰──── 2026-10-24T02:58:54.9082927Z  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-24T02:58:54.9083231Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9083233Z 2026-10-24T02:58:54.9083476Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9083654Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-24T02:58:54.9083722Z 1124 │ freeze.set(false); 2026-10-24T02:58:54.9083803Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-24T02:58:54.9083895Z ·  ────────┬──────── 2026-10-24T02:58:54.9084055Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T02:58:54.9084108Z 1126 │ 2026-10-24T02:58:54.9084158Z ╰──── 2026-10-24T02:58:54.9084444Z  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-24T02:58:54.9084748Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9084753Z 2026-10-24T02:58:54.9084907Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9085054Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-24T02:58:54.9085162Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T02:58:54.9085264Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-24T02:58:54.9085356Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9085513Z · ╰── `floatingControlCoverage` originates here 2026-10-24T02:58:54.9085636Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T02:58:54.9085689Z 953 │ ); 2026-10-24T02:58:54.9085761Z 954 │ useEffect(() => { 2026-10-24T02:58:54.9085864Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-24T02:58:54.9085951Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9086107Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T02:58:54.9086232Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T02:58:54.9086284Z ╰──── 2026-10-24T02:58:54.9086545Z  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-24T02:58:54.9086846Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9086850Z 2026-10-24T02:58:54.9087005Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9087154Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-24T02:58:54.9087335Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T02:58:54.9087455Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T02:58:54.9087562Z ·  ────────────────┬──────────────── 2026-10-24T02:58:54.9087743Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T02:58:54.9087867Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T02:58:54.9087921Z 966 │ ); 2026-10-24T02:58:54.9087988Z 967 │ useAnimatedReaction( 2026-10-24T02:58:54.9088046Z 968 │ () => 2026-10-24T02:58:54.9088192Z 969 │ contentInsetEndAdjustment.value + 2026-10-24T02:58:54.9088306Z 970 │ floatingControlCoverage.value + 2026-10-24T02:58:54.9088495Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T02:58:54.9088556Z 972 │ (value) => { 2026-10-24T02:58:54.9088666Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T02:58:54.9088771Z ·  ────────────────┬──────────────── 2026-10-24T02:58:54.9088956Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T02:58:54.9089012Z 974 │ }, 2026-10-24T02:58:54.9089062Z ╰──── 2026-10-24T02:58:54.9089318Z  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-24T02:58:54.9089619Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9089624Z 2026-10-24T02:58:54.9089818Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T02:58:54.9089980Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T02:58:54.9090073Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T02:58:54.9090162Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T02:58:54.9090240Z ·  ────┬─── 2026-10-24T02:58:54.9090371Z · ╰── 'Duration' is imported here 2026-10-24T02:58:54.9090455Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T02:58:54.9090505Z ╰──── 2026-10-24T02:58:54.9090606Z  help: Consider removing this import. 2026-10-24T02:58:54.9090611Z 2026-10-24T02:58:54.9090862Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9091010Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T02:58:54.9091061Z 55 │ 2026-10-24T02:58:54.9091124Z 56 │ useEffect(() => { 2026-10-24T02:58:54.9091194Z ·  ────┬──── 2026-10-24T02:58:54.9091491Z · ╰── This is the containing effect 2026-10-24T02:58:54.9091557Z 57 │ setDecodedSize(null); 2026-10-24T02:58:54.9091632Z ·  ───────┬────── 2026-10-24T02:58:54.9091796Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9091870Z 58 │ }, [props.sourceKey]); 2026-10-24T02:58:54.9091922Z ╰──── 2026-10-24T02:58:54.9092504Z  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-24T02:58:54.9092821Z  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-24T02:58:54.9092824Z 2026-10-24T02:58:54.9093073Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9093219Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T02:58:54.9093323Z 59 │ 2026-10-24T02:58:54.9093424Z 60 │ useEffect(() => { 2026-10-24T02:58:54.9093493Z ·  ────┬──── 2026-10-24T02:58:54.9093617Z · ╰── This is the containing effect 2026-10-24T02:58:54.9093682Z 61 │ setFailedUri(null); 2026-10-24T02:58:54.9093755Z ·  ──────┬───── 2026-10-24T02:58:54.9093916Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9093981Z 62 │ }, [props.uri]); 2026-10-24T02:58:54.9094029Z ╰──── 2026-10-24T02:58:54.9094615Z  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-24T02:58:54.9094932Z  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-24T02:58:54.9094934Z 2026-10-24T02:58:54.9095144Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T02:58:54.9095290Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T02:58:54.9095411Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T02:58:54.9095589Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T02:58:54.9095677Z ·  ────────┬──────── 2026-10-24T02:58:54.9095826Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T02:58:54.9095882Z 8 │ 2026-10-24T02:58:54.9095936Z ╰──── 2026-10-24T02:58:54.9096032Z  help: Consider removing this import. 2026-10-24T02:58:54.9096034Z 2026-10-24T02:58:54.9096230Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9096376Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T02:58:54.9096443Z 57 │ setDecodedSize(null); 2026-10-24T02:58:54.9096511Z 58 │ }, [props.sourceKey]); 2026-10-24T02:58:54.9096592Z ·  ───────┬─────── 2026-10-24T02:58:54.9096739Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T02:58:54.9096792Z 59 │ 2026-10-24T02:58:54.9096841Z ╰──── 2026-10-24T02:58:54.9097135Z  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-24T02:58:54.9097445Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9097447Z 2026-10-24T02:58:54.9097641Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9097788Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T02:58:54.9097855Z 61 │ setFailedUri(null); 2026-10-24T02:58:54.9097921Z 62 │ }, [props.uri]); 2026-10-24T02:58:54.9097991Z ·  ────┬──── 2026-10-24T02:58:54.9098129Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T02:58:54.9098181Z 63 │ 2026-10-24T02:58:54.9098231Z ╰──── 2026-10-24T02:58:54.9098565Z  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-24T02:58:54.9098900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9098903Z 2026-10-24T02:58:54.9099111Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:58:54.9099278Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T02:58:54.9099355Z 248 │ mountedRef.current = false; 2026-10-24T02:58:54.9099525Z 249 │ flow.setBranchQuery(""); 2026-10-24T02:58:54.9099629Z ·  ──┬─ 2026-10-24T02:58:54.9099765Z · ╰── Missing dependency `flow` 2026-10-24T02:58:54.9099822Z 250 │ }; 2026-10-24T02:58:54.9099935Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T02:58:54.9100025Z ·  ─────────┬───────── 2026-10-24T02:58:54.9100225Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T02:58:54.9100276Z 252 │ 2026-10-24T02:58:54.9100329Z ╰──── 2026-10-24T02:58:54.9100741Z  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-24T02:58:54.9101050Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9101055Z 2026-10-24T02:58:54.9101305Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9101462Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-24T02:58:54.9101581Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T02:58:54.9101646Z 284 │ useEffect(() => { 2026-10-24T02:58:54.9101717Z ·  ────┬──── 2026-10-24T02:58:54.9101843Z · ╰── This is the containing effect 2026-10-24T02:58:54.9101926Z 285 │ setNow(new Date().toISOString()); 2026-10-24T02:58:54.9101993Z ·  ───┬── 2026-10-24T02:58:54.9102153Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9102361Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T02:58:54.9102459Z ╰──── 2026-10-24T02:58:54.9103043Z  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-24T02:58:54.9103362Z  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-24T02:58:54.9103365Z 2026-10-24T02:58:54.9103560Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9103722Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-24T02:58:54.9103855Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-24T02:58:54.9103944Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T02:58:54.9104044Z ·  ───────┬────── 2026-10-24T02:58:54.9104204Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T02:58:54.9104317Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T02:58:54.9104369Z ╰──── 2026-10-24T02:58:54.9104655Z  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-24T02:58:54.9104961Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9104968Z 2026-10-24T02:58:54.9105131Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.9105289Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-24T02:58:54.9105375Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T02:58:54.9105528Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T02:58:54.9105645Z ·  ─────┬──── 2026-10-24T02:58:54.9105805Z · ╰── Cannot call impure function 2026-10-24T02:58:54.9105883Z 357 │ const id = setTimeout(() => { 2026-10-24T02:58:54.9105935Z ╰──── 2026-10-24T02:58:54.9106217Z  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-24T02:58:54.9106508Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.9106510Z 2026-10-24T02:58:54.9106762Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9106909Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T02:58:54.9107067Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T02:58:54.9107130Z 29 │ useEffect(() => { 2026-10-24T02:58:54.9107200Z ·  ────┬──── 2026-10-24T02:58:54.9107374Z · ╰── This is the containing effect 2026-10-24T02:58:54.9107639Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T02:58:54.9107740Z ·  ───┬─── 2026-10-24T02:58:54.9107929Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9108001Z 31 │ }, [key, live, snapshot]); 2026-10-24T02:58:54.9108052Z ╰──── 2026-10-24T02:58:54.9108632Z  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-24T02:58:54.9108951Z  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-24T02:58:54.9108955Z 2026-10-24T02:58:54.9109155Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T02:58:54.9109319Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T02:58:54.9109390Z 14 │ } from "@t3tools/contracts"; 2026-10-24T02:58:54.9109479Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T02:58:54.9109546Z ·  ── 2026-10-24T02:58:54.9109725Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-24T02:58:54.9109777Z ╰──── 2026-10-24T02:58:54.9109892Z  help: Remove empty braces 2026-10-24T02:58:54.9109895Z 2026-10-24T02:58:54.9110154Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9110328Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T02:58:54.9110383Z 58 │ 2026-10-24T02:58:54.9110444Z 59 │ useEffect(() => { 2026-10-24T02:58:54.9110512Z ·  ────┬──── 2026-10-24T02:58:54.9110640Z · ╰── This is the containing effect 2026-10-24T02:58:54.9110720Z 60 │ setMountedModes((current) => { 2026-10-24T02:58:54.9110797Z ·  ───────┬─────── 2026-10-24T02:58:54.9110961Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9111044Z 61 │ if (current.has(props.mode)) { 2026-10-24T02:58:54.9111094Z ╰──── 2026-10-24T02:58:54.9111681Z  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-24T02:58:54.9111997Z  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-24T02:58:54.9112000Z 2026-10-24T02:58:54.9112251Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.9112391Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T02:58:54.9112446Z 3754 │ 2026-10-24T02:58:54.9112692Z 3755 │ const layer: Layer.Layer = 2026-10-24T02:58:54.9112793Z ·  ──┬── 2026-10-24T02:58:54.9112916Z · ╰── 'layer' is declared here 2026-10-24T02:58:54.9112980Z 3756 │ Layer.effect( 2026-10-24T02:58:54.9113029Z ╰──── 2026-10-24T02:58:54.9113132Z  help: Consider removing this declaration. 2026-10-24T02:58:54.9113134Z 2026-10-24T02:58:54.9113295Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T02:58:54.9113447Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1526:12] 2026-10-24T02:58:54.9113498Z 1525 │ 2026-10-24T02:58:54.9113567Z 1526 │ for (const [] of [ 2026-10-24T02:58:54.9113637Z ·  ── 2026-10-24T02:58:54.9113708Z 1527 │ ["github", "github.com"], 2026-10-24T02:58:54.9113764Z ╰──── 2026-10-24T02:58:54.9114037Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T02:58:54.9114040Z 2026-10-24T02:58:54.9114204Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:58:54.9114390Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T02:58:54.9114442Z 52 │ 2026-10-24T02:58:54.9114507Z 53 │ for (const {} of [ 2026-10-24T02:58:54.9114575Z ·  ── 2026-10-24T02:58:54.9114640Z 54 │ { healthy: true }, 2026-10-24T02:58:54.9114690Z ╰──── 2026-10-24T02:58:54.9114915Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:58:54.9114917Z 2026-10-24T02:58:54.9115173Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9115339Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-24T02:58:54.9115391Z 211 │ }; 2026-10-24T02:58:54.9115454Z 212 │ useEffect(() => { 2026-10-24T02:58:54.9115528Z ·  ────┬──── 2026-10-24T02:58:54.9115657Z · ╰── This is the containing effect 2026-10-24T02:58:54.9115827Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T02:58:54.9115890Z 214 │ if (inserted) { 2026-10-24T02:58:54.9115966Z 215 │ setSelection((current) => 2026-10-24T02:58:54.9116043Z ·  ──────┬───── 2026-10-24T02:58:54.9116213Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9116383Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T02:58:54.9116433Z ╰──── 2026-10-24T02:58:54.9117018Z  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-24T02:58:54.9117329Z  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-24T02:58:54.9117332Z 2026-10-24T02:58:54.9117712Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9117898Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-24T02:58:54.9117975Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-24T02:58:54.9118039Z 285 │ useEffect(() => { 2026-10-24T02:58:54.9118107Z ·  ────┬──── 2026-10-24T02:58:54.9118233Z · ╰── This is the containing effect 2026-10-24T02:58:54.9118377Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T02:58:54.9118523Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T02:58:54.9118591Z 288 │ const now = Date.now(); 2026-10-24T02:58:54.9118704Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T02:58:54.9118761Z 290 │ if ( 2026-10-24T02:58:54.9118842Z 291 │ lastRequest?.key === key && 2026-10-24T02:58:54.9118978Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T02:58:54.9119033Z 293 │ ) 2026-10-24T02:58:54.9119095Z 294 │ return; 2026-10-24T02:58:54.9119268Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T02:58:54.9119353Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-24T02:58:54.9119448Z ·  ────────────┬─────────── 2026-10-24T02:58:54.9119620Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9119680Z 297 │ return; 2026-10-24T02:58:54.9119729Z ╰──── 2026-10-24T02:58:54.9120363Z  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-24T02:58:54.9120679Z  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-24T02:58:54.9120682Z 2026-10-24T02:58:54.9120877Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9121035Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-24T02:58:54.9121088Z 325 │ }, [ 2026-10-24T02:58:54.9121151Z 326 │ draftMessage, 2026-10-24T02:58:54.9121226Z ·  ──────┬───── 2026-10-24T02:58:54.9121372Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T02:58:54.9121436Z 327 │ environmentId, 2026-10-24T02:58:54.9121488Z ╰──── 2026-10-24T02:58:54.9121776Z  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-24T02:58:54.9122078Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9122080Z 2026-10-24T02:58:54.9122263Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T02:58:54.9122413Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T02:58:54.9122577Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T02:58:54.9122702Z 602 │ const gesture = Gesture.Pan() 2026-10-24T02:58:54.9122821Z ·  ─┬─ 2026-10-24T02:58:54.9122958Z · ╰── `Pan` may be a component 2026-10-24T02:58:54.9123032Z 603 │ .enabled(!props.disabled) 2026-10-24T02:58:54.9123082Z ╰──── 2026-10-24T02:58:54.9123349Z  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-24T02:58:54.9123782Z  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-24T02:58:54.9123785Z 2026-10-24T02:58:54.9124039Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9124197Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T02:58:54.9124259Z 259 │ .join("|"); 2026-10-24T02:58:54.9124322Z 260 │ useEffect(() => { 2026-10-24T02:58:54.9124392Z ·  ────┬──── 2026-10-24T02:58:54.9124519Z · ╰── This is the containing effect 2026-10-24T02:58:54.9124580Z 261 │ stop(); 2026-10-24T02:58:54.9124646Z ·  ──┬─ 2026-10-24T02:58:54.9124807Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9124872Z 262 │ }, [orderVersion]); 2026-10-24T02:58:54.9124923Z ╰──── 2026-10-24T02:58:54.9125508Z  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-24T02:58:54.9125823Z  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-24T02:58:54.9125825Z 2026-10-24T02:58:54.9126036Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:58:54.9126190Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T02:58:54.9126254Z 260 │ useEffect(() => { 2026-10-24T02:58:54.9126311Z 261 │ stop(); 2026-10-24T02:58:54.9126379Z ·  ──┬─ 2026-10-24T02:58:54.9126505Z · ╰── Missing dependency `stop` 2026-10-24T02:58:54.9126572Z 262 │ }, [orderVersion]); 2026-10-24T02:58:54.9126647Z ·  ──────┬───── 2026-10-24T02:58:54.9126791Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T02:58:54.9126855Z 263 │ useEffect( 2026-10-24T02:58:54.9126906Z ╰──── 2026-10-24T02:58:54.9127314Z  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-24T02:58:54.9127618Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9127620Z 2026-10-24T02:58:54.9127809Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9127992Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T02:58:54.9128068Z 95 │ const latest = useRef(props); 2026-10-24T02:58:54.9128134Z 96 │ latest.current = props; 2026-10-24T02:58:54.9128238Z ·  ───┬──────┬─── 2026-10-24T02:58:54.9128412Z · │ ╰── Cannot update ref value during render 2026-10-24T02:58:54.9128524Z · ╰── This value is a ref 2026-10-24T02:58:54.9128590Z 97 │ const gesture = useMemo( 2026-10-24T02:58:54.9128641Z ╰──── 2026-10-24T02:58:54.9129108Z  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-24T02:58:54.9129393Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9129395Z 2026-10-24T02:58:54.9129533Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9129690Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T02:58:54.9129755Z 103 │ .runOnJS(true) 2026-10-24T02:58:54.9129875Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T02:58:54.9129990Z ·  ───────────────┬────────────── 2026-10-24T02:58:54.9130191Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.9130325Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9130376Z ╰──── 2026-10-24T02:58:54.9130829Z  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-24T02:58:54.9131111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9131113Z 2026-10-24T02:58:54.9131253Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9131407Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T02:58:54.9131548Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T02:58:54.9131702Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9131838Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T02:58:54.9132040Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.9132162Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9132213Z ╰──── 2026-10-24T02:58:54.9132660Z  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-24T02:58:54.9132948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9132954Z 2026-10-24T02:58:54.9133092Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9133247Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T02:58:54.9133373Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9133492Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9133629Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T02:58:54.9133828Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.9133956Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T02:58:54.9134009Z ╰──── 2026-10-24T02:58:54.9134459Z  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-24T02:58:54.9134745Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9134747Z 2026-10-24T02:58:54.9134885Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9135040Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T02:58:54.9135157Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9135281Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T02:58:54.9135416Z ·  ───────────────────────┬────────────────────── 2026-10-24T02:58:54.9135616Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.9135682Z 108 │ [props.disabled], 2026-10-24T02:58:54.9135733Z ╰──── 2026-10-24T02:58:54.9136183Z  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-24T02:58:54.9136513Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9136545Z 2026-10-24T02:58:54.9136682Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9136835Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T02:58:54.9136946Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T02:58:54.9137049Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T02:58:54.9137151Z ·  ───┬──────┬─── 2026-10-24T02:58:54.9137325Z · │ ╰── Cannot update ref value during render 2026-10-24T02:58:54.9137437Z · ╰── This value is a ref 2026-10-24T02:58:54.9137490Z 250 │ 2026-10-24T02:58:54.9137541Z ╰──── 2026-10-24T02:58:54.9137992Z  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-24T02:58:54.9138276Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9138278Z 2026-10-24T02:58:54.9138417Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9138573Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T02:58:54.9138690Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T02:58:54.9138800Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T02:58:54.9138924Z ·  ──────────────────┬────────────────── 2026-10-24T02:58:54.9139089Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.9139198Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T02:58:54.9139247Z ╰──── 2026-10-24T02:58:54.9139797Z  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-24T02:58:54.9140117Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9140120Z 2026-10-24T02:58:54.9140283Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:58:54.9140442Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T02:58:54.9140506Z 323 │ update(0); 2026-10-24T02:58:54.9140584Z 324 │ let last = performance.now(); 2026-10-24T02:58:54.9140679Z ·  ────────┬──────── 2026-10-24T02:58:54.9140814Z · ╰── Cannot call impure function 2026-10-24T02:58:54.9140882Z 325 │ const tick = () => { 2026-10-24T02:58:54.9140932Z ╰──── 2026-10-24T02:58:54.9141224Z  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-24T02:58:54.9141512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:58:54.9141597Z 2026-10-24T02:58:54.9141814Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T02:58:54.9141970Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T02:58:54.9142028Z  98 │ () => 2026-10-24T02:58:54.9142093Z  99 │ Gesture.Pan() 2026-10-24T02:58:54.9142166Z ·  ─┬─ 2026-10-24T02:58:54.9142294Z · ╰── `Pan` may be a component 2026-10-24T02:58:54.9142372Z 100 │ .enabled(!props.disabled) 2026-10-24T02:58:54.9142423Z ╰──── 2026-10-24T02:58:54.9142687Z  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-24T02:58:54.9143124Z  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-24T02:58:54.9143130Z 2026-10-24T02:58:54.9143312Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:58:54.9143466Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T02:58:54.9143532Z 103 │ .runOnJS(true) 2026-10-24T02:58:54.9143626Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T02:58:54.9143713Z ·  ───┬── 2026-10-24T02:58:54.9144139Z · ╰── 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-24T02:58:54.9144270Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9144389Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:58:54.9144510Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T02:58:54.9144577Z 108 │ [props.disabled], 2026-10-24T02:58:54.9144656Z ·  ────────┬─────── 2026-10-24T02:58:54.9144837Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:58:54.9144892Z 109 │ ); 2026-10-24T02:58:54.9144942Z ╰──── 2026-10-24T02:58:54.9145145Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:58:54.9145456Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9145463Z 2026-10-24T02:58:54.9145714Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9145848Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5] 2026-10-24T02:58:54.9145905Z 2137 │ ); 2026-10-24T02:58:54.9145971Z 2138 │ useEffect(() => { 2026-10-24T02:58:54.9146042Z ·  ────┬──── 2026-10-24T02:58:54.9146171Z · ╰── This is the containing effect 2026-10-24T02:58:54.9146246Z 2139 │ setExpandedVideo(null); 2026-10-24T02:58:54.9146325Z ·  ────────┬─────── 2026-10-24T02:58:54.9146545Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9146648Z 2140 │ setExpandedFile(null); 2026-10-24T02:58:54.9146699Z ╰──── 2026-10-24T02:58:54.9147285Z  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-24T02:58:54.9147601Z  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-24T02:58:54.9147603Z 2026-10-24T02:58:54.9147826Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T02:58:54.9147963Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T02:58:54.9148102Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T02:58:54.9148240Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T02:58:54.9148333Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9148496Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T02:58:54.9148650Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T02:58:54.9148702Z ╰──── 2026-10-24T02:58:54.9148797Z  help: Consider removing this import. 2026-10-24T02:58:54.9148800Z 2026-10-24T02:58:54.9149103Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T02:58:54.9149236Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T02:58:54.9149295Z 91 │ import { 2026-10-24T02:58:54.9149356Z 92 │ createContext, 2026-10-24T02:58:54.9149431Z ·  ──────┬────── 2026-10-24T02:58:54.9149563Z · ╰── 'createContext' is imported here 2026-10-24T02:58:54.9149619Z 93 │ memo, 2026-10-24T02:58:54.9149667Z ╰──── 2026-10-24T02:58:54.9149763Z  help: Consider removing this import. 2026-10-24T02:58:54.9149765Z 2026-10-24T02:58:54.9150144Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T02:58:54.9150277Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T02:58:54.9150333Z 107 │ import { 2026-10-24T02:58:54.9150401Z 108 │ ActivityIndicator, 2026-10-24T02:58:54.9150530Z ·  ────────┬──────── 2026-10-24T02:58:54.9150699Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T02:58:54.9150754Z 109 │ Image, 2026-10-24T02:58:54.9150804Z ╰──── 2026-10-24T02:58:54.9150897Z  help: Consider removing this import. 2026-10-24T02:58:54.9150900Z 2026-10-24T02:58:54.9151095Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T02:58:54.9151223Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T02:58:54.9151286Z 114 │ Pressable, 2026-10-24T02:58:54.9151348Z 115 │ ScrollView, 2026-10-24T02:58:54.9151421Z ·  ─────┬──── 2026-10-24T02:58:54.9151548Z · ╰── 'ScrollView' is imported here 2026-10-24T02:58:54.9151609Z 116 │ StyleSheet, 2026-10-24T02:58:54.9151664Z ╰──── 2026-10-24T02:58:54.9151760Z  help: Consider removing this import. 2026-10-24T02:58:54.9151762Z 2026-10-24T02:58:54.9151953Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T02:58:54.9152083Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T02:58:54.9152142Z 116 │ StyleSheet, 2026-10-24T02:58:54.9152208Z 117 │ Text as NativeText, 2026-10-24T02:58:54.9152284Z ·  ─────┬──── 2026-10-24T02:58:54.9152417Z · ╰── 'NativeText' is imported here 2026-10-24T02:58:54.9152481Z 118 │ type ColorValue, 2026-10-24T02:58:54.9152531Z ╰──── 2026-10-24T02:58:54.9152622Z  help: Consider removing this import. 2026-10-24T02:58:54.9152624Z 2026-10-24T02:58:54.9152837Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T02:58:54.9152968Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T02:58:54.9153101Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T02:58:54.9153223Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T02:58:54.9153310Z ·  ─────────┬──────── 2026-10-24T02:58:54.9153459Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T02:58:54.9153603Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T02:58:54.9153652Z ╰──── 2026-10-24T02:58:54.9153746Z  help: Consider removing this import. 2026-10-24T02:58:54.9153748Z 2026-10-24T02:58:54.9153965Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T02:58:54.9154100Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T02:58:54.9154231Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T02:58:54.9154353Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T02:58:54.9154441Z ·  ─────────┬───────── 2026-10-24T02:58:54.9154591Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T02:58:54.9154647Z 144 │ import { 2026-10-24T02:58:54.9154700Z ╰──── 2026-10-24T02:58:54.9154794Z  help: Consider removing this import. 2026-10-24T02:58:54.9154796Z 2026-10-24T02:58:54.9155055Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T02:58:54.9155211Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T02:58:54.9155354Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T02:58:54.9155487Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T02:58:54.9155574Z ·  ────────┬─────── 2026-10-24T02:58:54.9155720Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T02:58:54.9155855Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T02:58:54.9155907Z ╰──── 2026-10-24T02:58:54.9156000Z  help: Consider removing this import. 2026-10-24T02:58:54.9156002Z 2026-10-24T02:58:54.9156220Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T02:58:54.9156348Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T02:58:54.9156429Z 160 │ attachmentVideoPreviewSource, 2026-10-24T02:58:54.9156499Z 161 │ mediaVideoPreviewUri, 2026-10-24T02:58:54.9156581Z ·  ──────────┬───────── 2026-10-24T02:58:54.9156727Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T02:58:54.9156798Z 162 │ mediaVideoThumbnailKey, 2026-10-24T02:58:54.9156849Z ╰──── 2026-10-24T02:58:54.9156943Z  help: Consider removing this import. 2026-10-24T02:58:54.9156945Z 2026-10-24T02:58:54.9157161Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T02:58:54.9157290Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T02:58:54.9157363Z 161 │ mediaVideoPreviewUri, 2026-10-24T02:58:54.9157436Z 162 │ mediaVideoThumbnailKey, 2026-10-24T02:58:54.9157520Z ·  ───────────┬────────── 2026-10-24T02:58:54.9157672Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T02:58:54.9157750Z 163 │ type MediaVideoPreviewSource, 2026-10-24T02:58:54.9157801Z ╰──── 2026-10-24T02:58:54.9157892Z  help: Consider removing this import. 2026-10-24T02:58:54.9157894Z 2026-10-24T02:58:54.9158103Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T02:58:54.9158231Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T02:58:54.9158301Z 162 │ mediaVideoThumbnailKey, 2026-10-24T02:58:54.9158379Z 163 │ type MediaVideoPreviewSource, 2026-10-24T02:58:54.9158478Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9158639Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T02:58:54.9158725Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T02:58:54.9158773Z ╰──── 2026-10-24T02:58:54.9158866Z  help: Consider removing this import. 2026-10-24T02:58:54.9158868Z 2026-10-24T02:58:54.9159062Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T02:58:54.9159191Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T02:58:54.9159360Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T02:58:54.9159499Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T02:58:54.9159639Z ·  ───────┬─────── 2026-10-24T02:58:54.9159811Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T02:58:54.9159902Z 172 │ import { 2026-10-24T02:58:54.9159958Z ╰──── 2026-10-24T02:58:54.9160050Z  help: Consider removing this import. 2026-10-24T02:58:54.9160052Z 2026-10-24T02:58:54.9160273Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T02:58:54.9160401Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T02:58:54.9160457Z 185 │ import { 2026-10-24T02:58:54.9160530Z 186 │ resolveMarkdownFontSizes, 2026-10-24T02:58:54.9160619Z ·  ────────────┬─────────── 2026-10-24T02:58:54.9160778Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T02:58:54.9160864Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T02:58:54.9160915Z ╰──── 2026-10-24T02:58:54.9161007Z  help: Consider removing this import. 2026-10-24T02:58:54.9161009Z 2026-10-24T02:58:54.9161222Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-24T02:58:54.9161350Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10] 2026-10-24T02:58:54.9161480Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-24T02:58:54.9161615Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-24T02:58:54.9161707Z ·  ───────────┬────────── 2026-10-24T02:58:54.9161863Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-24T02:58:54.9161926Z 192 │ import { 2026-10-24T02:58:54.9161979Z ╰──── 2026-10-24T02:58:54.9162071Z  help: Consider removing this import. 2026-10-24T02:58:54.9162074Z 2026-10-24T02:58:54.9162322Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T02:58:54.9162449Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3] 2026-10-24T02:58:54.9162526Z 193 │ normalizeNativeMarkdownUrl, 2026-10-24T02:58:54.9162619Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T02:58:54.9162725Z ·  ──────────────────┬────────────────── 2026-10-24T02:58:54.9162916Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T02:58:54.9162988Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T02:58:54.9163045Z ╰──── 2026-10-24T02:58:54.9163138Z  help: Consider removing this import. 2026-10-24T02:58:54.9163140Z 2026-10-24T02:58:54.9163358Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-24T02:58:54.9163486Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3] 2026-10-24T02:58:54.9163578Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T02:58:54.9163648Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T02:58:54.9163735Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9163887Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-24T02:58:54.9163971Z 196 │ resolveMarkdownLinkPresentation, 2026-10-24T02:58:54.9164021Z ╰──── 2026-10-24T02:58:54.9164113Z  help: Consider removing this import. 2026-10-24T02:58:54.9164166Z 2026-10-24T02:58:54.9164413Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T02:58:54.9164541Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10] 2026-10-24T02:58:54.9164640Z 233 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T02:58:54.9164781Z 234 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T02:58:54.9164878Z ·  ────────────┬─────────── 2026-10-24T02:58:54.9165041Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T02:58:54.9165099Z 235 │ import { 2026-10-24T02:58:54.9165147Z ╰──── 2026-10-24T02:58:54.9165240Z  help: Consider removing this import. 2026-10-24T02:58:54.9165242Z 2026-10-24T02:58:54.9165451Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T02:58:54.9165580Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3] 2026-10-24T02:58:54.9165642Z 237 │ useAssetUrl, 2026-10-24T02:58:54.9165709Z 238 │ useAssetUrlState, 2026-10-24T02:58:54.9165788Z ·  ────────┬─────── 2026-10-24T02:58:54.9165927Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T02:58:54.9165993Z 239 │ useRefreshAssetUrl, 2026-10-24T02:58:54.9166044Z ╰──── 2026-10-24T02:58:54.9166136Z  help: Consider removing this import. 2026-10-24T02:58:54.9166139Z 2026-10-24T02:58:54.9166335Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9166470Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7] 2026-10-24T02:58:54.9166546Z 2140 │ setExpandedFile(null); 2026-10-24T02:58:54.9166701Z 2141 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T02:58:54.9166915Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T02:58:54.9167200Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T02:58:54.9167394Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T02:58:54.9167554Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T02:58:54.9167743Z 2142 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T02:58:54.9167831Z ╰──── 2026-10-24T02:58:54.9168120Z  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-24T02:58:54.9168430Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9168432Z 2026-10-24T02:58:54.9168628Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9168761Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7] 2026-10-24T02:58:54.9168854Z 2608 │ reportHeaderMaterialVisibility(false); 2026-10-24T02:58:54.9168971Z 2609 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T02:58:54.9169053Z ·  ──────┬────── 2026-10-24T02:58:54.9169206Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T02:58:54.9169258Z 2610 │ 2026-10-24T02:58:54.9169311Z ╰──── 2026-10-24T02:58:54.9169603Z  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-24T02:58:54.9169933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9169936Z 2026-10-24T02:58:54.9170132Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9170270Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7] 2026-10-24T02:58:54.9170330Z 2624 │ } 2026-10-24T02:58:54.9170459Z 2625 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T02:58:54.9170536Z ·  ──────┬───── 2026-10-24T02:58:54.9170679Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T02:58:54.9170733Z 2626 │ 2026-10-24T02:58:54.9170787Z ╰──── 2026-10-24T02:58:54.9171069Z  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-24T02:58:54.9171372Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9171374Z 2026-10-24T02:58:54.9171575Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9171709Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7] 2026-10-24T02:58:54.9171766Z 2781 │ } 2026-10-24T02:58:54.9171944Z 2782 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T02:58:54.9172135Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T02:58:54.9172379Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T02:58:54.9172576Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T02:58:54.9172776Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T02:58:54.9172864Z 2783 │ 2026-10-24T02:58:54.9172916Z ╰──── 2026-10-24T02:58:54.9173201Z  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-24T02:58:54.9173503Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9173505Z 2026-10-24T02:58:54.9173680Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:58:54.9173812Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9] 2026-10-24T02:58:54.9173870Z 612 │ }; 2026-10-24T02:58:54.9173983Z 613 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T02:58:54.9174169Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T02:58:54.9174406Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T02:58:54.9174598Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T02:58:54.9174759Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T02:58:54.9174813Z 614 │ ); 2026-10-24T02:58:54.9174862Z ╰──── 2026-10-24T02:58:54.9175168Z  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-24T02:58:54.9175478Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9175483Z 2026-10-24T02:58:54.9175662Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9175831Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T02:58:54.9175913Z 554 │ assert.deepStrictEqual( 2026-10-24T02:58:54.9176075Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T02:58:54.9176194Z ·  ┬ 2026-10-24T02:58:54.9176352Z · ╰── '_' is declared here 2026-10-24T02:58:54.9176418Z 556 │ [ 2026-10-24T02:58:54.9176472Z ╰──── 2026-10-24T02:58:54.9176575Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9176577Z 2026-10-24T02:58:54.9176754Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9176924Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T02:58:54.9177006Z 1154 │ assert.deepStrictEqual( 2026-10-24T02:58:54.9177165Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T02:58:54.9177284Z ·  ┬ 2026-10-24T02:58:54.9177495Z · ╰── '_' is declared here 2026-10-24T02:58:54.9177586Z 1156 │ [ 2026-10-24T02:58:54.9177638Z ╰──── 2026-10-24T02:58:54.9177738Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9177741Z 2026-10-24T02:58:54.9178191Z ⚠ 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-24T02:58:54.9178311Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T02:58:54.9178403Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T02:58:54.9178511Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T02:58:54.9178627Z ·  ────────────────────────── 2026-10-24T02:58:54.9178694Z 130 │ Schema.Struct({ 2026-10-24T02:58:54.9178749Z ╰──── 2026-10-24T02:58:54.9178754Z 2026-10-24T02:58:54.9179080Z ⚠ 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-24T02:58:54.9179196Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T02:58:54.9179351Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T02:58:54.9179489Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T02:58:54.9179626Z ·  ───────── 2026-10-24T02:58:54.9179687Z 19 │ expect( 2026-10-24T02:58:54.9179737Z ╰──── 2026-10-24T02:58:54.9179740Z 2026-10-24T02:58:54.9180108Z ⚠ 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-24T02:58:54.9180227Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T02:58:54.9180286Z 19 │ expect( 2026-10-24T02:58:54.9180450Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T02:58:54.9180524Z ·  ───────── 2026-10-24T02:58:54.9180587Z 21 │ ).toBe(true); 2026-10-24T02:58:54.9180637Z ╰──── 2026-10-24T02:58:54.9180640Z 2026-10-24T02:58:54.9180848Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:58:54.9180990Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T02:58:54.9181090Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T02:58:54.9181221Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T02:58:54.9181314Z ·  ────────────┬──────────── 2026-10-24T02:58:54.9181483Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T02:58:54.9181538Z 774 │ } 2026-10-24T02:58:54.9181736Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T02:58:54.9181840Z ·  ────────────────┬──────────────── 2026-10-24T02:58:54.9182115Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T02:58:54.9182179Z 776 │ 2026-10-24T02:58:54.9182270Z ╰──── 2026-10-24T02:58:54.9182747Z  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-24T02:58:54.9183091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9183094Z 2026-10-24T02:58:54.9183248Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9183389Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T02:58:54.9183546Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T02:58:54.9183678Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T02:58:54.9183767Z ·  ──────────┬───────── 2026-10-24T02:58:54.9183923Z · ╰── `animatedBorderRadius` originates here 2026-10-24T02:58:54.9184080Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T02:58:54.9184149Z 390 │ useLayoutEffect(() => { 2026-10-24T02:58:54.9184248Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T02:58:54.9184334Z ·  ──────────┬───────── 2026-10-24T02:58:54.9184486Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T02:58:54.9184572Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T02:58:54.9184623Z ╰──── 2026-10-24T02:58:54.9184882Z  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-24T02:58:54.9185187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9185193Z 2026-10-24T02:58:54.9185556Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-24T02:58:54.9185672Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T02:58:54.9185819Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T02:58:54.9185988Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T02:58:54.9186091Z ·  ────────────────────────── 2026-10-24T02:58:54.9186232Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T02:58:54.9186284Z ╰──── 2026-10-24T02:58:54.9186287Z 2026-10-24T02:58:54.9186479Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9186739Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T02:58:54.9186912Z 151 │ 2026-10-24T02:58:54.9186989Z 152 │ {props.children(open)} 2026-10-24T02:58:54.9187076Z ·  ──┬─ 2026-10-24T02:58:54.9187232Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.9187291Z 153 │ 2026-10-24T02:58:54.9187342Z ╰──── 2026-10-24T02:58:54.9187804Z  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-24T02:58:54.9188092Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9188095Z 2026-10-24T02:58:54.9188288Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T02:58:54.9188431Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T02:58:54.9188513Z 139 │ if (action.id !== undefined) { 2026-10-24T02:58:54.9188590Z 140 │ props.onPressAction?.({ 2026-10-24T02:58:54.9188661Z ·  ──┬── 2026-10-24T02:58:54.9188787Z · ╰── Missing dependency `props` 2026-10-24T02:58:54.9188877Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T02:58:54.9189025Z 142 │ } as Parameters>[0]); 2026-10-24T02:58:54.9189083Z 143 │ } 2026-10-24T02:58:54.9189137Z 144 │ }, 2026-10-24T02:58:54.9189217Z 145 │ [close, props.onPressAction], 2026-10-24T02:58:54.9189309Z ·  ─────────┬───────── 2026-10-24T02:58:54.9189518Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T02:58:54.9189571Z 146 │ ); 2026-10-24T02:58:54.9189623Z ╰──── 2026-10-24T02:58:54.9190131Z  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-24T02:58:54.9190443Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9190447Z 2026-10-24T02:58:54.9190610Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T02:58:54.9190796Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T02:58:54.9190932Z 219 │ 2026-10-24T02:58:54.9191069Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T02:58:54.9191175Z ·  ──┬─ 2026-10-24T02:58:54.9191335Z · ╰── 'U+001B' is a control character. 2026-10-24T02:58:54.9191448Z 221 │ 2026-10-24T02:58:54.9191532Z ╰──── 2026-10-24T02:58:54.9191757Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T02:58:54.9191759Z 2026-10-24T02:58:54.9191979Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T02:58:54.9192139Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T02:58:54.9192193Z 1397 │ 2026-10-24T02:58:54.9192281Z 1398 │ function assertUserMessagesExclude( 2026-10-24T02:58:54.9192381Z ·  ────────────┬──────────── 2026-10-24T02:58:54.9192546Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T02:58:54.9192661Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T02:58:54.9192715Z ╰──── 2026-10-24T02:58:54.9192815Z  help: Consider removing this declaration. 2026-10-24T02:58:54.9192820Z 2026-10-24T02:58:54.9193276Z ⚠ 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-24T02:58:54.9193443Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T02:58:54.9193544Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T02:58:54.9193738Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T02:58:54.9193835Z 567 │ │ const nextEvent = { 2026-10-24T02:58:54.9193997Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T02:58:54.9194128Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T02:58:54.9194217Z 570 │ │ threadId, 2026-10-24T02:58:54.9194317Z 571 │ │ providerInstanceId, 2026-10-24T02:58:54.9194415Z 572 │ │ occurredAt: now, 2026-10-24T02:58:54.9194559Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T02:58:54.9194685Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T02:58:54.9194796Z 575 │ │ const reader = yield* eventSink 2026-10-24T02:58:54.9194916Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T02:58:54.9195051Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T02:58:54.9195157Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.9195317Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T02:58:54.9195439Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T02:58:54.9195553Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T02:58:54.9195749Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T02:58:54.9195828Z 583 │ │ } 2026-10-24T02:58:54.9195984Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T02:58:54.9196176Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T02:58:54.9196329Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T02:58:54.9196456Z 587 │ ╰─▶ } 2026-10-24T02:58:54.9196514Z 588 │ }), 2026-10-24T02:58:54.9196567Z ╰──── 2026-10-24T02:58:54.9196569Z 2026-10-24T02:58:54.9197021Z ⚠ 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-24T02:58:54.9197189Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T02:58:54.9197265Z 2326 │ let settled = false; 2026-10-24T02:58:54.9197427Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T02:58:54.9197585Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T02:58:54.9197716Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T02:58:54.9197797Z 2330 │ │ ); 2026-10-24T02:58:54.9197918Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T02:58:54.9198054Z 2332 │ ╰─▶ } 2026-10-24T02:58:54.9198172Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T02:58:54.9198224Z ╰──── 2026-10-24T02:58:54.9198226Z 2026-10-24T02:58:54.9198683Z ⚠ 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-24T02:58:54.9198811Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T02:58:54.9198864Z 499 │ 2026-10-24T02:58:54.9198976Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T02:58:54.9199092Z ·  ────────────────────────── 2026-10-24T02:58:54.9199197Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T02:58:54.9199247Z ╰──── 2026-10-24T02:58:54.9199249Z 2026-10-24T02:58:54.9199538Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.9199658Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T02:58:54.9199715Z 217 │ 2026-10-24T02:58:54.9199876Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T02:58:54.9200016Z ·  ──────────┬────────── 2026-10-24T02:58:54.9200167Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T02:58:54.9200352Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T02:58:54.9200403Z ╰──── 2026-10-24T02:58:54.9200504Z  help: Consider removing this declaration. 2026-10-24T02:58:54.9200506Z 2026-10-24T02:58:54.9200808Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:58:54.9200927Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T02:58:54.9200980Z 220 │ 2026-10-24T02:58:54.9201160Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T02:58:54.9201289Z ·  ──────────────┬────────────── 2026-10-24T02:58:54.9201462Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T02:58:54.9201620Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T02:58:54.9201671Z ╰──── 2026-10-24T02:58:54.9201771Z  help: Consider removing this declaration. 2026-10-24T02:58:54.9201773Z 2026-10-24T02:58:54.9201950Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9202084Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T02:58:54.9202250Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T02:58:54.9202340Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T02:58:54.9202420Z ·  ┬ 2026-10-24T02:58:54.9202547Z · ╰── '_' is declared here 2026-10-24T02:58:54.9202647Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T02:58:54.9202698Z ╰──── 2026-10-24T02:58:54.9202796Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9202798Z 2026-10-24T02:58:54.9202976Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9203109Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T02:58:54.9203165Z 133 │ ); 2026-10-24T02:58:54.9203267Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T02:58:54.9203368Z ·  ┬ 2026-10-24T02:58:54.9203505Z · ╰── '_' is declared here 2026-10-24T02:58:54.9203571Z 135 │ Effect.succeed( 2026-10-24T02:58:54.9203620Z ╰──── 2026-10-24T02:58:54.9203720Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9203723Z 2026-10-24T02:58:54.9203899Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9204030Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T02:58:54.9204083Z 177 │ }); 2026-10-24T02:58:54.9204181Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T02:58:54.9204267Z ·  ┬ 2026-10-24T02:58:54.9204402Z · ╰── '_' is declared here 2026-10-24T02:58:54.9204500Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T02:58:54.9204551Z ╰──── 2026-10-24T02:58:54.9204646Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9204649Z 2026-10-24T02:58:54.9204824Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9204953Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T02:58:54.9205007Z 202 │ ); 2026-10-24T02:58:54.9205104Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T02:58:54.9205192Z ·  ┬ 2026-10-24T02:58:54.9205322Z · ╰── '_' is declared here 2026-10-24T02:58:54.9205404Z 204 │ options.removeWorktreeFails 2026-10-24T02:58:54.9205512Z ╰──── 2026-10-24T02:58:54.9205639Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9205641Z 2026-10-24T02:58:54.9205813Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9205945Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T02:58:54.9206000Z 207 │ ); 2026-10-24T02:58:54.9206100Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T02:58:54.9206190Z ·  ┬ 2026-10-24T02:58:54.9206324Z · ╰── '_' is declared here 2026-10-24T02:58:54.9206410Z 209 │ options.deleteLocalBranchFails 2026-10-24T02:58:54.9206463Z ╰──── 2026-10-24T02:58:54.9206558Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9206562Z 2026-10-24T02:58:54.9206741Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9206874Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T02:58:54.9206926Z 212 │ ); 2026-10-24T02:58:54.9207038Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T02:58:54.9207133Z ·  ┬ 2026-10-24T02:58:54.9207271Z · ╰── '_' is declared here 2026-10-24T02:58:54.9207357Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T02:58:54.9207408Z ╰──── 2026-10-24T02:58:54.9207502Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9207505Z 2026-10-24T02:58:54.9207684Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9207818Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T02:58:54.9207873Z 253 │ ); 2026-10-24T02:58:54.9207960Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T02:58:54.9208046Z ·  ┬ 2026-10-24T02:58:54.9208175Z · ╰── '_' is declared here 2026-10-24T02:58:54.9208243Z 255 │ Effect.succeed({ 2026-10-24T02:58:54.9208293Z ╰──── 2026-10-24T02:58:54.9208391Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9208393Z 2026-10-24T02:58:54.9208567Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:58:54.9208699Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T02:58:54.9208802Z 263 │ ); 2026-10-24T02:58:54.9208980Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T02:58:54.9209067Z ·  ┬ 2026-10-24T02:58:54.9209199Z · ╰── '_' is declared here 2026-10-24T02:58:54.9209341Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T02:58:54.9209390Z ╰──── 2026-10-24T02:58:54.9209487Z  help: Consider removing this parameter. 2026-10-24T02:58:54.9209490Z 2026-10-24T02:58:54.9209641Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T02:58:54.9209761Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T02:58:54.9209881Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T02:58:54.9210003Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T02:58:54.9210105Z ·  ───────────────────────────── 2026-10-24T02:58:54.9210229Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T02:58:54.9210280Z ╰──── 2026-10-24T02:58:54.9210437Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T02:58:54.9210440Z 2026-10-24T02:58:54.9210895Z ⚠ 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-24T02:58:54.9211040Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T02:58:54.9211164Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T02:58:54.9211311Z 133 │ ╭─▶ for ( 2026-10-24T02:58:54.9211413Z 134 │ │ let attempt = 0; 2026-10-24T02:58:54.9211580Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T02:58:54.9211674Z 136 │ │ attempt += 1 2026-10-24T02:58:54.9211756Z 137 │ │ ) { 2026-10-24T02:58:54.9211868Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T02:58:54.9211999Z 139 │ ╰─▶ } 2026-10-24T02:58:54.9212119Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T02:58:54.9212171Z ╰──── 2026-10-24T02:58:54.9212173Z 2026-10-24T02:58:54.9212335Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:58:54.9212492Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T02:58:54.9212584Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T02:58:54.9212675Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T02:58:54.9212754Z ·  ──────┬────── 2026-10-24T02:58:54.9212892Z · ╰── `pulseProgress` originates here 2026-10-24T02:58:54.9212942Z 55 │ 2026-10-24T02:58:54.9213008Z 56 │ useEffect(() => { 2026-10-24T02:58:54.9213070Z 57 │ if (pulse) { 2026-10-24T02:58:54.9213155Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T02:58:54.9213230Z ·  ──────┬────── 2026-10-24T02:58:54.9213420Z · ╰── `pulseProgress` cannot be modified 2026-10-24T02:58:54.9213519Z 59 │ withTiming(1, { 2026-10-24T02:58:54.9213569Z ╰──── 2026-10-24T02:58:54.9213828Z  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-24T02:58:54.9214133Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:58:54.9214135Z 2026-10-24T02:58:54.9214388Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9214521Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T02:58:54.9214620Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T02:58:54.9214684Z 67 │ useEffect(() => { 2026-10-24T02:58:54.9214758Z ·  ────┬──── 2026-10-24T02:58:54.9214885Z · ╰── This is the containing effect 2026-10-24T02:58:54.9214947Z 68 │ setUri(null); 2026-10-24T02:58:54.9215015Z ·  ───┬── 2026-10-24T02:58:54.9215177Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9215240Z 69 │ setError(null); 2026-10-24T02:58:54.9215290Z ╰──── 2026-10-24T02:58:54.9215870Z  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-24T02:58:54.9216194Z  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-24T02:58:54.9216199Z 2026-10-24T02:58:54.9216395Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9216528Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T02:58:54.9216581Z 90 │ }; 2026-10-24T02:58:54.9216658Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T02:58:54.9216775Z ·  ──────┬───── ───┬─── 2026-10-24T02:58:54.9216953Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T02:58:54.9217096Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T02:58:54.9217235Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T02:58:54.9217289Z ╰──── 2026-10-24T02:58:54.9217575Z  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-24T02:58:54.9217879Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9217881Z 2026-10-24T02:58:54.9218090Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:58:54.9218226Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T02:58:54.9218294Z 212 │ useEffect(() => { 2026-10-24T02:58:54.9218405Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T02:58:54.9218549Z ·  ──┬── 2026-10-24T02:58:54.9218723Z · ╰── Missing dependency `props` 2026-10-24T02:58:54.9218828Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T02:58:54.9218937Z ·  ──────────┬───────── 2026-10-24T02:58:54.9219157Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T02:58:54.9219232Z 215 │ const { source } = props; 2026-10-24T02:58:54.9219284Z ╰──── 2026-10-24T02:58:54.9219801Z  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-24T02:58:54.9220154Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9220159Z 2026-10-24T02:58:54.9220352Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9220479Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T02:58:54.9220535Z 81 │ }, 2026-10-24T02:58:54.9220599Z 82 │ [draftKey], 2026-10-24T02:58:54.9220668Z ·  ────┬─── 2026-10-24T02:58:54.9220803Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T02:58:54.9220857Z 83 │ ); 2026-10-24T02:58:54.9220907Z ╰──── 2026-10-24T02:58:54.9221195Z  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-24T02:58:54.9221501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9221503Z 2026-10-24T02:58:54.9221753Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9221920Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T02:58:54.9221970Z 76 │ 2026-10-24T02:58:54.9222035Z 77 │ useEffect(() => { 2026-10-24T02:58:54.9222104Z ·  ────┬──── 2026-10-24T02:58:54.9222229Z · ╰── This is the containing effect 2026-10-24T02:58:54.9222357Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T02:58:54.9222429Z 79 │ setHostInput(host); 2026-10-24T02:58:54.9222503Z ·  ──────┬───── 2026-10-24T02:58:54.9222666Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9222731Z 80 │ setCodeInput(code); 2026-10-24T02:58:54.9222781Z ╰──── 2026-10-24T02:58:54.9223365Z  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-24T02:58:54.9223679Z  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-24T02:58:54.9223743Z 2026-10-24T02:58:54.9224029Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9224192Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T02:58:54.9224246Z 82 │ 2026-10-24T02:58:54.9224308Z 83 │ useEffect(() => { 2026-10-24T02:58:54.9224377Z ·  ────┬──── 2026-10-24T02:58:54.9224501Z · ╰── This is the containing effect 2026-10-24T02:58:54.9224590Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T02:58:54.9224650Z 85 │ return; 2026-10-24T02:58:54.9224702Z 86 │ } 2026-10-24T02:58:54.9224752Z 87 │ 2026-10-24T02:58:54.9224867Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T02:58:54.9224941Z 89 │ setHostInput(host); 2026-10-24T02:58:54.9225019Z ·  ──────┬───── 2026-10-24T02:58:54.9225180Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9225246Z 90 │ setCodeInput(code); 2026-10-24T02:58:54.9225297Z ╰──── 2026-10-24T02:58:54.9225875Z  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-24T02:58:54.9226190Z  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-24T02:58:54.9226195Z 2026-10-24T02:58:54.9226445Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9226612Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T02:58:54.9226664Z 92 │ 2026-10-24T02:58:54.9226727Z 93 │ useEffect(() => { 2026-10-24T02:58:54.9226794Z ·  ────┬──── 2026-10-24T02:58:54.9226920Z · ╰── This is the containing effect 2026-10-24T02:58:54.9227002Z 94 │ if (pairingConnectionError) { 2026-10-24T02:58:54.9227073Z 95 │ setIsSubmitting(false); 2026-10-24T02:58:54.9227152Z ·  ───────┬─────── 2026-10-24T02:58:54.9227319Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9227373Z 96 │ } 2026-10-24T02:58:54.9227428Z ╰──── 2026-10-24T02:58:54.9228017Z  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-24T02:58:54.9228333Z  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-24T02:58:54.9228336Z 2026-10-24T02:58:54.9228585Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9228715Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T02:58:54.9228768Z 57 │ 2026-10-24T02:58:54.9228884Z 58 │ useEffect(() => { 2026-10-24T02:58:54.9228982Z ·  ────┬──── 2026-10-24T02:58:54.9229111Z · ╰── This is the containing effect 2026-10-24T02:58:54.9229205Z 59 │ const controller = new AbortController(); 2026-10-24T02:58:54.9229278Z 60 │ setLoadState("pending"); 2026-10-24T02:58:54.9229350Z ·  ──────┬───── 2026-10-24T02:58:54.9229510Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9229664Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T02:58:54.9229716Z ╰──── 2026-10-24T02:58:54.9230330Z  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-24T02:58:54.9230643Z  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-24T02:58:54.9230646Z 2026-10-24T02:58:54.9230844Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9230974Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T02:58:54.9231054Z 70 │ return () => controller.abort(); 2026-10-24T02:58:54.9231148Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T02:58:54.9231314Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T02:58:54.9231538Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T02:58:54.9231734Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T02:58:54.9231870Z · ╰── Unnecessary dependency `player_0` 2026-10-24T02:58:54.9231923Z 72 │ 2026-10-24T02:58:54.9231973Z ╰──── 2026-10-24T02:58:54.9232256Z  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-24T02:58:54.9232557Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9232560Z 2026-10-24T02:58:54.9232749Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9232893Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T02:58:54.9233065Z 53 │ const child = children as ReactElement>; 2026-10-24T02:58:54.9233234Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T02:58:54.9233339Z 55 │ │ onTouchStart: (event) => { 2026-10-24T02:58:54.9233493Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T02:58:54.9233647Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T02:58:54.9233771Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T02:58:54.9233939Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T02:58:54.9234051Z 60 │ │ pendingPress.current = null; 2026-10-24T02:58:54.9234171Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T02:58:54.9234245Z 62 │ │ }, 2026-10-24T02:58:54.9235819Z 63 │ │ onPress: (event) => { 2026-10-24T02:58:54.9235996Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T02:58:54.9236132Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T02:58:54.9236295Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T02:58:54.9236487Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T02:58:54.9236575Z 68 │ │ return; 2026-10-24T02:58:54.9236651Z 69 │ │ } 2026-10-24T02:58:54.9236786Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T02:58:54.9236950Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T02:58:54.9237110Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T02:58:54.9237209Z 73 │ │ event.persist(); 2026-10-24T02:58:54.9237363Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T02:58:54.9237447Z 75 │ │ return; 2026-10-24T02:58:54.9237523Z 76 │ │ } 2026-10-24T02:58:54.9237639Z 77 │ │ child.props.onPress?.(event); 2026-10-24T02:58:54.9237715Z 78 │ │ }, 2026-10-24T02:58:54.9237843Z 79 │ ├─▶ }); 2026-10-24T02:58:54.9238072Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T02:58:54.9238173Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T02:58:54.9238222Z ╰──── 2026-10-24T02:58:54.9238681Z  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-24T02:58:54.9239038Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9239073Z 2026-10-24T02:58:54.9239281Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T02:58:54.9239385Z ╭─[apps/mobile/src/Stack.tsx:1074:21] 2026-10-24T02:58:54.9239448Z 1073 │ } 2026-10-24T02:58:54.9239713Z ·  ───────────────────────────────────────────── 2026-10-24T02:58:54.9239782Z 1075 │ screenListeners={{ 2026-10-24T02:58:54.9239833Z ╰──── 2026-10-24T02:58:54.9240232Z  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-24T02:58:54.9240238Z 2026-10-24T02:58:54.9240427Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.9240571Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-24T02:58:54.9240677Z 266 │ {record.elements?.map((element, index) => ( 2026-10-24T02:58:54.9240837Z 267 │ 2026-10-24T02:58:54.9240987Z ·  ─────────────────────────────────────────────────────── 2026-10-24T02:58:54.9241062Z 268 │ { 2026-10-24T02:58:54.9241852Z ·  ────┬──── 2026-10-24T02:58:54.9241977Z · ╰── This is the containing effect 2026-10-24T02:58:54.9242125Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T02:58:54.9242242Z ·  ───────┬────── 2026-10-24T02:58:54.9242448Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9242529Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T02:58:54.9242579Z ╰──── 2026-10-24T02:58:54.9243165Z  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-24T02:58:54.9243478Z  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-24T02:58:54.9243481Z 2026-10-24T02:58:54.9243729Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9243907Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:159:5] 2026-10-24T02:58:54.9244129Z 154 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T02:58:54.9244197Z 155 │ useLayoutEffect(() => { 2026-10-24T02:58:54.9244273Z ·  ───────┬─────── 2026-10-24T02:58:54.9244402Z · ╰── This is the containing effect 2026-10-24T02:58:54.9244488Z 156 │ if (faviconRequest === null) return; 2026-10-24T02:58:54.9244538Z 157 │ 2026-10-24T02:58:54.9244668Z 158 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T02:58:54.9244761Z 159 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T02:58:54.9244850Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9245015Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9245088Z 160 │ return endRequest; 2026-10-24T02:58:54.9245141Z ╰──── 2026-10-24T02:58:54.9245723Z  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-24T02:58:54.9246038Z  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-24T02:58:54.9246040Z 2026-10-24T02:58:54.9246229Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:58:54.9246383Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T02:58:54.9246451Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T02:58:54.9247499Z 113 │ useEffect(() => { 2026-10-24T02:58:54.9247574Z ·  ────┬──── 2026-10-24T02:58:54.9247701Z · ╰── This is the containing effect 2026-10-24T02:58:54.9247861Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T02:58:54.9247923Z 115 │ return; 2026-10-24T02:58:54.9247976Z 116 │ } 2026-10-24T02:58:54.9248092Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T02:58:54.9248161Z ·  ────┬─── 2026-10-24T02:58:54.9248325Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9248443Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T02:58:54.9248494Z ╰──── 2026-10-24T02:58:54.9249125Z  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-24T02:58:54.9249465Z  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-24T02:58:54.9249468Z 2026-10-24T02:58:54.9249716Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9249904Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T02:58:54.9249956Z 638 │ 2026-10-24T02:58:54.9250019Z 639 │ useEffect(() => { 2026-10-24T02:58:54.9250086Z ·  ────┬──── 2026-10-24T02:58:54.9250215Z · ╰── This is the containing effect 2026-10-24T02:58:54.9250324Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T02:58:54.9250384Z 641 │ return; 2026-10-24T02:58:54.9250437Z 642 │ } 2026-10-24T02:58:54.9250508Z 643 │ setPendingLaunchEntry({ 2026-10-24T02:58:54.9250593Z ·  ──────────┬────────── 2026-10-24T02:58:54.9250761Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9250830Z 644 │ key: launchTargetKey, 2026-10-24T02:58:54.9250879Z ╰──── 2026-10-24T02:58:54.9251466Z  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-24T02:58:54.9251780Z  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-24T02:58:54.9251783Z 2026-10-24T02:58:54.9252027Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9252191Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T02:58:54.9252241Z 648 │ 2026-10-24T02:58:54.9252306Z 649 │ useEffect(() => { 2026-10-24T02:58:54.9252373Z ·  ────┬──── 2026-10-24T02:58:54.9252501Z · ╰── This is the containing effect 2026-10-24T02:58:54.9252615Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T02:58:54.9252676Z 651 │ return; 2026-10-24T02:58:54.9252730Z 652 │ } 2026-10-24T02:58:54.9252807Z 653 │ setInitialAttachGridEntry({ 2026-10-24T02:58:54.9252898Z ·  ────────────┬──────────── 2026-10-24T02:58:54.9253064Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9253134Z 654 │ key: launchTargetKey, 2026-10-24T02:58:54.9253184Z ╰──── 2026-10-24T02:58:54.9253762Z  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-24T02:58:54.9254122Z  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-24T02:58:54.9254155Z 2026-10-24T02:58:54.9254400Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:58:54.9254563Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T02:58:54.9254616Z 743 │ 2026-10-24T02:58:54.9254678Z 744 │ useEffect(() => { 2026-10-24T02:58:54.9254746Z ·  ────┬──── 2026-10-24T02:58:54.9254870Z · ╰── This is the containing effect 2026-10-24T02:58:54.9254970Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T02:58:54.9255036Z 746 │ setLastGridSize({ 2026-10-24T02:58:54.9255120Z ·  ───────┬─────── 2026-10-24T02:58:54.9255286Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:58:54.9255366Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T02:58:54.9255415Z ╰──── 2026-10-24T02:58:54.9256000Z  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-24T02:58:54.9256313Z  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-24T02:58:54.9256315Z 2026-10-24T02:58:54.9256515Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9256684Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T02:58:54.9256738Z 537 │ }); 2026-10-24T02:58:54.9256862Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T02:58:54.9256968Z ·  ───────────┬────────── 2026-10-24T02:58:54.9257209Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T02:58:54.9257368Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T02:58:54.9257418Z ╰──── 2026-10-24T02:58:54.9257753Z  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-24T02:58:54.9258086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9258089Z 2026-10-24T02:58:54.9258287Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9258449Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T02:58:54.9258545Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T02:58:54.9258610Z 709 │ }, [terminalKey]); 2026-10-24T02:58:54.9258685Z ·  ─────┬───── 2026-10-24T02:58:54.9258824Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T02:58:54.9258875Z 710 │ 2026-10-24T02:58:54.9258925Z ╰──── 2026-10-24T02:58:54.9259215Z  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-24T02:58:54.9259659Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9259661Z 2026-10-24T02:58:54.9259888Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:58:54.9260056Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T02:58:54.9260111Z 799 │ }; 2026-10-24T02:58:54.9260284Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T02:58:54.9260461Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T02:58:54.9260693Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T02:58:54.9260898Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T02:58:54.9260949Z 801 │ 2026-10-24T02:58:54.9260998Z ╰──── 2026-10-24T02:58:54.9261280Z  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-24T02:58:54.9261584Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:58:54.9261586Z 2026-10-24T02:58:54.9261733Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:58:54.9261897Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T02:58:54.9261950Z 792 │ } 2026-10-24T02:58:54.9262056Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T02:58:54.9262166Z ·  ───────────┬─────────── 2026-10-24T02:58:54.9262325Z · ╰── Cannot access ref value during render 2026-10-24T02:58:54.9262375Z 794 │ 2026-10-24T02:58:54.9262425Z ╰──── 2026-10-24T02:58:54.9262958Z  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-24T02:58:54.9263378Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:58:54.9263381Z 2026-10-24T02:58:54.9263462Z Found 0 errors and 362 warnings in 5407 files (5.2s, 8 threads) 2026-10-24T02:58:54.9689199Z Post job cleanup. 2026-10-24T02:58:55.0291556Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T02:58:55.0359461Z Post job cleanup. 2026-10-24T02:58:55.0370895Z ##[start-action display=Cache full pnpm store;id=__f6ac6304-82d7-4d9a-8e03-922c651584ec.__actions_cache] 2026-10-24T02:58:55.0975793Z Post job cleanup. 2026-10-24T02:58:55.1621187Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef, not saving cache. 2026-10-24T02:58:55.1653262Z ##[end-action id=__f6ac6304-82d7-4d9a-8e03-922c651584ec.__actions_cache;outcome=success;conclusion=success;duration_ms=128] 2026-10-24T02:58:55.1654812Z ##[start-action display=Cache Vite+;id=__f6ac6304-82d7-4d9a-8e03-922c651584ec.vp_cache] 2026-10-24T02:58:55.1673873Z Post job cleanup. 2026-10-24T02:58:55.2284423Z 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-24T02:58:55.2317445Z ##[end-action id=__f6ac6304-82d7-4d9a-8e03-922c651584ec.vp_cache;outcome=success;conclusion=success;duration_ms=66] 2026-10-24T02:58:55.2360933Z Post job cleanup. 2026-10-24T02:58:55.2751114Z [command]/usr/local/bin/git version 2026-10-24T02:58:55.2777659Z git version 2.55.0 2026-10-24T02:58:55.2794135Z Temporarily overriding HOME='/home/runner/_work/_temp/2f9ebf18-3e72-445f-be97-a50f417dbf4f' before making global git config changes 2026-10-24T02:58:55.2794499Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T02:58:55.2796917Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T02:58:55.2818223Z Removing SSH command configuration 2026-10-24T02:58:55.2821380Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T02:58:55.2846585Z [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-24T02:58:55.2968649Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T02:58:55.2988498Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T02:58:55.3028506Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T02:58:55.3044595Z ##[group]Run '/job_completed.sh' 2026-10-24T02:58:55.3051532Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:58:55.3051697Z env: 2026-10-24T02:58:55.3051810Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 5307 2026-10-24T02:58:55.3051964Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 407 2026-10-24T02:58:55.3052104Z BLACKSMITH_CHECK_RUN_ID: 120760135878 2026-10-24T02:58:55.3052240Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T02:58:55.3052378Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T02:58:55.3052504Z ##[endgroup] 2026-10-24T02:58:55.3121466Z Docker container cache not activated, skipping hash computation. 2026-10-24T02:58:55.3364893Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T02:58:55.3404647Z Cleaning up orphan processes