2026-10-24T20:37:46.5007154Z Current runner version: '2.338.1' 2026-10-24T20:37:46.5010409Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-yvdi4mrxemr2lqv3' 2026-10-24T20:37:46.5011112Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T20:37:46.5011765Z Machine name: 'ip-172-31-73-130' 2026-10-24T20:37:46.5013376Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T20:37:46.5014637Z Contents: read 2026-10-24T20:37:46.5015049Z Metadata: read 2026-10-24T20:37:46.5015473Z ##[endgroup] 2026-10-24T20:37:46.5016951Z Secret source: Actions 2026-10-24T20:37:46.5017579Z Cache mode: write 2026-10-24T20:37:46.5018060Z Prepare workflow directory 2026-10-24T20:37:46.5191603Z Prepare all required actions 2026-10-24T20:37:46.5216349Z Getting action download info 2026-10-24T20:37:46.6276154Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T20:37:46.6577515Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T20:37:46.7648055Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T20:37:46.7684433Z Complete job name: Lint 2026-10-24T20:37:46.8040118Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T20:37:46.8093017Z ##[group]Run '/setup.sh' 2026-10-24T20:37:46.8100683Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:37:46.8101093Z env: 2026-10-24T20:37:46.8101379Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:46.8101662Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:46.8101933Z BLACKSMITH_CHECK_RUN_ID: 120981382431 2026-10-24T20:37:46.8102206Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T20:37:46.8102471Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T20:37:46.8102719Z ##[endgroup] 2026-10-24T20:37:46.8298000Z Logging daemon started (blacksmithd for logs) 2026-10-24T20:37:46.8374386Z Results daemon started (blacksmithd for results) 2026-10-24T20:37:46.8501644Z Background adoption and SSH setup started (PID: 3175) 2026-10-24T20:37:46.8503220Z 2026-10-24T20:37:46.8503328Z ---------------------------------------- 2026-10-24T20:37:46.8503784Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40130627811/jobs/120981382431 2026-10-24T20:37:46.8504182Z SSH Access (using your GitHub SSH key): 2026-10-24T20:37:46.8504588Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-yvdi4mrxemr2lqv3.vm.blacksmith.sh 2026-10-24T20:37:46.8504888Z 2026-10-24T20:37:46.8504994Z No GitHub SSH key? Add one at: 2026-10-24T20:37:46.8505461Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T20:37:46.8505848Z 2026-10-24T20:37:46.8505950Z ---------------------------------------- 2026-10-24T20:37:46.8506117Z 2026-10-24T20:37:46.8506250Z VM ID: blacksmith-8vcpu-ubuntu-2404-yvdi4mrxemr2lqv3 2026-10-24T20:37:46.8506559Z Host: production-152.236.30.247-x8664 2026-10-24T20:37:46.8506822Z Host Agent PID: 4166390 2026-10-24T20:37:46.8507059Z Host Agent Git SHA: 1637818df 2026-10-24T20:37:46.8507305Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T20:37:46.8507574Z Blacksmith Host Generation: gen 2 2026-10-24T20:37:46.8507841Z Petname: production-guided-bass-228f51a3 2026-10-24T20:37:46.8508107Z Region: us-east 2026-10-24T20:37:46.8508326Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T20:37:46.8514112Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T20:37:46.8514474Z 2026-10-24T20:37:46.8514836Z Enabling Blacksmith transparent cache 2026-10-24T20:37:46.8704965Z ##[group]Run actions/checkout@v6 2026-10-24T20:37:46.8705248Z with: 2026-10-24T20:37:46.8705565Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T20:37:46.8705949Z sparse-checkout-cone-mode: false 2026-10-24T20:37:46.8706213Z repository: pingdotgg/t3code 2026-10-24T20:37:46.8708022Z token: *** 2026-10-24T20:37:46.8708225Z ssh-strict: true 2026-10-24T20:37:46.8708433Z ssh-user: git 2026-10-24T20:37:46.8708647Z persist-credentials: true 2026-10-24T20:37:46.8709077Z clean: true 2026-10-24T20:37:46.8709276Z fetch-depth: 1 2026-10-24T20:37:46.8709482Z fetch-tags: false 2026-10-24T20:37:46.8709696Z show-progress: true 2026-10-24T20:37:46.8709911Z lfs: false 2026-10-24T20:37:46.8710108Z submodules: false 2026-10-24T20:37:46.8710322Z set-safe-directory: true 2026-10-24T20:37:46.8710565Z allow-unsafe-pr-checkout: false 2026-10-24T20:37:46.8710807Z env: 2026-10-24T20:37:46.8711035Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:46.8711404Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:46.8711674Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:46.8711924Z ##[endgroup] 2026-10-24T20:37:46.9672697Z Syncing repository: pingdotgg/t3code 2026-10-24T20:37:46.9673825Z ##[group]Getting Git version info 2026-10-24T20:37:46.9674161Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T20:37:46.9674631Z [command]/usr/local/bin/git version 2026-10-24T20:37:46.9674929Z git version 2.55.0 2026-10-24T20:37:46.9685449Z ##[endgroup] 2026-10-24T20:37:46.9693702Z Temporarily overriding HOME='/home/runner/_work/_temp/f70bcd2e-de21-4106-8b70-2465309d0909' before making global git config changes 2026-10-24T20:37:46.9694420Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T20:37:46.9697928Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T20:37:46.9728351Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T20:37:46.9729920Z ##[group]Determining repository object format 2026-10-24T20:37:46.9730970Z ##[endgroup] 2026-10-24T20:37:46.9731346Z ##[group]Initializing the repository 2026-10-24T20:37:46.9733273Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T20:37:46.9765573Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T20:37:46.9766306Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T20:37:46.9766850Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T20:37:46.9767317Z hint: call: 2026-10-24T20:37:46.9767633Z hint: 2026-10-24T20:37:46.9768018Z hint: git config --global init.defaultBranch 2026-10-24T20:37:46.9768412Z hint: 2026-10-24T20:37:46.9768807Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T20:37:46.9769245Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T20:37:46.9769606Z hint: 2026-10-24T20:37:46.9769806Z hint: git branch -m 2026-10-24T20:37:46.9770077Z hint: 2026-10-24T20:37:46.9770374Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T20:37:46.9770828Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T20:37:46.9771604Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T20:37:46.9795538Z ##[endgroup] 2026-10-24T20:37:46.9795901Z ##[group]Disabling automatic garbage collection 2026-10-24T20:37:46.9797578Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T20:37:46.9815288Z ##[endgroup] 2026-10-24T20:37:46.9815639Z ##[group]Setting up auth 2026-10-24T20:37:46.9815914Z Removing SSH command configuration 2026-10-24T20:37:46.9818720Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T20:37:46.9842086Z [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-24T20:37:46.9959317Z Removing HTTP extra header 2026-10-24T20:37:46.9961797Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T20:37:46.9984057Z [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-24T20:37:47.0070160Z Removing includeIf entries pointing to credentials config files 2026-10-24T20:37:47.0073145Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T20:37:47.0094411Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T20:37:47.0187419Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-5456e780-761b-4e62-9749-7be14f57068c.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T20:37:47.0211561Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-5456e780-761b-4e62-9749-7be14f57068c.config 2026-10-24T20:37:47.0229118Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-5456e780-761b-4e62-9749-7be14f57068c.config 2026-10-24T20:37:47.0251305Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-5456e780-761b-4e62-9749-7be14f57068c.config 2026-10-24T20:37:47.0269765Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-5456e780-761b-4e62-9749-7be14f57068c.config 2026-10-24T20:37:47.0290166Z ##[endgroup] 2026-10-24T20:37:47.0290517Z ##[group]Fetching the repository 2026-10-24T20:37:47.0294640Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +bf5c483cbe298032fe5f97b05f31f8458aab0031:refs/remotes/origin/main 2026-10-24T20:37:47.3096319Z From https://github.com/pingdotgg/t3code 2026-10-24T20:37:47.3097370Z * [new ref] bf5c483cbe298032fe5f97b05f31f8458aab0031 -> origin/main 2026-10-24T20:37:47.3119319Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T20:37:47.3136845Z origin/main 2026-10-24T20:37:47.3140922Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T20:37:47.3155747Z bf5c483cbe298032fe5f97b05f31f8458aab0031 2026-10-24T20:37:47.3157702Z ##[endgroup] 2026-10-24T20:37:47.3158507Z ##[group]Determining the checkout info 2026-10-24T20:37:47.3159343Z ##[endgroup] 2026-10-24T20:37:47.3160254Z ##[group]Setting up sparse checkout 2026-10-24T20:37:47.3160987Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T20:37:47.3179263Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T20:37:47.3193562Z .git/info/sparse-checkout 2026-10-24T20:37:47.3197327Z ##[endgroup] 2026-10-24T20:37:47.3198257Z ##[group]Checking out the ref 2026-10-24T20:37:47.3199251Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T20:37:54.1561901Z Updating files: 0% (1/6402) 2026-10-24T20:37:54.1589578Z Updating files: 1% (65/6402) 2026-10-24T20:37:54.1606493Z Updating files: 2% (129/6402) 2026-10-24T20:37:54.1627795Z Updating files: 3% (193/6402) 2026-10-24T20:37:54.1648536Z Updating files: 4% (257/6402) 2026-10-24T20:37:54.1678551Z Updating files: 5% (321/6402) 2026-10-24T20:37:54.1699849Z Updating files: 6% (385/6402) 2026-10-24T20:37:54.1751840Z Updating files: 7% (449/6402) 2026-10-24T20:37:54.1782501Z Updating files: 8% (513/6402) 2026-10-24T20:37:54.1804451Z Updating files: 9% (577/6402) 2026-10-24T20:37:54.2067864Z Updating files: 10% (641/6402) 2026-10-24T20:37:54.2083934Z Updating files: 11% (705/6402) 2026-10-24T20:37:54.2095957Z Updating files: 12% (769/6402) 2026-10-24T20:37:54.2111412Z Updating files: 13% (833/6402) 2026-10-24T20:37:54.2127464Z Updating files: 14% (897/6402) 2026-10-24T20:37:54.2145187Z Updating files: 15% (961/6402) 2026-10-24T20:37:54.2163187Z Updating files: 16% (1025/6402) 2026-10-24T20:37:54.2177787Z Updating files: 17% (1089/6402) 2026-10-24T20:37:54.2195639Z Updating files: 18% (1153/6402) 2026-10-24T20:37:54.2210301Z Updating files: 19% (1217/6402) 2026-10-24T20:37:54.2233672Z Updating files: 20% (1281/6402) 2026-10-24T20:37:54.2250856Z Updating files: 21% (1345/6402) 2026-10-24T20:37:54.2269064Z Updating files: 22% (1409/6402) 2026-10-24T20:37:54.2282189Z Updating files: 23% (1473/6402) 2026-10-24T20:37:54.2296114Z Updating files: 24% (1537/6402) 2026-10-24T20:37:54.2311207Z Updating files: 25% (1601/6402) 2026-10-24T20:37:54.2324599Z Updating files: 26% (1665/6402) 2026-10-24T20:37:54.2336340Z Updating files: 27% (1729/6402) 2026-10-24T20:37:54.2353721Z Updating files: 28% (1793/6402) 2026-10-24T20:37:54.2384461Z Updating files: 29% (1857/6402) 2026-10-24T20:37:54.2404407Z Updating files: 30% (1921/6402) 2026-10-24T20:37:54.2427140Z Updating files: 31% (1985/6402) 2026-10-24T20:37:54.2456303Z Updating files: 32% (2049/6402) 2026-10-24T20:37:54.2484503Z Updating files: 33% (2113/6402) 2026-10-24T20:37:54.2552227Z Updating files: 34% (2177/6402) 2026-10-24T20:37:54.2607962Z Updating files: 35% (2241/6402) 2026-10-24T20:37:54.2643587Z Updating files: 36% (2305/6402) 2026-10-24T20:37:54.2675158Z Updating files: 37% (2369/6402) 2026-10-24T20:37:54.2719183Z Updating files: 38% (2433/6402) 2026-10-24T20:37:54.2745243Z Updating files: 39% (2497/6402) 2026-10-24T20:37:54.2774225Z Updating files: 40% (2561/6402) 2026-10-24T20:37:54.2800432Z Updating files: 41% (2625/6402) 2026-10-24T20:37:54.2815255Z Updating files: 42% (2689/6402) 2026-10-24T20:37:54.2824797Z Updating files: 43% (2753/6402) 2026-10-24T20:37:54.2853275Z Updating files: 44% (2817/6402) 2026-10-24T20:37:54.2880478Z Updating files: 45% (2881/6402) 2026-10-24T20:37:54.2906538Z Updating files: 46% (2945/6402) 2026-10-24T20:37:54.2931334Z Updating files: 47% (3009/6402) 2026-10-24T20:37:54.2959515Z Updating files: 48% (3073/6402) 2026-10-24T20:37:54.2996173Z Updating files: 49% (3137/6402) 2026-10-24T20:37:54.3023118Z Updating files: 50% (3201/6402) 2026-10-24T20:37:54.3038293Z Updating files: 51% (3266/6402) 2026-10-24T20:37:54.3072853Z Updating files: 52% (3330/6402) 2026-10-24T20:37:54.3099717Z Updating files: 53% (3394/6402) 2026-10-24T20:37:54.3118684Z Updating files: 54% (3458/6402) 2026-10-24T20:37:54.3141453Z Updating files: 55% (3522/6402) 2026-10-24T20:37:54.3157503Z Updating files: 56% (3586/6402) 2026-10-24T20:37:54.3177139Z Updating files: 57% (3650/6402) 2026-10-24T20:37:54.3195493Z Updating files: 58% (3714/6402) 2026-10-24T20:37:54.3440674Z Updating files: 59% (3778/6402) 2026-10-24T20:37:54.3547607Z Updating files: 59% (3794/6402) 2026-10-24T20:37:54.3562059Z Updating files: 60% (3842/6402) 2026-10-24T20:37:54.3581279Z Updating files: 61% (3906/6402) 2026-10-24T20:37:54.3599037Z Updating files: 62% (3970/6402) 2026-10-24T20:37:54.3621393Z Updating files: 63% (4034/6402) 2026-10-24T20:37:54.3647091Z Updating files: 64% (4098/6402) 2026-10-24T20:37:54.3666214Z Updating files: 65% (4162/6402) 2026-10-24T20:37:54.3682914Z Updating files: 66% (4226/6402) 2026-10-24T20:37:54.3705112Z Updating files: 67% (4290/6402) 2026-10-24T20:37:54.3719320Z Updating files: 68% (4354/6402) 2026-10-24T20:37:54.3736170Z Updating files: 69% (4418/6402) 2026-10-24T20:37:54.3748503Z Updating files: 70% (4482/6402) 2026-10-24T20:37:54.3766425Z Updating files: 71% (4546/6402) 2026-10-24T20:37:54.3778707Z Updating files: 72% (4610/6402) 2026-10-24T20:37:54.3824798Z Updating files: 73% (4674/6402) 2026-10-24T20:37:54.4214135Z Updating files: 74% (4738/6402) 2026-10-24T20:37:54.4236473Z Updating files: 75% (4802/6402) 2026-10-24T20:37:54.4257957Z Updating files: 76% (4866/6402) 2026-10-24T20:37:54.4281120Z Updating files: 77% (4930/6402) 2026-10-24T20:37:54.4301826Z Updating files: 78% (4994/6402) 2026-10-24T20:37:54.4317617Z Updating files: 79% (5058/6402) 2026-10-24T20:37:54.4339465Z Updating files: 80% (5122/6402) 2026-10-24T20:37:54.4354756Z Updating files: 81% (5186/6402) 2026-10-24T20:37:54.4372319Z Updating files: 82% (5250/6402) 2026-10-24T20:37:54.4393554Z Updating files: 83% (5314/6402) 2026-10-24T20:37:54.4417611Z Updating files: 84% (5378/6402) 2026-10-24T20:37:54.4434533Z Updating files: 85% (5442/6402) 2026-10-24T20:37:54.4458879Z Updating files: 86% (5506/6402) 2026-10-24T20:37:54.4527813Z Updating files: 87% (5570/6402) 2026-10-24T20:37:54.4556830Z Updating files: 88% (5634/6402) 2026-10-24T20:37:54.4576847Z Updating files: 89% (5698/6402) 2026-10-24T20:37:54.4603924Z Updating files: 90% (5762/6402) 2026-10-24T20:37:54.4630471Z Updating files: 91% (5826/6402) 2026-10-24T20:37:54.4645508Z Updating files: 92% (5890/6402) 2026-10-24T20:37:54.4666401Z Updating files: 93% (5954/6402) 2026-10-24T20:37:54.4687095Z Updating files: 94% (6018/6402) 2026-10-24T20:37:54.4709795Z Updating files: 95% (6082/6402) 2026-10-24T20:37:54.4766495Z Updating files: 96% (6146/6402) 2026-10-24T20:37:54.4788541Z Updating files: 97% (6210/6402) 2026-10-24T20:37:54.4832629Z Updating files: 98% (6274/6402) 2026-10-24T20:37:54.4851524Z Updating files: 99% (6338/6402) 2026-10-24T20:37:54.4851918Z Updating files: 100% (6402/6402) 2026-10-24T20:37:54.4852083Z Updating files: 100% (6402/6402), done. 2026-10-24T20:37:54.5000844Z Switched to a new branch 'main' 2026-10-24T20:37:54.5001750Z branch 'main' set up to track 'origin/main'. 2026-10-24T20:37:54.5013127Z ##[endgroup] 2026-10-24T20:37:54.5043640Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T20:37:54.5061422Z bf5c483cbe298032fe5f97b05f31f8458aab0031 2026-10-24T20:37:54.5137541Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T20:37:54.5137781Z files="$(git ls-files .github/pr-assets)" 2026-10-24T20:37:54.5138052Z if test -n "$files"; then 2026-10-24T20:37:54.5138385Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T20:37:54.5138728Z  exit 1 2026-10-24T20:37:54.5138842Z fi 2026-10-24T20:37:54.5147290Z shell: /usr/bin/bash -e {0} 2026-10-24T20:37:54.5147412Z env: 2026-10-24T20:37:54.5147533Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:54.5147673Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:54.5147812Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:54.5147940Z ##[endgroup] 2026-10-24T20:37:54.5282081Z Prepare all required actions 2026-10-24T20:37:54.5282441Z Getting action download info 2026-10-24T20:37:54.6100717Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T20:37:54.7043316Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T20:37:54.7043472Z env: 2026-10-24T20:37:54.7043590Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:54.7043738Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:54.7043879Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:54.7044015Z ##[endgroup] 2026-10-24T20:37:54.7119123Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T20:37:54.7131274Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T20:37:54.7131632Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T20:37:54.7131920Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T20:37:54.7132150Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T20:37:54.7140446Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:37:54.7140605Z env: 2026-10-24T20:37:54.7140716Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:54.7140858Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:54.7140999Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:54.7141126Z ##[endgroup] 2026-10-24T20:37:54.7203192Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T20:37:54.7204650Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T20:37:54.7247123Z ##[group]Run actions/cache@v6 2026-10-24T20:37:54.7247391Z with: 2026-10-24T20:37:54.7247491Z path: ~/.vite-plus 2026-10-24T20:37:54.7247653Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:37:54.7247843Z enableCrossOsArchive: false 2026-10-24T20:37:54.7247972Z fail-on-cache-miss: false 2026-10-24T20:37:54.7248093Z lookup-only: false 2026-10-24T20:37:54.7248200Z save-always: false 2026-10-24T20:37:54.7248308Z env: 2026-10-24T20:37:54.7248412Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:54.7248554Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:54.7248695Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:54.7248821Z ##[endgroup] 2026-10-24T20:37:54.9143774Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:37:55.2713625Z Received 170349591 of 170349591 (100.0%), 486.4 MBs/sec 2026-10-24T20:37:55.2714629Z Cache Size: ~162 MB (170349591 B) 2026-10-24T20:37:55.2738434Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/350d13b2-7d4e-4fa3-884e-b2f02968c537/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:37:55.9084997Z Cache restored successfully 2026-10-24T20:37:55.9219936Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:37:55.9298898Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1209] 2026-10-24T20:37:55.9301320Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T20:37:55.9318052Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T20:37:55.9318262Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T20:37:55.9318433Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T20:37:55.9327029Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:37:55.9327188Z env: 2026-10-24T20:37:55.9327306Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:55.9327670Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:55.9327841Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:55.9327992Z ##[endgroup] 2026-10-24T20:37:55.9362731Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T20:37:55.9369510Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=6] 2026-10-24T20:37:55.9370739Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T20:37:55.9374266Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T20:37:55.9375336Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T20:37:55.9383959Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T20:37:55.9384125Z store_path="$(vp pm cache dir)" 2026-10-24T20:37:55.9384284Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T20:37:55.9392962Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:37:55.9393128Z env: 2026-10-24T20:37:55.9393237Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:55.9393388Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:55.9393524Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:55.9393654Z ##[endgroup] 2026-10-24T20:37:55.9512525Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=13] 2026-10-24T20:37:55.9513695Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T20:37:55.9831642Z ##[group]Run actions/cache@v6 2026-10-24T20:37:55.9831832Z with: 2026-10-24T20:37:55.9832033Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T20:37:55.9832336Z key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T20:37:55.9832687Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T20:37:55.9832865Z enableCrossOsArchive: false 2026-10-24T20:37:55.9833057Z fail-on-cache-miss: false 2026-10-24T20:37:55.9833219Z lookup-only: false 2026-10-24T20:37:55.9833375Z save-always: false 2026-10-24T20:37:55.9833529Z env: 2026-10-24T20:37:55.9833673Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:37:55.9834009Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:37:55.9834184Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:37:55.9834363Z ##[endgroup] 2026-10-24T20:37:56.1760499Z Cache hit for restore-key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T20:37:57.2075869Z Received 536870912 of 994208090 (54.0%), 503.9 MBs/sec 2026-10-24T20:37:57.8416726Z Received 994208090 of 994208090 (100.0%), 574.6 MBs/sec 2026-10-24T20:37:57.8418213Z Cache Size: ~948 MB (994208090 B) 2026-10-24T20:37:57.8456706Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/50e82931-19d6-4a2d-8e8c-404dfea957dc/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:38:02.8123640Z Cache restored successfully 2026-10-24T20:38:02.8628177Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T20:38:02.8707924Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6919] 2026-10-24T20:38:02.8709944Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T20:38:02.8720327Z ##[group]Run vp install 2026-10-24T20:38:02.8720472Z vp install 2026-10-24T20:38:02.8728977Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:38:02.8729139Z env: 2026-10-24T20:38:02.8729254Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:02.8729398Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:02.8729540Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:02.8729673Z ##[endgroup] 2026-10-24T20:38:02.9021726Z Scope: all 34 workspace projects 2026-10-24T20:38:03.0009986Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T20:38:03.2242826Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T20:38:03.2243153Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T20:38:03.2243371Z Virtual store is at: node_modules/.pnpm 2026-10-24T20:38:05.1909134Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.2s) 2026-10-24T20:38:05.1909432Z Lockfile is up to date, resolution step is skipped 2026-10-24T20:38:05.2064434Z Packages: +1721 2026-10-24T20:38:05.2064599Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T20:38:05.2349419Z Progress: resolved 1721, reused 1717, downloaded 1, added 1721, done 2026-10-24T20:38:05.2655886Z .../react-native-enriched-markdown postinstall$ node postinstall.mjs 2026-10-24T20:38:05.2959164Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] restoring vendored native assets ... 2026-10-24T20:38:05.3125523Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching runtime v0.26.3 from https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.26.3.tar.gz 2026-10-24T20:38:05.4203820Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] runtime -> react-native-enriched-markdown/cpp/highlight/vendor/tree-sitter/src 2026-10-24T20:38:05.4205535Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-json@0.24.8 ... 2026-10-24T20:38:05.4215669Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-html@0.23.2 ... 2026-10-24T20:38:05.4216101Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-css@0.23.2 ... 2026-10-24T20:38:05.4216522Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading @tree-sitter-grammars/tree-sitter-markdown@0.3.2 ... 2026-10-24T20:38:05.4217111Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading @tree-sitter-grammars/tree-sitter-yaml@0.7.1 ... 2026-10-24T20:38:05.4217651Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-go@0.23.4 ... 2026-10-24T20:38:05.4218076Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-java@0.23.5 ... 2026-10-24T20:38:05.4218870Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-javascript@0.23.1 ... 2026-10-24T20:38:05.4219674Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-python@0.23.6 ... 2026-10-24T20:38:05.4220458Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-c@0.23.5 ... 2026-10-24T20:38:05.4220925Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-rust@0.23.2 ... 2026-10-24T20:38:05.4221583Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-bash@0.23.3 ... 2026-10-24T20:38:05.4222091Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-typescript@0.23.2 ... 2026-10-24T20:38:05.4222488Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-cpp@0.23.4 ... 2026-10-24T20:38:05.4222866Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-swift@0.7.0 ... 2026-10-24T20:38:05.4223249Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-php@0.24.2 ... 2026-10-24T20:38:05.4223623Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-ruby@0.23.1 ... 2026-10-24T20:38:05.4224014Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-c-sharp@0.23.1 ... 2026-10-24T20:38:07.2237270Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] json -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/json 2026-10-24T20:38:07.2249550Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] html -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/html 2026-10-24T20:38:07.2256754Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] css -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/css 2026-10-24T20:38:07.2278194Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] markdown -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/markdown 2026-10-24T20:38:07.2289405Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] yaml -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/yaml 2026-10-24T20:38:07.2300166Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] go -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/go 2026-10-24T20:38:07.2318294Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] java -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/java 2026-10-24T20:38:07.2336206Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] javascript -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/javascript 2026-10-24T20:38:07.2358923Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] python -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/python 2026-10-24T20:38:07.2383944Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] c -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/c 2026-10-24T20:38:07.2436006Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] rust -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/rust 2026-10-24T20:38:07.2523745Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] bash -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/bash 2026-10-24T20:38:07.2712180Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] typescript -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/typescript 2026-10-24T20:38:07.2871447Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] tsx -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/tsx 2026-10-24T20:38:07.3006072Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] cpp -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/cpp 2026-10-24T20:38:07.3414833Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] swift -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/swift 2026-10-24T20:38:07.3543740Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] php -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/php 2026-10-24T20:38:07.3620817Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] ruby -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/ruby 2026-10-24T20:38:07.3931135Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] c-sharp -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/c-sharp 2026-10-24T20:38:07.4288782Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] grammar sources ready. 2026-10-24T20:38:07.4289206Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] done. 2026-10-24T20:38:07.4507350Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching xcframework from https://github.com/erweixin/RaTeX/releases/download/v0.1.15/RaTeX.xcframework.zip 2026-10-24T20:38:07.8484561Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching source from https://github.com/erweixin/RaTeX/archive/refs/tags/v0.1.15.tar.gz 2026-10-24T20:38:08.2575537Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] RaTeX v0.1.15 -> /home/runner/_work/t3code/t3code/node_modules/.pnpm/react-native-enriched-markdown@file+apps+mobile+deps+react-native-enriched-markdown-1.2_b1dac8bd485b7749f70e76df11d6d462/node_modules/react-native-enriched-markdown/ios/vendor 2026-10-24T20:38:08.2576286Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] done. 2026-10-24T20:38:08.2632908Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] postinstall complete. 2026-10-24T20:38:08.2650335Z .../react-native-enriched-markdown postinstall: Done 2026-10-24T20:38:08.6313690Z . prepare$ vp config --no-agent 2026-10-24T20:38:08.7210331Z . prepare: Done 2026-10-24T20:38:08.7222577Z 2026-10-24T20:38:08.7222624Z devDependencies: 2026-10-24T20:38:08.7222754Z + @coderabbitai/config 1.1.0 2026-10-24T20:38:08.7222907Z + @shadcn/lint 0.1.5 2026-10-24T20:38:08.7223049Z + @types/node 24.12.4 2026-10-24T20:38:08.7223167Z + knip 6.34.0 2026-10-24T20:38:08.7223297Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T20:38:08.7223435Z + vite-plus 1.3.0 2026-10-24T20:38:08.7223500Z 2026-10-24T20:38:08.7242480Z Done in 5.8s using pnpm v12.14.0 2026-10-24T20:38:08.7384025Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=5867] 2026-10-24T20:38:08.7981516Z ##[group]Run actions/cache@v6 2026-10-24T20:38:08.7981678Z with: 2026-10-24T20:38:08.7981809Z path: ~/.cache/electron 2026-10-24T20:38:08.7982032Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:38:08.7982263Z enableCrossOsArchive: false 2026-10-24T20:38:08.7982393Z fail-on-cache-miss: false 2026-10-24T20:38:08.7982517Z lookup-only: false 2026-10-24T20:38:08.7982625Z save-always: false 2026-10-24T20:38:08.7982727Z env: 2026-10-24T20:38:08.7982839Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:08.7982982Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:08.7983136Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:08.7983267Z ##[endgroup] 2026-10-24T20:38:08.9878309Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:38:09.1443861Z Received 122906203 of 122906203 (100.0%), 831.3 MBs/sec 2026-10-24T20:38:09.1444620Z Cache Size: ~117 MB (122906203 B) 2026-10-24T20:38:09.1483658Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/ad4e3167-e420-4b37-9c6c-9d6ce3717d87/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:38:09.2014219Z Cache restored successfully 2026-10-24T20:38:09.2150614Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:38:09.2282989Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T20:38:09.2283280Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T20:38:09.2296092Z shell: /usr/bin/bash -e {0} 2026-10-24T20:38:09.2296274Z env: 2026-10-24T20:38:09.2296429Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:09.2296585Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:09.2296733Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:09.2296882Z ##[endgroup] 2026-10-24T20:38:09.4124545Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T20:38:09.9482127Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T20:38:09.9497635Z 2026-10-24T20:38:09.9608416Z ##[group]Run vp run knip:check 2026-10-24T20:38:09.9608624Z vp run knip:check 2026-10-24T20:38:09.9620031Z shell: /usr/bin/bash -e {0} 2026-10-24T20:38:09.9620171Z env: 2026-10-24T20:38:09.9620321Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:09.9620490Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:09.9620697Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:09.9620829Z ##[endgroup] 2026-10-24T20:38:10.1172740Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T20:38:13.6322090Z 2026-10-24T20:38:13.6325249Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T20:38:21.4706432Z 2026-10-24T20:38:21.4707700Z --- 2026-10-24T20:38:21.4708135Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T20:38:21.4777488Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T20:38:21.4777832Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T20:38:21.4787381Z shell: /usr/bin/bash -e {0} 2026-10-24T20:38:21.4787538Z env: 2026-10-24T20:38:21.4787687Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:21.4787963Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:21.4788163Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:21.4788356Z ##[endgroup] 2026-10-24T20:38:21.6240788Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T20:38:21.8053877Z 2026-10-24T20:38:21.8116771Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T20:38:21.8116990Z vp run --filter t3 generate --check 2026-10-24T20:38:21.8125620Z shell: /usr/bin/bash -e {0} 2026-10-24T20:38:21.8125744Z env: 2026-10-24T20:38:21.8125863Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:21.8126010Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:21.8126148Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:21.8126283Z ##[endgroup] 2026-10-24T20:38:21.9514232Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T20:38:22.1015715Z 2026-10-24T20:38:22.1079440Z ##[group]Run vp check 2026-10-24T20:38:22.1079617Z vp check 2026-10-24T20:38:22.1088038Z shell: /usr/bin/bash -e {0} 2026-10-24T20:38:22.1088168Z env: 2026-10-24T20:38:22.1088279Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:22.1088425Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:22.1088565Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:38:22.1088693Z ##[endgroup] 2026-10-24T20:38:22.6567845Z pass: All 5751 files are correctly formatted (415ms, 8 threads) 2026-10-24T20:38:28.2432290Z warn: Lint warnings found 2026-10-24T20:38:28.2433552Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:38:28.2433943Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T20:38:28.2434178Z 20 │ [instanceId]: { 2026-10-24T20:38:28.2434343Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T20:38:28.2434613Z ·  ──────────────────────────── 2026-10-24T20:38:28.2434793Z 22 │ [model]: options, 2026-10-24T20:38:28.2434935Z ╰──── 2026-10-24T20:38:28.2435264Z  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-24T20:38:28.2435525Z 2026-10-24T20:38:28.2435678Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2436004Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T20:38:28.2436229Z 493 │ > 2026-10-24T20:38:28.2436377Z 494 │ {props.children(close)} 2026-10-24T20:38:28.2436569Z ·  ──┬── 2026-10-24T20:38:28.2436832Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.2437067Z 495 │ 2026-10-24T20:38:28.2437216Z ╰──── 2026-10-24T20:38:28.2437743Z  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-24T20:38:28.2438510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2438792Z 2026-10-24T20:38:28.2438963Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2439276Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T20:38:28.2439578Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T20:38:28.2439876Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T20:38:28.2440158Z ·  ─────┬──── 2026-10-24T20:38:28.2440436Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2440651Z 373 │ return ( 2026-10-24T20:38:28.2440775Z ╰──── 2026-10-24T20:38:28.2441152Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2441705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2441987Z 2026-10-24T20:38:28.2442156Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2442469Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T20:38:28.2442717Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T20:38:28.2442951Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T20:38:28.2443203Z ·  ─────┬──── 2026-10-24T20:38:28.2443604Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2443852Z 854 │ } 2026-10-24T20:38:28.2443967Z ╰──── 2026-10-24T20:38:28.2444296Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2444840Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2445116Z 2026-10-24T20:38:28.2445340Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:38:28.2445668Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T20:38:28.2445862Z 730 │ ); 2026-10-24T20:38:28.2446113Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T20:38:28.2446386Z ·  ────── 2026-10-24T20:38:28.2446605Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T20:38:28.2446794Z ╰──── 2026-10-24T20:38:28.2447016Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:38:28.2447186Z 2026-10-24T20:38:28.2447663Z ⚠ 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-24T20:38:28.2448232Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T20:38:28.2448507Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T20:38:28.2448848Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T20:38:28.2449180Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T20:38:28.2449429Z 137 │ │ if (predicate(lastState)) { 2026-10-24T20:38:28.2449650Z 138 │ │ return lastState; 2026-10-24T20:38:28.2449834Z 139 │ │ } 2026-10-24T20:38:28.2450026Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2450265Z 141 │ ╰─▶ } 2026-10-24T20:38:28.2450467Z 142 │ return yield* Effect.die( 2026-10-24T20:38:28.2450614Z ╰──── 2026-10-24T20:38:28.2450670Z 2026-10-24T20:38:28.2450922Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T20:38:28.2451211Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T20:38:28.2451401Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T20:38:28.2451592Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T20:38:28.2451767Z ·  ──┬── 2026-10-24T20:38:28.2451987Z · ╰── 'Fiber' is imported here 2026-10-24T20:38:28.2452217Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T20:38:28.2452385Z ╰──── 2026-10-24T20:38:28.2452532Z  help: Consider removing this import. 2026-10-24T20:38:28.2452646Z 2026-10-24T20:38:28.2452842Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T20:38:28.2453120Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T20:38:28.2453367Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T20:38:28.2453592Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T20:38:28.2453778Z ·  ────┬─── 2026-10-24T20:38:28.2454000Z · ╰── 'Schedule' is imported here 2026-10-24T20:38:28.2454216Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T20:38:28.2454371Z ╰──── 2026-10-24T20:38:28.2454517Z  help: Consider removing this import. 2026-10-24T20:38:28.2454629Z 2026-10-24T20:38:28.2454928Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2455299Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T20:38:28.2455559Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T20:38:28.2455916Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T20:38:28.2456224Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2456498Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T20:38:28.2456824Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T20:38:28.2457045Z ╰──── 2026-10-24T20:38:28.2457204Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2457319Z 2026-10-24T20:38:28.2457685Z ⚠ 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-24T20:38:28.2458141Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T20:38:28.2458425Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T20:38:28.2458733Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T20:38:28.2459011Z ·  ────────────────────────── 2026-10-24T20:38:28.2459254Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T20:38:28.2459432Z ╰──── 2026-10-24T20:38:28.2459489Z 2026-10-24T20:38:28.2459925Z ⚠ 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-24T20:38:28.2460447Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T20:38:28.2460726Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T20:38:28.2461078Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T20:38:28.2461379Z ·  ─────────────────── 2026-10-24T20:38:28.2461590Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T20:38:28.2461748Z ╰──── 2026-10-24T20:38:28.2461806Z 2026-10-24T20:38:28.2462072Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2462459Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T20:38:28.2462665Z 913 │ 2026-10-24T20:38:28.2462912Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T20:38:28.2463258Z ·  ─────┬───── 2026-10-24T20:38:28.2464305Z · ╰── 'layerDaemon' is declared here 2026-10-24T20:38:28.2464533Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T20:38:28.2464746Z ╰──── 2026-10-24T20:38:28.2464905Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2465021Z 2026-10-24T20:38:28.2465483Z ⚠ 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-24T20:38:28.2466044Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T20:38:28.2466326Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T20:38:28.2466615Z 133 │ ╭─▶ for ( 2026-10-24T20:38:28.2466860Z 134 │ │ let attempt = 0; 2026-10-24T20:38:28.2467141Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T20:38:28.2467406Z 136 │ │ attempt += 1 2026-10-24T20:38:28.2467599Z 137 │ │ ) { 2026-10-24T20:38:28.2467807Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2468063Z 139 │ ╰─▶ } 2026-10-24T20:38:28.2468733Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T20:38:28.2468922Z ╰──── 2026-10-24T20:38:28.2468975Z 2026-10-24T20:38:28.2469148Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T20:38:28.2469466Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T20:38:28.2469679Z 1436 │ 2026-10-24T20:38:28.2469806Z 1437 │ for (const [] of [ 2026-10-24T20:38:28.2469966Z ·  ── 2026-10-24T20:38:28.2470121Z 1438 │ ["github", "github.com"], 2026-10-24T20:38:28.2470264Z ╰──── 2026-10-24T20:38:28.2470589Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T20:38:28.2470998Z 2026-10-24T20:38:28.2471150Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T20:38:28.2471518Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T20:38:28.2471785Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T20:38:28.2472019Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T20:38:28.2472231Z ·  ───────────────────────────── 2026-10-24T20:38:28.2472464Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T20:38:28.2472653Z ╰──── 2026-10-24T20:38:28.2472861Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T20:38:28.2473025Z 2026-10-24T20:38:28.2473315Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2473712Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T20:38:28.2473895Z 217 │ 2026-10-24T20:38:28.2474099Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T20:38:28.2474483Z ·  ──────────┬────────── 2026-10-24T20:38:28.2474788Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T20:38:28.2475129Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T20:38:28.2475370Z ╰──── 2026-10-24T20:38:28.2475529Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2475649Z 2026-10-24T20:38:28.2475953Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2476358Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T20:38:28.2476540Z 220 │ 2026-10-24T20:38:28.2476736Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T20:38:28.2476986Z ·  ──────────────┬────────────── 2026-10-24T20:38:28.2477272Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T20:38:28.2477598Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T20:38:28.2477820Z ╰──── 2026-10-24T20:38:28.2477974Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2478110Z 2026-10-24T20:38:28.2478353Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T20:38:28.2478696Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T20:38:28.2478873Z 55 │ 2026-10-24T20:38:28.2479033Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T20:38:28.2479258Z ·  ────────────────┬──────────────── 2026-10-24T20:38:28.2479569Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T20:38:28.2479839Z 57 │ selection: TerminalContextSelection, 2026-10-24T20:38:28.2480002Z ╰──── 2026-10-24T20:38:28.2480159Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2480276Z 2026-10-24T20:38:28.2480550Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2480974Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7] 2026-10-24T20:38:28.2481182Z 12394 │ 2026-10-24T20:38:28.2481384Z 12395 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T20:38:28.2481624Z ·  ────────┬─────── 2026-10-24T20:38:28.2481931Z · ╰── 'layerUnavailable' is declared here 2026-10-24T20:38:28.2482180Z 12396 │ OrchestratorV2, 2026-10-24T20:38:28.2482316Z ╰──── 2026-10-24T20:38:28.2482474Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2482591Z 2026-10-24T20:38:28.2482777Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2483091Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T20:38:28.2483398Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T20:38:28.2483658Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T20:38:28.2483852Z ·  ┬ 2026-10-24T20:38:28.2484082Z · ╰── '_' is declared here 2026-10-24T20:38:28.2484320Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T20:38:28.2484491Z ╰──── 2026-10-24T20:38:28.2484660Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2484774Z 2026-10-24T20:38:28.2484959Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2485277Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T20:38:28.2485477Z 133 │ ); 2026-10-24T20:38:28.2485648Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T20:38:28.2485869Z ·  ┬ 2026-10-24T20:38:28.2486118Z · ╰── '_' is declared here 2026-10-24T20:38:28.2486322Z 135 │ Effect.succeed( 2026-10-24T20:38:28.2486454Z ╰──── 2026-10-24T20:38:28.2486621Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2486739Z 2026-10-24T20:38:28.2486918Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2487232Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T20:38:28.2487430Z 177 │ }); 2026-10-24T20:38:28.2487599Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T20:38:28.2487798Z ·  ┬ 2026-10-24T20:38:28.2488033Z · ╰── '_' is declared here 2026-10-24T20:38:28.2488271Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T20:38:28.2488473Z ╰──── 2026-10-24T20:38:28.2488640Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2488757Z 2026-10-24T20:38:28.2488945Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2489258Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T20:38:28.2489458Z 202 │ ); 2026-10-24T20:38:28.2489620Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T20:38:28.2489826Z ·  ┬ 2026-10-24T20:38:28.2490063Z · ╰── '_' is declared here 2026-10-24T20:38:28.2490275Z 204 │ options.removeWorktreeFails 2026-10-24T20:38:28.2490428Z ╰──── 2026-10-24T20:38:28.2490583Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2490702Z 2026-10-24T20:38:28.2491042Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2491682Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T20:38:28.2492002Z 207 │ ); 2026-10-24T20:38:28.2492178Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T20:38:28.2492407Z ·  ┬ 2026-10-24T20:38:28.2492662Z · ╰── '_' is declared here 2026-10-24T20:38:28.2492890Z 209 │ options.deleteLocalBranchFails 2026-10-24T20:38:28.2493054Z ╰──── 2026-10-24T20:38:28.2493219Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2493340Z 2026-10-24T20:38:28.2493537Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2493865Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T20:38:28.2494070Z 212 │ ); 2026-10-24T20:38:28.2494256Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T20:38:28.2494487Z ·  ┬ 2026-10-24T20:38:28.2494739Z · ╰── '_' is declared here 2026-10-24T20:38:28.2494962Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T20:38:28.2495115Z ╰──── 2026-10-24T20:38:28.2495275Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2495393Z 2026-10-24T20:38:28.2495574Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2495886Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T20:38:28.2496084Z 253 │ ); 2026-10-24T20:38:28.2496240Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T20:38:28.2496438Z ·  ┬ 2026-10-24T20:38:28.2496679Z · ╰── '_' is declared here 2026-10-24T20:38:28.2496880Z 255 │ Effect.succeed({ 2026-10-24T20:38:28.2497016Z ╰──── 2026-10-24T20:38:28.2497175Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2497292Z 2026-10-24T20:38:28.2497472Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2497785Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T20:38:28.2497980Z 263 │ ); 2026-10-24T20:38:28.2498196Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T20:38:28.2498445Z ·  ┬ 2026-10-24T20:38:28.2498683Z · ╰── '_' is declared here 2026-10-24T20:38:28.2498963Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T20:38:28.2499170Z ╰──── 2026-10-24T20:38:28.2499323Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2499439Z 2026-10-24T20:38:28.2499738Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2500173Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T20:38:28.2500392Z 345 │ 2026-10-24T20:38:28.2500553Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T20:38:28.2500761Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2501071Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T20:38:28.2501372Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T20:38:28.2501562Z ╰──── 2026-10-24T20:38:28.2501721Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2501839Z 2026-10-24T20:38:28.2502061Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:38:28.2502405Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T20:38:28.2502616Z 1021 │ instanceId, 2026-10-24T20:38:28.2502839Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T20:38:28.2503127Z ·  ────────────────────────────────────────────────── 2026-10-24T20:38:28.2503326Z 1023 │ ]), 2026-10-24T20:38:28.2503453Z ╰──── 2026-10-24T20:38:28.2503775Z  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-24T20:38:28.2504031Z 2026-10-24T20:38:28.2504196Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2504503Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T20:38:28.2504768Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T20:38:28.2505048Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T20:38:28.2505338Z ·  ─────┬──── 2026-10-24T20:38:28.2505628Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2505841Z 179 │ } 2026-10-24T20:38:28.2505953Z ╰──── 2026-10-24T20:38:28.2506286Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2506854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2507134Z 2026-10-24T20:38:28.2507334Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2507643Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T20:38:28.2507841Z 28 │ getPendingThreadOrder(); 2026-10-24T20:38:28.2508013Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T20:38:28.2508230Z ·  ────┬──── ───────┬────── 2026-10-24T20:38:28.2508549Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:38:28.2508855Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T20:38:28.2509062Z 30 │ return pending; 2026-10-24T20:38:28.2509190Z ╰──── 2026-10-24T20:38:28.2509530Z  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-24T20:38:28.2510106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2510397Z 2026-10-24T20:38:28.2510604Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T20:38:28.2511042Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T20:38:28.2511441Z 236 │ 2026-10-24T20:38:28.2511615Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T20:38:28.2511829Z ·  ───────┬────── 2026-10-24T20:38:28.2512066Z · ╰── 'nonEmptyString' is declared here 2026-10-24T20:38:28.2512348Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T20:38:28.2512545Z ╰──── 2026-10-24T20:38:28.2512703Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2512818Z 2026-10-24T20:38:28.2513014Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2513347Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T20:38:28.2513571Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T20:38:28.2513739Z 1321 │ retryTick, 2026-10-24T20:38:28.2513889Z ·  ────┬──── 2026-10-24T20:38:28.2514117Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T20:38:28.2514331Z 1322 │ restoreQueuedMessage, 2026-10-24T20:38:28.2514469Z ╰──── 2026-10-24T20:38:28.2514824Z  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-24T20:38:28.2515398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2515687Z 2026-10-24T20:38:28.2515878Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:38:28.2516179Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T20:38:28.2516371Z 7 │ () => 2026-10-24T20:38:28.2516503Z 8 │ Gesture.Hover() 2026-10-24T20:38:28.2516664Z ·  ──┬── 2026-10-24T20:38:28.2516887Z · ╰── `Hover` may be a component 2026-10-24T20:38:28.2517098Z 9 │ .manualActivation(true) 2026-10-24T20:38:28.2517239Z ╰──── 2026-10-24T20:38:28.2517567Z  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-24T20:38:28.2518264Z  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-24T20:38:28.2518670Z 2026-10-24T20:38:28.2519129Z ⚠ 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-24T20:38:28.2519671Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T20:38:28.2519872Z 225 │ ) { 2026-10-24T20:38:28.2520144Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.2520454Z 227 │ │ const socket = sockets[index]; 2026-10-24T20:38:28.2520664Z 228 │ │ if (socket) { 2026-10-24T20:38:28.2520900Z 229 │ │ return socket; 2026-10-24T20:38:28.2521090Z 230 │ │ } 2026-10-24T20:38:28.2521430Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2521711Z 232 │ ╰─▶ } 2026-10-24T20:38:28.2522016Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T20:38:28.2536489Z ╰──── 2026-10-24T20:38:28.2536570Z 2026-10-24T20:38:28.2537063Z ⚠ 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-24T20:38:28.2537633Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T20:38:28.2537833Z 239 │ ) { 2026-10-24T20:38:28.2538117Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.2538519Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T20:38:28.2538813Z 242 │ │ if (request) { 2026-10-24T20:38:28.2539012Z 243 │ │ return request; 2026-10-24T20:38:28.2539193Z 244 │ │ } 2026-10-24T20:38:28.2539387Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2539625Z 246 │ ╰─▶ } 2026-10-24T20:38:28.2539918Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T20:38:28.2540139Z ╰──── 2026-10-24T20:38:28.2540195Z 2026-10-24T20:38:28.2540661Z ⚠ 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-24T20:38:28.2541240Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T20:38:28.2541440Z 130 │ ) { 2026-10-24T20:38:28.2541720Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.2542033Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T20:38:28.2542256Z 133 │ │ return; 2026-10-24T20:38:28.2542440Z 134 │ │ } 2026-10-24T20:38:28.2542646Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2542901Z 136 │ ╰─▶ } 2026-10-24T20:38:28.2543208Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T20:38:28.2543432Z ╰──── 2026-10-24T20:38:28.2543491Z 2026-10-24T20:38:28.2543945Z ⚠ 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-24T20:38:28.2544491Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T20:38:28.2544793Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T20:38:28.2545205Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T20:38:28.2545632Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2545919Z 254 │ ╰─▶ } 2026-10-24T20:38:28.2546175Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T20:38:28.2546363Z ╰──── 2026-10-24T20:38:28.2546423Z 2026-10-24T20:38:28.2546875Z ⚠ 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-24T20:38:28.2547409Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T20:38:28.2547604Z 257 │ 2026-10-24T20:38:28.2547912Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T20:38:28.2548250Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2548500Z 260 │ ╰─▶ } 2026-10-24T20:38:28.2548739Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T20:38:28.2548909Z ╰──── 2026-10-24T20:38:28.2548968Z 2026-10-24T20:38:28.2549413Z ⚠ 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-24T20:38:28.2549950Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T20:38:28.2550152Z 321 │ ); 2026-10-24T20:38:28.2550484Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T20:38:28.2550820Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2551105Z 324 │ ╰─▶ } 2026-10-24T20:38:28.2551644Z 325 │ 2026-10-24T20:38:28.2551763Z ╰──── 2026-10-24T20:38:28.2551821Z 2026-10-24T20:38:28.2552267Z ⚠ 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-24T20:38:28.2552806Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T20:38:28.2553108Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T20:38:28.2553613Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T20:38:28.2553982Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2554229Z 332 │ ╰─▶ } 2026-10-24T20:38:28.2554464Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T20:38:28.2554633Z ╰──── 2026-10-24T20:38:28.2554690Z 2026-10-24T20:38:28.2554921Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T20:38:28.2555277Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T20:38:28.2555541Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T20:38:28.2555914Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T20:38:28.2556256Z 986 │ │ (approval) => approval.requestId, 2026-10-24T20:38:28.2556520Z 987 │ ╰─▶ ); 2026-10-24T20:38:28.2556846Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T20:38:28.2557048Z ╰──── 2026-10-24T20:38:28.2557181Z  help: Switch to `Set` 2026-10-24T20:38:28.2557278Z 2026-10-24T20:38:28.2557503Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:38:28.2557856Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T20:38:28.2558064Z 237 │ ): string { 2026-10-24T20:38:28.2558294Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T20:38:28.2558574Z ·  ────── 2026-10-24T20:38:28.2558824Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T20:38:28.2559018Z ╰──── 2026-10-24T20:38:28.2559245Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:38:28.2559420Z 2026-10-24T20:38:28.2559883Z ⚠ 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-24T20:38:28.2560458Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T20:38:28.2560732Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T20:38:28.2561100Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T20:38:28.2561390Z 567 │ │ const nextEvent = { 2026-10-24T20:38:28.2561661Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T20:38:28.2561952Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T20:38:28.2562186Z 570 │ │ threadId, 2026-10-24T20:38:28.2562394Z 571 │ │ providerInstanceId, 2026-10-24T20:38:28.2562610Z 572 │ │ occurredAt: now, 2026-10-24T20:38:28.2562865Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T20:38:28.2563207Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T20:38:28.2563492Z 575 │ │ const reader = yield* eventSink 2026-10-24T20:38:28.2563740Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T20:38:28.2564001Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T20:38:28.2564244Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2564522Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T20:38:28.2564820Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T20:38:28.2565072Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T20:38:28.2565402Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T20:38:28.2565679Z 583 │ │ } 2026-10-24T20:38:28.2565941Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T20:38:28.2566248Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T20:38:28.2566526Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T20:38:28.2566791Z 587 │ ╰─▶ } 2026-10-24T20:38:28.2566987Z 588 │ }), 2026-10-24T20:38:28.2567108Z ╰──── 2026-10-24T20:38:28.2567166Z 2026-10-24T20:38:28.2567625Z ⚠ 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-24T20:38:28.2568204Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T20:38:28.2568458Z 2326 │ let settled = false; 2026-10-24T20:38:28.2568713Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T20:38:28.2569028Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T20:38:28.2569319Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T20:38:28.2569538Z 2330 │ │ ); 2026-10-24T20:38:28.2569767Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T20:38:28.2570037Z 2332 │ ╰─▶ } 2026-10-24T20:38:28.2570299Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T20:38:28.2570486Z ╰──── 2026-10-24T20:38:28.2570545Z 2026-10-24T20:38:28.2570803Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2571214Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T20:38:28.2571464Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T20:38:28.2571653Z 84 │ useEffect(() => { 2026-10-24T20:38:28.2571813Z ·  ────┬──── 2026-10-24T20:38:28.2572029Z · ╰── This is the containing effect 2026-10-24T20:38:28.2572255Z 85 │ if (!actionState.isRunning) return; 2026-10-24T20:38:28.2572426Z 86 │ setNowMs(Date.now()); 2026-10-24T20:38:28.2572584Z ·  ────┬─── 2026-10-24T20:38:28.2572891Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2573213Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T20:38:28.2573401Z ╰──── 2026-10-24T20:38:28.2574048Z  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-24T20:38:28.2574911Z  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-24T20:38:28.2575216Z 2026-10-24T20:38:28.2575425Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T20:38:28.2575788Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T20:38:28.2576043Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T20:38:28.2576264Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T20:38:28.2576485Z ·  ─────┬───── 2026-10-24T20:38:28.2576722Z · ╰── 'HostProcess' is imported here 2026-10-24T20:38:28.2576914Z 26 │ 2026-10-24T20:38:28.2577029Z ╰──── 2026-10-24T20:38:28.2577184Z  help: Consider removing this import. 2026-10-24T20:38:28.2577297Z 2026-10-24T20:38:28.2577567Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2577988Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T20:38:28.2578244Z 123 │ const path = yield* Path.Path; 2026-10-24T20:38:28.2578463Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T20:38:28.2578677Z ·  ──────┬───── 2026-10-24T20:38:28.2578913Z · ╰── 'serverConfig' is declared here 2026-10-24T20:38:28.2579194Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T20:38:28.2579397Z ╰──── 2026-10-24T20:38:28.2579559Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2579676Z 2026-10-24T20:38:28.2579949Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2580371Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T20:38:28.2580654Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T20:38:28.2580969Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T20:38:28.2581204Z ·  ───────┬────── 2026-10-24T20:38:28.2581446Z · ╰── 'serverSettings' is declared here 2026-10-24T20:38:28.2581723Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T20:38:28.2581928Z ╰──── 2026-10-24T20:38:28.2582086Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2582203Z 2026-10-24T20:38:28.2582457Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2582883Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T20:38:28.2583115Z 57 │ 2026-10-24T20:38:28.2583243Z 58 │ useEffect(() => { 2026-10-24T20:38:28.2583396Z ·  ────┬──── 2026-10-24T20:38:28.2583620Z · ╰── This is the containing effect 2026-10-24T20:38:28.2583847Z 59 │ const controller = new AbortController(); 2026-10-24T20:38:28.2584033Z 60 │ setLoadState("pending"); 2026-10-24T20:38:28.2584198Z ·  ──────┬───── 2026-10-24T20:38:28.2584455Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2584774Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T20:38:28.2584985Z ╰──── 2026-10-24T20:38:28.2585637Z  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-24T20:38:28.2586482Z  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-24T20:38:28.2586783Z 2026-10-24T20:38:28.2586980Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2587310Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T20:38:28.2587530Z 70 │ return () => controller.abort(); 2026-10-24T20:38:28.2587729Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T20:38:28.2588019Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T20:38:28.2588411Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T20:38:28.2588812Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T20:38:28.2589140Z · ╰── Unnecessary dependency `player_0` 2026-10-24T20:38:28.2589331Z 72 │ 2026-10-24T20:38:28.2589439Z ╰──── 2026-10-24T20:38:28.2589780Z  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-24T20:38:28.2590362Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2590654Z 2026-10-24T20:38:28.2590919Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2591509Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T20:38:28.2591709Z 3754 │ 2026-10-24T20:38:28.2591967Z 3755 │ const layer: Layer.Layer = 2026-10-24T20:38:28.2592239Z ·  ──┬── 2026-10-24T20:38:28.2592450Z · ╰── 'layer' is declared here 2026-10-24T20:38:28.2592648Z 3756 │ Layer.effect( 2026-10-24T20:38:28.2592776Z ╰──── 2026-10-24T20:38:28.2592937Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2593053Z 2026-10-24T20:38:28.2593296Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T20:38:28.2593637Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T20:38:28.2593891Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T20:38:28.2594118Z 194 │ const codes = new Array(count); 2026-10-24T20:38:28.2594335Z ·  ──────────────────────── 2026-10-24T20:38:28.2594555Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T20:38:28.2594722Z ╰──── 2026-10-24T20:38:28.2595188Z  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-24T20:38:28.2595559Z 2026-10-24T20:38:28.2595750Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2596107Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T20:38:28.2596361Z 554 │ assert.deepStrictEqual( 2026-10-24T20:38:28.2596626Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T20:38:28.2596912Z ·  ┬ 2026-10-24T20:38:28.2597201Z · ╰── '_' is declared here 2026-10-24T20:38:28.2597416Z 556 │ [ 2026-10-24T20:38:28.2597543Z ╰──── 2026-10-24T20:38:28.2597698Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2597817Z 2026-10-24T20:38:28.2598004Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.2598357Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T20:38:28.2598614Z 1154 │ assert.deepStrictEqual( 2026-10-24T20:38:28.2598874Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T20:38:28.2599159Z ·  ┬ 2026-10-24T20:38:28.2599445Z · ╰── '_' is declared here 2026-10-24T20:38:28.2599657Z 1156 │ [ 2026-10-24T20:38:28.2599788Z ╰──── 2026-10-24T20:38:28.2599944Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2600061Z 2026-10-24T20:38:28.2600232Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.2600583Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T20:38:28.2600825Z 52 │ 2026-10-24T20:38:28.2600990Z 53 │ for (const {} of [ 2026-10-24T20:38:28.2601146Z ·  ── 2026-10-24T20:38:28.2601299Z 54 │ { healthy: true }, 2026-10-24T20:38:28.2601438Z ╰──── 2026-10-24T20:38:28.2601717Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.2601937Z 2026-10-24T20:38:28.2602150Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:38:28.2602477Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T20:38:28.2602773Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T20:38:28.2603021Z 259 │ for (const edit of edits.reverse()) 2026-10-24T20:38:28.2603217Z ·  ─────── 2026-10-24T20:38:28.2603490Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T20:38:28.2603709Z ╰──── 2026-10-24T20:38:28.2604034Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:38:28.2604287Z 2026-10-24T20:38:28.2604496Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:38:28.2604821Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T20:38:28.2605031Z 289 │ visit(parser.parse(markdown)); 2026-10-24T20:38:28.2605222Z 290 │ for (const edit of edits.reverse()) 2026-10-24T20:38:28.2605417Z ·  ─────── 2026-10-24T20:38:28.2605686Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T20:38:28.2605902Z ╰──── 2026-10-24T20:38:28.2606213Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:38:28.2606456Z 2026-10-24T20:38:28.2606662Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:38:28.2606984Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T20:38:28.2607194Z 343 │ visit(parser.parse(markdown)); 2026-10-24T20:38:28.2607398Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T20:38:28.2607621Z ·  ─────── 2026-10-24T20:38:28.2607901Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T20:38:28.2608116Z ╰──── 2026-10-24T20:38:28.2608423Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:38:28.2608672Z 2026-10-24T20:38:28.2608951Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2609370Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T20:38:28.2609582Z 14 │ 2026-10-24T20:38:28.2609710Z 15 │ const legacyCredentials = { 2026-10-24T20:38:28.2609887Z ·  ────────┬──────── 2026-10-24T20:38:28.2610182Z · ╰── 'legacyCredentials' is declared here 2026-10-24T20:38:28.2610430Z 16 │ version: 1 as const, 2026-10-24T20:38:28.2610564Z ╰──── 2026-10-24T20:38:28.2610722Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2610850Z 2026-10-24T20:38:28.2611218Z ⚠ 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-24T20:38:28.2611666Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T20:38:28.2611976Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T20:38:28.2612308Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T20:38:28.2612570Z ·  ───────── 2026-10-24T20:38:28.2612850Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T20:38:28.2613082Z ╰──── 2026-10-24T20:38:28.2613141Z 2026-10-24T20:38:28.2613472Z ⚠ 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-24T20:38:28.2613915Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T20:38:28.2614232Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T20:38:28.2614578Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T20:38:28.2614844Z ·  ───────── 2026-10-24T20:38:28.2614993Z 52 │ } 2026-10-24T20:38:28.2615107Z ╰──── 2026-10-24T20:38:28.2615168Z 2026-10-24T20:38:28.2615498Z ⚠ 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-24T20:38:28.2615938Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T20:38:28.2616150Z 54 │ assert.equal( 2026-10-24T20:38:28.2616398Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T20:38:28.2616647Z ·  ───────── 2026-10-24T20:38:28.2616791Z 56 │ true, 2026-10-24T20:38:28.2616909Z ╰──── 2026-10-24T20:38:28.2616965Z 2026-10-24T20:38:28.2617289Z ⚠ 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-24T20:38:28.2617732Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T20:38:28.2617945Z 58 │ assert.equal( 2026-10-24T20:38:28.2618200Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T20:38:28.2618450Z ·  ───────── 2026-10-24T20:38:28.2618593Z 60 │ true, 2026-10-24T20:38:28.2618708Z ╰──── 2026-10-24T20:38:28.2618762Z 2026-10-24T20:38:28.2619087Z ⚠ 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-24T20:38:28.2619531Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T20:38:28.2619736Z 102 │ 2026-10-24T20:38:28.2619959Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T20:38:28.2620276Z ·  ───────── 2026-10-24T20:38:28.2620463Z 104 │ }); 2026-10-24T20:38:28.2620575Z ╰──── 2026-10-24T20:38:28.2620633Z 2026-10-24T20:38:28.2620897Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2621321Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T20:38:28.2621541Z 409 │ 2026-10-24T20:38:28.2621728Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T20:38:28.2621941Z ·  ──┬── 2026-10-24T20:38:28.2622147Z · ╰── 'layer' is declared here 2026-10-24T20:38:28.2622324Z ╰──── 2026-10-24T20:38:28.2622482Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2622599Z 2026-10-24T20:38:28.2622880Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T20:38:28.2623268Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T20:38:28.2623464Z 248 │ }, 2026-10-24T20:38:28.2623608Z 249 │ (effect, flow, stopSessions) => 2026-10-24T20:38:28.2623799Z ·  ──────┬───── 2026-10-24T20:38:28.2624047Z · ╰── 'stopSessions' is declared here 2026-10-24T20:38:28.2624253Z 250 │ effect.pipe( 2026-10-24T20:38:28.2624383Z ╰──── 2026-10-24T20:38:28.2624536Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2624650Z 2026-10-24T20:38:28.2625106Z ⚠ 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-24T20:38:28.2625643Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T20:38:28.2625918Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T20:38:28.2626236Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T20:38:28.2626525Z ·  ──────────────────────── 2026-10-24T20:38:28.2626698Z 182 │ version: 1, 2026-10-24T20:38:28.2626831Z ╰──── 2026-10-24T20:38:28.2626886Z 2026-10-24T20:38:28.2627086Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T20:38:28.2627394Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T20:38:28.2627576Z 296 │ } from "./device.ts"; 2026-10-24T20:38:28.2627756Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T20:38:28.2627933Z ·  ── 2026-10-24T20:38:28.2628078Z 298 │ import { 2026-10-24T20:38:28.2628196Z ╰──── 2026-10-24T20:38:28.2628328Z  help: Remove empty braces 2026-10-24T20:38:28.2628429Z 2026-10-24T20:38:28.2628629Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T20:38:28.2628943Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T20:38:28.2629140Z 37 │ get isConnected() { 2026-10-24T20:38:28.2629311Z 38 │ let current: FakeElement | null = this; 2026-10-24T20:38:28.2629488Z ·  ─────── 2026-10-24T20:38:28.2629643Z 39 │ while (current?.parent) { 2026-10-24T20:38:28.2629840Z ╰──── 2026-10-24T20:38:28.2630192Z  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-24T20:38:28.2630447Z 2026-10-24T20:38:28.2630659Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.2631057Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T20:38:28.2631388Z 248 │ mountedRef.current = false; 2026-10-24T20:38:28.2631657Z 249 │ flow.setBranchQuery(""); 2026-10-24T20:38:28.2631915Z ·  ──┬─ 2026-10-24T20:38:28.2632157Z · ╰── Missing dependency `flow` 2026-10-24T20:38:28.2632345Z 250 │ }; 2026-10-24T20:38:28.2632484Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T20:38:28.2632666Z ·  ─────────┬───────── 2026-10-24T20:38:28.2632969Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T20:38:28.2633218Z 252 │ 2026-10-24T20:38:28.2633331Z ╰──── 2026-10-24T20:38:28.2633804Z  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-24T20:38:28.2634499Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2634795Z 2026-10-24T20:38:28.2634940Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2635248Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T20:38:28.2635586Z 151 │ 2026-10-24T20:38:28.2635847Z 152 │ {props.children(open)} 2026-10-24T20:38:28.2636035Z ·  ──┬─ 2026-10-24T20:38:28.2636299Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.2636517Z 153 │ 2026-10-24T20:38:28.2636648Z ╰──── 2026-10-24T20:38:28.2637166Z  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-24T20:38:28.2637880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2638161Z 2026-10-24T20:38:28.2638352Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T20:38:28.2638691Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T20:38:28.2638929Z 139 │ if (action.id !== undefined) { 2026-10-24T20:38:28.2639112Z 140 │ props.onPressAction?.({ 2026-10-24T20:38:28.2639282Z ·  ──┬── 2026-10-24T20:38:28.2639500Z · ╰── Missing dependency `props` 2026-10-24T20:38:28.2639729Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T20:38:28.2639983Z 142 │ } as Parameters>[0]); 2026-10-24T20:38:28.2640262Z 143 │ } 2026-10-24T20:38:28.2640422Z 144 │ }, 2026-10-24T20:38:28.2640571Z 145 │ [close, props.onPressAction], 2026-10-24T20:38:28.2640765Z ·  ─────────┬───────── 2026-10-24T20:38:28.2641127Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T20:38:28.2641381Z 146 │ ); 2026-10-24T20:38:28.2641496Z ╰──── 2026-10-24T20:38:28.2642028Z  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-24T20:38:28.2642772Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2643071Z 2026-10-24T20:38:28.2643432Z ⚠ 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-24T20:38:28.2643883Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T20:38:28.2644161Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T20:38:28.2644495Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T20:38:28.2644768Z ·  ──────────────────────── 2026-10-24T20:38:28.2644948Z 18 │ "review:write", 2026-10-24T20:38:28.2645084Z ╰──── 2026-10-24T20:38:28.2645140Z 2026-10-24T20:38:28.2645503Z ⚠ 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-24T20:38:28.2645946Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T20:38:28.2646128Z 19 │ ]); 2026-10-24T20:38:28.2646351Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T20:38:28.2646624Z ·  ──────────────────────── 2026-10-24T20:38:28.2646867Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T20:38:28.2647061Z ╰──── 2026-10-24T20:38:28.2647115Z 2026-10-24T20:38:28.2647474Z ⚠ 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-24T20:38:28.2647915Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T20:38:28.2648207Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T20:38:28.2648503Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T20:38:28.2648748Z ·  ──────────────────────── 2026-10-24T20:38:28.2648933Z 59 │ authenticated: true, 2026-10-24T20:38:28.2649076Z ╰──── 2026-10-24T20:38:28.2649132Z 2026-10-24T20:38:28.2649582Z ⚠ 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-24T20:38:28.2650113Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T20:38:28.2650315Z 38 │ JSON.stringify( 2026-10-24T20:38:28.2650575Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T20:38:28.2650832Z ·  ──────────────────────── 2026-10-24T20:38:28.2651037Z 40 │ { name: "a" }, 2026-10-24T20:38:28.2651173Z ╰──── 2026-10-24T20:38:28.2651231Z 2026-10-24T20:38:28.2651387Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2651689Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T20:38:28.2651991Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T20:38:28.2652277Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T20:38:28.2652497Z ·  ────┬─── 2026-10-24T20:38:28.2652713Z · ╰── `rotation` originates here 2026-10-24T20:38:28.2652902Z 172 │ 2026-10-24T20:38:28.2653038Z 173 │ useLayoutEffect(() => { 2026-10-24T20:38:28.2653261Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T20:38:28.2653479Z ·  ────┬─── 2026-10-24T20:38:28.2653696Z · ╰── `rotation` cannot be modified 2026-10-24T20:38:28.2653935Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T20:38:28.2654103Z ╰──── 2026-10-24T20:38:28.2654429Z  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-24T20:38:28.2654983Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2655274Z 2026-10-24T20:38:28.2655473Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.2655815Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T20:38:28.2656040Z 1245 │ { 2026-10-24T20:38:28.2658429Z ·  ────┬──── 2026-10-24T20:38:28.2658643Z · ╰── This is the containing effect 2026-10-24T20:38:28.2658836Z 261 │ stop(); 2026-10-24T20:38:28.2658979Z ·  ──┬─ 2026-10-24T20:38:28.2659226Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2659455Z 262 │ }, [orderVersion]); 2026-10-24T20:38:28.2659591Z ╰──── 2026-10-24T20:38:28.2660246Z  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-24T20:38:28.2661135Z  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-24T20:38:28.2661438Z 2026-10-24T20:38:28.2661653Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.2662019Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T20:38:28.2662249Z 260 │ useEffect(() => { 2026-10-24T20:38:28.2662390Z 261 │ stop(); 2026-10-24T20:38:28.2662530Z ·  ──┬─ 2026-10-24T20:38:28.2662738Z · ╰── Missing dependency `stop` 2026-10-24T20:38:28.2662941Z 262 │ }, [orderVersion]); 2026-10-24T20:38:28.2663108Z ·  ──────┬───── 2026-10-24T20:38:28.2663354Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T20:38:28.2663562Z 263 │ useEffect( 2026-10-24T20:38:28.2663689Z ╰──── 2026-10-24T20:38:28.2664166Z  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-24T20:38:28.2664859Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2665151Z 2026-10-24T20:38:28.2665298Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2665613Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T20:38:28.2665854Z 95 │ const latest = useRef(props); 2026-10-24T20:38:28.2666024Z 96 │ latest.current = props; 2026-10-24T20:38:28.2666219Z ·  ───┬──────┬─── 2026-10-24T20:38:28.2666504Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.2666793Z · ╰── This value is a ref 2026-10-24T20:38:28.2666981Z 97 │ const gesture = useMemo( 2026-10-24T20:38:28.2667123Z ╰──── 2026-10-24T20:38:28.2667637Z  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-24T20:38:28.2668406Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2668716Z 2026-10-24T20:38:28.2668858Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2669172Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T20:38:28.2669402Z 103 │ .runOnJS(true) 2026-10-24T20:38:28.2669590Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:38:28.2669818Z ·  ───────────────┬────────────── 2026-10-24T20:38:28.2670136Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.2670459Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2670659Z ╰──── 2026-10-24T20:38:28.2671405Z  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-24T20:38:28.2672212Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2672488Z 2026-10-24T20:38:28.2672630Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2672941Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T20:38:28.2673202Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:38:28.2673452Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2673742Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T20:38:28.2674091Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.2674410Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2674599Z ╰──── 2026-10-24T20:38:28.2675112Z  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-24T20:38:28.2675815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2676094Z 2026-10-24T20:38:28.2676240Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2676552Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T20:38:28.2676845Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2677113Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2677391Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T20:38:28.2677737Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.2678055Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:38:28.2678246Z ╰──── 2026-10-24T20:38:28.2678848Z  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-24T20:38:28.2679590Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2679866Z 2026-10-24T20:38:28.2680004Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2680309Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T20:38:28.2680593Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2680880Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:38:28.2681171Z ·  ───────────────────────┬────────────────────── 2026-10-24T20:38:28.2681512Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.2681773Z 108 │ [props.disabled], 2026-10-24T20:38:28.2681914Z ╰──── 2026-10-24T20:38:28.2682426Z  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-24T20:38:28.2683131Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2683406Z 2026-10-24T20:38:28.2683548Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2683858Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T20:38:28.2684139Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T20:38:28.2684372Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T20:38:28.2684596Z ·  ───┬──────┬─── 2026-10-24T20:38:28.2684885Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.2685167Z · ╰── This value is a ref 2026-10-24T20:38:28.2685341Z 250 │ 2026-10-24T20:38:28.2685451Z ╰──── 2026-10-24T20:38:28.2685967Z  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-24T20:38:28.2686670Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2686946Z 2026-10-24T20:38:28.2687088Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2687394Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T20:38:28.2687676Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T20:38:28.2687923Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T20:38:28.2688181Z ·  ──────────────────┬────────────────── 2026-10-24T20:38:28.2688525Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.2688835Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T20:38:28.2689010Z ╰──── 2026-10-24T20:38:28.2689526Z  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-24T20:38:28.2690220Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2690494Z 2026-10-24T20:38:28.2690661Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2691012Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T20:38:28.2691242Z 323 │ update(0); 2026-10-24T20:38:28.2691409Z 324 │ let last = performance.now(); 2026-10-24T20:38:28.2691613Z ·  ────────┬──────── 2026-10-24T20:38:28.2691864Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2692074Z 325 │ const tick = () => { 2026-10-24T20:38:28.2692215Z ╰──── 2026-10-24T20:38:28.2692570Z  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-24T20:38:28.2693136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2693415Z 2026-10-24T20:38:28.2693602Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:38:28.2693947Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T20:38:28.2694172Z  98 │ () => 2026-10-24T20:38:28.2694306Z  99 │ Gesture.Pan() 2026-10-24T20:38:28.2694465Z ·  ─┬─ 2026-10-24T20:38:28.2694690Z · ╰── `Pan` may be a component 2026-10-24T20:38:28.2694903Z 100 │ .enabled(!props.disabled) 2026-10-24T20:38:28.2695058Z ╰──── 2026-10-24T20:38:28.2695382Z  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-24T20:38:28.2696136Z  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-24T20:38:28.2696562Z 2026-10-24T20:38:28.2696744Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:38:28.2697083Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T20:38:28.2697309Z 103 │ .runOnJS(true) 2026-10-24T20:38:28.2697488Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:38:28.2697689Z ·  ───┬── 2026-10-24T20:38:28.2698218Z · ╰── 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-24T20:38:28.2698728Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2698998Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:38:28.2699254Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:38:28.2699457Z 108 │ [props.disabled], 2026-10-24T20:38:28.2699624Z ·  ────────┬─────── 2026-10-24T20:38:28.2699900Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.2700135Z 109 │ ); 2026-10-24T20:38:28.2700254Z ╰──── 2026-10-24T20:38:28.2700514Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:38:28.2701052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2701342Z 2026-10-24T20:38:28.2701502Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2701821Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T20:38:28.2702039Z 107 │ ); 2026-10-24T20:38:28.2702254Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T20:38:28.2702499Z ·  ─────────┬──────── 2026-10-24T20:38:28.2702747Z · ╰── `separationProgress` originates here 2026-10-24T20:38:28.2702946Z 109 │ 2026-10-24T20:38:28.2703069Z 110 │ useEffect(() => { 2026-10-24T20:38:28.2703324Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T20:38:28.2703576Z ·  ─────────┬──────── 2026-10-24T20:38:28.2703831Z · ╰── `separationProgress` cannot be modified 2026-10-24T20:38:28.2704090Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T20:38:28.2704264Z ╰──── 2026-10-24T20:38:28.2704580Z  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-24T20:38:28.2705139Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2705429Z 2026-10-24T20:38:28.2705581Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2705898Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T20:38:28.2706172Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T20:38:28.2706461Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T20:38:28.2706768Z ·  ──────┬───── 2026-10-24T20:38:28.2706995Z · ╰── `capsuleWidth` originates here 2026-10-24T20:38:28.2707245Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:38:28.2707485Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2707719Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:38:28.2707931Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:38:28.2708104Z 134 │ return; 2026-10-24T20:38:28.2708231Z 135 │ } 2026-10-24T20:38:28.2708402Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:38:28.2708605Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:38:28.2708857Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:38:28.2714327Z ·  ──────┬───── 2026-10-24T20:38:28.2714588Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T20:38:28.2714783Z 139 │ }; 2026-10-24T20:38:28.2714897Z ╰──── 2026-10-24T20:38:28.2715213Z  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-24T20:38:28.2715767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2716055Z 2026-10-24T20:38:28.2716216Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2716543Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T20:38:28.2716821Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T20:38:28.2717057Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T20:38:28.2717266Z ·  ──────┬───── 2026-10-24T20:38:28.2717495Z · ╰── `capsuleWidth` originates here 2026-10-24T20:38:28.2717740Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:38:28.2717972Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2718201Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:38:28.2718411Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:38:28.2718585Z 134 │ return; 2026-10-24T20:38:28.2718710Z 135 │ } 2026-10-24T20:38:28.2718885Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:38:28.2719092Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:38:28.2719340Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:38:28.2719544Z 139 │ }; 2026-10-24T20:38:28.2719694Z 140 │ const hasStatus = props.status !== null; 2026-10-24T20:38:28.2719941Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T20:38:28.2720153Z 142 │ useEffect(() => { 2026-10-24T20:38:28.2720303Z 143 │ if (!hasStatus) { 2026-10-24T20:38:28.2720471Z 144 │ measuredWidthRef.current = null; 2026-10-24T20:38:28.2720655Z 145 │ capsuleWidth.value = null; 2026-10-24T20:38:28.2720828Z ·  ──────┬───── 2026-10-24T20:38:28.2721115Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T20:38:28.2721311Z 146 │ } 2026-10-24T20:38:28.2721537Z ╰──── 2026-10-24T20:38:28.2721899Z  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-24T20:38:28.2722452Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2722743Z 2026-10-24T20:38:28.2722946Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:38:28.2723307Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T20:38:28.2723607Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T20:38:28.2723819Z 142 │ useEffect(() => { 2026-10-24T20:38:28.2723978Z ·  ───┬─── 2026-10-24T20:38:28.2724295Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T20:38:28.2724570Z 143 │ if (!hasStatus) { 2026-10-24T20:38:28.2724738Z 144 │ measuredWidthRef.current = null; 2026-10-24T20:38:28.2724919Z 145 │ capsuleWidth.value = null; 2026-10-24T20:38:28.2725088Z ·  ──────┬───── 2026-10-24T20:38:28.2725314Z · ╰── This modifies `capsuleWidth` 2026-10-24T20:38:28.2725503Z 146 │ } 2026-10-24T20:38:28.2725620Z ╰──── 2026-10-24T20:38:28.2726008Z  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-24T20:38:28.2726629Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2726922Z 2026-10-24T20:38:28.2727119Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:38:28.2727472Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T20:38:28.2727748Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:38:28.2727989Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2728240Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.2728603Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T20:38:28.2728928Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:38:28.2729147Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:38:28.2729320Z 134 │ return; 2026-10-24T20:38:28.2729446Z 135 │ } 2026-10-24T20:38:28.2729615Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:38:28.2729816Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:38:28.2730058Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:38:28.2730284Z ·  ──────┬───── 2026-10-24T20:38:28.2730507Z · ╰── This modifies `capsuleWidth` 2026-10-24T20:38:28.2730694Z 139 │ }; 2026-10-24T20:38:28.2730807Z ╰──── 2026-10-24T20:38:28.2731281Z  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-24T20:38:28.2731932Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2732220Z 2026-10-24T20:38:28.2732476Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2732871Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T20:38:28.2733079Z 55 │ 2026-10-24T20:38:28.2733210Z 56 │ useEffect(() => { 2026-10-24T20:38:28.2733364Z ·  ────┬──── 2026-10-24T20:38:28.2733578Z · ╰── This is the containing effect 2026-10-24T20:38:28.2733776Z 57 │ setDecodedSize(null); 2026-10-24T20:38:28.2733939Z ·  ───────┬────── 2026-10-24T20:38:28.2734204Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2734440Z 58 │ }, [props.sourceKey]); 2026-10-24T20:38:28.2734583Z ╰──── 2026-10-24T20:38:28.2735228Z  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-24T20:38:28.2736079Z  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-24T20:38:28.2736382Z 2026-10-24T20:38:28.2736641Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2737034Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T20:38:28.2737246Z 59 │ 2026-10-24T20:38:28.2737367Z 60 │ useEffect(() => { 2026-10-24T20:38:28.2737515Z ·  ────┬──── 2026-10-24T20:38:28.2737726Z · ╰── This is the containing effect 2026-10-24T20:38:28.2737921Z 61 │ setFailedUri(null); 2026-10-24T20:38:28.2738079Z ·  ──────┬───── 2026-10-24T20:38:28.2738330Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2738559Z 62 │ }, [props.uri]); 2026-10-24T20:38:28.2738690Z ╰──── 2026-10-24T20:38:28.2739341Z  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-24T20:38:28.2740179Z  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-24T20:38:28.2740478Z 2026-10-24T20:38:28.2740693Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T20:38:28.2741083Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T20:38:28.2741365Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T20:38:28.2741672Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T20:38:28.2741996Z ·  ────────┬──────── 2026-10-24T20:38:28.2742277Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T20:38:28.2742479Z 8 │ 2026-10-24T20:38:28.2742588Z ╰──── 2026-10-24T20:38:28.2742747Z  help: Consider removing this import. 2026-10-24T20:38:28.2742860Z 2026-10-24T20:38:28.2743063Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2743407Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T20:38:28.2743631Z 57 │ setDecodedSize(null); 2026-10-24T20:38:28.2743783Z 58 │ }, [props.sourceKey]); 2026-10-24T20:38:28.2743955Z ·  ───────┬─────── 2026-10-24T20:38:28.2744201Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T20:38:28.2744414Z 59 │ 2026-10-24T20:38:28.2744525Z ╰──── 2026-10-24T20:38:28.2744872Z  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-24T20:38:28.2745454Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2745748Z 2026-10-24T20:38:28.2745947Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2746291Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T20:38:28.2746514Z 61 │ setFailedUri(null); 2026-10-24T20:38:28.2746665Z 62 │ }, [props.uri]); 2026-10-24T20:38:28.2746745Z ·  ────┬──── 2026-10-24T20:38:28.2746893Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T20:38:28.2746945Z 63 │ 2026-10-24T20:38:28.2746998Z ╰──── 2026-10-24T20:38:28.2747286Z  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-24T20:38:28.2747592Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2747595Z 2026-10-24T20:38:28.2747848Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2748019Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T20:38:28.2748073Z 58 │ 2026-10-24T20:38:28.2748189Z 59 │ useEffect(() => { 2026-10-24T20:38:28.2748289Z ·  ────┬──── 2026-10-24T20:38:28.2748416Z · ╰── This is the containing effect 2026-10-24T20:38:28.2748498Z 60 │ setMountedModes((current) => { 2026-10-24T20:38:28.2748578Z ·  ───────┬─────── 2026-10-24T20:38:28.2748747Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2748827Z 61 │ if (current.has(props.mode)) { 2026-10-24T20:38:28.2748880Z ╰──── 2026-10-24T20:38:28.2749470Z  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-24T20:38:28.2749786Z  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-24T20:38:28.2749789Z 2026-10-24T20:38:28.2750028Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:38:28.2750182Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T20:38:28.2750246Z 289 │ return ( 2026-10-24T20:38:28.2750382Z 290 │ 2026-10-24T20:38:28.2750503Z ·  ───────────── 2026-10-24T20:38:28.2750570Z 291 │ {props.children} 2026-10-24T20:38:28.2750622Z ╰──── 2026-10-24T20:38:28.2750857Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:38:28.2751022Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:38:28.2751025Z 2026-10-24T20:38:28.2751341Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:38:28.2751530Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T20:38:28.2751593Z 653 │ return ( 2026-10-24T20:38:28.2751713Z 654 │ 2026-10-24T20:38:28.2751825Z ·  ───────────── 2026-10-24T20:38:28.2751894Z 655 │ {props.children} 2026-10-24T20:38:28.2751946Z ╰──── 2026-10-24T20:38:28.2752170Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:38:28.2752306Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:38:28.2752312Z 2026-10-24T20:38:28.2752542Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:38:28.2752700Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T20:38:28.2752763Z 1461 │ return ( 2026-10-24T20:38:28.2752923Z 1462 │ 2026-10-24T20:38:28.2753054Z ·  ──────────────────── 2026-10-24T20:38:28.2753153Z 1463 │ { 2026-10-24T20:38:28.2754270Z ·  ────┬──── 2026-10-24T20:38:28.2754400Z · ╰── This is the containing effect 2026-10-24T20:38:28.2754533Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T20:38:28.2754602Z 79 │ setHostInput(host); 2026-10-24T20:38:28.2754678Z ·  ──────┬───── 2026-10-24T20:38:28.2754847Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2754913Z 80 │ setCodeInput(code); 2026-10-24T20:38:28.2754966Z ╰──── 2026-10-24T20:38:28.2755550Z  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-24T20:38:28.2755872Z  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-24T20:38:28.2755876Z 2026-10-24T20:38:28.2756131Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2756298Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T20:38:28.2756352Z 82 │ 2026-10-24T20:38:28.2756414Z 83 │ useEffect(() => { 2026-10-24T20:38:28.2756483Z ·  ────┬──── 2026-10-24T20:38:28.2756611Z · ╰── This is the containing effect 2026-10-24T20:38:28.2756701Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T20:38:28.2756760Z 85 │ return; 2026-10-24T20:38:28.2756815Z 86 │ } 2026-10-24T20:38:28.2756867Z 87 │ 2026-10-24T20:38:28.2756978Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T20:38:28.2757048Z 89 │ setHostInput(host); 2026-10-24T20:38:28.2757125Z ·  ──────┬───── 2026-10-24T20:38:28.2757289Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2757352Z 90 │ setCodeInput(code); 2026-10-24T20:38:28.2757405Z ╰──── 2026-10-24T20:38:28.2757990Z  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-24T20:38:28.2758304Z  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-24T20:38:28.2758306Z 2026-10-24T20:38:28.2758605Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2758809Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T20:38:28.2758861Z 92 │ 2026-10-24T20:38:28.2758924Z 93 │ useEffect(() => { 2026-10-24T20:38:28.2758992Z ·  ────┬──── 2026-10-24T20:38:28.2759115Z · ╰── This is the containing effect 2026-10-24T20:38:28.2759197Z 94 │ if (pairingConnectionError) { 2026-10-24T20:38:28.2759270Z 95 │ setIsSubmitting(false); 2026-10-24T20:38:28.2759351Z ·  ───────┬─────── 2026-10-24T20:38:28.2759517Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2759574Z 96 │ } 2026-10-24T20:38:28.2759632Z ╰──── 2026-10-24T20:38:28.2760218Z  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-24T20:38:28.2760529Z  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-24T20:38:28.2760532Z 2026-10-24T20:38:28.2760781Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2760987Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T20:38:28.2761055Z 434 │ : null; 2026-10-24T20:38:28.2761124Z 435 │ useEffect(() => { 2026-10-24T20:38:28.2761193Z ·  ────┬──── 2026-10-24T20:38:28.2761323Z · ╰── This is the containing effect 2026-10-24T20:38:28.2761382Z 436 │ if ( 2026-10-24T20:38:28.2761459Z 437 │ props.active === false || 2026-10-24T20:38:28.2761533Z 438 │ activeDraftKey !== null || 2026-10-24T20:38:28.2761615Z 439 │ editingPendingTask !== null || 2026-10-24T20:38:28.2761690Z 440 │ selectedProject === null 2026-10-24T20:38:28.2761745Z 441 │ ) { 2026-10-24T20:38:28.2761806Z 442 │ return; 2026-10-24T20:38:28.2761862Z 443 │ } 2026-10-24T20:38:28.2761932Z 444 │ setActiveDraftKey( 2026-10-24T20:38:28.2762011Z ·  ────────┬──────── 2026-10-24T20:38:28.2762187Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2762262Z 445 │ createNewTaskDraft({ 2026-10-24T20:38:28.2762315Z ╰──── 2026-10-24T20:38:28.2762902Z  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-24T20:38:28.2763213Z  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-24T20:38:28.2763216Z 2026-10-24T20:38:28.2763451Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:38:28.2763665Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T20:38:28.2763803Z 1243 │ 2026-10-24T20:38:28.2763995Z 1244 │ {props.children} 2026-10-24T20:38:28.2764106Z ·  ───────────── 2026-10-24T20:38:28.2764181Z 1245 │ 2026-10-24T20:38:28.2764234Z ╰──── 2026-10-24T20:38:28.2764453Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:38:28.2764589Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:38:28.2764591Z 2026-10-24T20:38:28.2764815Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:38:28.2764935Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T20:38:28.2765038Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T20:38:28.2765166Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T20:38:28.2765323Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T20:38:28.2765381Z 347 │ }; 2026-10-24T20:38:28.2765434Z ╰──── 2026-10-24T20:38:28.2765694Z  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-24T20:38:28.2765697Z 2026-10-24T20:38:28.2765911Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T20:38:28.2766039Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T20:38:28.2766110Z 447 │ const favorites = 2026-10-24T20:38:28.2766219Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T20:38:28.2766308Z ·  ───┬── 2026-10-24T20:38:28.2766433Z · ╰── For this reduce 2026-10-24T20:38:28.2766515Z 449 │ const exists = current.some( 2026-10-24T20:38:28.2766685Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T20:38:28.2766744Z 451 │ ); 2026-10-24T20:38:28.2766816Z 452 │ return change.favorite 2026-10-24T20:38:28.2766879Z 453 │ ? exists 2026-10-24T20:38:28.2766940Z 454 │ ? current 2026-10-24T20:38:28.2767075Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T20:38:28.2767165Z ·  ─────┬──── 2026-10-24T20:38:28.2767286Z · ╰── From this spread 2026-10-24T20:38:28.2767352Z 456 │ : current.filter( 2026-10-24T20:38:28.2767404Z ╰──── 2026-10-24T20:38:28.2767605Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T20:38:28.2767762Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:38:28.2767765Z 2026-10-24T20:38:28.2767950Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T20:38:28.2768067Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T20:38:28.2768124Z 464 │ null; 2026-10-24T20:38:28.2768236Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T20:38:28.2768371Z ·  ──────────┬───────── 2026-10-24T20:38:28.2768532Z · ╰── From this accumulator 2026-10-24T20:38:28.2768632Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T20:38:28.2768700Z ·  ─┬─ 2026-10-24T20:38:28.2768803Z · ╰── For this loop 2026-10-24T20:38:28.2768938Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T20:38:28.2769006Z 468 │ hiddenModels: [], 2026-10-24T20:38:28.2769071Z 469 │ modelOrder: [], 2026-10-24T20:38:28.2769125Z 470 │ }; 2026-10-24T20:38:28.2769301Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T20:38:28.2769412Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T20:38:28.2769491Z 473 │ nextModelPreferences = { 2026-10-24T20:38:28.2769568Z 474 │ ...nextModelPreferences, 2026-10-24T20:38:28.2769663Z ·  ───────────┬─────────── 2026-10-24T20:38:28.2769789Z · ╰── From this spread 2026-10-24T20:38:28.2769902Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T20:38:28.2769952Z ╰──── 2026-10-24T20:38:28.2770104Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T20:38:28.2770256Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:38:28.2770259Z 2026-10-24T20:38:28.2770414Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2770567Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T20:38:28.2770669Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T20:38:28.2770764Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T20:38:28.2770874Z ·  ──────┬────── 2026-10-24T20:38:28.2771011Z · ╰── `pulseProgress` originates here 2026-10-24T20:38:28.2771064Z 55 │ 2026-10-24T20:38:28.2771129Z 56 │ useEffect(() => { 2026-10-24T20:38:28.2771193Z 57 │ if (pulse) { 2026-10-24T20:38:28.2771278Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T20:38:28.2771357Z ·  ──────┬────── 2026-10-24T20:38:28.2771501Z · ╰── `pulseProgress` cannot be modified 2026-10-24T20:38:28.2771568Z 59 │ withTiming(1, { 2026-10-24T20:38:28.2771617Z ╰──── 2026-10-24T20:38:28.2771931Z  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-24T20:38:28.2772262Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2772264Z 2026-10-24T20:38:28.2772517Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2772665Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T20:38:28.2772821Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T20:38:28.2772885Z 29 │ useEffect(() => { 2026-10-24T20:38:28.2772955Z ·  ────┬──── 2026-10-24T20:38:28.2773087Z · ╰── This is the containing effect 2026-10-24T20:38:28.2773211Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T20:38:28.2773314Z ·  ───┬─── 2026-10-24T20:38:28.2773500Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2773572Z 31 │ }, [key, live, snapshot]); 2026-10-24T20:38:28.2773622Z ╰──── 2026-10-24T20:38:28.2774208Z  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-24T20:38:28.2774527Z  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-24T20:38:28.2774532Z 2026-10-24T20:38:28.2774998Z ⚠ 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-24T20:38:28.2775121Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T20:38:28.2775196Z 138 │ Effect.gen(function* () { 2026-10-24T20:38:28.2775391Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T20:38:28.2775516Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T20:38:28.2775843Z 141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock 2026-10-24T20:38:28.2776031Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T20:38:28.2776157Z 143 │ ╰─▶ } 2026-10-24T20:38:28.2776244Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T20:38:28.2776297Z ╰──── 2026-10-24T20:38:28.2776300Z 2026-10-24T20:38:28.2776756Z ⚠ 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-24T20:38:28.2776931Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T20:38:28.2777058Z 222 │ let idlePasses = 0; 2026-10-24T20:38:28.2777227Z 223 │ ╭─▶ for (;;) { 2026-10-24T20:38:28.2777361Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T20:38:28.2777502Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T20:38:28.2777597Z 226 │ │ if (!pending) { 2026-10-24T20:38:28.2777691Z 227 │ │ idlePasses++; 2026-10-24T20:38:28.2777795Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T20:38:28.2777880Z 229 │ │ return; 2026-10-24T20:38:28.2777959Z 230 │ │ } 2026-10-24T20:38:28.2778044Z 231 │ │ continue; 2026-10-24T20:38:28.2778120Z 232 │ │ } 2026-10-24T20:38:28.2778218Z 233 │ │ idlePasses = 0; 2026-10-24T20:38:28.2778336Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T20:38:28.2778547Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T20:38:28.2778624Z 236 │ │ ); 2026-10-24T20:38:28.2778728Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T20:38:28.2778832Z 238 │ │ pending.resolve(exit); 2026-10-24T20:38:28.2778908Z 239 │ │ }); 2026-10-24T20:38:28.2779035Z 240 │ ╰─▶ } 2026-10-24T20:38:28.2779090Z 241 │ }, 2026-10-24T20:38:28.2779144Z ╰──── 2026-10-24T20:38:28.2779146Z 2026-10-24T20:38:28.2779418Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2779529Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T20:38:28.2779580Z 35 │ 2026-10-24T20:38:28.2779709Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T20:38:28.2779783Z ·  ─────┬──── 2026-10-24T20:38:28.2779918Z · ╰── 'claudeCaps' is declared here 2026-10-24T20:38:28.2779984Z 37 │ optionDescriptors: [ 2026-10-24T20:38:28.2780036Z ╰──── 2026-10-24T20:38:28.2780138Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2780140Z 2026-10-24T20:38:28.2780307Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2780469Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T20:38:28.2780647Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T20:38:28.2780812Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T20:38:28.2780983Z ·  ─────┬──── 2026-10-24T20:38:28.2781169Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2781301Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T20:38:28.2781353Z ╰──── 2026-10-24T20:38:28.2781686Z  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-24T20:38:28.2782003Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2782005Z 2026-10-24T20:38:28.2782167Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2782320Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T20:38:28.2782399Z 718 │ const snoozePresets = useMemo( 2026-10-24T20:38:28.2782575Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T20:38:28.2782706Z ·  ─────┬──── 2026-10-24T20:38:28.2782885Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2783003Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T20:38:28.2783053Z ╰──── 2026-10-24T20:38:28.2783326Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2783610Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2783615Z 2026-10-24T20:38:28.2783790Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:38:28.2783944Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T20:38:28.2784121Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T20:38:28.2784235Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T20:38:28.2784324Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2784498Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T20:38:28.2784552Z 721 │ ); 2026-10-24T20:38:28.2784602Z ╰──── 2026-10-24T20:38:28.2784910Z  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-24T20:38:28.2785216Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2785219Z 2026-10-24T20:38:28.2785400Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:38:28.2785551Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T20:38:28.2785618Z 765 │ thread.pinnedAt, 2026-10-24T20:38:28.2785680Z 766 │ variant, 2026-10-24T20:38:28.2785752Z ·  ───┬─── 2026-10-24T20:38:28.2785885Z · ╰── Unnecessary dependency `variant` 2026-10-24T20:38:28.2785940Z 767 │ ], 2026-10-24T20:38:28.2785993Z ╰──── 2026-10-24T20:38:28.2786299Z  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-24T20:38:28.2786603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2786652Z 2026-10-24T20:38:28.2786871Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.2787027Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T20:38:28.2787157Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T20:38:28.2787289Z 1216 │ 2026-10-24T20:38:28.2787402Z ·  ────────────────────────── 2026-10-24T20:38:28.2787509Z 1217 │ 2026-10-24T20:38:28.2787562Z ╰──── 2026-10-24T20:38:28.2787707Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:38:28.2787710Z 2026-10-24T20:38:28.2787968Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2788102Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2195:5] 2026-10-24T20:38:28.2788156Z 2193 │ ); 2026-10-24T20:38:28.2788221Z 2194 │ useEffect(() => { 2026-10-24T20:38:28.2788295Z ·  ────┬──── 2026-10-24T20:38:28.2788421Z · ╰── This is the containing effect 2026-10-24T20:38:28.2788494Z 2195 │ setExpandedVideo(null); 2026-10-24T20:38:28.2788575Z ·  ────────┬─────── 2026-10-24T20:38:28.2788743Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2788814Z 2196 │ setExpandedFile(null); 2026-10-24T20:38:28.2788865Z ╰──── 2026-10-24T20:38:28.2789456Z  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-24T20:38:28.2789771Z  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-24T20:38:28.2789774Z 2026-10-24T20:38:28.2790024Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2790157Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2700:9] 2026-10-24T20:38:28.2790293Z 2691 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T20:38:28.2790362Z 2692 │ useEffect(() => { 2026-10-24T20:38:28.2790440Z ·  ────┬──── 2026-10-24T20:38:28.2790566Z · ╰── This is the containing effect 2026-10-24T20:38:28.2790692Z 2693 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T20:38:28.2790787Z 2694 │ const index = presentedFeed.findIndex( 2026-10-24T20:38:28.2790945Z 2695 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T20:38:28.2790999Z 2696 │ ); 2026-10-24T20:38:28.2791068Z 2697 │ if (index === -1) { 2026-10-24T20:38:28.2791193Z 2698 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T20:38:28.2791392Z 2699 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T20:38:28.2791483Z 2700 │ setInteractionState((current) => ({ 2026-10-24T20:38:28.2791666Z ·  ─────────┬───────── 2026-10-24T20:38:28.2791878Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2791942Z 2701 │ ...current, 2026-10-24T20:38:28.2791990Z ╰──── 2026-10-24T20:38:28.2792572Z  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-24T20:38:28.2792885Z  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-24T20:38:28.2792888Z 2026-10-24T20:38:28.2793115Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T20:38:28.2793249Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-24T20:38:28.2793380Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T20:38:28.2793516Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T20:38:28.2793611Z ·  ───────────┬─────────── 2026-10-24T20:38:28.2793775Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T20:38:28.2793928Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T20:38:28.2793980Z ╰──── 2026-10-24T20:38:28.2794078Z  help: Consider removing this import. 2026-10-24T20:38:28.2794081Z 2026-10-24T20:38:28.2794289Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T20:38:28.2794419Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-24T20:38:28.2794477Z 95 │ import { 2026-10-24T20:38:28.2794543Z 96 │ createContext, 2026-10-24T20:38:28.2794617Z ·  ──────┬────── 2026-10-24T20:38:28.2794750Z · ╰── 'createContext' is imported here 2026-10-24T20:38:28.2794807Z 97 │ memo, 2026-10-24T20:38:28.2794861Z ╰──── 2026-10-24T20:38:28.2794957Z  help: Consider removing this import. 2026-10-24T20:38:28.2794960Z 2026-10-24T20:38:28.2795165Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T20:38:28.2795298Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-24T20:38:28.2795357Z 111 │ import { 2026-10-24T20:38:28.2795479Z 112 │ ActivityIndicator, 2026-10-24T20:38:28.2795610Z ·  ────────┬──────── 2026-10-24T20:38:28.2795784Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T20:38:28.2795841Z 113 │ Image, 2026-10-24T20:38:28.2795891Z ╰──── 2026-10-24T20:38:28.2795983Z  help: Consider removing this import. 2026-10-24T20:38:28.2795986Z 2026-10-24T20:38:28.2796180Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T20:38:28.2796311Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-24T20:38:28.2796373Z 118 │ Pressable, 2026-10-24T20:38:28.2796433Z 119 │ ScrollView, 2026-10-24T20:38:28.2796507Z ·  ─────┬──── 2026-10-24T20:38:28.2796646Z · ╰── 'ScrollView' is imported here 2026-10-24T20:38:28.2796712Z 120 │ StyleSheet, 2026-10-24T20:38:28.2796760Z ╰──── 2026-10-24T20:38:28.2796853Z  help: Consider removing this import. 2026-10-24T20:38:28.2796856Z 2026-10-24T20:38:28.2797048Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T20:38:28.2797179Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-24T20:38:28.2797238Z 120 │ StyleSheet, 2026-10-24T20:38:28.2797303Z 121 │ Text as NativeText, 2026-10-24T20:38:28.2797380Z ·  ─────┬──── 2026-10-24T20:38:28.2797512Z · ╰── 'NativeText' is imported here 2026-10-24T20:38:28.2797575Z 122 │ type ColorValue, 2026-10-24T20:38:28.2797627Z ╰──── 2026-10-24T20:38:28.2797726Z  help: Consider removing this import. 2026-10-24T20:38:28.2797731Z 2026-10-24T20:38:28.2797940Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T20:38:28.2798069Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-24T20:38:28.2798201Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T20:38:28.2798325Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T20:38:28.2798414Z ·  ─────────┬──────── 2026-10-24T20:38:28.2798562Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T20:38:28.2798708Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T20:38:28.2798758Z ╰──── 2026-10-24T20:38:28.2798856Z  help: Consider removing this import. 2026-10-24T20:38:28.2798861Z 2026-10-24T20:38:28.2799073Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T20:38:28.2799201Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-24T20:38:28.2799335Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T20:38:28.2799456Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T20:38:28.2799544Z ·  ─────────┬───────── 2026-10-24T20:38:28.2799693Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T20:38:28.2799751Z 148 │ import { 2026-10-24T20:38:28.2799802Z ╰──── 2026-10-24T20:38:28.2799895Z  help: Consider removing this import. 2026-10-24T20:38:28.2799898Z 2026-10-24T20:38:28.2800157Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T20:38:28.2800360Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-24T20:38:28.2800506Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T20:38:28.2800639Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T20:38:28.2800724Z ·  ────────┬─────── 2026-10-24T20:38:28.2800902Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T20:38:28.2801051Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T20:38:28.2801104Z ╰──── 2026-10-24T20:38:28.2801196Z  help: Consider removing this import. 2026-10-24T20:38:28.2801198Z 2026-10-24T20:38:28.2801423Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T20:38:28.2801555Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-24T20:38:28.2801635Z 164 │ attachmentVideoPreviewSource, 2026-10-24T20:38:28.2801704Z 165 │ mediaVideoPreviewUri, 2026-10-24T20:38:28.2801787Z ·  ──────────┬───────── 2026-10-24T20:38:28.2801936Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T20:38:28.2802006Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:38:28.2802055Z ╰──── 2026-10-24T20:38:28.2802148Z  help: Consider removing this import. 2026-10-24T20:38:28.2802150Z 2026-10-24T20:38:28.2802370Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T20:38:28.2802503Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-24T20:38:28.2802572Z 165 │ mediaVideoPreviewUri, 2026-10-24T20:38:28.2802639Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:38:28.2802726Z ·  ───────────┬────────── 2026-10-24T20:38:28.2802880Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T20:38:28.2802958Z 167 │ type MediaVideoPreviewSource, 2026-10-24T20:38:28.2803007Z ╰──── 2026-10-24T20:38:28.2803099Z  help: Consider removing this import. 2026-10-24T20:38:28.2803101Z 2026-10-24T20:38:28.2803310Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T20:38:28.2803437Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-24T20:38:28.2803510Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:38:28.2803591Z 167 │ type MediaVideoPreviewSource, 2026-10-24T20:38:28.2803683Z ·  ───────────┬─────────── 2026-10-24T20:38:28.2803843Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T20:38:28.2803927Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-24T20:38:28.2803976Z ╰──── 2026-10-24T20:38:28.2804070Z  help: Consider removing this import. 2026-10-24T20:38:28.2804072Z 2026-10-24T20:38:28.2804266Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T20:38:28.2804396Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:175:15] 2026-10-24T20:38:28.2804570Z 174 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T20:38:28.2804762Z 175 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T20:38:28.2804919Z ·  ───────┬─────── 2026-10-24T20:38:28.2805066Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T20:38:28.2805127Z 176 │ import { 2026-10-24T20:38:28.2805179Z ╰──── 2026-10-24T20:38:28.2805273Z  help: Consider removing this import. 2026-10-24T20:38:28.2805275Z 2026-10-24T20:38:28.2805498Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T20:38:28.2805629Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-24T20:38:28.2805687Z 189 │ import { 2026-10-24T20:38:28.2805761Z 190 │ resolveMarkdownFontSizes, 2026-10-24T20:38:28.2805855Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2806016Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T20:38:28.2806103Z 191 │ resolveNativeMarkdownTypography, 2026-10-24T20:38:28.2806155Z ╰──── 2026-10-24T20:38:28.2806246Z  help: Consider removing this import. 2026-10-24T20:38:28.2806249Z 2026-10-24T20:38:28.2806502Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T20:38:28.2806633Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:197:3] 2026-10-24T20:38:28.2806710Z 196 │ normalizeNativeMarkdownUrl, 2026-10-24T20:38:28.2806802Z 197 │ resolveMarkdownInlineCodePresentation, 2026-10-24T20:38:28.2806912Z ·  ──────────────────┬────────────────── 2026-10-24T20:38:28.2807111Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T20:38:28.2807199Z 198 │ resolveMarkdownLinkPresentation, 2026-10-24T20:38:28.2807248Z ╰──── 2026-10-24T20:38:28.2807344Z  help: Consider removing this import. 2026-10-24T20:38:28.2807346Z 2026-10-24T20:38:28.2807571Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T20:38:28.2807700Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:242:10] 2026-10-24T20:38:28.2807800Z 241 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T20:38:28.2807944Z 242 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T20:38:28.2808043Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2808257Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T20:38:28.2808381Z 243 │ import { 2026-10-24T20:38:28.2808432Z ╰──── 2026-10-24T20:38:28.2808528Z  help: Consider removing this import. 2026-10-24T20:38:28.2808530Z 2026-10-24T20:38:28.2808738Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T20:38:28.2808868Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:246:3] 2026-10-24T20:38:28.2808930Z 245 │ useAssetUrl, 2026-10-24T20:38:28.2808998Z 246 │ useAssetUrlState, 2026-10-24T20:38:28.2809077Z ·  ────────┬─────── 2026-10-24T20:38:28.2809215Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T20:38:28.2809283Z 247 │ useRefreshAssetUrl, 2026-10-24T20:38:28.2809335Z ╰──── 2026-10-24T20:38:28.2809435Z  help: Consider removing this import. 2026-10-24T20:38:28.2809441Z 2026-10-24T20:38:28.2809638Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2809769Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2197:7] 2026-10-24T20:38:28.2809843Z 2196 │ setExpandedFile(null); 2026-10-24T20:38:28.2809998Z 2197 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T20:38:28.2810222Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T20:38:28.2810508Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T20:38:28.2810711Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T20:38:28.2810893Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T20:38:28.2811061Z 2198 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T20:38:28.2811112Z ╰──── 2026-10-24T20:38:28.2811403Z  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-24T20:38:28.2811712Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2811714Z 2026-10-24T20:38:28.2811913Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2812052Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2669:7] 2026-10-24T20:38:28.2812150Z 2668 │ reportHeaderMaterialVisibility(false); 2026-10-24T20:38:28.2812264Z 2669 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T20:38:28.2812346Z ·  ──────┬────── 2026-10-24T20:38:28.2812492Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T20:38:28.2812547Z 2670 │ 2026-10-24T20:38:28.2812600Z ╰──── 2026-10-24T20:38:28.2812886Z  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-24T20:38:28.2813244Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2813282Z 2026-10-24T20:38:28.2813508Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2813641Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-24T20:38:28.2813697Z 2684 │ } 2026-10-24T20:38:28.2813825Z 2685 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T20:38:28.2813903Z ·  ──────┬───── 2026-10-24T20:38:28.2814049Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T20:38:28.2814190Z 2686 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T20:38:28.2814243Z ╰──── 2026-10-24T20:38:28.2814536Z  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-24T20:38:28.2814841Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2814843Z 2026-10-24T20:38:28.2815039Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2815170Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2881:7] 2026-10-24T20:38:28.2815226Z 2880 │ } 2026-10-24T20:38:28.2815405Z 2881 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T20:38:28.2815602Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T20:38:28.2815855Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T20:38:28.2816059Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T20:38:28.2816210Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T20:38:28.2816262Z 2882 │ 2026-10-24T20:38:28.2816315Z ╰──── 2026-10-24T20:38:28.2816600Z  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-24T20:38:28.2816904Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2816907Z 2026-10-24T20:38:28.2817089Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:38:28.2817223Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:627:9] 2026-10-24T20:38:28.2817281Z 626 │ }; 2026-10-24T20:38:28.2817398Z 627 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T20:38:28.2817582Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T20:38:28.2817819Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T20:38:28.2818011Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T20:38:28.2818224Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T20:38:28.2818348Z 628 │ ); 2026-10-24T20:38:28.2818398Z ╰──── 2026-10-24T20:38:28.2818704Z  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-24T20:38:28.2819009Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2819011Z 2026-10-24T20:38:28.2819236Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T20:38:28.2819363Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T20:38:28.2819432Z 14 │ threadSearchMatchKey, 2026-10-24T20:38:28.2819518Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T20:38:28.2819626Z ·  ──────────────┬───────────── 2026-10-24T20:38:28.2819799Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T20:38:28.2819910Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T20:38:28.2819963Z ╰──── 2026-10-24T20:38:28.2820059Z  help: Consider removing this import. 2026-10-24T20:38:28.2820062Z 2026-10-24T20:38:28.2820257Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2820384Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T20:38:28.2820514Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T20:38:28.2820605Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T20:38:28.2820709Z ·  ───────┬────── 2026-10-24T20:38:28.2820883Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:38:28.2821052Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T20:38:28.2821104Z ╰──── 2026-10-24T20:38:28.2821392Z  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-24T20:38:28.2821692Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2821695Z 2026-10-24T20:38:28.2821862Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2821993Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T20:38:28.2822081Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T20:38:28.2822239Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T20:38:28.2822360Z ·  ─────┬──── 2026-10-24T20:38:28.2822523Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2822602Z 519 │ const id = setTimeout(() => { 2026-10-24T20:38:28.2822653Z ╰──── 2026-10-24T20:38:28.2822931Z  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-24T20:38:28.2823271Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2823308Z 2026-10-24T20:38:28.2823570Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T20:38:28.2823697Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T20:38:28.2823874Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T20:38:28.2823970Z 35 │ instanceId === configured ? true : false, 2026-10-24T20:38:28.2824086Z ·  ──────────────────────────────────────── 2026-10-24T20:38:28.2824141Z 36 │ ); 2026-10-24T20:38:28.2824191Z ╰──── 2026-10-24T20:38:28.2824284Z  help: Remove this ternary operator 2026-10-24T20:38:28.2824287Z 2026-10-24T20:38:28.2824546Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2824698Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T20:38:28.2824831Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T20:38:28.2824895Z 356 │ useEffect(() => { 2026-10-24T20:38:28.2824966Z ·  ────┬──── 2026-10-24T20:38:28.2825095Z · ╰── This is the containing effect 2026-10-24T20:38:28.2825182Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T20:38:28.2825244Z 358 │ return; 2026-10-24T20:38:28.2825299Z 359 │ } 2026-10-24T20:38:28.2825397Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T20:38:28.2825489Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T20:38:28.2825593Z ·  ──────────────┬────────────── 2026-10-24T20:38:28.2825774Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2825838Z 362 │ return; 2026-10-24T20:38:28.2825887Z ╰──── 2026-10-24T20:38:28.2826482Z  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-24T20:38:28.2826798Z  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-24T20:38:28.2826800Z 2026-10-24T20:38:28.2827101Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2827323Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T20:38:28.2827375Z 447 │ 2026-10-24T20:38:28.2827440Z 448 │ useEffect(() => { 2026-10-24T20:38:28.2827511Z ·  ────┬──── 2026-10-24T20:38:28.2827638Z · ╰── This is the containing effect 2026-10-24T20:38:28.2827738Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T20:38:28.2827798Z 450 │ return; 2026-10-24T20:38:28.2827852Z 451 │ } 2026-10-24T20:38:28.2827992Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T20:38:28.2828121Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T20:38:28.2828227Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T20:38:28.2828287Z 455 │ } 2026-10-24T20:38:28.2828429Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T20:38:28.2828551Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T20:38:28.2828655Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T20:38:28.2828726Z 459 │ const directProject = 2026-10-24T20:38:28.2828793Z 460 │ projects.find( 2026-10-24T20:38:28.2828856Z 461 │ (project) => 2026-10-24T20:38:28.2829030Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T20:38:28.2829093Z 463 │ ) ?? null; 2026-10-24T20:38:28.2829148Z 464 │ 2026-10-24T20:38:28.2829214Z 465 │ if (directProject) { 2026-10-24T20:38:28.2829352Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T20:38:28.2829493Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T20:38:28.2829656Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T20:38:28.2829788Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T20:38:28.2829853Z 470 │ return; 2026-10-24T20:38:28.2829911Z 471 │ } 2026-10-24T20:38:28.2830007Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T20:38:28.2830066Z 473 │ if ( 2026-10-24T20:38:28.2830208Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T20:38:28.2830307Z 475 │ selectedProject.id !== directProject.id 2026-10-24T20:38:28.2830368Z 476 │ ) { 2026-10-24T20:38:28.2830450Z 477 │ setProject(directProject); 2026-10-24T20:38:28.2830513Z 478 │ return; 2026-10-24T20:38:28.2830577Z 479 │ } 2026-10-24T20:38:28.2830659Z 480 │ if (!flow.draftKey) return; 2026-10-24T20:38:28.2830797Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T20:38:28.2830982Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T20:38:28.2831091Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T20:38:28.2831168Z 484 │ workspaceSelection: { 2026-10-24T20:38:28.2831285Z 485 │ mode: "local", 2026-10-24T20:38:28.2831425Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T20:38:28.2831559Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T20:38:28.2831639Z 488 │ startFromOrigin: false, 2026-10-24T20:38:28.2831700Z 489 │ }, 2026-10-24T20:38:28.2831825Z 490 │ }); 2026-10-24T20:38:28.2831961Z 491 │ } 2026-10-24T20:38:28.2832121Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T20:38:28.2832182Z 493 │ if ( 2026-10-24T20:38:28.2832323Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T20:38:28.2832421Z 495 │ selectedProject.id === directProject.id 2026-10-24T20:38:28.2832478Z 496 │ ) { 2026-10-24T20:38:28.2832542Z 497 │ return; 2026-10-24T20:38:28.2832598Z 498 │ } 2026-10-24T20:38:28.2832678Z 499 │ setProject(directProject); 2026-10-24T20:38:28.2832738Z 500 │ return; 2026-10-24T20:38:28.2832794Z 501 │ } 2026-10-24T20:38:28.2832847Z 502 │ 2026-10-24T20:38:28.2832926Z 503 │ if (projects.length > 0) { 2026-10-24T20:38:28.2833025Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T20:38:28.2833135Z ·  ──────────────┬────────────── 2026-10-24T20:38:28.2833313Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2833369Z 505 │ } 2026-10-24T20:38:28.2833420Z ╰──── 2026-10-24T20:38:28.2834007Z  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-24T20:38:28.2834326Z  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-24T20:38:28.2834329Z 2026-10-24T20:38:28.2834588Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2834741Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T20:38:28.2834792Z 545 │ 2026-10-24T20:38:28.2834857Z 546 │ useEffect(() => { 2026-10-24T20:38:28.2834928Z ·  ────┬──── 2026-10-24T20:38:28.2835053Z · ╰── This is the containing effect 2026-10-24T20:38:28.2835147Z 547 │ const shareId = props.incomingShareId; 2026-10-24T20:38:28.2835229Z 548 │ const draftKey = flow.draftKey; 2026-10-24T20:38:28.2835332Z 549 │ const destinationProject = selectedProject; 2026-10-24T20:38:28.2835468Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T20:38:28.2835597Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T20:38:28.2835688Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T20:38:28.2835765Z 553 │ !initialEnvironmentId || 2026-10-24T20:38:28.2835833Z 554 │ !initialProjectId || 2026-10-24T20:38:28.2835962Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T20:38:28.2836065Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T20:38:28.2836123Z 557 │ if ( 2026-10-24T20:38:28.2836184Z 558 │ !shareId || 2026-10-24T20:38:28.2836248Z 559 │ !draftKey || 2026-10-24T20:38:28.2836321Z 560 │ !destinationProject || 2026-10-24T20:38:28.2836407Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T20:38:28.2836496Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T20:38:28.2836551Z 563 │ ) { 2026-10-24T20:38:28.2836612Z 564 │ return; 2026-10-24T20:38:28.2836719Z 565 │ } 2026-10-24T20:38:28.2836878Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T20:38:28.2836935Z 567 │ if ( 2026-10-24T20:38:28.2837047Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T20:38:28.2837156Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T20:38:28.2837209Z 570 │ ) { 2026-10-24T20:38:28.2837269Z 571 │ return; 2026-10-24T20:38:28.2837323Z 572 │ } 2026-10-24T20:38:28.2837373Z 573 │ 2026-10-24T20:38:28.2837441Z 574 │ if (!incomingShare) { 2026-10-24T20:38:28.2837635Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T20:38:28.2837761Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T20:38:28.2837825Z 577 │ Dialog.alert( 2026-10-24T20:38:28.2837914Z 578 │ "Shared content unavailable", 2026-10-24T20:38:28.2838090Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T20:38:28.2838149Z 580 │ ); 2026-10-24T20:38:28.2838202Z 581 │ } 2026-10-24T20:38:28.2838263Z 582 │ return; 2026-10-24T20:38:28.2838318Z 583 │ } 2026-10-24T20:38:28.2838372Z 584 │ 2026-10-24T20:38:28.2838426Z 585 │ if ( 2026-10-24T20:38:28.2838584Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T20:38:28.2838684Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T20:38:28.2838738Z 588 │ ) { 2026-10-24T20:38:28.2838795Z 589 │ return; 2026-10-24T20:38:28.2838850Z 590 │ } 2026-10-24T20:38:28.2838902Z 591 │ 2026-10-24T20:38:28.2839036Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T20:38:28.2839159Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T20:38:28.2839218Z 594 │ } 2026-10-24T20:38:28.2839325Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T20:38:28.2839391Z 596 │ const draftBackup = 2026-10-24T20:38:28.2839577Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T20:38:28.2839711Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T20:38:28.2839800Z 599 │ const importToken = Symbol(importKey); 2026-10-24T20:38:28.2839876Z 600 │ let didReserveShare = false; 2026-10-24T20:38:28.2839952Z 601 │ let didConsumeShare = false; 2026-10-24T20:38:28.2840032Z 602 │ let needsDraftRestore = false; 2026-10-24T20:38:28.2840140Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T20:38:28.2840226Z 604 │ setImportingShareKey(importKey); 2026-10-24T20:38:28.2840316Z ·  ──────────┬───────── 2026-10-24T20:38:28.2840490Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2840559Z 605 │ void (async () => { 2026-10-24T20:38:28.2840610Z ╰──── 2026-10-24T20:38:28.2841231Z  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-24T20:38:28.2841547Z  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-24T20:38:28.2841550Z 2026-10-24T20:38:28.2841800Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2842042Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T20:38:28.2842116Z 523 │ props.initialProjectRef, 2026-10-24T20:38:28.2842189Z 524 │ props.incomingShareId, 2026-10-24T20:38:28.2842277Z ·  ──────────┬────────── 2026-10-24T20:38:28.2842442Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T20:38:28.2842511Z 525 │ props.pendingTaskId, 2026-10-24T20:38:28.2842562Z ╰──── 2026-10-24T20:38:28.2842851Z  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-24T20:38:28.2843163Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2843168Z 2026-10-24T20:38:28.2843384Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.2843531Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T20:38:28.2843646Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T20:38:28.2843715Z 543 │ flow.loadBranches(); 2026-10-24T20:38:28.2843784Z ·  ──┬─ 2026-10-24T20:38:28.2843903Z · ╰── Missing dependency `flow` 2026-10-24T20:38:28.2843996Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T20:38:28.2844081Z ·  ────────┬──────── 2026-10-24T20:38:28.2844284Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T20:38:28.2844339Z 545 │ 2026-10-24T20:38:28.2844391Z ╰──── 2026-10-24T20:38:28.2844809Z  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-24T20:38:28.2845115Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2845118Z 2026-10-24T20:38:28.2845313Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2845461Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T20:38:28.2845532Z 765 │ flow.draftKey, 2026-10-24T20:38:28.2845611Z 766 │ hasImportedIncomingShare, 2026-10-24T20:38:28.2845703Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2845872Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T20:38:28.2845938Z 767 │ incomingShare, 2026-10-24T20:38:28.2846017Z 768 │ isIncomingShareInboxLoading, 2026-10-24T20:38:28.2846111Z ·  ─────────────┬───────────── 2026-10-24T20:38:28.2846289Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T20:38:28.2846369Z 769 │ isIncomingShareUnavailable, 2026-10-24T20:38:28.2846441Z 770 │ props.incomingShareId, 2026-10-24T20:38:28.2846533Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T20:38:28.2846680Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T20:38:28.2846816Z 773 │ releaseShareReservation, 2026-10-24T20:38:28.2846880Z 774 │ reserveShare, 2026-10-24T20:38:28.2846964Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T20:38:28.2847032Z 776 │ selectedProject, 2026-10-24T20:38:28.2847101Z 777 │ shareImportAttempt, 2026-10-24T20:38:28.2847187Z ·  ─────────┬──────── 2026-10-24T20:38:28.2847347Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T20:38:28.2847403Z 778 │ ]); 2026-10-24T20:38:28.2847455Z ╰──── 2026-10-24T20:38:28.2847744Z  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-24T20:38:28.2848053Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2848060Z 2026-10-24T20:38:28.2848266Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:38:28.2848407Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T20:38:28.2848532Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T20:38:28.2848639Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T20:38:28.2848746Z ·  ─────── 2026-10-24T20:38:28.2848857Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T20:38:28.2848909Z ╰──── 2026-10-24T20:38:28.2849171Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:38:28.2849176Z 2026-10-24T20:38:28.2849427Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T20:38:28.2849570Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T20:38:28.2849724Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T20:38:28.2849803Z 12 │ this.onmessage = listener; 2026-10-24T20:38:28.2849881Z ·  ───────── 2026-10-24T20:38:28.2849937Z 13 │ } 2026-10-24T20:38:28.2849990Z ╰──── 2026-10-24T20:38:28.2850299Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T20:38:28.2850301Z 2026-10-24T20:38:28.2850507Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T20:38:28.2850646Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T20:38:28.2850712Z 15 │ constructor() { 2026-10-24T20:38:28.2850777Z 16 │ source = this; 2026-10-24T20:38:28.2850880Z ·  ────── 2026-10-24T20:38:28.2850935Z 17 │ } 2026-10-24T20:38:28.2850995Z ╰──── 2026-10-24T20:38:28.2851266Z  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-24T20:38:28.2851269Z 2026-10-24T20:38:28.2851415Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.2851576Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T20:38:28.2851820Z 53 │ const child = children as ReactElement>; 2026-10-24T20:38:28.2851995Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T20:38:28.2852099Z 55 │ │ onTouchStart: (event) => { 2026-10-24T20:38:28.2852254Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T20:38:28.2852409Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T20:38:28.2852535Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T20:38:28.2852702Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T20:38:28.2852817Z 60 │ │ pendingPress.current = null; 2026-10-24T20:38:28.2852938Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T20:38:28.2853014Z 62 │ │ }, 2026-10-24T20:38:28.2853112Z 63 │ │ onPress: (event) => { 2026-10-24T20:38:28.2853277Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T20:38:28.2853413Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T20:38:28.2853575Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T20:38:28.2853762Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T20:38:28.2853850Z 68 │ │ return; 2026-10-24T20:38:28.2853929Z 69 │ │ } 2026-10-24T20:38:28.2854071Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T20:38:28.2854235Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T20:38:28.2854399Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T20:38:28.2854495Z 73 │ │ event.persist(); 2026-10-24T20:38:28.2854652Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T20:38:28.2854737Z 75 │ │ return; 2026-10-24T20:38:28.2854814Z 76 │ │ } 2026-10-24T20:38:28.2854925Z 77 │ │ child.props.onPress?.(event); 2026-10-24T20:38:28.2855001Z 78 │ │ }, 2026-10-24T20:38:28.2855179Z 79 │ ├─▶ }); 2026-10-24T20:38:28.2855488Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.2855590Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T20:38:28.2855645Z ╰──── 2026-10-24T20:38:28.2856107Z  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-24T20:38:28.2856395Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.2856398Z 2026-10-24T20:38:28.2856614Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.2856757Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T20:38:28.2856858Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T20:38:28.2856985Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T20:38:28.2857080Z ·  ────────────┬──────────── 2026-10-24T20:38:28.2857247Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T20:38:28.2857304Z 774 │ } 2026-10-24T20:38:28.2857503Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T20:38:28.2857610Z ·  ────────────────┬──────────────── 2026-10-24T20:38:28.2857892Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T20:38:28.2857950Z 776 │ 2026-10-24T20:38:28.2858004Z ╰──── 2026-10-24T20:38:28.2858422Z  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-24T20:38:28.2858726Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2858731Z 2026-10-24T20:38:28.2858886Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2859032Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T20:38:28.2859190Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T20:38:28.2859325Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T20:38:28.2859412Z ·  ──────────┬───────── 2026-10-24T20:38:28.2859565Z · ╰── `animatedBorderRadius` originates here 2026-10-24T20:38:28.2859719Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T20:38:28.2859790Z 390 │ useLayoutEffect(() => { 2026-10-24T20:38:28.2859888Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T20:38:28.2859975Z ·  ──────────┬───────── 2026-10-24T20:38:28.2860129Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T20:38:28.2860267Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T20:38:28.2860402Z ╰──── 2026-10-24T20:38:28.2860666Z  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-24T20:38:28.2861010Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2861013Z 2026-10-24T20:38:28.2861212Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T20:38:28.2861301Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T20:38:28.2861374Z 21 │ EnvironmentThreadShell, 2026-10-24T20:38:28.2861441Z 22 │ ThreadRunSummary, 2026-10-24T20:38:28.2861521Z ·  ────────┬─────── 2026-10-24T20:38:28.2861664Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T20:38:28.2861736Z 23 │ ThreadRuntimeSummary, 2026-10-24T20:38:28.2861789Z ╰──── 2026-10-24T20:38:28.2861888Z  help: Consider removing this import. 2026-10-24T20:38:28.2861890Z 2026-10-24T20:38:28.2862041Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2862194Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:38:28.2862249Z 83 │ 2026-10-24T20:38:28.2862341Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T20:38:28.2862418Z ·  ──────┬───── 2026-10-24T20:38:28.2862553Z · ╰── `cardCoverage` originates here 2026-10-24T20:38:28.2862634Z 85 │ const barHeightRef = useRef(0); 2026-10-24T20:38:28.2862719Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T20:38:28.2862804Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:38:28.2862895Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:38:28.2862962Z 89 │ if (!cardCoverage) { 2026-10-24T20:38:28.2863024Z 90 │ return; 2026-10-24T20:38:28.2863077Z 91 │ } 2026-10-24T20:38:28.2863240Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:38:28.2863341Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:38:28.2863498Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:38:28.2863571Z ·  ──────┬───── 2026-10-24T20:38:28.2863708Z · ╰── `cardCoverage` cannot be modified 2026-10-24T20:38:28.2863775Z 95 │ }, [cardCoverage]); 2026-10-24T20:38:28.2863833Z ╰──── 2026-10-24T20:38:28.2864125Z  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-24T20:38:28.2864428Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2864431Z 2026-10-24T20:38:28.2864582Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2864736Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T20:38:28.2864817Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T20:38:28.2864901Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:38:28.2864979Z ·  ─────┬──── 2026-10-24T20:38:28.2865163Z · ╰── `cardHeight` originates here 2026-10-24T20:38:28.2865322Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:38:28.2865388Z  89 │ if (!cardCoverage) { 2026-10-24T20:38:28.2865450Z  90 │ return; 2026-10-24T20:38:28.2865503Z  91 │ } 2026-10-24T20:38:28.2865663Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:38:28.2865762Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T20:38:28.2865917Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:38:28.2865983Z  95 │ }, [cardCoverage]); 2026-10-24T20:38:28.2866063Z  96 │ const handleBarLayout = useCallback( 2026-10-24T20:38:28.2866145Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2866271Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:38:28.2866342Z  99 │ notifyCoverage(); 2026-10-24T20:38:28.2866395Z 100 │ }, 2026-10-24T20:38:28.2866460Z 101 │ [notifyCoverage], 2026-10-24T20:38:28.2866515Z 102 │ ); 2026-10-24T20:38:28.2866601Z 103 │ const handleCardLayout = useCallback( 2026-10-24T20:38:28.2866679Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2866805Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:38:28.2866917Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T20:38:28.2866995Z ·  ─────┬──── 2026-10-24T20:38:28.2867126Z · ╰── `cardHeight` cannot be modified 2026-10-24T20:38:28.2867193Z 107 │ notifyCoverage(); 2026-10-24T20:38:28.2867247Z ╰──── 2026-10-24T20:38:28.2867513Z  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-24T20:38:28.2867813Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2867817Z 2026-10-24T20:38:28.2868012Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:38:28.2868165Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:38:28.2868249Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:38:28.2868339Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:38:28.2868439Z ·  ───┬─── 2026-10-24T20:38:28.2868678Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T20:38:28.2868746Z 89 │ if (!cardCoverage) { 2026-10-24T20:38:28.2868807Z 90 │ return; 2026-10-24T20:38:28.2868859Z 91 │ } 2026-10-24T20:38:28.2869020Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:38:28.2869119Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:38:28.2869273Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:38:28.2869345Z ·  ──────┬───── 2026-10-24T20:38:28.2869478Z · ╰── This modifies `cardCoverage` 2026-10-24T20:38:28.2869544Z 95 │ }, [cardCoverage]); 2026-10-24T20:38:28.2869597Z ╰──── 2026-10-24T20:38:28.2869982Z  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-24T20:38:28.2903854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2903867Z 2026-10-24T20:38:28.2904154Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:38:28.2904321Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:38:28.2904428Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:38:28.2904588Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:38:28.2904667Z ·  ──────┬───── 2026-10-24T20:38:28.2904813Z · ╰── This modifies `cardCoverage` 2026-10-24T20:38:28.2904884Z 95 │ }, [cardCoverage]); 2026-10-24T20:38:28.2904970Z 96 │ const handleBarLayout = useCallback( 2026-10-24T20:38:28.2905048Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2905152Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.2905369Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T20:38:28.2905493Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:38:28.2905545Z ╰──── 2026-10-24T20:38:28.2905878Z  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-24T20:38:28.2906189Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2906195Z 2026-10-24T20:38:28.2906389Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:38:28.2906547Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T20:38:28.2906635Z 103 │ const handleCardLayout = useCallback( 2026-10-24T20:38:28.2906714Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T20:38:28.2906817Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.2907030Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T20:38:28.2907154Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:38:28.2907272Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T20:38:28.2907348Z ·  ─────┬──── 2026-10-24T20:38:28.2907474Z · ╰── This modifies `cardHeight` 2026-10-24T20:38:28.2907541Z 107 │ notifyCoverage(); 2026-10-24T20:38:28.2907591Z ╰──── 2026-10-24T20:38:28.2907918Z  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-24T20:38:28.2908215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2908218Z 2026-10-24T20:38:28.2908451Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T20:38:28.2908712Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T20:38:28.2908905Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T20:38:28.2909079Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T20:38:28.2909164Z ·  ─────────────── 2026-10-24T20:38:28.2909220Z 518 │ ) 2026-10-24T20:38:28.2909270Z ╰──── 2026-10-24T20:38:28.2909418Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T20:38:28.2909421Z 2026-10-24T20:38:28.2909674Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2909829Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T20:38:28.2909944Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T20:38:28.2910014Z 38 │ useLayoutEffect(() => { 2026-10-24T20:38:28.2910088Z ·  ───────┬─────── 2026-10-24T20:38:28.2910214Z · ╰── This is the containing effect 2026-10-24T20:38:28.2910272Z 39 │ reset(); 2026-10-24T20:38:28.2910338Z 40 │ setInitialized(true); 2026-10-24T20:38:28.2910414Z ·  ───────┬────── 2026-10-24T20:38:28.2910579Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2910638Z 41 │ }, [reset]); 2026-10-24T20:38:28.2910688Z ╰──── 2026-10-24T20:38:28.2911416Z  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-24T20:38:28.2911736Z  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-24T20:38:28.2911739Z 2026-10-24T20:38:28.2911990Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2912142Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T20:38:28.2912193Z 88 │ 2026-10-24T20:38:28.2912259Z 89 │ useEffect(() => { 2026-10-24T20:38:28.2912325Z ·  ────┬──── 2026-10-24T20:38:28.2912449Z · ╰── This is the containing effect 2026-10-24T20:38:28.2912664Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T20:38:28.2912859Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T20:38:28.2912940Z 92 │ let active = true; 2026-10-24T20:38:28.2913033Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T20:38:28.2913115Z ·  ─────────┬───────── 2026-10-24T20:38:28.2913280Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2913430Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T20:38:28.2913478Z ╰──── 2026-10-24T20:38:28.2914065Z  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-24T20:38:28.2914380Z  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-24T20:38:28.2914383Z 2026-10-24T20:38:28.2914728Z ⚠ 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-24T20:38:28.2914860Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T20:38:28.2914991Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T20:38:28.2915134Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T20:38:28.2915253Z ·  ─────────────────── 2026-10-24T20:38:28.2915317Z 1787 │ cwd, 2026-10-24T20:38:28.2915366Z ╰──── 2026-10-24T20:38:28.2915370Z 2026-10-24T20:38:28.2915556Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.2915724Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T20:38:28.2915784Z 87 │
  • props.onEnd(y, success)); 2026-10-24T20:38:28.2916889Z 602 │ const gesture = Gesture.Pan() 2026-10-24T20:38:28.2916971Z ·  ─┬─ 2026-10-24T20:38:28.2917109Z · ╰── `Pan` may be a component 2026-10-24T20:38:28.2917182Z 603 │ .enabled(!props.disabled) 2026-10-24T20:38:28.2917231Z ╰──── 2026-10-24T20:38:28.2917500Z  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-24T20:38:28.2917978Z  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-24T20:38:28.2918014Z 2026-10-24T20:38:28.2918505Z ⚠ 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-24T20:38:28.2918636Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T20:38:28.2918690Z 93 │ ) { 2026-10-24T20:38:28.2918885Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.2919058Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T20:38:28.2919177Z 96 │ │ if (predicate(project)) return project; 2026-10-24T20:38:28.2919277Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2919395Z 98 │ ╰─▶ } 2026-10-24T20:38:28.2919536Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T20:38:28.2919585Z ╰──── 2026-10-24T20:38:28.2919587Z 2026-10-24T20:38:28.2919862Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:38:28.2920024Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T20:38:28.2920082Z 472 │ onFilters, 2026-10-24T20:38:28.2920155Z 473 │ authorOptions = [], 2026-10-24T20:38:28.2920231Z ·  ── 2026-10-24T20:38:28.2920294Z 474 │ labelOptions = [], 2026-10-24T20:38:28.2920343Z ╰──── 2026-10-24T20:38:28.2920651Z  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-24T20:38:28.2920654Z 2026-10-24T20:38:28.2920936Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:38:28.2921133Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T20:38:28.2921197Z 473 │ authorOptions = [], 2026-10-24T20:38:28.2921259Z 474 │ labelOptions = [], 2026-10-24T20:38:28.2921333Z ·  ── 2026-10-24T20:38:28.2921401Z 475 │ optionScope, 2026-10-24T20:38:28.2921450Z ╰──── 2026-10-24T20:38:28.2921751Z  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-24T20:38:28.2921754Z 2026-10-24T20:38:28.2921950Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T20:38:28.2922070Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T20:38:28.2922166Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T20:38:28.2922321Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T20:38:28.2922446Z 159 │ │ constructor(data: Record) { 2026-10-24T20:38:28.2922606Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T20:38:28.2922743Z 161 │ │ } 2026-10-24T20:38:28.2922865Z 162 │ ╰─▶ }, 2026-10-24T20:38:28.2922928Z 163 │ clipboard: { 2026-10-24T20:38:28.2922977Z ╰──── 2026-10-24T20:38:28.2923137Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T20:38:28.2923140Z 2026-10-24T20:38:28.2923301Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2923416Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T20:38:28.2923517Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T20:38:28.2923668Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T20:38:28.2923793Z ·  ─────┬──── 2026-10-24T20:38:28.2923959Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2924037Z 822 │ return AsyncResult.failure( 2026-10-24T20:38:28.2924086Z ╰──── 2026-10-24T20:38:28.2924355Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2924647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2924649Z 2026-10-24T20:38:28.2924813Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2924933Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T20:38:28.2925002Z 708 │ const wokeAt = resolved 2026-10-24T20:38:28.2925135Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T20:38:28.2925246Z ·  ─────┬──── 2026-10-24T20:38:28.2925403Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2925463Z 710 │ : null; 2026-10-24T20:38:28.2925513Z ╰──── 2026-10-24T20:38:28.2925781Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2926066Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2926068Z 2026-10-24T20:38:28.2926531Z ⚠ 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-24T20:38:28.2926684Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T20:38:28.2926740Z 27 │ ) { 2026-10-24T20:38:28.2926935Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.2927077Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T20:38:28.2927199Z 30 │ │ if (predicate(available)) return available; 2026-10-24T20:38:28.2927297Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2927461Z 32 │ ╰─▶ } 2026-10-24T20:38:28.2927704Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T20:38:28.2927753Z ╰──── 2026-10-24T20:38:28.2927757Z 2026-10-24T20:38:28.2927984Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T20:38:28.2928142Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T20:38:28.2928202Z 261 │ ): boolean { 2026-10-24T20:38:28.2928349Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T20:38:28.2928510Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T20:38:28.2928658Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T20:38:28.2928712Z ╰──── 2026-10-24T20:38:28.2928789Z  help: Switch to `Set` 2026-10-24T20:38:28.2928791Z 2026-10-24T20:38:28.2929043Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2929188Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T20:38:28.2929239Z 404 │ 2026-10-24T20:38:28.2929303Z 405 │ useEffect(() => { 2026-10-24T20:38:28.2929372Z ·  ────┬──── 2026-10-24T20:38:28.2929500Z · ╰── This is the containing effect 2026-10-24T20:38:28.2929590Z 406 │ setInspectorSelection((current) => { 2026-10-24T20:38:28.2929676Z ·  ──────────┬────────── 2026-10-24T20:38:28.2929850Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2929953Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T20:38:28.2930003Z ╰──── 2026-10-24T20:38:28.2930591Z  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-24T20:38:28.2930919Z  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-24T20:38:28.2930924Z 2026-10-24T20:38:28.2931162Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:38:28.2931313Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T20:38:28.2931471Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T20:38:28.2931635Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T20:38:28.2931729Z 535 │ │ 2026-10-24T20:38:28.2932321Z 540 │ ╰─▶ ); 2026-10-24T20:38:28.2932447Z 541 │ const FilesInspector = () => 2026-10-24T20:38:28.2932556Z ╰──── 2026-10-24T20:38:28.2932776Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T20:38:28.2932779Z 2026-10-24T20:38:28.2932985Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:38:28.2933134Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T20:38:28.2933190Z 540 │ ); 2026-10-24T20:38:28.2933351Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T20:38:28.2933496Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T20:38:28.2933606Z 543 │ │ 2026-10-24T20:38:28.2934531Z 551 │ ╰─▶ ) : null; 2026-10-24T20:38:28.2934678Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T20:38:28.2934733Z ╰──── 2026-10-24T20:38:28.2934945Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T20:38:28.2934948Z 2026-10-24T20:38:28.2935199Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2935345Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T20:38:28.2935401Z 568 │ }, []); 2026-10-24T20:38:28.2935464Z 569 │ useEffect(() => { 2026-10-24T20:38:28.2935534Z ·  ────┬──── 2026-10-24T20:38:28.2935660Z · ╰── This is the containing effect 2026-10-24T20:38:28.2935742Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T20:38:28.2935829Z ·  ───────────┬─────────── 2026-10-24T20:38:28.2936066Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2936222Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T20:38:28.2936273Z ╰──── 2026-10-24T20:38:28.2936856Z  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-24T20:38:28.2937172Z  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-24T20:38:28.2937175Z 2026-10-24T20:38:28.2937431Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2937580Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T20:38:28.2937732Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T20:38:28.2937794Z 964 │ useEffect(() => { 2026-10-24T20:38:28.2937863Z ·  ────┬──── 2026-10-24T20:38:28.2937988Z · ╰── This is the containing effect 2026-10-24T20:38:28.2938141Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T20:38:28.2938247Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T20:38:28.2938343Z ·  ─────────────┬──────────── 2026-10-24T20:38:28.2938521Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2938577Z 967 │ } 2026-10-24T20:38:28.2938626Z ╰──── 2026-10-24T20:38:28.2939211Z  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-24T20:38:28.2939526Z  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-24T20:38:28.2939529Z 2026-10-24T20:38:28.2939780Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2939935Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T20:38:28.2939988Z 1220 │ 2026-10-24T20:38:28.2940054Z 1221 │ useEffect(() => { 2026-10-24T20:38:28.2940125Z ·  ────┬──── 2026-10-24T20:38:28.2940252Z · ╰── This is the containing effect 2026-10-24T20:38:28.2940326Z 1222 │ setAnchorMessageId(null); 2026-10-24T20:38:28.2940409Z ·  ─────────┬──────── 2026-10-24T20:38:28.2940575Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2940654Z 1223 │ setSubmittedMessageId(null); 2026-10-24T20:38:28.2940703Z ╰──── 2026-10-24T20:38:28.2941380Z  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-24T20:38:28.2941765Z  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-24T20:38:28.2941767Z 2026-10-24T20:38:28.2941964Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2942111Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T20:38:28.2942193Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T20:38:28.2942289Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T20:38:28.2942426Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T20:38:28.2942633Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T20:38:28.2942789Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T20:38:28.2942914Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T20:38:28.2942963Z ╰──── 2026-10-24T20:38:28.2943250Z  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-24T20:38:28.2943555Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2943557Z 2026-10-24T20:38:28.2943750Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2943906Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T20:38:28.2943991Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T20:38:28.2944148Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T20:38:28.2944241Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2944415Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T20:38:28.2944520Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T20:38:28.2944571Z ╰──── 2026-10-24T20:38:28.2944857Z  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-24T20:38:28.2945167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2945171Z 2026-10-24T20:38:28.2945365Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2945516Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T20:38:28.2945583Z 1227 │ freeze.set(false); 2026-10-24T20:38:28.2945661Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T20:38:28.2945753Z ·  ────────┬──────── 2026-10-24T20:38:28.2945913Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T20:38:28.2945966Z 1229 │ 2026-10-24T20:38:28.2946015Z ╰──── 2026-10-24T20:38:28.2946348Z  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-24T20:38:28.2946715Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2946718Z 2026-10-24T20:38:28.2946870Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2947017Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T20:38:28.2947126Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T20:38:28.2947232Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T20:38:28.2947326Z ·  ───────────┬─────────── 2026-10-24T20:38:28.2947482Z · ╰── `floatingControlCoverage` originates here 2026-10-24T20:38:28.2947615Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T20:38:28.2947673Z 1056 │ ); 2026-10-24T20:38:28.2947736Z 1057 │ useEffect(() => { 2026-10-24T20:38:28.2947836Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T20:38:28.2947926Z ·  ───────────┬─────────── 2026-10-24T20:38:28.2948086Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T20:38:28.2948209Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T20:38:28.2948258Z ╰──── 2026-10-24T20:38:28.2948518Z  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-24T20:38:28.2948822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2948827Z 2026-10-24T20:38:28.2948980Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.2949128Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T20:38:28.2949309Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T20:38:28.2949433Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T20:38:28.2949541Z ·  ────────────────┬──────────────── 2026-10-24T20:38:28.2949724Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T20:38:28.2949850Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T20:38:28.2949906Z 1069 │ ); 2026-10-24T20:38:28.2949981Z 1070 │ useAnimatedReaction( 2026-10-24T20:38:28.2950042Z 1071 │ () => 2026-10-24T20:38:28.2950132Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T20:38:28.2950220Z 1073 │ floatingControlCoverage.value + 2026-10-24T20:38:28.2950413Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T20:38:28.2950476Z 1075 │ (value) => { 2026-10-24T20:38:28.2950586Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T20:38:28.2950694Z ·  ────────────────┬──────────────── 2026-10-24T20:38:28.2950908Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T20:38:28.2950975Z 1077 │ }, 2026-10-24T20:38:28.2951024Z ╰──── 2026-10-24T20:38:28.2951476Z  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-24T20:38:28.2951885Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.2951888Z 2026-10-24T20:38:28.2952140Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2952300Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T20:38:28.2952418Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T20:38:28.2952482Z 278 │ useEffect(() => { 2026-10-24T20:38:28.2952553Z ·  ────┬──── 2026-10-24T20:38:28.2952687Z · ╰── This is the containing effect 2026-10-24T20:38:28.2952771Z 279 │ setNow(new Date().toISOString()); 2026-10-24T20:38:28.2952839Z ·  ───┬── 2026-10-24T20:38:28.2953000Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2953135Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T20:38:28.2953184Z ╰──── 2026-10-24T20:38:28.2953767Z  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-24T20:38:28.2954087Z  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-24T20:38:28.2954092Z 2026-10-24T20:38:28.2954315Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T20:38:28.2954472Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T20:38:28.2954540Z 12 │ threadSearchMatchKey, 2026-10-24T20:38:28.2954623Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T20:38:28.2954727Z ·  ──────────────┬───────────── 2026-10-24T20:38:28.2954898Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T20:38:28.2955004Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T20:38:28.2955054Z ╰──── 2026-10-24T20:38:28.2955150Z  help: Consider removing this import. 2026-10-24T20:38:28.2955198Z 2026-10-24T20:38:28.2955452Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2955613Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T20:38:28.2955743Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T20:38:28.2955831Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T20:38:28.2955933Z ·  ───────┬────── 2026-10-24T20:38:28.2956092Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:38:28.2956202Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T20:38:28.2956252Z ╰──── 2026-10-24T20:38:28.2956545Z  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-24T20:38:28.2956852Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2956855Z 2026-10-24T20:38:28.2957017Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2957177Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T20:38:28.2957261Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T20:38:28.2957412Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T20:38:28.2957528Z ·  ─────┬──── 2026-10-24T20:38:28.2957694Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2957773Z 351 │ const id = setTimeout(() => { 2026-10-24T20:38:28.2957823Z ╰──── 2026-10-24T20:38:28.2958099Z  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-24T20:38:28.2958387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2958389Z 2026-10-24T20:38:28.2958613Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T20:38:28.2958730Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T20:38:28.2958781Z 11 │ 2026-10-24T20:38:28.2958879Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T20:38:28.2958979Z ·  ────────────┬──────────── 2026-10-24T20:38:28.2959144Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T20:38:28.2959209Z 13 │ readonly thread: { 2026-10-24T20:38:28.2959258Z ╰──── 2026-10-24T20:38:28.2959360Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2959363Z 2026-10-24T20:38:28.2959613Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2959775Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T20:38:28.2959827Z 213 │ }; 2026-10-24T20:38:28.2959891Z 214 │ useEffect(() => { 2026-10-24T20:38:28.2959962Z ·  ────┬──── 2026-10-24T20:38:28.2960145Z · ╰── This is the containing effect 2026-10-24T20:38:28.2960378Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T20:38:28.2960441Z 216 │ if (inserted) { 2026-10-24T20:38:28.2960516Z 217 │ setSelection((current) => 2026-10-24T20:38:28.2960592Z ·  ──────┬───── 2026-10-24T20:38:28.2960756Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2960958Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T20:38:28.2961008Z ╰──── 2026-10-24T20:38:28.2961604Z  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-24T20:38:28.2961918Z  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-24T20:38:28.2961922Z 2026-10-24T20:38:28.2962171Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.2962330Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T20:38:28.2962405Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T20:38:28.2962467Z 287 │ useEffect(() => { 2026-10-24T20:38:28.2962534Z ·  ────┬──── 2026-10-24T20:38:28.2962658Z · ╰── This is the containing effect 2026-10-24T20:38:28.2962806Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T20:38:28.2962953Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T20:38:28.2963022Z 290 │ const now = Date.now(); 2026-10-24T20:38:28.2963133Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T20:38:28.2963188Z 292 │ if ( 2026-10-24T20:38:28.2963266Z 293 │ lastRequest?.key === key && 2026-10-24T20:38:28.2963399Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T20:38:28.2963452Z 295 │ ) 2026-10-24T20:38:28.2963512Z 296 │ return; 2026-10-24T20:38:28.2963683Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T20:38:28.2963768Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T20:38:28.2963866Z ·  ────────────┬─────────── 2026-10-24T20:38:28.2964039Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.2964101Z 299 │ return; 2026-10-24T20:38:28.2964150Z ╰──── 2026-10-24T20:38:28.2964741Z  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-24T20:38:28.2965056Z  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-24T20:38:28.2965059Z 2026-10-24T20:38:28.2965300Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.2965521Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T20:38:28.2965576Z 327 │ }, [ 2026-10-24T20:38:28.2965639Z 328 │ draftMessage, 2026-10-24T20:38:28.2965714Z ·  ──────┬───── 2026-10-24T20:38:28.2965854Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T20:38:28.2965919Z 329 │ environmentId, 2026-10-24T20:38:28.2965969Z ╰──── 2026-10-24T20:38:28.2966255Z  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-24T20:38:28.2966564Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.2966569Z 2026-10-24T20:38:28.2967030Z ⚠ 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-24T20:38:28.2967160Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T20:38:28.2967257Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T20:38:28.2967485Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T20:38:28.2967605Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T20:38:28.2967751Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T20:38:28.2967884Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T20:38:28.2967986Z 2619 │ │ flush: () => { 2026-10-24T20:38:28.2968107Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T20:38:28.2968249Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T20:38:28.2968331Z 2622 │ │ }, 2026-10-24T20:38:28.2968409Z 2623 │ │ }; 2026-10-24T20:38:28.2968477Z 2624 │ │ 2026-10-24T20:38:28.2968631Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T20:38:28.2968734Z 2626 │ │ let requestChecks = 0; 2026-10-24T20:38:28.2968866Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T20:38:28.2968976Z 2628 │ │ executionMode: "async", 2026-10-24T20:38:28.2969093Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T20:38:28.2969202Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T20:38:28.2969333Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T20:38:28.2969437Z 2632 │ │ requestChecks += 1; 2026-10-24T20:38:28.2969573Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T20:38:28.2969688Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T20:38:28.2969784Z 2635 │ │ return true; 2026-10-24T20:38:28.2969863Z 2636 │ │ }, 2026-10-24T20:38:28.2969988Z 2637 │ │ }; 2026-10-24T20:38:28.2970115Z 2638 │ │ 2026-10-24T20:38:28.2970233Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T20:38:28.2970325Z 2640 │ │ ...WINDOW, 2026-10-24T20:38:28.2970448Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T20:38:28.2970636Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T20:38:28.2970714Z 2643 │ │ }; 2026-10-24T20:38:28.2970823Z 2644 │ │ const first = yield* service 2026-10-24T20:38:28.2970938Z 2645 │ │ .readSummary(input) 2026-10-24T20:38:28.2971055Z 2646 │ │ .pipe( 2026-10-24T20:38:28.2971157Z 2647 │ │ Effect.exit, 2026-10-24T20:38:28.2971312Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T20:38:28.2971412Z 2649 │ │ Effect.forkChild, 2026-10-24T20:38:28.2971491Z 2650 │ │ ); 2026-10-24T20:38:28.2971591Z 2651 │ │ requestFiber = first; 2026-10-24T20:38:28.2971694Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2971793Z 2653 │ │ dispatcher.flush(); 2026-10-24T20:38:28.2971861Z 2654 │ │ 2026-10-24T20:38:28.2972008Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T20:38:28.2972103Z 2656 │ │ Effect.match({ 2026-10-24T20:38:28.2972230Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T20:38:28.2972354Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T20:38:28.2972436Z 2659 │ │ }), 2026-10-24T20:38:28.2972587Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T20:38:28.2972686Z 2661 │ │ Effect.forkChild, 2026-10-24T20:38:28.2972765Z 2662 │ │ ); 2026-10-24T20:38:28.2972866Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.2972965Z 2664 │ │ dispatcher.flush(); 2026-10-24T20:38:28.2973088Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T20:38:28.2973208Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T20:38:28.2973322Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T20:38:28.2973429Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T20:38:28.2973513Z 2669 │ │ break; 2026-10-24T20:38:28.2973593Z 2670 │ │ } 2026-10-24T20:38:28.2973709Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T20:38:28.2973864Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T20:38:28.2973940Z 2673 │ │ } 2026-10-24T20:38:28.2974088Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T20:38:28.2974219Z 2675 │ ╰─▶ } 2026-10-24T20:38:28.2974322Z 2676 │ 2026-10-24T20:38:28.2974438Z ╰──── 2026-10-24T20:38:28.2974442Z 2026-10-24T20:38:28.2974607Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2974720Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T20:38:28.2974815Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T20:38:28.2974879Z 1136 │ Date.now(), 2026-10-24T20:38:28.2974960Z ·  ─────┬──── 2026-10-24T20:38:28.2975091Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2975225Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T20:38:28.2975274Z ╰──── 2026-10-24T20:38:28.2975564Z  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-24T20:38:28.2975856Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2975859Z 2026-10-24T20:38:28.2976119Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.2976233Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T20:38:28.2976284Z 168 │ 2026-10-24T20:38:28.2976361Z 169 │ const layerTest = Layer.succeed( 2026-10-24T20:38:28.2976434Z ·  ────┬──── 2026-10-24T20:38:28.2976561Z · ╰── 'layerTest' is declared here 2026-10-24T20:38:28.2976622Z 170 │ UsageService, 2026-10-24T20:38:28.2976672Z ╰──── 2026-10-24T20:38:28.2976780Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2976785Z 2026-10-24T20:38:28.2976946Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2977092Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T20:38:28.2977269Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T20:38:28.2977397Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T20:38:28.2977518Z ·  ─────┬──── 2026-10-24T20:38:28.2977682Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2977738Z 153 │ } 2026-10-24T20:38:28.2977788Z ╰──── 2026-10-24T20:38:28.2978071Z  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-24T20:38:28.2978366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2978369Z 2026-10-24T20:38:28.2978638Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T20:38:28.2978766Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T20:38:28.2978820Z 284 │ }, 2026-10-24T20:38:28.2978901Z 285 │ (effect, flow, stopSessions) => 2026-10-24T20:38:28.2978989Z ·  ──────┬───── 2026-10-24T20:38:28.2979182Z · ╰── 'stopSessions' is declared here 2026-10-24T20:38:28.2979293Z 286 │ effect.pipe( 2026-10-24T20:38:28.2979364Z ╰──── 2026-10-24T20:38:28.2979465Z  help: Consider removing this parameter. 2026-10-24T20:38:28.2979467Z 2026-10-24T20:38:28.2979716Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T20:38:28.2979865Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T20:38:28.2979917Z 1619 │ 2026-10-24T20:38:28.2980122Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T20:38:28.2980238Z ·  ──────────────────┬────────────────── 2026-10-24T20:38:28.2980440Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T20:38:28.2980519Z 1621 │ const meta = response._meta; 2026-10-24T20:38:28.2980567Z ╰──── 2026-10-24T20:38:28.2980668Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2980670Z 2026-10-24T20:38:28.2980895Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T20:38:28.2981061Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T20:38:28.2981133Z 14 │ } from "@t3tools/contracts"; 2026-10-24T20:38:28.2981221Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T20:38:28.2981289Z ·  ── 2026-10-24T20:38:28.2981338Z 16 │ 2026-10-24T20:38:28.2981387Z ╰──── 2026-10-24T20:38:28.2981466Z  help: Remove empty braces 2026-10-24T20:38:28.2981469Z 2026-10-24T20:38:28.2981636Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2981769Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T20:38:28.2981897Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T20:38:28.2982038Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T20:38:28.2982157Z ·  ─────┬──── 2026-10-24T20:38:28.2982322Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2982416Z 141 │ onSelect={(selected) => { 2026-10-24T20:38:28.2982464Z ╰──── 2026-10-24T20:38:28.2982793Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2983195Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2983198Z 2026-10-24T20:38:28.2983390Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.2983551Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T20:38:28.2983614Z 817 │
    = 2026-10-24T20:38:28.2987870Z ·  ──┬── 2026-10-24T20:38:28.2987990Z · ╰── 'layer' is declared here 2026-10-24T20:38:28.2988054Z 3406 │ Layer.effect( 2026-10-24T20:38:28.2988104Z ╰──── 2026-10-24T20:38:28.2988203Z  help: Consider removing this declaration. 2026-10-24T20:38:28.2988205Z 2026-10-24T20:38:28.2988367Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:38:28.2988495Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T20:38:28.2988617Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T20:38:28.2988711Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T20:38:28.2988800Z ·  ─────┬──── 2026-10-24T20:38:28.2988937Z · ╰── Cannot call impure function 2026-10-24T20:38:28.2989041Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T20:38:28.2989092Z ╰──── 2026-10-24T20:38:28.2989364Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:38:28.2989651Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:38:28.2989653Z 2026-10-24T20:38:28.2990023Z ⚠ 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-24T20:38:28.2990138Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T20:38:28.2990284Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T20:38:28.2990448Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T20:38:28.2990551Z ·  ────────────────────────── 2026-10-24T20:38:28.2990693Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T20:38:28.2990745Z ╰──── 2026-10-24T20:38:28.2990747Z 2026-10-24T20:38:28.2990925Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.2991111Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T20:38:28.2991166Z 465 │ 2026-10-24T20:38:28.2991346Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T20:38:28.2991417Z ·  ── 2026-10-24T20:38:28.2991470Z 467 │ } 2026-10-24T20:38:28.2991520Z ╰──── 2026-10-24T20:38:28.2991746Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.2991749Z 2026-10-24T20:38:28.2992200Z ⚠ 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-24T20:38:28.2992317Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T20:38:28.2992478Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T20:38:28.2992627Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T20:38:28.2992742Z ·  ────────────────────────── 2026-10-24T20:38:28.2992808Z 130 │ Schema.Struct({ 2026-10-24T20:38:28.2992859Z ╰──── 2026-10-24T20:38:28.2992861Z 2026-10-24T20:38:28.2993188Z ⚠ 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-24T20:38:28.2993303Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T20:38:28.2993461Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T20:38:28.2993581Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T20:38:28.2993659Z ·  ───────── 2026-10-24T20:38:28.2993725Z 19 │ expect( 2026-10-24T20:38:28.2993776Z ╰──── 2026-10-24T20:38:28.2993778Z 2026-10-24T20:38:28.2994099Z ⚠ 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-24T20:38:28.2994214Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T20:38:28.2994274Z 19 │ expect( 2026-10-24T20:38:28.2994438Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T20:38:28.2994509Z ·  ───────── 2026-10-24T20:38:28.2994572Z 21 │ ).toBe(true); 2026-10-24T20:38:28.2994624Z ╰──── 2026-10-24T20:38:28.2994627Z 2026-10-24T20:38:28.2995084Z ⚠ 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-24T20:38:28.2995206Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T20:38:28.2995258Z 499 │ 2026-10-24T20:38:28.2995371Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T20:38:28.2995485Z ·  ────────────────────────── 2026-10-24T20:38:28.2995588Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T20:38:28.2995638Z ╰──── 2026-10-24T20:38:28.2995641Z 2026-10-24T20:38:28.2995802Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.2995936Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T20:38:28.2995986Z 185 │ 2026-10-24T20:38:28.2996091Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T20:38:28.2996162Z ·  ── 2026-10-24T20:38:28.2996213Z 187 │ } 2026-10-24T20:38:28.2996262Z ╰──── 2026-10-24T20:38:28.2996487Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.2996489Z 2026-10-24T20:38:28.2996655Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.2996791Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T20:38:28.2996841Z 188 │ 2026-10-24T20:38:28.2996905Z 189 │ for (const {} of [ 2026-10-24T20:38:28.2996973Z ·  ── 2026-10-24T20:38:28.2997061Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T20:38:28.2997110Z ╰──── 2026-10-24T20:38:28.2997375Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.2997403Z 2026-10-24T20:38:28.2997565Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.2997698Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T20:38:28.2997748Z 310 │ 2026-10-24T20:38:28.2997872Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T20:38:28.2997940Z ·  ── 2026-10-24T20:38:28.2997992Z 312 │ } 2026-10-24T20:38:28.2998039Z ╰──── 2026-10-24T20:38:28.2998264Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.2998267Z 2026-10-24T20:38:28.2998433Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.2998568Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T20:38:28.2998617Z 313 │ 2026-10-24T20:38:28.2998681Z 314 │ for (const {} of [ 2026-10-24T20:38:28.2998748Z ·  ── 2026-10-24T20:38:28.2998800Z 315 │ { 2026-10-24T20:38:28.2998848Z ╰──── 2026-10-24T20:38:28.2999067Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.2999070Z 2026-10-24T20:38:28.2999509Z ⚠ 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-24T20:38:28.2999633Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T20:38:28.2999807Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T20:38:28.2999986Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T20:38:28.3000097Z ·  ─────────────────── 2026-10-24T20:38:28.3000204Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T20:38:28.3000253Z ╰──── 2026-10-24T20:38:28.3000256Z 2026-10-24T20:38:28.3000689Z ⚠ 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-24T20:38:28.3000810Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T20:38:28.3001140Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T20:38:28.3001269Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T20:38:28.3001380Z ·  ─────────────────── 2026-10-24T20:38:28.3001495Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T20:38:28.3001545Z ╰──── 2026-10-24T20:38:28.3001547Z 2026-10-24T20:38:28.3001905Z ⚠ 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-24T20:38:28.3002026Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T20:38:28.3002158Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T20:38:28.3002292Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T20:38:28.3002397Z ·  ──────────────────────── 2026-10-24T20:38:28.3002529Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T20:38:28.3002580Z ╰──── 2026-10-24T20:38:28.3002582Z 2026-10-24T20:38:28.3002937Z ⚠ 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-24T20:38:28.3003056Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T20:38:28.3003154Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T20:38:28.3003306Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T20:38:28.3003417Z ·  ──────────────────────── 2026-10-24T20:38:28.3003482Z 257 │ return [ 2026-10-24T20:38:28.3003533Z ╰──── 2026-10-24T20:38:28.3003536Z 2026-10-24T20:38:28.3003729Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T20:38:28.3003831Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T20:38:28.3003918Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T20:38:28.3004009Z 28 │ import { identity } from "effect/Function"; 2026-10-24T20:38:28.3004082Z ·  ────┬─── 2026-10-24T20:38:28.3004214Z · ╰── 'identity' is imported here 2026-10-24T20:38:28.3004297Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T20:38:28.3004346Z ╰──── 2026-10-24T20:38:28.3004439Z  help: Consider removing this import. 2026-10-24T20:38:28.3004441Z 2026-10-24T20:38:28.3004662Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:38:28.3004789Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T20:38:28.3004858Z 113 │ const declared = { 2026-10-24T20:38:28.3004946Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T20:38:28.3005053Z ·  ──────────────────────────────── 2026-10-24T20:38:28.3005156Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T20:38:28.3005206Z ╰──── 2026-10-24T20:38:28.3005468Z  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-24T20:38:28.3005473Z 2026-10-24T20:38:28.3005685Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:38:28.3005856Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T20:38:28.3005972Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T20:38:28.3006073Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T20:38:28.3006189Z ·  ──────────────────────────────────────── 2026-10-24T20:38:28.3006286Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T20:38:28.3006337Z ╰──── 2026-10-24T20:38:28.3006597Z  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-24T20:38:28.3006600Z 2026-10-24T20:38:28.3006811Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:38:28.3006939Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T20:38:28.3007041Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T20:38:28.3007135Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T20:38:28.3007245Z ·  ──────────────────────────────────── 2026-10-24T20:38:28.3007303Z 117 │ }; 2026-10-24T20:38:28.3007354Z ╰──── 2026-10-24T20:38:28.3007611Z  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-24T20:38:28.3007613Z 2026-10-24T20:38:28.3007788Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T20:38:28.3007921Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T20:38:28.3008006Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T20:38:28.3008102Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T20:38:28.3008183Z ·  ──┬── 2026-10-24T20:38:28.3008313Z · ╰── 'Scope' is imported here 2026-10-24T20:38:28.3008398Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T20:38:28.3008450Z ╰──── 2026-10-24T20:38:28.3008545Z  help: Consider removing this import. 2026-10-24T20:38:28.3008549Z 2026-10-24T20:38:28.3008748Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T20:38:28.3008849Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T20:38:28.3008986Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T20:38:28.3009097Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T20:38:28.3009185Z ·  ──────┬────── 2026-10-24T20:38:28.3009326Z · ╰── 'HookForwarder' is imported here 2026-10-24T20:38:28.3009428Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T20:38:28.3009478Z ╰──── 2026-10-24T20:38:28.3009570Z  help: Consider removing this import. 2026-10-24T20:38:28.3009573Z 2026-10-24T20:38:28.3009855Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:38:28.3010007Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T20:38:28.3010063Z 162 │ keys, 2026-10-24T20:38:28.3010133Z 163 │ overridingProjects = [], 2026-10-24T20:38:28.3010215Z ·  ── 2026-10-24T20:38:28.3010282Z 164 │ onClearOverrides, 2026-10-24T20:38:28.3010394Z ╰──── 2026-10-24T20:38:28.3010735Z  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-24T20:38:28.3010738Z 2026-10-24T20:38:28.3010966Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T20:38:28.3011102Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T20:38:28.3011154Z 21 │ 2026-10-24T20:38:28.3011305Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T20:38:28.3011391Z ·  ────────┬─────── 2026-10-24T20:38:28.3011535Z · ╰── 'summarizePayload' is declared here 2026-10-24T20:38:28.3011646Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T20:38:28.3011697Z ╰──── 2026-10-24T20:38:28.3011797Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3011800Z 2026-10-24T20:38:28.3011942Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3012059Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T20:38:28.3012122Z 184 │ "options", 2026-10-24T20:38:28.3012214Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T20:38:28.3012319Z ·  ────────────────┬─────────────── 2026-10-24T20:38:28.3012509Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3012600Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T20:38:28.3012651Z ╰──── 2026-10-24T20:38:28.3013119Z  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-24T20:38:28.3013409Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3013411Z 2026-10-24T20:38:28.3013552Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3013666Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T20:38:28.3013757Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T20:38:28.3013847Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T20:38:28.3013955Z ·  ────────────────┬──────────────── 2026-10-24T20:38:28.3014146Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3014238Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T20:38:28.3014287Z ╰──── 2026-10-24T20:38:28.3014743Z  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-24T20:38:28.3015028Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3015030Z 2026-10-24T20:38:28.3015216Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T20:38:28.3015406Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T20:38:28.3015488Z  80 │ 2026-10-24T20:38:28.3015755Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T20:38:28.3015872Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T20:38:28.3015993Z  83 │ │ ): Effect.fn.Return { 2026-10-24T20:38:28.3016157Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T20:38:28.3016290Z  85 │ │ const connections = new Map(); 2026-10-24T20:38:28.3016357Z  86 │ │ 2026-10-24T20:38:28.3016572Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T20:38:28.3016674Z  88 │ │ Effect.suspend(() => { 2026-10-24T20:38:28.3016806Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T20:38:28.3016915Z  90 │ │ return connection === undefined 2026-10-24T20:38:28.3017122Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T20:38:28.3017229Z  92 │ │ : Effect.succeed(connection); 2026-10-24T20:38:28.3017303Z  93 │ │ }); 2026-10-24T20:38:28.3017370Z  94 │ │ 2026-10-24T20:38:28.3017450Z  95 │ │ const send = ( 2026-10-24T20:38:28.3017548Z  96 │ │ connection: Connection, 2026-10-24T20:38:28.3017644Z  97 │ │ message: unknown, 2026-10-24T20:38:28.3017800Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T20:38:28.3017909Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T20:38:28.3018014Z 100 │ │ Effect.gen(function* () { 2026-10-24T20:38:28.3018133Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T20:38:28.3018270Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T20:38:28.3018481Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T20:38:28.3018557Z 104 │ │ } 2026-10-24T20:38:28.3018687Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T20:38:28.3018788Z 106 │ │ try: (signal) => 2026-10-24T20:38:28.3018919Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T20:38:28.3019019Z 108 │ │ method: "POST", 2026-10-24T20:38:28.3019109Z 109 │ │ signal, 2026-10-24T20:38:28.3019204Z 110 │ │ headers: { 2026-10-24T20:38:28.3019327Z 111 │ │ "content-type": "application/json", 2026-10-24T20:38:28.3019466Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T20:38:28.3019594Z 113 │ │ authorization: options.authorization, 2026-10-24T20:38:28.3019717Z 114 │ │ ...(connection.sessionId === null 2026-10-24T20:38:28.3019857Z 115 │ │ ? {} 2026-10-24T20:38:28.3020024Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T20:38:28.3020155Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T20:38:28.3020246Z 118 │ │ ? {} 2026-10-24T20:38:28.3020406Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T20:38:28.3020493Z 120 │ │ }, 2026-10-24T20:38:28.3020585Z 121 │ │ body, 2026-10-24T20:38:28.3020669Z 122 │ │ }), 2026-10-24T20:38:28.3020767Z 123 │ │ catch: bridgeError, 2026-10-24T20:38:28.3020866Z 124 │ │ }); 2026-10-24T20:38:28.3021085Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T20:38:28.3021186Z 126 │ │ if (!response.ok) { 2026-10-24T20:38:28.3021288Z 127 │ │ yield* Effect.promise( 2026-10-24T20:38:28.3021465Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T20:38:28.3021545Z 129 │ │ ); 2026-10-24T20:38:28.3021654Z 130 │ │ return yield* Effect.fail( 2026-10-24T20:38:28.3021862Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T20:38:28.3021940Z 132 │ │ ); 2026-10-24T20:38:28.3022014Z 133 │ │ } 2026-10-24T20:38:28.3022226Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T20:38:28.3022345Z 135 │ │ for (const payload of payloads) { 2026-10-24T20:38:28.3022555Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T20:38:28.3022632Z 137 │ │ } 2026-10-24T20:38:28.3022727Z 138 │ │ return payloads; 2026-10-24T20:38:28.3022849Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T20:38:28.3022921Z 140 │ │ ); 2026-10-24T20:38:28.3022991Z 141 │ │ 2026-10-24T20:38:28.3023162Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T20:38:28.3023336Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T20:38:28.3023545Z 144 │ │ ): Effect.fn.Return { 2026-10-24T20:38:28.3023703Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:38:28.3023829Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T20:38:28.3023948Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T20:38:28.3024047Z 148 │ │ if (sessionId !== null) { 2026-10-24T20:38:28.3024173Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T20:38:28.3024268Z 150 │ │ try: (signal) => 2026-10-24T20:38:28.3024398Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T20:38:28.3024496Z 152 │ │ method: "DELETE", 2026-10-24T20:38:28.3024585Z 153 │ │ signal, 2026-10-24T20:38:28.3024679Z 154 │ │ headers: { 2026-10-24T20:38:28.3024806Z 155 │ │ authorization: options.authorization, 2026-10-24T20:38:28.3024920Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T20:38:28.3025051Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T20:38:28.3025141Z 158 │ │ ? {} 2026-10-24T20:38:28.3025301Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T20:38:28.3025383Z 160 │ │ }, 2026-10-24T20:38:28.3025470Z 161 │ │ }), 2026-10-24T20:38:28.3025573Z 162 │ │ catch: bridgeError, 2026-10-24T20:38:28.3025652Z 163 │ │ }); 2026-10-24T20:38:28.3025782Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T20:38:28.3025893Z 165 │ │ return yield* Effect.fail( 2026-10-24T20:38:28.3026002Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T20:38:28.3026185Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T20:38:28.3026266Z 168 │ │ ), 2026-10-24T20:38:28.3026343Z 169 │ │ ); 2026-10-24T20:38:28.3026421Z 170 │ │ } 2026-10-24T20:38:28.3026532Z 171 │ │ yield* Effect.promise( 2026-10-24T20:38:28.3026710Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T20:38:28.3026785Z 173 │ │ ); 2026-10-24T20:38:28.3026860Z 174 │ │ } 2026-10-24T20:38:28.3026947Z 175 │ │ return {}; 2026-10-24T20:38:28.3027019Z 176 │ │ }); 2026-10-24T20:38:28.3027089Z 177 │ │ 2026-10-24T20:38:28.3027168Z 178 │ │ return { 2026-10-24T20:38:28.3027339Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T20:38:28.3027456Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T20:38:28.3027564Z 181 │ │ return yield* Effect.fail( 2026-10-24T20:38:28.3027803Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T20:38:28.3027910Z 183 │ │ ); 2026-10-24T20:38:28.3027987Z 184 │ │ } 2026-10-24T20:38:28.3028112Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T20:38:28.3028320Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T20:38:28.3028397Z 187 │ │ } 2026-10-24T20:38:28.3028552Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T20:38:28.3028663Z 189 │ │ connections.set(connectionId, { 2026-10-24T20:38:28.3028781Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T20:38:28.3028884Z 191 │ │ sessionId: null, 2026-10-24T20:38:28.3028992Z 192 │ │ protocolVersion: null, 2026-10-24T20:38:28.3029089Z 193 │ │ nextRequestId: 0, 2026-10-24T20:38:28.3029167Z 194 │ │ }); 2026-10-24T20:38:28.3029270Z 195 │ │ return { connectionId }; 2026-10-24T20:38:28.3029352Z 196 │ │ }), 2026-10-24T20:38:28.3029518Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T20:38:28.3029681Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:38:28.3029803Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T20:38:28.3029936Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T20:38:28.3030034Z 201 │ │ jsonrpc: "2.0", 2026-10-24T20:38:28.3030117Z 202 │ │ id, 2026-10-24T20:38:28.3030260Z 203 │ │ method: request.method, 2026-10-24T20:38:28.3030532Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T20:38:28.3030646Z 205 │ │ }); 2026-10-24T20:38:28.3030879Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T20:38:28.3032310Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T20:38:28.3032447Z 208 │ │ if (envelope === null) { 2026-10-24T20:38:28.3032575Z 209 │ │ return yield* Effect.fail( 2026-10-24T20:38:28.3032798Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T20:38:28.3032908Z 211 │ │ ); 2026-10-24T20:38:28.3033004Z 212 │ │ } 2026-10-24T20:38:28.3033143Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T20:38:28.3033378Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T20:38:28.3033482Z 215 │ │ } 2026-10-24T20:38:28.3033676Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T20:38:28.3033756Z 217 │ │ }), 2026-10-24T20:38:28.3033997Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T20:38:28.3034251Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:38:28.3034470Z 220 │ │ yield* send(connection, { 2026-10-24T20:38:28.3034578Z 221 │ │ jsonrpc: "2.0", 2026-10-24T20:38:28.3034714Z 222 │ │ method: request.method, 2026-10-24T20:38:28.3034903Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T20:38:28.3035013Z 224 │ │ }); 2026-10-24T20:38:28.3035099Z 225 │ │ }), 2026-10-24T20:38:28.3035210Z 226 │ │ disconnect, 2026-10-24T20:38:28.3035365Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T20:38:28.3035490Z 228 │ │ Effect.forEach( 2026-10-24T20:38:28.3035627Z 229 │ │ [...connections.keys()], 2026-10-24T20:38:28.3035812Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T20:38:28.3035942Z 231 │ │ { discard: true }, 2026-10-24T20:38:28.3036056Z 232 │ │ ), 2026-10-24T20:38:28.3036159Z 233 │ │ ), 2026-10-24T20:38:28.3036249Z 234 │ │ }; 2026-10-24T20:38:28.3036397Z 235 │ ╰─▶ }); 2026-10-24T20:38:28.3036497Z ╰──── 2026-10-24T20:38:28.3036774Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T20:38:28.3036777Z 2026-10-24T20:38:28.3036987Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T20:38:28.3037214Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T20:38:28.3037377Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T20:38:28.3037527Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T20:38:28.3037611Z ·  ──┬── 2026-10-24T20:38:28.3037769Z · ╰── 'Image' is imported here 2026-10-24T20:38:28.3037843Z 18 │ 2026-10-24T20:38:28.3037944Z ╰──── 2026-10-24T20:38:28.3038054Z  help: Consider removing this import. 2026-10-24T20:38:28.3038057Z 2026-10-24T20:38:28.3038294Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:38:28.3038470Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T20:38:28.3038665Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T20:38:28.3038791Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3038899Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3039404Z · ╰── 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-24T20:38:28.3039985Z 227 │ mostRecentEventCount, 2026-10-24T20:38:28.3040253Z 228 │ ); 2026-10-24T20:38:28.3040521Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T20:38:28.3040863Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T20:38:28.3041354Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3041712Z 230 │ const assumedValue = props.value; 2026-10-24T20:38:28.3041906Z ╰──── 2026-10-24T20:38:28.3042202Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:38:28.3043058Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3043415Z 2026-10-24T20:38:28.3043712Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.3044142Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T20:38:28.3044502Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T20:38:28.3044801Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3045066Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3045675Z · ╰── 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-24T20:38:28.3046237Z 238 │ controlledEventCount, 2026-10-24T20:38:28.3046435Z 239 │ assumedValue, 2026-10-24T20:38:28.3046637Z 240 │ ); 2026-10-24T20:38:28.3046960Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T20:38:28.3047770Z ·  ───────────┬────────── 2026-10-24T20:38:28.3048298Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T20:38:28.3048644Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T20:38:28.3048854Z ╰──── 2026-10-24T20:38:28.3049389Z  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-24T20:38:28.3050124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3050454Z 2026-10-24T20:38:28.3050628Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3051005Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T20:38:28.3051411Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:38:28.3051704Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:38:28.3052081Z ·  ─────────────┬──────────── 2026-10-24T20:38:28.3052534Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3052865Z 163 │ }); 2026-10-24T20:38:28.3053026Z ╰──── 2026-10-24T20:38:28.3053738Z  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-24T20:38:28.3054551Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3054891Z 2026-10-24T20:38:28.3055057Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3055470Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T20:38:28.3055797Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:38:28.3056101Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:38:28.3056401Z ·  ─────────────┬──────────── 2026-10-24T20:38:28.3056774Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3057203Z 163 │ }); 2026-10-24T20:38:28.3057359Z ╰──── 2026-10-24T20:38:28.3058003Z  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-24T20:38:28.3058809Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3059175Z 2026-10-24T20:38:28.3059354Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3059702Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T20:38:28.3059952Z 163 │ }); 2026-10-24T20:38:28.3060143Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T20:38:28.3060437Z ·  ─────────┬────────────┬─── 2026-10-24T20:38:28.3060801Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.3061182Z · ╰── This value is a ref 2026-10-24T20:38:28.3061432Z 165 │ return JSON.stringify( 2026-10-24T20:38:28.3061633Z ╰──── 2026-10-24T20:38:28.3062254Z  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-24T20:38:28.3063021Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3063317Z 2026-10-24T20:38:28.3063561Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3063925Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T20:38:28.3064203Z 205 │ mostRecentEventCount, 2026-10-24T20:38:28.3064432Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3064681Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.3065044Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3065376Z 207 │ ); 2026-10-24T20:38:28.3065561Z ╰──── 2026-10-24T20:38:28.3066116Z  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-24T20:38:28.3066890Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3067201Z 2026-10-24T20:38:28.3067372Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3067695Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T20:38:28.3067987Z 211 │ mostRecentEventCount, 2026-10-24T20:38:28.3068205Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3068481Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.3068861Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3069161Z 213 │ ); 2026-10-24T20:38:28.3069312Z ╰──── 2026-10-24T20:38:28.3069867Z  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-24T20:38:28.3070647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3070987Z 2026-10-24T20:38:28.3071190Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:38:28.3071697Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T20:38:28.3072026Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:38:28.3075742Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:38:28.3075988Z ·  ─────────┬──────── 2026-10-24T20:38:28.3076572Z · ╰── 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-24T20:38:28.3077037Z 163 │ }); 2026-10-24T20:38:28.3077196Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T20:38:28.3077373Z 165 │ return JSON.stringify( 2026-10-24T20:38:28.3077624Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T20:38:28.3077861Z 167 │ const record = 2026-10-24T20:38:28.3078022Z 168 │ token.type === "context" 2026-10-24T20:38:28.3078286Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T20:38:28.3078519Z 170 │ : undefined; 2026-10-24T20:38:28.3078811Z 171 │ const presentation = contextChipPresentation( 2026-10-24T20:38:28.3079080Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T20:38:28.3079269Z 173 │ record, 2026-10-24T20:38:28.3079404Z 174 │ ); 2026-10-24T20:38:28.3079556Z 175 │ const icon = contextChipIcon( 2026-10-24T20:38:28.3079721Z 176 │ presentation, 2026-10-24T20:38:28.3079944Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T20:38:28.3080151Z 178 │ ); 2026-10-24T20:38:28.3080279Z 179 │ return { 2026-10-24T20:38:28.3080428Z 180 │ type: token.type, 2026-10-24T20:38:28.3080586Z 181 │ source: token.source, 2026-10-24T20:38:28.3080749Z 182 │ start: token.start, 2026-10-24T20:38:28.3080921Z 183 │ end: token.end, 2026-10-24T20:38:28.3081201Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T20:38:28.3081418Z 185 │ label: 2026-10-24T20:38:28.3081569Z 186 │ token.type === "skill" 2026-10-24T20:38:28.3081776Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T20:38:28.3081976Z 188 │ : token.type === "context" 2026-10-24T20:38:28.3082311Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T20:38:28.3082618Z 190 │ : basename(token.value), 2026-10-24T20:38:28.3082864Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T20:38:28.3083104Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T20:38:28.3083304Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T20:38:28.3083466Z 194 │ }; 2026-10-24T20:38:28.3083592Z 195 │ }), 2026-10-24T20:38:28.3083714Z 196 │ ); 2026-10-24T20:38:28.3083911Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T20:38:28.3084202Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T20:38:28.3084547Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3084872Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T20:38:28.3085071Z ╰──── 2026-10-24T20:38:28.3085331Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:38:28.3085857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3086154Z 2026-10-24T20:38:28.3086340Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:38:28.3086661Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T20:38:28.3086935Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T20:38:28.3087172Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T20:38:28.3087380Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3087932Z · ╰── 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-24T20:38:28.3088484Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T20:38:28.3088743Z 254 │ value, 2026-10-24T20:38:28.3088931Z 255 │ selection: nextSelection, 2026-10-24T20:38:28.3089082Z 256 │ }); 2026-10-24T20:38:28.3089251Z 257 │ return acknowledgedEventCount; 2026-10-24T20:38:28.3089407Z 258 │ }, 2026-10-24T20:38:28.3089526Z 259 │ [], 2026-10-24T20:38:28.3089659Z ·  ─┬ 2026-10-24T20:38:28.3089917Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3090143Z 260 │ ); 2026-10-24T20:38:28.3090251Z ╰──── 2026-10-24T20:38:28.3090506Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:38:28.3091060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3091354Z 2026-10-24T20:38:28.3091555Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:38:28.3091973Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T20:38:28.3092274Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T20:38:28.3092528Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3092733Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3093281Z · ╰── 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-24T20:38:28.3093756Z 229 │ mostRecentEventCount, 2026-10-24T20:38:28.3093901Z 230 │ ); 2026-10-24T20:38:28.3094094Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T20:38:28.3094360Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T20:38:28.3094684Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3094950Z 232 │ const assumedValue = props.value; 2026-10-24T20:38:28.3095102Z ╰──── 2026-10-24T20:38:28.3095322Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:38:28.3095813Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3096106Z 2026-10-24T20:38:28.3096323Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.3096665Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T20:38:28.3096945Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T20:38:28.3097185Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3097382Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3097932Z · ╰── 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-24T20:38:28.3098398Z 240 │ controlledEventCount, 2026-10-24T20:38:28.3098551Z 241 │ assumedValue, 2026-10-24T20:38:28.3098685Z 242 │ ); 2026-10-24T20:38:28.3098960Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T20:38:28.3099284Z ·  ───────────┬────────── 2026-10-24T20:38:28.3099615Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T20:38:28.3099886Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T20:38:28.3100039Z ╰──── 2026-10-24T20:38:28.3100504Z  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-24T20:38:28.3101217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3101510Z 2026-10-24T20:38:28.3101654Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3101937Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T20:38:28.3102199Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:38:28.3102443Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:38:28.3102684Z ·  ─────────────┬──────────── 2026-10-24T20:38:28.3102966Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3103178Z 165 │ }); 2026-10-24T20:38:28.3103289Z ╰──── 2026-10-24T20:38:28.3103812Z  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-24T20:38:28.3104517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3104792Z 2026-10-24T20:38:28.3104935Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3105213Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T20:38:28.3105478Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:38:28.3105720Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:38:28.3105959Z ·  ─────────────┬──────────── 2026-10-24T20:38:28.3106325Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3106600Z 165 │ }); 2026-10-24T20:38:28.3106711Z ╰──── 2026-10-24T20:38:28.3107224Z  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-24T20:38:28.3107923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3108202Z 2026-10-24T20:38:28.3108343Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3108625Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T20:38:28.3108827Z 165 │ }); 2026-10-24T20:38:28.3108976Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T20:38:28.3109204Z ·  ─────────┬────────────┬─── 2026-10-24T20:38:28.3109508Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.3109795Z · ╰── This value is a ref 2026-10-24T20:38:28.3109984Z 167 │ return JSON.stringify( 2026-10-24T20:38:28.3110122Z ╰──── 2026-10-24T20:38:28.3110631Z  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-24T20:38:28.3111498Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3111777Z 2026-10-24T20:38:28.3111918Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3112199Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T20:38:28.3112406Z 207 │ mostRecentEventCount, 2026-10-24T20:38:28.3112580Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3112784Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.3113073Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3113302Z 209 │ ); 2026-10-24T20:38:28.3113412Z ╰──── 2026-10-24T20:38:28.3113927Z  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-24T20:38:28.3114631Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3114904Z 2026-10-24T20:38:28.3115045Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3115325Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T20:38:28.3115532Z 213 │ mostRecentEventCount, 2026-10-24T20:38:28.3115705Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T20:38:28.3115907Z ·  ───────────────┬─────────────── 2026-10-24T20:38:28.3116261Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3116534Z 215 │ ); 2026-10-24T20:38:28.3116641Z ╰──── 2026-10-24T20:38:28.3117151Z  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-24T20:38:28.3117854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3118128Z 2026-10-24T20:38:28.3118308Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:38:28.3118620Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T20:38:28.3118883Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:38:28.3119127Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:38:28.3119357Z ·  ─────────┬──────── 2026-10-24T20:38:28.3119928Z · ╰── 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-24T20:38:28.3120382Z 165 │ }); 2026-10-24T20:38:28.3120534Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T20:38:28.3120705Z 167 │ return JSON.stringify( 2026-10-24T20:38:28.3121000Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T20:38:28.3121237Z 169 │ const record = 2026-10-24T20:38:28.3121400Z 170 │ token.type === "context" 2026-10-24T20:38:28.3121660Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T20:38:28.3121887Z 172 │ : undefined; 2026-10-24T20:38:28.3122075Z 173 │ const presentation = contextChipPresentation( 2026-10-24T20:38:28.3122299Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T20:38:28.3122483Z 175 │ record, 2026-10-24T20:38:28.3122615Z 176 │ ); 2026-10-24T20:38:28.3122764Z 177 │ const icon = contextChipIcon( 2026-10-24T20:38:28.3122926Z 178 │ presentation, 2026-10-24T20:38:28.3123148Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T20:38:28.3123354Z 180 │ ); 2026-10-24T20:38:28.3123480Z 181 │ return { 2026-10-24T20:38:28.3123630Z 182 │ type: token.type, 2026-10-24T20:38:28.3123791Z 183 │ source: token.source, 2026-10-24T20:38:28.3123954Z 184 │ start: token.start, 2026-10-24T20:38:28.3124105Z 185 │ end: token.end, 2026-10-24T20:38:28.3124333Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T20:38:28.3124545Z 187 │ label: 2026-10-24T20:38:28.3124693Z 188 │ token.type === "skill" 2026-10-24T20:38:28.3124895Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T20:38:28.3125095Z 190 │ : token.type === "context" 2026-10-24T20:38:28.3125420Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T20:38:28.3125721Z 192 │ : basename(token.value), 2026-10-24T20:38:28.3126015Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T20:38:28.3126282Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T20:38:28.3126474Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T20:38:28.3126633Z 196 │ }; 2026-10-24T20:38:28.3126755Z 197 │ }), 2026-10-24T20:38:28.3126873Z 198 │ ); 2026-10-24T20:38:28.3127066Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T20:38:28.3127356Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T20:38:28.3127694Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3128020Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T20:38:28.3128216Z ╰──── 2026-10-24T20:38:28.3128477Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:38:28.3128986Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3129278Z 2026-10-24T20:38:28.3129459Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:38:28.3129770Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T20:38:28.3130038Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T20:38:28.3130274Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T20:38:28.3130477Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3131061Z · ╰── 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-24T20:38:28.3131555Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T20:38:28.3131722Z 256 │ value, 2026-10-24T20:38:28.3131873Z 257 │ selection: nextSelection, 2026-10-24T20:38:28.3132023Z 258 │ }); 2026-10-24T20:38:28.3132171Z 259 │ return acknowledgedEventCount; 2026-10-24T20:38:28.3132323Z 260 │ }, 2026-10-24T20:38:28.3132440Z 261 │ [], 2026-10-24T20:38:28.3132565Z ·  ─┬ 2026-10-24T20:38:28.3132820Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3133044Z 262 │ ); 2026-10-24T20:38:28.3133151Z ╰──── 2026-10-24T20:38:28.3133411Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:38:28.3133919Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3134214Z 2026-10-24T20:38:28.3134469Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3134835Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T20:38:28.3135018Z 727 │ 2026-10-24T20:38:28.3135149Z 728 │ const layer = layerWithOptions(); 2026-10-24T20:38:28.3135315Z ·  ──┬── 2026-10-24T20:38:28.3135515Z · ╰── 'layer' is declared here 2026-10-24T20:38:28.3135690Z ╰──── 2026-10-24T20:38:28.3135898Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3136043Z 2026-10-24T20:38:28.3136241Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:38:28.3136592Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T20:38:28.3136830Z 3 │ AuthProvidersManageScope, 2026-10-24T20:38:28.3136986Z 4 │ type AuthSessionState, 2026-10-24T20:38:28.3137155Z ·  ────────┬─────── 2026-10-24T20:38:28.3137390Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:38:28.3137595Z 5 │ type EnvironmentId, 2026-10-24T20:38:28.3137728Z ╰──── 2026-10-24T20:38:28.3137873Z  help: Consider removing this import. 2026-10-24T20:38:28.3137985Z 2026-10-24T20:38:28.3138182Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T20:38:28.3138504Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T20:38:28.3138709Z 1 │ import type { 2026-10-24T20:38:28.3138841Z 2 │ EnvironmentId, 2026-10-24T20:38:28.3138988Z ·  ──────┬────── 2026-10-24T20:38:28.3139202Z · ╰── 'EnvironmentId' is imported here 2026-10-24T20:38:28.3139418Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T20:38:28.3139567Z ╰──── 2026-10-24T20:38:28.3139710Z  help: Consider removing this import. 2026-10-24T20:38:28.3139819Z 2026-10-24T20:38:28.3140287Z ⚠ 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-24T20:38:28.3140877Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T20:38:28.3141088Z 168 │ }); 2026-10-24T20:38:28.3141352Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:38:28.3141721Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T20:38:28.3142011Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3142257Z 172 │ ╰─▶ } 2026-10-24T20:38:28.3142439Z 173 │ 2026-10-24T20:38:28.3142548Z ╰──── 2026-10-24T20:38:28.3142605Z 2026-10-24T20:38:28.3143069Z ⚠ 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-24T20:38:28.3143624Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T20:38:28.3143879Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T20:38:28.3144189Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:38:28.3144497Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T20:38:28.3144735Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3144975Z 181 │ ╰─▶ } 2026-10-24T20:38:28.3145162Z 182 │ 2026-10-24T20:38:28.3145269Z ╰──── 2026-10-24T20:38:28.3145378Z 2026-10-24T20:38:28.3145858Z ⚠ 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-24T20:38:28.3146405Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T20:38:28.3146680Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T20:38:28.3147001Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:38:28.3147297Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T20:38:28.3147615Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T20:38:28.3147890Z 310 │ │ break; 2026-10-24T20:38:28.3148068Z 311 │ │ } 2026-10-24T20:38:28.3148261Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3148504Z 313 │ ╰─▶ } 2026-10-24T20:38:28.3148687Z 314 │ 2026-10-24T20:38:28.3148794Z ╰──── 2026-10-24T20:38:28.3148848Z 2026-10-24T20:38:28.3149043Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3149378Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T20:38:28.3149622Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T20:38:28.3149808Z 257 │ }, [props.path, targetIndex]); 2026-10-24T20:38:28.3149980Z ·  ─────┬──── 2026-10-24T20:38:28.3150215Z · ╰── Unnecessary dependency `props.path` 2026-10-24T20:38:28.3150410Z 258 │ 2026-10-24T20:38:28.3150517Z ╰──── 2026-10-24T20:38:28.3151034Z  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-24T20:38:28.3151665Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3151958Z 2026-10-24T20:38:28.3152146Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.3152476Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T20:38:28.3152695Z 292 │ 2026-10-24T20:38:28.3154973Z ·  ─────────── 2026-10-24T20:38:28.3155148Z 310 │ {body} 2026-10-24T20:38:28.3155282Z ╰──── 2026-10-24T20:38:28.3155474Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:38:28.3155625Z 2026-10-24T20:38:28.3155878Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3156253Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T20:38:28.3156446Z 150 │ 2026-10-24T20:38:28.3156567Z 151 │ useEffect(() => { 2026-10-24T20:38:28.3156716Z ·  ────┬──── 2026-10-24T20:38:28.3156923Z · ╰── This is the containing effect 2026-10-24T20:38:28.3157135Z 152 │ if (!controlledSelectedPath) { 2026-10-24T20:38:28.3157292Z 153 │ return; 2026-10-24T20:38:28.3157417Z 154 │ } 2026-10-24T20:38:28.3157567Z 155 │ setExpandedPaths((current) => { 2026-10-24T20:38:28.3157745Z ·  ────────┬─────── 2026-10-24T20:38:28.3158002Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3158287Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T20:38:28.3158471Z ╰──── 2026-10-24T20:38:28.3159115Z  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-24T20:38:28.3159973Z  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-24T20:38:28.3160276Z 2026-10-24T20:38:28.3160730Z ⚠ 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-24T20:38:28.3161325Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T20:38:28.3161572Z 1679 │ yield* harness.replaceSession; 2026-10-24T20:38:28.3161883Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.3162221Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T20:38:28.3162458Z 1682 │ │ break; 2026-10-24T20:38:28.3162692Z 1683 │ │ } 2026-10-24T20:38:28.3162921Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3163168Z 1685 │ ╰─▶ } 2026-10-24T20:38:28.3163372Z 1686 │ yield* Queue.offer( 2026-10-24T20:38:28.3163512Z ╰──── 2026-10-24T20:38:28.3163565Z 2026-10-24T20:38:28.3164021Z ⚠ 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-24T20:38:28.3164580Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T20:38:28.3164824Z 1788 │ yield* harness.replaceSession; 2026-10-24T20:38:28.3165132Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:38:28.3165476Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T20:38:28.3165734Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3165981Z 1792 │ ╰─▶ } 2026-10-24T20:38:28.3166237Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T20:38:28.3166425Z ╰──── 2026-10-24T20:38:28.3166478Z 2026-10-24T20:38:28.3166657Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:38:28.3167013Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T20:38:28.3167263Z 115 │ return [...commands]; 2026-10-24T20:38:28.3167483Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T20:38:28.3167736Z ·  ─────────┬───────── 2026-10-24T20:38:28.3168032Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T20:38:28.3168251Z 117 │ 2026-10-24T20:38:28.3168357Z ╰──── 2026-10-24T20:38:28.3168724Z  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-24T20:38:28.3169322Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3169618Z 2026-10-24T20:38:28.3169832Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:38:28.3170157Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T20:38:28.3170336Z 40 │ 2026-10-24T20:38:28.3170497Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T20:38:28.3170727Z ·  ─────── 2026-10-24T20:38:28.3170943Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T20:38:28.3171129Z ╰──── 2026-10-24T20:38:28.3171434Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:38:28.3171681Z 2026-10-24T20:38:28.3172188Z ⚠ 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-24T20:38:28.3172801Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T20:38:28.3173049Z 520 │ })).delivery; 2026-10-24T20:38:28.3173323Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T20:38:28.3173614Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3173877Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T20:38:28.3174124Z 524 │ │ id: task.id, 2026-10-24T20:38:28.3174348Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T20:38:28.3174568Z 526 │ │ })).delivery; 2026-10-24T20:38:28.3174813Z 527 │ ╰─▶ } 2026-10-24T20:38:28.3175067Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T20:38:28.3175240Z ╰──── 2026-10-24T20:38:28.3175294Z 2026-10-24T20:38:28.3175499Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T20:38:28.3175818Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T20:38:28.3175997Z 78 │ 2026-10-24T20:38:28.3176186Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T20:38:28.3176413Z ·  ────────┬─────── 2026-10-24T20:38:28.3176649Z · ╰── 'describeSchedule' is declared here 2026-10-24T20:38:28.3176894Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T20:38:28.3177066Z ╰──── 2026-10-24T20:38:28.3177222Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3177337Z 2026-10-24T20:38:28.3177489Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3177796Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T20:38:28.3178009Z 35 │ 2026-10-24T20:38:28.3178196Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T20:38:28.3178423Z ·  ────────┬──────── 2026-10-24T20:38:28.3178656Z · ╰── `inspectorProgress` originates here 2026-10-24T20:38:28.3178887Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T20:38:28.3179121Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T20:38:28.3179316Z 39 │ 2026-10-24T20:38:28.3179450Z 40 │ const onClosed = props.onClosed; 2026-10-24T20:38:28.3179608Z 41 │ useEffect(() => { 2026-10-24T20:38:28.3179777Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T20:38:28.3179962Z ·  ────────┬──────── 2026-10-24T20:38:28.3180197Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T20:38:28.3180414Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T20:38:28.3180555Z ╰──── 2026-10-24T20:38:28.3180901Z  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-24T20:38:28.3181451Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3181740Z 2026-10-24T20:38:28.3181943Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3182284Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T20:38:28.3182535Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T20:38:28.3182769Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T20:38:28.3182996Z ·  ──────────┬───────── 2026-10-24T20:38:28.3183244Z · ╰── `renderedContentWidth` originates here 2026-10-24T20:38:28.3183441Z 39 │ 2026-10-24T20:38:28.3183573Z 40 │ const onClosed = props.onClosed; 2026-10-24T20:38:28.3183728Z 41 │ useEffect(() => { 2026-10-24T20:38:28.3183893Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T20:38:28.3184071Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T20:38:28.3184238Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T20:38:28.3184396Z 45 │ (finished) => { 2026-10-24T20:38:28.3184611Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T20:38:28.3184824Z 47 │ runOnJS(onClosed)(); 2026-10-24T20:38:28.3184968Z 48 │ } 2026-10-24T20:38:28.3185085Z 49 │ }, 2026-10-24T20:38:28.3185197Z 50 │ ); 2026-10-24T20:38:28.3185384Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T20:38:28.3185602Z 52 │ renderedInspectorWidth.set( 2026-10-24T20:38:28.3185836Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T20:38:28.3186040Z 54 │ ); 2026-10-24T20:38:28.3186151Z 55 │ }, [ 2026-10-24T20:38:28.3186279Z 56 │ inspectorProgress, 2026-10-24T20:38:28.3186427Z 57 │ inspectorVisible, 2026-10-24T20:38:28.3186577Z 58 │ inspectorWidth, 2026-10-24T20:38:28.3186719Z 59 │ onClosed, 2026-10-24T20:38:28.3186859Z 60 │ renderedInspectorWidth, 2026-10-24T20:38:28.3187006Z 61 │ resizing, 2026-10-24T20:38:28.3187125Z 62 │ ]); 2026-10-24T20:38:28.3187235Z 63 │ 2026-10-24T20:38:28.3187349Z 64 │ useEffect(() => { 2026-10-24T20:38:28.3187517Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T20:38:28.3187704Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T20:38:28.3187901Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T20:38:28.3188095Z ·  ──────────┬───────── 2026-10-24T20:38:28.3188250Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T20:38:28.3188308Z 68 │ return; 2026-10-24T20:38:28.3188359Z ╰──── 2026-10-24T20:38:28.3188626Z  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-24T20:38:28.3188931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3188933Z 2026-10-24T20:38:28.3189098Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:38:28.3189214Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T20:38:28.3189267Z 265 │ 2026-10-24T20:38:28.3189370Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T20:38:28.3189440Z ·  ── 2026-10-24T20:38:28.3189491Z 267 │ } 2026-10-24T20:38:28.3189542Z ╰──── 2026-10-24T20:38:28.3189827Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:38:28.3189858Z 2026-10-24T20:38:28.3190055Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3190213Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T20:38:28.3190267Z 154 │ } 2026-10-24T20:38:28.3190333Z 155 │ }, [wrappedRender]); 2026-10-24T20:38:28.3190409Z ·  ──────┬────── 2026-10-24T20:38:28.3190552Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T20:38:28.3190604Z 156 │ 2026-10-24T20:38:28.3190653Z ╰──── 2026-10-24T20:38:28.3190978Z  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-24T20:38:28.3191295Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3191298Z 2026-10-24T20:38:28.3191576Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:38:28.3191734Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T20:38:28.3191787Z 799 │ > 2026-10-24T20:38:28.3191909Z 800 │ 2026-10-24T20:38:28.3192027Z ·  ──────────────────── 2026-10-24T20:38:28.3192125Z 801 │ 2026-10-24T20:38:28.3192175Z ╰──── 2026-10-24T20:38:28.3192398Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:38:28.3192538Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:38:28.3192540Z 2026-10-24T20:38:28.3192725Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T20:38:28.3192855Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T20:38:28.3192969Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T20:38:28.3193046Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T20:38:28.3193116Z ·  ─┬─ 2026-10-24T20:38:28.3193238Z · ╰── 'Arr' is imported here 2026-10-24T20:38:28.3193319Z 5 │ import * as Order from "effect/Order"; 2026-10-24T20:38:28.3193429Z ╰──── 2026-10-24T20:38:28.3193562Z  help: Consider removing this import. 2026-10-24T20:38:28.3193564Z 2026-10-24T20:38:28.3193753Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T20:38:28.3193879Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T20:38:28.3193956Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T20:38:28.3194037Z 5 │ import * as Order from "effect/Order"; 2026-10-24T20:38:28.3194109Z ·  ──┬── 2026-10-24T20:38:28.3194235Z · ╰── 'Order' is imported here 2026-10-24T20:38:28.3194284Z 6 │ 2026-10-24T20:38:28.3194337Z ╰──── 2026-10-24T20:38:28.3194431Z  help: Consider removing this import. 2026-10-24T20:38:28.3194434Z 2026-10-24T20:38:28.3194581Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3194745Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T20:38:28.3194827Z 26 │ const latestInput = useRef(input); 2026-10-24T20:38:28.3194902Z 27 │ latestInput.current = input; 2026-10-24T20:38:28.3195008Z ·  ─────┬─────────┬─── 2026-10-24T20:38:28.3195182Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.3195294Z · ╰── This value is a ref 2026-10-24T20:38:28.3195368Z 28 │ const mounted = useRef(true); 2026-10-24T20:38:28.3195419Z ╰──── 2026-10-24T20:38:28.3195890Z  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-24T20:38:28.3196182Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3196185Z 2026-10-24T20:38:28.3196337Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3196497Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T20:38:28.3196600Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T20:38:28.3196679Z 66 │ const progress = useSharedValue(0); 2026-10-24T20:38:28.3196751Z ·  ────┬─── 2026-10-24T20:38:28.3196879Z · ╰── `progress` originates here 2026-10-24T20:38:28.3196949Z 67 │ useEffect(() => { 2026-10-24T20:38:28.3197070Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T20:38:28.3197139Z ·  ────┬─── 2026-10-24T20:38:28.3197268Z · ╰── `progress` cannot be modified 2026-10-24T20:38:28.3197337Z 69 │ }, [expanded, progress]); 2026-10-24T20:38:28.3197385Z ╰──── 2026-10-24T20:38:28.3197643Z  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-24T20:38:28.3197940Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3197943Z 2026-10-24T20:38:28.3198092Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3198299Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T20:38:28.3198382Z 90 │ }) { 2026-10-24T20:38:28.3198495Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T20:38:28.3198566Z ·  ────┬─── 2026-10-24T20:38:28.3198690Z · ╰── `rotation` originates here 2026-10-24T20:38:28.3198758Z 92 │ useLayoutEffect(() => { 2026-10-24T20:38:28.3198897Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T20:38:28.3198966Z ·  ────┬─── 2026-10-24T20:38:28.3199090Z · ╰── `rotation` cannot be modified 2026-10-24T20:38:28.3199165Z 94 │ }, [props.hidden, rotation]); 2026-10-24T20:38:28.3199216Z ╰──── 2026-10-24T20:38:28.3199478Z  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-24T20:38:28.3199775Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3199780Z 2026-10-24T20:38:28.3199932Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3200100Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T20:38:28.3200192Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T20:38:28.3200320Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T20:38:28.3200404Z ·  ────────┬──────── 2026-10-24T20:38:28.3200554Z · ╰── `loadingVisibility` originates here 2026-10-24T20:38:28.3200624Z 268 │ useLayoutEffect(() => { 2026-10-24T20:38:28.3200779Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T20:38:28.3200871Z ·  ────────┬──────── 2026-10-24T20:38:28.3201044Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T20:38:28.3201135Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T20:38:28.3201185Z ╰──── 2026-10-24T20:38:28.3201439Z  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-24T20:38:28.3201737Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3201739Z 2026-10-24T20:38:28.3201893Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3202059Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T20:38:28.3202111Z 325 │ }) { 2026-10-24T20:38:28.3202266Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T20:38:28.3202352Z ·  ─────────┬───────── 2026-10-24T20:38:28.3202501Z · ╰── `recordingVisibility` originates here 2026-10-24T20:38:28.3202567Z 327 │ useLayoutEffect(() => { 2026-10-24T20:38:28.3202750Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T20:38:28.3202834Z ·  ─────────┬───────── 2026-10-24T20:38:28.3203030Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T20:38:28.3203148Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T20:38:28.3203199Z ╰──── 2026-10-24T20:38:28.3203456Z  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-24T20:38:28.3203754Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3203756Z 2026-10-24T20:38:28.3203896Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3204048Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T20:38:28.3204203Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T20:38:28.3204329Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T20:38:28.3204448Z ·  ───────────┬────────── 2026-10-24T20:38:28.3204615Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3204731Z 123 │ const sessionRef = useRef(null); 2026-10-24T20:38:28.3204782Z ╰──── 2026-10-24T20:38:28.3205245Z  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-24T20:38:28.3205535Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3205539Z 2026-10-24T20:38:28.3205677Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3205831Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T20:38:28.3205884Z 125 │ 2026-10-24T20:38:28.3205990Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:38:28.3206074Z ·  ─────────┬──────── 2026-10-24T20:38:28.3206219Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3206317Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:38:28.3206368Z ╰──── 2026-10-24T20:38:28.3206828Z  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-24T20:38:28.3207114Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3207117Z 2026-10-24T20:38:28.3207255Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3207407Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T20:38:28.3207462Z 125 │ 2026-10-24T20:38:28.3207565Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:38:28.3207649Z ·  ─────────┬───────── 2026-10-24T20:38:28.3207793Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3207941Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:38:28.3208086Z ╰──── 2026-10-24T20:38:28.3208541Z  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-24T20:38:28.3208825Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3208827Z 2026-10-24T20:38:28.3208965Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3209118Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T20:38:28.3209167Z 125 │ 2026-10-24T20:38:28.3209270Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:38:28.3209384Z ·  ─────────┬───────── 2026-10-24T20:38:28.3209547Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3209643Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:38:28.3209693Z ╰──── 2026-10-24T20:38:28.3210144Z  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-24T20:38:28.3210426Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3210428Z 2026-10-24T20:38:28.3210569Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3210724Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T20:38:28.3210776Z 125 │ 2026-10-24T20:38:28.3210887Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:38:28.3211022Z ·  ──────────┬───────── 2026-10-24T20:38:28.3211184Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3211282Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:38:28.3211335Z ╰──── 2026-10-24T20:38:28.3211785Z  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-24T20:38:28.3212072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3212077Z 2026-10-24T20:38:28.3212216Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3212369Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T20:38:28.3212477Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:38:28.3212662Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:38:28.3212832Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T20:38:28.3212955Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T20:38:28.3213148Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T20:38:28.3213297Z 131 │ │ isFinished: status.isFinished, 2026-10-24T20:38:28.3213468Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T20:38:28.3213569Z 133 │ │ error: status.error, 2026-10-24T20:38:28.3213664Z 134 │ │ url: status.url, 2026-10-24T20:38:28.3213744Z 135 │ │ }); 2026-10-24T20:38:28.3213818Z 136 │ │ }, 2026-10-24T20:38:28.3214009Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T20:38:28.3214116Z 138 │ │ selectInput: (inputs) => { 2026-10-24T20:38:28.3214273Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T20:38:28.3214416Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T20:38:28.3214577Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T20:38:28.3214713Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T20:38:28.3214812Z 143 │ │ if (order !== known) { 2026-10-24T20:38:28.3214944Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T20:38:28.3215055Z 145 │ │ transform: (current) => ({ 2026-10-24T20:38:28.3215255Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T20:38:28.3215344Z 147 │ │ }), 2026-10-24T20:38:28.3215423Z 148 │ │ }); 2026-10-24T20:38:28.3215501Z 149 │ │ } 2026-10-24T20:38:28.3215638Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T20:38:28.3215714Z 151 │ │ }, 2026-10-24T20:38:28.3215840Z 152 │ ├─▶ }); 2026-10-24T20:38:28.3216070Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3216154Z 153 │ recorderRef.current = recorder; 2026-10-24T20:38:28.3216206Z ╰──── 2026-10-24T20:38:28.3216708Z  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-24T20:38:28.3217022Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3217025Z 2026-10-24T20:38:28.3217165Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3217318Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T20:38:28.3217375Z 152 │ }); 2026-10-24T20:38:28.3217453Z 153 │ recorderRef.current = recorder; 2026-10-24T20:38:28.3217565Z ·  ─────┬─────────┬─── 2026-10-24T20:38:28.3217751Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.3217865Z · ╰── This value is a ref 2026-10-24T20:38:28.3217966Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:38:28.3218016Z ╰──── 2026-10-24T20:38:28.3218469Z  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-24T20:38:28.3218751Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3218753Z 2026-10-24T20:38:28.3218890Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3219045Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T20:38:28.3219131Z 153 │ recorderRef.current = recorder; 2026-10-24T20:38:28.3219319Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:38:28.3219403Z 155 │ │ recorder, 2026-10-24T20:38:28.3219526Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T20:38:28.3219642Z 157 │ │ requestPermission: async () => { 2026-10-24T20:38:28.3219800Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T20:38:28.3219986Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T20:38:28.3220060Z 160 │ │ }, 2026-10-24T20:38:28.3220204Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T20:38:28.3220339Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T20:38:28.3220470Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T20:38:28.3220577Z 164 │ │ onStateChange: (nextState) => 2026-10-24T20:38:28.3220665Z 165 │ │ setState({ 2026-10-24T20:38:28.3220762Z 166 │ │ state: nextState, 2026-10-24T20:38:28.3220906Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T20:38:28.3221055Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T20:38:28.3221132Z 169 │ │ }), 2026-10-24T20:38:28.3221302Z 170 │ ├─▶ }); 2026-10-24T20:38:28.3221526Z · ╰──── Cannot access ref value during render 2026-10-24T20:38:28.3221582Z 171 │ } 2026-10-24T20:38:28.3221631Z ╰──── 2026-10-24T20:38:28.3222087Z  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-24T20:38:28.3222371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3222373Z 2026-10-24T20:38:28.3222513Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3222669Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T20:38:28.3222752Z 153 │ recorderRef.current = recorder; 2026-10-24T20:38:28.3222854Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:38:28.3222961Z ·  ─────┬────────┬─── 2026-10-24T20:38:28.3223136Z · │ ╰── Cannot update ref value during render 2026-10-24T20:38:28.3223250Z · ╰── This value is a ref 2026-10-24T20:38:28.3223313Z 155 │ recorder, 2026-10-24T20:38:28.3223363Z ╰──── 2026-10-24T20:38:28.3223822Z  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-24T20:38:28.3224104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3224107Z 2026-10-24T20:38:28.3224246Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3224397Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T20:38:28.3224482Z 184 │ return () => subscription.remove(); 2026-10-24T20:38:28.3224545Z 185 │ }, [controller]); 2026-10-24T20:38:28.3224619Z ·  ─────┬──── 2026-10-24T20:38:28.3224760Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3224811Z 186 │ 2026-10-24T20:38:28.3224860Z ╰──── 2026-10-24T20:38:28.3225321Z  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-24T20:38:28.3225603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3225606Z 2026-10-24T20:38:28.3225746Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3225896Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T20:38:28.3225978Z 184 │ return () => subscription.remove(); 2026-10-24T20:38:28.3226043Z 185 │ }, [controller]); 2026-10-24T20:38:28.3226119Z ·  ──────┬───── 2026-10-24T20:38:28.3226304Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3226385Z 186 │ 2026-10-24T20:38:28.3226435Z ╰──── 2026-10-24T20:38:28.3226888Z  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-24T20:38:28.3227168Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3227171Z 2026-10-24T20:38:28.3227307Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3227460Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T20:38:28.3227519Z 191 │ }, 2026-10-24T20:38:28.3227591Z 192 │ [controller, recorder], 2026-10-24T20:38:28.3227664Z ·  ─────┬──── 2026-10-24T20:38:28.3227802Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3227856Z 193 │ ); 2026-10-24T20:38:28.3227906Z ╰──── 2026-10-24T20:38:28.3228358Z  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-24T20:38:28.3228639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3228641Z 2026-10-24T20:38:28.3228783Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3228940Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T20:38:28.3229028Z 174 │ const controller = session.controller; 2026-10-24T20:38:28.3229112Z 175 │ const recorder = recorderRef.current; 2026-10-24T20:38:28.3229214Z ·  ─────────┬───────── 2026-10-24T20:38:28.3229367Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3229417Z 176 │ 2026-10-24T20:38:28.3229465Z ╰──── 2026-10-24T20:38:28.3229920Z  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-24T20:38:28.3230206Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3230211Z 2026-10-24T20:38:28.3230349Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3230500Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T20:38:28.3230553Z 191 │ }, 2026-10-24T20:38:28.3230624Z 192 │ [controller, recorder], 2026-10-24T20:38:28.3230711Z ·  ───────────┬────────── 2026-10-24T20:38:28.3230863Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3230915Z 193 │ ); 2026-10-24T20:38:28.3230994Z ╰──── 2026-10-24T20:38:28.3231542Z  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-24T20:38:28.3231862Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3231864Z 2026-10-24T20:38:28.3231999Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3232152Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T20:38:28.3232242Z 245 │ return () => clearInterval(intervalId); 2026-10-24T20:38:28.3232351Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T20:38:28.3232435Z ·  ─────┬──── 2026-10-24T20:38:28.3232590Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3232644Z 247 │ 2026-10-24T20:38:28.3232698Z ╰──── 2026-10-24T20:38:28.3233153Z  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-24T20:38:28.3233431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3233434Z 2026-10-24T20:38:28.3233571Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3233724Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T20:38:28.3233815Z 245 │ return () => clearInterval(intervalId); 2026-10-24T20:38:28.3233923Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T20:38:28.3234048Z ·  ────────────────────────┬─────────────────────── 2026-10-24T20:38:28.3234201Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3234253Z 247 │ 2026-10-24T20:38:28.3234301Z ╰──── 2026-10-24T20:38:28.3234758Z  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-24T20:38:28.3235039Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3235042Z 2026-10-24T20:38:28.3235185Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3235340Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T20:38:28.3235406Z 260 │ setOwnerFocused, 2026-10-24T20:38:28.3235470Z 261 │ session, 2026-10-24T20:38:28.3235540Z ·  ───┬─── 2026-10-24T20:38:28.3235676Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3235733Z 262 │ stop, 2026-10-24T20:38:28.3235785Z ╰──── 2026-10-24T20:38:28.3237886Z  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-24T20:38:28.3238250Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3238296Z 2026-10-24T20:38:28.3238437Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3238591Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T20:38:28.3238645Z 250 │ 2026-10-24T20:38:28.3238781Z 251 │ ╭─▶ return { 2026-10-24T20:38:28.3238987Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T20:38:28.3239065Z 253 │ │ state, 2026-10-24T20:38:28.3239151Z 254 │ │ audioLevels, 2026-10-24T20:38:28.3239248Z 255 │ │ elapsedSeconds, 2026-10-24T20:38:28.3239376Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T20:38:28.3239455Z 257 │ │ ownerKey, 2026-10-24T20:38:28.3239531Z 258 │ │ label, 2026-10-24T20:38:28.3239619Z 259 │ │ focusedOwners, 2026-10-24T20:38:28.3239709Z 260 │ │ setOwnerFocused, 2026-10-24T20:38:28.3239788Z 261 │ │ session, 2026-10-24T20:38:28.3239863Z 262 │ │ stop, 2026-10-24T20:38:28.3239940Z 263 │ │ cancel, 2026-10-24T20:38:28.3240062Z 264 │ ├─▶ }; 2026-10-24T20:38:28.3240255Z · ╰──── Cannot access ref value during render 2026-10-24T20:38:28.3240316Z 265 │ } 2026-10-24T20:38:28.3240370Z ╰──── 2026-10-24T20:38:28.3240828Z  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-24T20:38:28.3241150Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3241153Z 2026-10-24T20:38:28.3241305Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:38:28.3241459Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T20:38:28.3241613Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T20:38:28.3241736Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T20:38:28.3241815Z ·  ─────┬───── 2026-10-24T20:38:28.3241947Z · ╰── `audioLevels` originates here 2026-10-24T20:38:28.3242063Z 123 │ const sessionRef = useRef(null); 2026-10-24T20:38:28.3242203Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T20:38:28.3242258Z 125 │ 2026-10-24T20:38:28.3242362Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:38:28.3242458Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:38:28.3242592Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T20:38:28.3242684Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T20:38:28.3242859Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T20:38:28.3242970Z 131 │ isFinished: status.isFinished, 2026-10-24T20:38:28.3243108Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T20:38:28.3243180Z 133 │ error: status.error, 2026-10-24T20:38:28.3243245Z 134 │ url: status.url, 2026-10-24T20:38:28.3243303Z 135 │ }); 2026-10-24T20:38:28.3243356Z 136 │ }, 2026-10-24T20:38:28.3243517Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T20:38:28.3243591Z 138 │ selectInput: (inputs) => { 2026-10-24T20:38:28.3243710Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T20:38:28.3243818Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T20:38:28.3243951Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T20:38:28.3244057Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T20:38:28.3244126Z 143 │ if (order !== known) { 2026-10-24T20:38:28.3244227Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T20:38:28.3244308Z 145 │ transform: (current) => ({ 2026-10-24T20:38:28.3244476Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T20:38:28.3244536Z 147 │ }), 2026-10-24T20:38:28.3244593Z 148 │ }); 2026-10-24T20:38:28.3244649Z 149 │ } 2026-10-24T20:38:28.3244754Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T20:38:28.3244808Z 151 │ }, 2026-10-24T20:38:28.3244860Z 152 │ }); 2026-10-24T20:38:28.3244939Z 153 │ recorderRef.current = recorder; 2026-10-24T20:38:28.3245044Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:38:28.3245104Z 155 │ recorder, 2026-10-24T20:38:28.3245199Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T20:38:28.3245280Z 157 │ requestPermission: async () => { 2026-10-24T20:38:28.3245406Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T20:38:28.3245556Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T20:38:28.3245610Z 160 │ }, 2026-10-24T20:38:28.3245717Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T20:38:28.3245818Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T20:38:28.3245917Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T20:38:28.3245994Z 164 │ onStateChange: (nextState) => 2026-10-24T20:38:28.3246056Z 165 │ setState({ 2026-10-24T20:38:28.3246172Z 166 │ state: nextState, 2026-10-24T20:38:28.3246303Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T20:38:28.3246396Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T20:38:28.3246453Z 169 │ }), 2026-10-24T20:38:28.3246506Z 170 │ }); 2026-10-24T20:38:28.3246556Z 171 │ } 2026-10-24T20:38:28.3246606Z 172 │ 2026-10-24T20:38:28.3246688Z 173 │ const session = sessionRef.current; 2026-10-24T20:38:28.3246773Z 174 │ const controller = session.controller; 2026-10-24T20:38:28.3246854Z 175 │ const recorder = recorderRef.current; 2026-10-24T20:38:28.3246903Z 176 │ 2026-10-24T20:38:28.3246967Z 177 │ useEffect(() => { 2026-10-24T20:38:28.3247112Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T20:38:28.3247252Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T20:38:28.3247388Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T20:38:28.3247494Z 181 │ // calls and route interruptions during capture. 2026-10-24T20:38:28.3247626Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T20:38:28.3247678Z 183 │ }); 2026-10-24T20:38:28.3247761Z 184 │ return () => subscription.remove(); 2026-10-24T20:38:28.3247823Z 185 │ }, [controller]); 2026-10-24T20:38:28.3247875Z 186 │ 2026-10-24T20:38:28.3247932Z 187 │ useEffect( 2026-10-24T20:38:28.3247991Z 188 │ () => () => { 2026-10-24T20:38:28.3248061Z 189 │ controller.dispose(); 2026-10-24T20:38:28.3248127Z 190 │ recorder.release(); 2026-10-24T20:38:28.3248179Z 191 │ }, 2026-10-24T20:38:28.3248245Z 192 │ [controller, recorder], 2026-10-24T20:38:28.3248301Z 193 │ ); 2026-10-24T20:38:28.3248351Z 194 │ 2026-10-24T20:38:28.3248413Z 195 │ useEffect(() => { 2026-10-24T20:38:28.3248502Z 196 │ if (state.phase !== "recording") return; 2026-10-24T20:38:28.3248552Z 197 │ 2026-10-24T20:38:28.3248693Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T20:38:28.3248793Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T20:38:28.3248871Z 200 │ void activation.catch(() => {}); 2026-10-24T20:38:28.3248932Z 201 │ return () => { 2026-10-24T20:38:28.3249075Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T20:38:28.3249209Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T20:38:28.3249261Z 204 │ }; 2026-10-24T20:38:28.3249337Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T20:38:28.3249390Z 206 │ 2026-10-24T20:38:28.3249456Z 207 │ useEffect(() => { 2026-10-24T20:38:28.3249587Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T20:38:28.3249636Z 209 │ 2026-10-24T20:38:28.3249752Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T20:38:28.3249901Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T20:38:28.3250000Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T20:38:28.3250075Z ·  ─────┬───── 2026-10-24T20:38:28.3250209Z · ╰── `audioLevels` cannot be modified 2026-10-24T20:38:28.3250262Z 213 │ } 2026-10-24T20:38:28.3250311Z ╰──── 2026-10-24T20:38:28.3250625Z  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-24T20:38:28.3250996Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3250999Z 2026-10-24T20:38:28.3251192Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:38:28.3251346Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T20:38:28.3251397Z 206 │ 2026-10-24T20:38:28.3251457Z 207 │ useEffect(() => { 2026-10-24T20:38:28.3251531Z ·  ───┬─── 2026-10-24T20:38:28.3251744Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T20:38:28.3251881Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T20:38:28.3251930Z 209 │ 2026-10-24T20:38:28.3252047Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T20:38:28.3252196Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T20:38:28.3252294Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T20:38:28.3252367Z ·  ─────┬───── 2026-10-24T20:38:28.3252496Z · ╰── This modifies `audioLevels` 2026-10-24T20:38:28.3252548Z 213 │ } 2026-10-24T20:38:28.3252597Z ╰──── 2026-10-24T20:38:28.3252929Z  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-24T20:38:28.3253234Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:38:28.3253238Z 2026-10-24T20:38:28.3253444Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:38:28.3253575Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T20:38:28.3253647Z 89 │ let cursor = prompt.length; 2026-10-24T20:38:28.3253749Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T20:38:28.3253850Z ·  ─────── 2026-10-24T20:38:28.3253929Z 91 │ let { start, end } = occurrence; 2026-10-24T20:38:28.3253979Z ╰──── 2026-10-24T20:38:28.3254231Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:38:28.3254239Z 2026-10-24T20:38:28.3254403Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T20:38:28.3254592Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T20:38:28.3254726Z 219 │ 2026-10-24T20:38:28.3254865Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T20:38:28.3254970Z ·  ──┬─ 2026-10-24T20:38:28.3255130Z · ╰── 'U+001B' is a control character. 2026-10-24T20:38:28.3255192Z 221 │ 2026-10-24T20:38:28.3255240Z ╰──── 2026-10-24T20:38:28.3255517Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T20:38:28.3255549Z 2026-10-24T20:38:28.3255745Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T20:38:28.3255908Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T20:38:28.3255972Z 1782 │ assert.equal( 2026-10-24T20:38:28.3256110Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T20:38:28.3256210Z ·  ────────────────────────── 2026-10-24T20:38:28.3256288Z 1784 │ stored.attachments[0]?.id, 2026-10-24T20:38:28.3256337Z ╰──── 2026-10-24T20:38:28.3256503Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T20:38:28.3256505Z 2026-10-24T20:38:28.3256770Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3256900Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T20:38:28.3256950Z 339 │ 2026-10-24T20:38:28.3257046Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T20:38:28.3257118Z ·  ────┬──── 2026-10-24T20:38:28.3257244Z · ╰── 'layerTest' is declared here 2026-10-24T20:38:28.3257293Z ╰──── 2026-10-24T20:38:28.3257392Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3257395Z 2026-10-24T20:38:28.3257570Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:38:28.3257725Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T20:38:28.3257830Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T20:38:28.3258008Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T20:38:28.3258149Z ·  ─────┬───── 2026-10-24T20:38:28.3258347Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T20:38:28.3258424Z 101 │ const readEditor = useCallback( 2026-10-24T20:38:28.3258471Z ╰──── 2026-10-24T20:38:28.3258782Z  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-24T20:38:28.3259097Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3259102Z 2026-10-24T20:38:28.3259276Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:38:28.3259429Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T20:38:28.3259489Z 120 │ setEditor, 2026-10-24T20:38:28.3259550Z 121 │ startEditor, 2026-10-24T20:38:28.3259623Z ·  ─────┬───── 2026-10-24T20:38:28.3259763Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T20:38:28.3259823Z 122 │ hasChanges, 2026-10-24T20:38:28.3259872Z ╰──── 2026-10-24T20:38:28.3260226Z  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-24T20:38:28.3260558Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3260561Z 2026-10-24T20:38:28.3260757Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:38:28.3260895Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T20:38:28.3260995Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T20:38:28.3261061Z 3 │ type AuthSessionState, 2026-10-24T20:38:28.3261141Z ·  ────────┬─────── 2026-10-24T20:38:28.3261280Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:38:28.3261346Z 4 │ sessionGrantsScope, 2026-10-24T20:38:28.3261399Z ╰──── 2026-10-24T20:38:28.3261496Z  help: Consider removing this import. 2026-10-24T20:38:28.3261499Z 2026-10-24T20:38:28.3261717Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:38:28.3261883Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T20:38:28.3261949Z 1997 │ assert.equal( 2026-10-24T20:38:28.3262091Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T20:38:28.3262167Z ·  ────── 2026-10-24T20:38:28.3262246Z 1999 │ "authoritative answer", 2026-10-24T20:38:28.3262295Z ╰──── 2026-10-24T20:38:28.3262460Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:38:28.3262462Z 2026-10-24T20:38:28.3262932Z ⚠ 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-24T20:38:28.3263098Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T20:38:28.3263273Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T20:38:28.3263473Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T20:38:28.3263579Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3263707Z 3953 │ ╰─▶ } 2026-10-24T20:38:28.3263830Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T20:38:28.3263881Z ╰──── 2026-10-24T20:38:28.3263884Z 2026-10-24T20:38:28.3264337Z ⚠ 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-24T20:38:28.3264499Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T20:38:28.3264587Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T20:38:28.3264765Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T20:38:28.3264871Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3265000Z 6064 │ ╰─▶ } 2026-10-24T20:38:28.3265210Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T20:38:28.3265293Z ╰──── 2026-10-24T20:38:28.3265295Z 2026-10-24T20:38:28.3265747Z ⚠ 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-24T20:38:28.3265909Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T20:38:28.3265993Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T20:38:28.3266169Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T20:38:28.3266274Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T20:38:28.3266407Z 6199 │ ╰─▶ } 2026-10-24T20:38:28.3266569Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T20:38:28.3266619Z ╰──── 2026-10-24T20:38:28.3266621Z 2026-10-24T20:38:28.3266874Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3267038Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7] 2026-10-24T20:38:28.3267090Z 10601 │ 2026-10-24T20:38:28.3267160Z 10602 │ const layer: Layer.Layer< 2026-10-24T20:38:28.3267231Z ·  ──┬── 2026-10-24T20:38:28.3267355Z · ╰── 'layer' is declared here 2026-10-24T20:38:28.3267452Z 10603 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:38:28.3267504Z ╰──── 2026-10-24T20:38:28.3267606Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3267609Z 2026-10-24T20:38:28.3267931Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3268087Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T20:38:28.3268138Z 1443 │ 2026-10-24T20:38:28.3268250Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T20:38:28.3268363Z ·  ───────────────────┬─────────────────── 2026-10-24T20:38:28.3268563Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T20:38:28.3268685Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T20:38:28.3268737Z ╰──── 2026-10-24T20:38:28.3268836Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3268839Z 2026-10-24T20:38:28.3269087Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3269242Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T20:38:28.3269293Z 1679 │ 2026-10-24T20:38:28.3269361Z 1680 │ const layer: Layer.Layer< 2026-10-24T20:38:28.3269428Z ·  ──┬── 2026-10-24T20:38:28.3269547Z · ╰── 'layer' is declared here 2026-10-24T20:38:28.3269636Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:38:28.3269685Z ╰──── 2026-10-24T20:38:28.3269830Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3269911Z 2026-10-24T20:38:28.3270278Z ⚠ 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-24T20:38:28.3270400Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T20:38:28.3270457Z 145 │ name, 2026-10-24T20:38:28.3270591Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T20:38:28.3270692Z ·  ────────────────────────── 2026-10-24T20:38:28.3270812Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T20:38:28.3270875Z ╰──── 2026-10-24T20:38:28.3270878Z 2026-10-24T20:38:28.3271155Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T20:38:28.3271391Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T20:38:28.3271444Z 959 │ 2026-10-24T20:38:28.3271549Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T20:38:28.3271658Z ·  ──────────────────┬───────────────── 2026-10-24T20:38:28.3271850Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T20:38:28.3271950Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T20:38:28.3272000Z ╰──── 2026-10-24T20:38:28.3272098Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3272100Z 2026-10-24T20:38:28.3272319Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T20:38:28.3272481Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T20:38:28.3272535Z 1397 │ 2026-10-24T20:38:28.3272620Z 1398 │ function assertUserMessagesExclude( 2026-10-24T20:38:28.3272719Z ·  ────────────┬──────────── 2026-10-24T20:38:28.3272882Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T20:38:28.3272987Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T20:38:28.3273036Z ╰──── 2026-10-24T20:38:28.3273134Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3273136Z 2026-10-24T20:38:28.3273314Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:38:28.3273419Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T20:38:28.3273548Z 457 │ ): Array { 2026-10-24T20:38:28.3273693Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T20:38:28.3273788Z ·  ┬ 2026-10-24T20:38:28.3273928Z · ╰── '_' is declared here 2026-10-24T20:38:28.3273997Z 459 │ for (const b of data) { 2026-10-24T20:38:28.3274047Z ╰──── 2026-10-24T20:38:28.3274146Z  help: Consider removing this parameter. 2026-10-24T20:38:28.3274148Z 2026-10-24T20:38:28.3274342Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:38:28.3274471Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T20:38:28.3274541Z 2 │ AuthFilesystemReadScope, 2026-10-24T20:38:28.3274607Z 3 │ type AuthSessionState, 2026-10-24T20:38:28.3274694Z ·  ────────┬─────── 2026-10-24T20:38:28.3274835Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:38:28.3274907Z 4 │ type FilesystemBrowseEntry, 2026-10-24T20:38:28.3274956Z ╰──── 2026-10-24T20:38:28.3275052Z  help: Consider removing this import. 2026-10-24T20:38:28.3275055Z 2026-10-24T20:38:28.3275248Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3275407Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T20:38:28.3275499Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T20:38:28.3275595Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T20:38:28.3275696Z ·  ──────┬───── 2026-10-24T20:38:28.3275860Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T20:38:28.3275962Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T20:38:28.3276012Z ╰──── 2026-10-24T20:38:28.3276304Z  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-24T20:38:28.3276609Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3276612Z 2026-10-24T20:38:28.3276794Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T20:38:28.3276914Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T20:38:28.3277025Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T20:38:28.3277092Z 187 │ let next = initial; 2026-10-24T20:38:28.3277159Z ·  ──┬─ 2026-10-24T20:38:28.3277276Z · ╰── From this accumulator 2026-10-24T20:38:28.3277353Z 188 │ let receivedSnapshot = false; 2026-10-24T20:38:28.3277427Z 189 │ for (const item of items) { 2026-10-24T20:38:28.3277493Z ·  ─┬─ 2026-10-24T20:38:28.3277593Z · ╰── For this loop 2026-10-24T20:38:28.3277681Z 190 │ if (item.kind === "synchronized") { 2026-10-24T20:38:28.3277745Z 191 │ waiting = false; 2026-10-24T20:38:28.3277833Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T20:38:28.3277946Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T20:38:28.3278078Z ·  ───┬─── 2026-10-24T20:38:28.3278229Z · ╰── From this spread 2026-10-24T20:38:28.3278287Z 194 │ } 2026-10-24T20:38:28.3278335Z ╰──── 2026-10-24T20:38:28.3278486Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T20:38:28.3278638Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:38:28.3278641Z 2026-10-24T20:38:28.3278818Z ⚠ react(static-components): Cannot create components during render 2026-10-24T20:38:28.3278972Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T20:38:28.3279057Z 196 │ const { onInput, onResize } = props; 2026-10-24T20:38:28.3279204Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T20:38:28.3279332Z ·  ────────────────┬─────────────── 2026-10-24T20:38:28.3279511Z · ╰── The component is created during render here 2026-10-24T20:38:28.3279634Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T20:38:28.3279685Z 199 │ 2026-10-24T20:38:28.3279751Z 200 │ useEffect(() => { 2026-10-24T20:38:28.3279834Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T20:38:28.3279919Z 202 │ terminalKey: props.terminalKey, 2026-10-24T20:38:28.3279992Z 203 │ native: hasNativeSurface, 2026-10-24T20:38:28.3280122Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T20:38:28.3280202Z 205 │ bufferLen: props.buffer.length, 2026-10-24T20:38:28.3280284Z 206 │ isRunning: props.isRunning, 2026-10-24T20:38:28.3280343Z 207 │ }); 2026-10-24T20:38:28.3280499Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T20:38:28.3280582Z 209 │ const handleNativeInput = useCallback( 2026-10-24T20:38:28.3280693Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T20:38:28.3280787Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T20:38:28.3280858Z 212 │ return; 2026-10-24T20:38:28.3280910Z 213 │ } 2026-10-24T20:38:28.3281024Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T20:38:28.3281171Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T20:38:28.3281227Z 216 │ }); 2026-10-24T20:38:28.3281309Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T20:38:28.3281362Z 218 │ }, 2026-10-24T20:38:28.3281463Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T20:38:28.3281516Z 220 │ ); 2026-10-24T20:38:28.3281602Z 221 │ const handleNativeResize = useCallback( 2026-10-24T20:38:28.3281713Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T20:38:28.3281774Z 223 │ onResize({ 2026-10-24T20:38:28.3281854Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T20:38:28.3281934Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T20:38:28.3281989Z 226 │ }); 2026-10-24T20:38:28.3282042Z 227 │ }, 2026-10-24T20:38:28.3282101Z 228 │ [onResize], 2026-10-24T20:38:28.3282154Z 229 │ ); 2026-10-24T20:38:28.3282203Z 230 │ 2026-10-24T20:38:28.3282284Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T20:38:28.3282341Z 232 │ return ( 2026-10-24T20:38:28.3282417Z 233 │ 2026-10-24T20:38:28.3282616Z 234 │ { 2026-10-24T20:38:28.3285070Z ·  ────┬──── 2026-10-24T20:38:28.3285196Z · ╰── This is the containing effect 2026-10-24T20:38:28.3285273Z 119 │ void refreshNotifications(); 2026-10-24T20:38:28.3285360Z ·  ──────────┬───────── 2026-10-24T20:38:28.3285528Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3285667Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T20:38:28.3285715Z ╰──── 2026-10-24T20:38:28.3286311Z  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-24T20:38:28.3286634Z  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-24T20:38:28.3286637Z 2026-10-24T20:38:28.3286887Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3287069Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T20:38:28.3287119Z 125 │ 2026-10-24T20:38:28.3287181Z 126 │ useEffect(() => { 2026-10-24T20:38:28.3287250Z ·  ────┬──── 2026-10-24T20:38:28.3287373Z · ╰── This is the containing effect 2026-10-24T20:38:28.3287435Z 127 │ if (!isLoaded) { 2026-10-24T20:38:28.3287565Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T20:38:28.3287679Z ·  ──────────┬────────── 2026-10-24T20:38:28.3287846Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3287907Z 129 │ return; 2026-10-24T20:38:28.3287955Z ╰──── 2026-10-24T20:38:28.3288541Z  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-24T20:38:28.3288853Z  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-24T20:38:28.3288856Z 2026-10-24T20:38:28.3289109Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3289264Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T20:38:28.3289428Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T20:38:28.3289491Z 113 │ useEffect(() => { 2026-10-24T20:38:28.3289559Z ·  ────┬──── 2026-10-24T20:38:28.3289683Z · ╰── This is the containing effect 2026-10-24T20:38:28.3289842Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T20:38:28.3289901Z 115 │ return; 2026-10-24T20:38:28.3289954Z 116 │ } 2026-10-24T20:38:28.3290073Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T20:38:28.3290143Z ·  ────┬─── 2026-10-24T20:38:28.3290303Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3290420Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T20:38:28.3290473Z ╰──── 2026-10-24T20:38:28.3291092Z  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-24T20:38:28.3291404Z  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-24T20:38:28.3291406Z 2026-10-24T20:38:28.3291599Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.3291740Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T20:38:28.3291827Z 35 │ } 2026-10-24T20:38:28.3292938Z ·  ───────────────────────────────────────────── 2026-10-24T20:38:28.3293018Z 1080 │ screenOptions={({ route }) => 2026-10-24T20:38:28.3293068Z ╰──── 2026-10-24T20:38:28.3293422Z  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-24T20:38:28.3293426Z 2026-10-24T20:38:28.3293675Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3293841Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T20:38:28.3293898Z 118 │ 2026-10-24T20:38:28.3293963Z 119 │ useEffect(() => { 2026-10-24T20:38:28.3294030Z ·  ────┬──── 2026-10-24T20:38:28.3294153Z · ╰── This is the containing effect 2026-10-24T20:38:28.3294234Z 120 │ if (orientationSettled) return; 2026-10-24T20:38:28.3294346Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T20:38:28.3294417Z 122 │ if (orientation === null) { 2026-10-24T20:38:28.3294497Z 123 │ setOrientationSettled(true); 2026-10-24T20:38:28.3294584Z ·  ──────────┬────────── 2026-10-24T20:38:28.3294748Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3294807Z 124 │ return; 2026-10-24T20:38:28.3294858Z ╰──── 2026-10-24T20:38:28.3295444Z  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-24T20:38:28.3295760Z  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-24T20:38:28.3295763Z 2026-10-24T20:38:28.3296009Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3296177Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T20:38:28.3296227Z 292 │ 2026-10-24T20:38:28.3296289Z 293 │ useEffect(() => { 2026-10-24T20:38:28.3296396Z ·  ────┬──── 2026-10-24T20:38:28.3296545Z · ╰── This is the containing effect 2026-10-24T20:38:28.3296602Z 294 │ if ( 2026-10-24T20:38:28.3296667Z 295 │ scene === null || 2026-10-24T20:38:28.3296740Z 296 │ requestedScene === null || 2026-10-24T20:38:28.3296814Z 297 │ scene !== requestedScene || 2026-10-24T20:38:28.3296876Z 298 │ !hasFixture || 2026-10-24T20:38:28.3296946Z 299 │ !orientationSettled || 2026-10-24T20:38:28.3297009Z 300 │ !themeApplied || 2026-10-24T20:38:28.3297122Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T20:38:28.3297253Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T20:38:28.3297307Z 303 │ ) { 2026-10-24T20:38:28.3297372Z 304 │ setReadyScene(null); 2026-10-24T20:38:28.3297454Z ·  ──────┬────── 2026-10-24T20:38:28.3297620Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3297679Z 305 │ return; 2026-10-24T20:38:28.3297726Z ╰──── 2026-10-24T20:38:28.3298308Z  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-24T20:38:28.3298619Z  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-24T20:38:28.3298622Z 2026-10-24T20:38:28.3298892Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3299059Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T20:38:28.3299124Z 127 │ let cancelled = false; 2026-10-24T20:38:28.3299213Z 128 │ let lastOutcome: string | null = null; 2026-10-24T20:38:28.3299291Z ·  ─────┬───── 2026-10-24T20:38:28.3299422Z · ╰── 'lastOutcome' is declared here 2026-10-24T20:38:28.3299594Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T20:38:28.3299643Z ╰──── 2026-10-24T20:38:28.3299745Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3299747Z 2026-10-24T20:38:28.3300001Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3300164Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T20:38:28.3300216Z 638 │ 2026-10-24T20:38:28.3300279Z 639 │ useEffect(() => { 2026-10-24T20:38:28.3300346Z ·  ────┬──── 2026-10-24T20:38:28.3300468Z · ╰── This is the containing effect 2026-10-24T20:38:28.3300575Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T20:38:28.3300634Z 641 │ return; 2026-10-24T20:38:28.3300686Z 642 │ } 2026-10-24T20:38:28.3300757Z 643 │ setPendingLaunchEntry({ 2026-10-24T20:38:28.3300842Z ·  ──────────┬────────── 2026-10-24T20:38:28.3301037Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3301154Z 644 │ key: launchTargetKey, 2026-10-24T20:38:28.3301231Z ╰──── 2026-10-24T20:38:28.3301811Z  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-24T20:38:28.3302123Z  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-24T20:38:28.3302125Z 2026-10-24T20:38:28.3302373Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3302542Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T20:38:28.3302594Z 648 │ 2026-10-24T20:38:28.3302656Z 649 │ useEffect(() => { 2026-10-24T20:38:28.3302724Z ·  ────┬──── 2026-10-24T20:38:28.3302849Z · ╰── This is the containing effect 2026-10-24T20:38:28.3302959Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T20:38:28.3303018Z 651 │ return; 2026-10-24T20:38:28.3303070Z 652 │ } 2026-10-24T20:38:28.3303148Z 653 │ setInitialAttachGridEntry({ 2026-10-24T20:38:28.3303237Z ·  ────────────┬──────────── 2026-10-24T20:38:28.3303403Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3303472Z 654 │ key: launchTargetKey, 2026-10-24T20:38:28.3303521Z ╰──── 2026-10-24T20:38:28.3304106Z  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-24T20:38:28.3304422Z  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-24T20:38:28.3304425Z 2026-10-24T20:38:28.3304672Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3304835Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T20:38:28.3304885Z 743 │ 2026-10-24T20:38:28.3304945Z 744 │ useEffect(() => { 2026-10-24T20:38:28.3305015Z ·  ────┬──── 2026-10-24T20:38:28.3305140Z · ╰── This is the containing effect 2026-10-24T20:38:28.3305239Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T20:38:28.3305303Z 746 │ setLastGridSize({ 2026-10-24T20:38:28.3305382Z ·  ───────┬─────── 2026-10-24T20:38:28.3305544Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3305624Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T20:38:28.3305672Z ╰──── 2026-10-24T20:38:28.3306303Z  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-24T20:38:28.3306643Z  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-24T20:38:28.3306645Z 2026-10-24T20:38:28.3306840Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3307004Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T20:38:28.3307057Z 537 │ }); 2026-10-24T20:38:28.3307174Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T20:38:28.3307279Z ·  ───────────┬────────── 2026-10-24T20:38:28.3307522Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T20:38:28.3307680Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T20:38:28.3307729Z ╰──── 2026-10-24T20:38:28.3308015Z  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-24T20:38:28.3308318Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3308321Z 2026-10-24T20:38:28.3308512Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3308674Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T20:38:28.3308766Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T20:38:28.3308835Z 709 │ }, [terminalKey]); 2026-10-24T20:38:28.3308909Z ·  ─────┬───── 2026-10-24T20:38:28.3309047Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T20:38:28.3309098Z 710 │ 2026-10-24T20:38:28.3309146Z ╰──── 2026-10-24T20:38:28.3309428Z  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-24T20:38:28.3309729Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3309732Z 2026-10-24T20:38:28.3309923Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3310091Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T20:38:28.3310147Z 799 │ }; 2026-10-24T20:38:28.3310320Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T20:38:28.3310491Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T20:38:28.3310716Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T20:38:28.3310931Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T20:38:28.3311010Z 801 │ 2026-10-24T20:38:28.3311060Z ╰──── 2026-10-24T20:38:28.3311451Z  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-24T20:38:28.3311795Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3311797Z 2026-10-24T20:38:28.3311937Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3312097Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T20:38:28.3312151Z 792 │ } 2026-10-24T20:38:28.3312255Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T20:38:28.3312366Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3312529Z · ╰── Cannot access ref value during render 2026-10-24T20:38:28.3312581Z 794 │ 2026-10-24T20:38:28.3312629Z ╰──── 2026-10-24T20:38:28.3313090Z  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-24T20:38:28.3313374Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3313379Z 2026-10-24T20:38:28.3313628Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3313757Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T20:38:28.3313947Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T20:38:28.3314015Z 168 │ useLayoutEffect(() => { 2026-10-24T20:38:28.3314090Z ·  ───────┬─────── 2026-10-24T20:38:28.3314219Z · ╰── This is the containing effect 2026-10-24T20:38:28.3314305Z 169 │ if (faviconRequest === null) return; 2026-10-24T20:38:28.3314355Z 170 │ 2026-10-24T20:38:28.3314483Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T20:38:28.3314576Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T20:38:28.3314664Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3314831Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3314896Z 173 │ return endRequest; 2026-10-24T20:38:28.3314945Z ╰──── 2026-10-24T20:38:28.3315579Z  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-24T20:38:28.3315921Z  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-24T20:38:28.3315923Z 2026-10-24T20:38:28.3316063Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:38:28.3316216Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T20:38:28.3316270Z 276 │ 2026-10-24T20:38:28.3316451Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T20:38:28.3316544Z 278 │ │ ...nativeProps, 2026-10-24T20:38:28.3316685Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T20:38:28.3316774Z 280 │ │ ref: nativeRef, 2026-10-24T20:38:28.3316898Z 281 │ ├─▶ }); 2026-10-24T20:38:28.3317129Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:38:28.3317181Z 282 │ } 2026-10-24T20:38:28.3317230Z ╰──── 2026-10-24T20:38:28.3317692Z  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-24T20:38:28.3317978Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:38:28.3317981Z 2026-10-24T20:38:28.3318230Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3318391Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T20:38:28.3318443Z 100 │ 2026-10-24T20:38:28.3318507Z 101 │ useEffect(() => { 2026-10-24T20:38:28.3318575Z ·  ────┬──── 2026-10-24T20:38:28.3318698Z · ╰── This is the containing effect 2026-10-24T20:38:28.3318798Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T20:38:28.3318884Z 103 │ setHighlightedLinesById({}); 2026-10-24T20:38:28.3318978Z ·  ───────────┬─────────── 2026-10-24T20:38:28.3319147Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3319208Z 104 │ return; 2026-10-24T20:38:28.3319256Z ╰──── 2026-10-24T20:38:28.3319841Z  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-24T20:38:28.3320154Z  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-24T20:38:28.3320202Z 2026-10-24T20:38:28.3320421Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.3320565Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T20:38:28.3320670Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T20:38:28.3320833Z 272 │ 2026-10-24T20:38:28.3321016Z ·  ─────────────────────────────────────────────────────── 2026-10-24T20:38:28.3321092Z 273 │ { 2026-10-24T20:38:28.3323244Z ·  ────┬──── 2026-10-24T20:38:28.3323369Z · ╰── This is the containing effect 2026-10-24T20:38:28.3323445Z 106 │ clearReviewCommentTarget(); 2026-10-24T20:38:28.3323539Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T20:38:28.3323643Z ·  ────────────────┬─────────────── 2026-10-24T20:38:28.3323817Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3323890Z 108 │ }, [selectedSection?.id]); 2026-10-24T20:38:28.3323939Z ╰──── 2026-10-24T20:38:28.3324518Z  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-24T20:38:28.3324830Z  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-24T20:38:28.3324832Z 2026-10-24T20:38:28.3325080Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3325307Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T20:38:28.3325390Z 109 │ 2026-10-24T20:38:28.3325453Z 110 │ useEffect(() => { 2026-10-24T20:38:28.3325522Z ·  ────┬──── 2026-10-24T20:38:28.3325644Z · ╰── This is the containing effect 2026-10-24T20:38:28.3325730Z 111 │ if (activeCommentTarget === null) { 2026-10-24T20:38:28.3325829Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T20:38:28.3325934Z ·  ────────────────┬─────────────── 2026-10-24T20:38:28.3326104Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3326157Z 113 │ } 2026-10-24T20:38:28.3326206Z ╰──── 2026-10-24T20:38:28.3326793Z  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-24T20:38:28.3327108Z  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-24T20:38:28.3327110Z 2026-10-24T20:38:28.3327300Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3327478Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T20:38:28.3327571Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T20:38:28.3327642Z 108 │ }, [selectedSection?.id]); 2026-10-24T20:38:28.3327730Z ·  ─────────┬───────── 2026-10-24T20:38:28.3327889Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T20:38:28.3327941Z 109 │ 2026-10-24T20:38:28.3327989Z ╰──── 2026-10-24T20:38:28.3328272Z  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-24T20:38:28.3328575Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3328578Z 2026-10-24T20:38:28.3328769Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3328900Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T20:38:28.3328987Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T20:38:28.3329093Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T20:38:28.3329234Z ·  ──────┬────── ────┬─── 2026-10-24T20:38:28.3329426Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T20:38:28.3329571Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T20:38:28.3329629Z 455 │ const { 2026-10-24T20:38:28.3329678Z ╰──── 2026-10-24T20:38:28.3329964Z  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-24T20:38:28.3330322Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3330354Z 2026-10-24T20:38:28.3330534Z ⚠ react(static-components): Cannot create components during render 2026-10-24T20:38:28.3330664Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T20:38:28.3330727Z 492 │ // same check. 2026-10-24T20:38:28.3330862Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T20:38:28.3331006Z ·  ─────────────┬───────────── 2026-10-24T20:38:28.3331180Z · ╰── The component is created during render here 2026-10-24T20:38:28.3331325Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T20:38:28.3331446Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T20:38:28.3331576Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T20:38:28.3331665Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T20:38:28.3331741Z 498 │ setIsPullRefreshing(true); 2026-10-24T20:38:28.3331823Z 499 │ await refreshSelectedSection(); 2026-10-24T20:38:28.3331900Z 500 │ setIsPullRefreshing(false); 2026-10-24T20:38:28.3331950Z 501 │ }; 2026-10-24T20:38:28.3332089Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T20:38:28.3332226Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T20:38:28.3332331Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T20:38:28.3332413Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T20:38:28.3332501Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T20:38:28.3332572Z 507 │ files: reviewFiles, 2026-10-24T20:38:28.3332671Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T20:38:28.3332797Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T20:38:28.3332860Z 510 │ : undefined, 2026-10-24T20:38:28.3332952Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T20:38:28.3333071Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T20:38:28.3333130Z 513 │ : undefined, 2026-10-24T20:38:28.3333183Z 514 │ }); 2026-10-24T20:38:28.3333368Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T20:38:28.3333495Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T20:38:28.3333554Z 517 │ environmentId, 2026-10-24T20:38:28.3333614Z 518 │ threadId, 2026-10-24T20:38:28.3333683Z 519 │ selectedSection, 2026-10-24T20:38:28.3333751Z 520 │ nativeReviewDiffData, 2026-10-24T20:38:28.3333803Z 521 │ }); 2026-10-24T20:38:28.3333904Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T20:38:28.3333987Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T20:38:28.3334073Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T20:38:28.3334148Z 525 │ diff: selectedSection?.diff, 2026-10-24T20:38:28.3334222Z 526 │ data: nativeReviewDiffData, 2026-10-24T20:38:28.3334291Z 527 │ collapsedFileIds, 2026-10-24T20:38:28.3334351Z 528 │ viewedFileIds, 2026-10-24T20:38:28.3334457Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T20:38:28.3334553Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T20:38:28.3334605Z 531 │ }); 2026-10-24T20:38:28.3334675Z 532 │ const showcaseReviewKey = 2026-10-24T20:38:28.3334853Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T20:38:28.3335084Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T20:38:28.3335143Z 535 │ : null; 2026-10-24T20:38:28.3335304Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T20:38:28.3335380Z 537 │ nativeBridge.onDebug(event); 2026-10-24T20:38:28.3335437Z 538 │ if ( 2026-10-24T20:38:28.3335514Z 539 │ showcaseReviewKey === null || 2026-10-24T20:38:28.3335630Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T20:38:28.3335737Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T20:38:28.3335791Z 542 │ ) { 2026-10-24T20:38:28.3335849Z 543 │ return; 2026-10-24T20:38:28.3335900Z 544 │ } 2026-10-24T20:38:28.3336014Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T20:38:28.3336174Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T20:38:28.3336225Z 547 │ }; 2026-10-24T20:38:28.3336275Z 548 │ 2026-10-24T20:38:28.3336388Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T20:38:28.3336465Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T20:38:28.3336551Z 551 │ commentSelection.clearSelection(); 2026-10-24T20:38:28.3336668Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T20:38:28.3336746Z 553 │ toggleExpandedFile(fileId); 2026-10-24T20:38:28.3336798Z 554 │ } 2026-10-24T20:38:28.3336905Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T20:38:28.3336973Z 556 │ if (!nativeView) return; 2026-10-24T20:38:28.3337068Z 557 │ const result = await settlePromise(() => 2026-10-24T20:38:28.3337239Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T20:38:28.3337292Z 559 │ ); 2026-10-24T20:38:28.3337378Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T20:38:28.3337554Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T20:38:28.3337606Z 562 │ } 2026-10-24T20:38:28.3337656Z 563 │ }; 2026-10-24T20:38:28.3337736Z 564 │ const handleVisibleFileChange = ( 2026-10-24T20:38:28.3337865Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T20:38:28.3337922Z 566 │ ) => { 2026-10-24T20:38:28.3338026Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T20:38:28.3338236Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T20:38:28.3338317Z 569 │ }; 2026-10-24T20:38:28.3338393Z 570 │ const renderInspector = () => ( 2026-10-24T20:38:28.3338458Z 571 │ void handleSelectFile(fileId)} 2026-10-24T20:38:28.3338952Z 577 │ /> 2026-10-24T20:38:28.3339002Z 578 │ ); 2026-10-24T20:38:28.3339053Z 579 │ 2026-10-24T20:38:28.3339232Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T20:38:28.3339323Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T20:38:28.3339385Z 582 │ if (fileId) { 2026-10-24T20:38:28.3339466Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T20:38:28.3339541Z 584 │ toggleExpandedFile(fileId); 2026-10-24T20:38:28.3339594Z 585 │ } 2026-10-24T20:38:28.3339644Z 586 │ }; 2026-10-24T20:38:28.3339693Z 587 │ 2026-10-24T20:38:28.3339780Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T20:38:28.3339897Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T20:38:28.3339951Z 590 │ ) => { 2026-10-24T20:38:28.3340035Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T20:38:28.3340097Z 592 │ if (fileId) { 2026-10-24T20:38:28.3340170Z 593 │ toggleViewedFile(fileId); 2026-10-24T20:38:28.3340220Z 594 │ } 2026-10-24T20:38:28.3340272Z 595 │ }; 2026-10-24T20:38:28.3340323Z 596 │ 2026-10-24T20:38:28.3340396Z 597 │ const parsedDiffNotice = 2026-10-24T20:38:28.3340554Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T20:38:28.3340671Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T20:38:28.3340822Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T20:38:28.3340972Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T20:38:28.3341125Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T20:38:28.3341232Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T20:38:28.3341330Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T20:38:28.3341400Z 605 │ hasCachedSelectedDiff, 2026-10-24T20:38:28.3341463Z 606 │ hasAnyCachedDiff, 2026-10-24T20:38:28.3341515Z 607 │ }); 2026-10-24T20:38:28.3341604Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T20:38:28.3341688Z 609 │ void retryEnvironment(environmentId); 2026-10-24T20:38:28.3341740Z 610 │ }; 2026-10-24T20:38:28.3341822Z 611 │ const handleReturnToThread = () => { 2026-10-24T20:38:28.3341898Z 612 │ if (navigation.canGoBack()) { 2026-10-24T20:38:28.3341963Z 613 │ navigation.goBack(); 2026-10-24T20:38:28.3342020Z 614 │ return; 2026-10-24T20:38:28.3342072Z 615 │ } 2026-10-24T20:38:28.3342150Z 616 │ navigation.navigate("Thread", { 2026-10-24T20:38:28.3342236Z 617 │ environmentId: String(environmentId), 2026-10-24T20:38:28.3342311Z 618 │ threadId: String(threadId), 2026-10-24T20:38:28.3342363Z 619 │ }); 2026-10-24T20:38:28.3342416Z 620 │ }; 2026-10-24T20:38:28.3342490Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T20:38:28.3342605Z 622 │ selectedSection?.title, 2026-10-24T20:38:28.3342715Z 623 │ headerDiffSummary.additions, 2026-10-24T20:38:28.3342790Z 624 │ headerDiffSummary.deletions, 2026-10-24T20:38:28.3342842Z 625 │ ] 2026-10-24T20:38:28.3342945Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T20:38:28.3343006Z 627 │ .join(" · "); 2026-10-24T20:38:28.3343056Z 628 │ 2026-10-24T20:38:28.3343131Z 629 │ const showChangedFilesPane = 2026-10-24T20:38:28.3343203Z 630 │ !showConnectionNotice && 2026-10-24T20:38:28.3343276Z 631 │ selectedSection !== null && 2026-10-24T20:38:28.3343351Z 632 │ parsedDiff.kind === "files" && 2026-10-24T20:38:28.3343429Z 633 │ NativeReviewDiffView !== null; 2026-10-24T20:38:28.3343594Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T20:38:28.3343766Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T20:38:28.3343817Z 636 │ 2026-10-24T20:38:28.3343888Z 637 │ const listHeader = (() => { 2026-10-24T20:38:28.3343971Z 638 │ const children: ReactElement[] = []; 2026-10-24T20:38:28.3344021Z 639 │ 2026-10-24T20:38:28.3344080Z 640 │ if (error) { 2026-10-24T20:38:28.3344144Z 641 │ children.push( 2026-10-24T20:38:28.3344202Z 642 │ 2026-10-24T20:38:28.3344835Z 649 │ Review unavailable 2026-10-24T20:38:28.3344991Z 650 │ {error} 2026-10-24T20:38:28.3345050Z 651 │ , 2026-10-24T20:38:28.3345105Z 652 │ ); 2026-10-24T20:38:28.3345158Z 653 │ } 2026-10-24T20:38:28.3345207Z 654 │ 2026-10-24T20:38:28.3345275Z 655 │ if (parsedDiffNotice) { 2026-10-24T20:38:28.3345431Z 656 │ children.push(); 2026-10-24T20:38:28.3345483Z 657 │ } 2026-10-24T20:38:28.3345532Z 658 │ 2026-10-24T20:38:28.3345605Z 659 │ if (children.length === 0) { 2026-10-24T20:38:28.3345667Z 660 │ return null; 2026-10-24T20:38:28.3345719Z 661 │ } 2026-10-24T20:38:28.3345770Z 662 │ 2026-10-24T20:38:28.3345838Z 663 │ return <>{children}; 2026-10-24T20:38:28.3345898Z 664 │ })(); 2026-10-24T20:38:28.3345968Z 665 │ const headerSubtitle = [ 2026-10-24T20:38:28.3346045Z 666 │ headerDiffSummary.additions, 2026-10-24T20:38:28.3346121Z 667 │ headerDiffSummary.deletions, 2026-10-24T20:38:28.3346201Z 668 │ pendingReviewCommentCount > 0 2026-10-24T20:38:28.3346370Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T20:38:28.3346427Z 670 │ : null, 2026-10-24T20:38:28.3346479Z 671 │ ] 2026-10-24T20:38:28.3346543Z 672 │ .filter(Boolean) 2026-10-24T20:38:28.3346604Z 673 │ .join(" · "); 2026-10-24T20:38:28.3346734Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T20:38:28.3346786Z 675 │ 2026-10-24T20:38:28.3346845Z 676 │ return ( 2026-10-24T20:38:28.3346900Z 677 │ <> 2026-10-24T20:38:28.3346961Z 678 │ 2026-10-24T20:38:28.3348335Z 694 │ 2026-10-24T20:38:28.3348401Z 695 │ 2026-10-24T20:38:28.3348520Z 696 │ 2026-10-24T20:38:28.3348597Z 697 │ {showConnectionNotice ? ( 2026-10-24T20:38:28.3348735Z 698 │ 2026-10-24T20:38:28.3348823Z 699 │ 2026-10-24T20:38:28.3349810Z 711 │ 2026-10-24T20:38:28.3349963Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T20:38:28.3350020Z 713 │ 2026-10-24T20:38:28.3350454Z 719 │ 2026-10-24T20:38:28.3350802Z 723 │ {listHeader} 2026-10-24T20:38:28.3350954Z 724 │ 2026-10-24T20:38:28.3351035Z 725 │ { 2026-10-24T20:38:28.3352768Z ·  ────┬──── 2026-10-24T20:38:28.3352892Z · ╰── This is the containing effect 2026-10-24T20:38:28.3352953Z 68 │ setUri(null); 2026-10-24T20:38:28.3353023Z ·  ───┬── 2026-10-24T20:38:28.3353182Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3353243Z 69 │ setError(null); 2026-10-24T20:38:28.3353293Z ╰──── 2026-10-24T20:38:28.3353881Z  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-24T20:38:28.3354203Z  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-24T20:38:28.3354208Z 2026-10-24T20:38:28.3354403Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3354534Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T20:38:28.3354588Z 90 │ }; 2026-10-24T20:38:28.3354661Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T20:38:28.3354774Z ·  ──────┬───── ───┬─── 2026-10-24T20:38:28.3354949Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T20:38:28.3355091Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T20:38:28.3355228Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T20:38:28.3355281Z ╰──── 2026-10-24T20:38:28.3355566Z  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-24T20:38:28.3355872Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3355874Z 2026-10-24T20:38:28.3356081Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:38:28.3356218Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T20:38:28.3356282Z 212 │ useEffect(() => { 2026-10-24T20:38:28.3356502Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T20:38:28.3356626Z ·  ──┬── 2026-10-24T20:38:28.3356773Z · ╰── Missing dependency `props` 2026-10-24T20:38:28.3356879Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T20:38:28.3356985Z ·  ──────────┬───────── 2026-10-24T20:38:28.3357206Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T20:38:28.3357277Z 215 │ const { source } = props; 2026-10-24T20:38:28.3357327Z ╰──── 2026-10-24T20:38:28.3357745Z  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-24T20:38:28.3358055Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3358057Z 2026-10-24T20:38:28.3358308Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3358451Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T20:38:28.3358508Z 61 │ }, []); 2026-10-24T20:38:28.3358568Z 62 │ useEffect(() => { 2026-10-24T20:38:28.3358636Z ·  ────┬──── 2026-10-24T20:38:28.3358760Z · ╰── This is the containing effect 2026-10-24T20:38:28.3358908Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T20:38:28.3359031Z ·  ───────┬────── 2026-10-24T20:38:28.3359231Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3359308Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T20:38:28.3359357Z ╰──── 2026-10-24T20:38:28.3359941Z  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-24T20:38:28.3360261Z  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-24T20:38:28.3360266Z 2026-10-24T20:38:28.3360455Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.3360602Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T20:38:28.3360706Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T20:38:28.3360797Z 223 │ 2026-10-24T20:38:28.3360932Z ·  ─────────────── 2026-10-24T20:38:28.3361022Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T20:38:28.3361072Z ╰──── 2026-10-24T20:38:28.3361214Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:38:28.3361217Z 2026-10-24T20:38:28.3361452Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:38:28.3361634Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T20:38:28.3361710Z 226 │ { 2026-10-24T20:38:28.3362765Z ·  ────┬──── 2026-10-24T20:38:28.3362889Z · ╰── This is the containing effect 2026-10-24T20:38:28.3362954Z 57 │ scheduler.reset(); 2026-10-24T20:38:28.3363048Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T20:38:28.3363132Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T20:38:28.3363246Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T20:38:28.3363323Z ·  ───────┬─────── 2026-10-24T20:38:28.3363487Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3363598Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T20:38:28.3363649Z ╰──── 2026-10-24T20:38:28.3364241Z  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-24T20:38:28.3364559Z  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-24T20:38:28.3364561Z 2026-10-24T20:38:28.3364754Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:38:28.3364924Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T20:38:28.3365003Z 62 │ return () => scheduler.cancel(); 2026-10-24T20:38:28.3365105Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T20:38:28.3365229Z ·  ───┬─── ─────┬───── 2026-10-24T20:38:28.3365416Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T20:38:28.3365549Z · ╰── Unnecessary dependency `enabled` 2026-10-24T20:38:28.3365600Z 64 │ 2026-10-24T20:38:28.3365648Z ╰──── 2026-10-24T20:38:28.3365938Z  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-24T20:38:28.3366241Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3366243Z 2026-10-24T20:38:28.3366561Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:38:28.3366731Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T20:38:28.3366782Z 60 │ ) { 2026-10-24T20:38:28.3366946Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T20:38:28.3367024Z ·  ──────┬────── 2026-10-24T20:38:28.3367159Z · ╰── 'useDragRegion' is declared here 2026-10-24T20:38:28.3367246Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T20:38:28.3367295Z ╰──── 2026-10-24T20:38:28.3367396Z  help: Consider removing this declaration. 2026-10-24T20:38:28.3367399Z 2026-10-24T20:38:28.3367654Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:38:28.3367822Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T20:38:28.3367877Z 328 │ }; 2026-10-24T20:38:28.3367942Z 329 │ useEffect(() => { 2026-10-24T20:38:28.3368013Z ·  ────┬──── 2026-10-24T20:38:28.3368137Z · ╰── This is the containing effect 2026-10-24T20:38:28.3368234Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T20:38:28.3368327Z 331 │ requestedSection.current = "overview"; 2026-10-24T20:38:28.3368488Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T20:38:28.3368558Z 333 │ setSection("overview"); 2026-10-24T20:38:28.3368631Z ·  ─────┬──── 2026-10-24T20:38:28.3368804Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:38:28.3368860Z 334 │ } 2026-10-24T20:38:28.3368909Z ╰──── 2026-10-24T20:38:28.3369493Z  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-24T20:38:28.3369807Z  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-24T20:38:28.3369809Z 2026-10-24T20:38:28.3370007Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:38:28.3370222Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T20:38:28.3370342Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T20:38:28.3370436Z 331 │ requestedSection.current = "overview"; 2026-10-24T20:38:28.3370517Z ·  ────────┬─────── 2026-10-24T20:38:28.3370992Z · ╰── 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-24T20:38:28.3371150Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T20:38:28.3371297Z ·  ─────────┬───────── ──────┬────── 2026-10-24T20:38:28.3371791Z · │ ╰── 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-24T20:38:28.3372234Z · ╰── 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-24T20:38:28.3372309Z 333 │ setSection("overview"); 2026-10-24T20:38:28.3372360Z 334 │ } 2026-10-24T20:38:28.3372450Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T20:38:28.3372558Z ·  ──────────────────┬───────────────── 2026-10-24T20:38:28.3372751Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3372837Z 336 │ const tabContent = activityContent; 2026-10-24T20:38:28.3372887Z ╰──── 2026-10-24T20:38:28.3373050Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:38:28.3373354Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3373357Z 2026-10-24T20:38:28.3373555Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:38:28.3373720Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T20:38:28.3373777Z 860 │ if ( 2026-10-24T20:38:28.3373890Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T20:38:28.3373971Z ·  ──────┬────── 2026-10-24T20:38:28.3374393Z · ╰── 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-24T20:38:28.3374519Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T20:38:28.3374570Z 863 │ ) 2026-10-24T20:38:28.3374632Z 864 │ return; 2026-10-24T20:38:28.3374803Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T20:38:28.3374935Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T20:38:28.3375019Z 867 │ setJumpPath(route.params.path); 2026-10-24T20:38:28.3375089Z 868 │ setSelectedRowId(null); 2026-10-24T20:38:28.3375166Z 869 │ jumpStarted.current = false; 2026-10-24T20:38:28.3375358Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T20:38:28.3375479Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T20:38:28.3375567Z ·  ─────┬──── 2026-10-24T20:38:28.3375994Z · ╰── 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-24T20:38:28.3376117Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T20:38:28.3376194Z 873 │ jumpStarted.current = true; 2026-10-24T20:38:28.3376326Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T20:38:28.3376403Z 875 │ jumpStarted.current = false; 2026-10-24T20:38:28.3376463Z 876 │ }); 2026-10-24T20:38:28.3376655Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T20:38:28.3376855Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T20:38:28.3377068Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:38:28.3377175Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T20:38:28.3377226Z ╰──── 2026-10-24T20:38:28.3377388Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:38:28.3377693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:38:28.3377702Z 2026-10-24T20:38:28.3377783Z Found 0 errors and 367 warnings in 5479 files (5.5s, 8 threads) 2026-10-24T20:38:28.3814487Z Post job cleanup. 2026-10-24T20:38:28.4400711Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T20:38:28.4466773Z Post job cleanup. 2026-10-24T20:38:28.4476653Z ##[start-action display=Cache full pnpm store;id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.__actions_cache] 2026-10-24T20:38:28.4778177Z Post job cleanup. 2026-10-24T20:38:28.5483266Z [command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/_work/t3code/t3code --files-from manifest.txt --use-compress-program zstdmt 2026-10-24T20:38:32.0104225Z Failed to save: Unable to reserve cache with key pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6, another job may be creating this cache. 2026-10-24T20:38:32.0565525Z ##[end-action id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.__actions_cache;outcome=success;conclusion=success;duration_ms=3608] 2026-10-24T20:38:32.0567162Z ##[start-action display=Cache Vite+;id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.vp_cache] 2026-10-24T20:38:32.0585937Z Post job cleanup. 2026-10-24T20:38:32.1183454Z 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-24T20:38:32.1212248Z ##[end-action id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.vp_cache;outcome=success;conclusion=success;duration_ms=64] 2026-10-24T20:38:32.1245945Z Post job cleanup. 2026-10-24T20:38:32.1616808Z [command]/usr/local/bin/git version 2026-10-24T20:38:32.1642786Z git version 2.55.0 2026-10-24T20:38:32.1689670Z Temporarily overriding HOME='/home/runner/_work/_temp/fe065c06-5498-4a18-91d5-577c1fadb2cf' before making global git config changes 2026-10-24T20:38:32.1690015Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T20:38:32.1692340Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T20:38:32.1712114Z Removing SSH command configuration 2026-10-24T20:38:32.1714826Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T20:38:32.1735481Z [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-24T20:38:32.1843220Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T20:38:32.1867544Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T20:38:32.1909768Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T20:38:32.1923515Z ##[group]Run '/job_completed.sh' 2026-10-24T20:38:32.1929076Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:38:32.1929242Z env: 2026-10-24T20:38:32.1929348Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167 2026-10-24T20:38:32.1929501Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383 2026-10-24T20:38:32.1929634Z BLACKSMITH_CHECK_RUN_ID: 120981382431 2026-10-24T20:38:32.1929770Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T20:38:32.1929904Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T20:38:32.1930033Z ##[endgroup] 2026-10-24T20:38:32.1997329Z Docker container cache not activated, skipping hash computation. 2026-10-24T20:38:32.2249311Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T20:38:32.2289509Z Cleaning up orphan processes