2026-10-24T10:51:18.2839316Z Current runner version: '2.338.1' 2026-10-24T10:51:18.2842965Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-z2sk5w56xeo7haog' 2026-10-24T10:51:18.2843674Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T10:51:18.2844356Z Machine name: 'ip-172-31-73-130' 2026-10-24T10:51:18.2845921Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T10:51:18.2847233Z Contents: read 2026-10-24T10:51:18.2847622Z Metadata: read 2026-10-24T10:51:18.2848013Z ##[endgroup] 2026-10-24T10:51:18.2849282Z Secret source: None 2026-10-24T10:51:18.2849938Z Cache mode: write 2026-10-24T10:51:18.2850394Z Prepare workflow directory 2026-10-24T10:51:18.3028843Z Prepare all required actions 2026-10-24T10:51:18.3054528Z Getting action download info 2026-10-24T10:51:18.4196464Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T10:51:18.4553156Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T10:51:18.5645382Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T10:51:18.5684606Z Complete job name: Lint 2026-10-24T10:51:18.6061195Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T10:51:18.6195185Z ##[group]Run '/setup.sh' 2026-10-24T10:51:18.6211563Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:51:18.6211973Z env: 2026-10-24T10:51:18.6212187Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:18.6212467Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:18.6212745Z BLACKSMITH_CHECK_RUN_ID: 120853460311 2026-10-24T10:51:18.6213018Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T10:51:18.6213289Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T10:51:18.6213540Z ##[endgroup] 2026-10-24T10:51:18.6426702Z Logging daemon started (blacksmithd for logs) 2026-10-24T10:51:18.6505131Z Results daemon started (blacksmithd for results) 2026-10-24T10:51:18.6625109Z Background adoption and SSH setup started (PID: 3174) 2026-10-24T10:51:18.6627959Z 2026-10-24T10:51:18.6628236Z ---------------------------------------- 2026-10-24T10:51:18.6628927Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40087549550/jobs/120853460311 2026-10-24T10:51:18.6629567Z SSH Access (using your GitHub SSH key): 2026-10-24T10:51:18.6630151Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-z2sk5w56xeo7haog.vm.blacksmith.sh 2026-10-24T10:51:18.6630453Z 2026-10-24T10:51:18.6630559Z No GitHub SSH key? Add one at: 2026-10-24T10:51:18.6631037Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T10:51:18.6631432Z 2026-10-24T10:51:18.6631534Z ---------------------------------------- 2026-10-24T10:51:18.6631706Z 2026-10-24T10:51:18.6631845Z VM ID: blacksmith-8vcpu-ubuntu-2404-z2sk5w56xeo7haog 2026-10-24T10:51:18.6632225Z Host: production-152.236.31.192-x8664 2026-10-24T10:51:18.6632494Z Host Agent PID: 3932983 2026-10-24T10:51:18.6632732Z Host Agent Git SHA: 1637818df 2026-10-24T10:51:18.6632996Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T10:51:18.6633272Z Blacksmith Host Generation: gen 2 2026-10-24T10:51:18.6633565Z Petname: production-prepared-starling-3fabdbd4 2026-10-24T10:51:18.6633860Z Region: us-east 2026-10-24T10:51:18.6634089Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T10:51:18.6640858Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T10:51:18.6641574Z 2026-10-24T10:51:18.6641790Z Enabling Blacksmith transparent cache 2026-10-24T10:51:18.6912595Z ##[group]Run actions/checkout@v6 2026-10-24T10:51:18.6912913Z with: 2026-10-24T10:51:18.6913232Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T10:51:18.6913628Z sparse-checkout-cone-mode: false 2026-10-24T10:51:18.6913899Z repository: pingdotgg/t3code 2026-10-24T10:51:18.6915721Z token: *** 2026-10-24T10:51:18.6915930Z ssh-strict: true 2026-10-24T10:51:18.6916201Z ssh-user: git 2026-10-24T10:51:18.6916420Z persist-credentials: true 2026-10-24T10:51:18.6916972Z clean: true 2026-10-24T10:51:18.6917181Z fetch-depth: 1 2026-10-24T10:51:18.6917398Z fetch-tags: false 2026-10-24T10:51:18.6917614Z show-progress: true 2026-10-24T10:51:18.6917837Z lfs: false 2026-10-24T10:51:18.6918041Z submodules: false 2026-10-24T10:51:18.6918264Z set-safe-directory: true 2026-10-24T10:51:18.6918514Z allow-unsafe-pr-checkout: false 2026-10-24T10:51:18.6918761Z env: 2026-10-24T10:51:18.6918997Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:18.6919274Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:18.6919547Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:18.6919806Z ##[endgroup] 2026-10-24T10:51:18.8226564Z Syncing repository: pingdotgg/t3code 2026-10-24T10:51:18.8227637Z ##[group]Getting Git version info 2026-10-24T10:51:18.8227973Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T10:51:18.8228454Z [command]/usr/local/bin/git version 2026-10-24T10:51:18.8293162Z git version 2.55.0 2026-10-24T10:51:18.8303903Z ##[endgroup] 2026-10-24T10:51:18.8310639Z Temporarily overriding HOME='/home/runner/_work/_temp/e7158e43-f864-4223-8221-d7efbee19ceb' before making global git config changes 2026-10-24T10:51:18.8311292Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T10:51:18.8314161Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T10:51:18.8345084Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T10:51:18.8346838Z ##[group]Determining repository object format 2026-10-24T10:51:18.8347936Z ##[endgroup] 2026-10-24T10:51:18.8348296Z ##[group]Initializing the repository 2026-10-24T10:51:18.8350170Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T10:51:18.8386095Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T10:51:18.8386584Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T10:51:18.8387061Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T10:51:18.8387418Z hint: call: 2026-10-24T10:51:18.8387635Z hint: 2026-10-24T10:51:18.8387903Z hint: git config --global init.defaultBranch 2026-10-24T10:51:18.8388210Z hint: 2026-10-24T10:51:18.8388491Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T10:51:18.8388941Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T10:51:18.8389303Z hint: 2026-10-24T10:51:18.8389510Z hint: git branch -m 2026-10-24T10:51:18.8389739Z hint: 2026-10-24T10:51:18.8390045Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T10:51:18.8390511Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T10:51:18.8391311Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T10:51:18.8417144Z ##[endgroup] 2026-10-24T10:51:18.8417535Z ##[group]Disabling automatic garbage collection 2026-10-24T10:51:18.8419555Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T10:51:18.8442370Z ##[endgroup] 2026-10-24T10:51:18.8443008Z ##[group]Setting up auth 2026-10-24T10:51:18.8443300Z Removing SSH command configuration 2026-10-24T10:51:18.8445717Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T10:51:18.8467174Z [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-24T10:51:18.8601011Z Removing HTTP extra header 2026-10-24T10:51:18.8603500Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T10:51:18.8626317Z [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-24T10:51:18.8722587Z Removing includeIf entries pointing to credentials config files 2026-10-24T10:51:18.8725961Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T10:51:18.8745897Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T10:51:18.8879982Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-0030f3fe-6ef1-422f-a77a-522fdb22ec00.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T10:51:18.8905358Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-0030f3fe-6ef1-422f-a77a-522fdb22ec00.config 2026-10-24T10:51:18.8927459Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-0030f3fe-6ef1-422f-a77a-522fdb22ec00.config 2026-10-24T10:51:18.8947545Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-0030f3fe-6ef1-422f-a77a-522fdb22ec00.config 2026-10-24T10:51:18.8965432Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-0030f3fe-6ef1-422f-a77a-522fdb22ec00.config 2026-10-24T10:51:18.8982295Z ##[endgroup] 2026-10-24T10:51:18.8982651Z ##[group]Fetching the repository 2026-10-24T10:51:18.8986550Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +338a76050034a0e63f17384b2d3051c4353f81c7:refs/remotes/pull/24099/merge 2026-10-24T10:51:19.1813469Z From https://github.com/pingdotgg/t3code 2026-10-24T10:51:19.1814625Z * [new ref] 338a76050034a0e63f17384b2d3051c4353f81c7 -> pull/24099/merge 2026-10-24T10:51:19.1834226Z ##[endgroup] 2026-10-24T10:51:19.1835216Z ##[group]Determining the checkout info 2026-10-24T10:51:19.1836481Z ##[endgroup] 2026-10-24T10:51:19.1837353Z ##[group]Setting up sparse checkout 2026-10-24T10:51:19.1838265Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T10:51:19.1860979Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T10:51:19.1877734Z .git/info/sparse-checkout 2026-10-24T10:51:19.1881653Z ##[endgroup] 2026-10-24T10:51:19.1882449Z ##[group]Checking out the ref 2026-10-24T10:51:19.1884275Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24099/merge 2026-10-24T10:51:25.7661089Z Updating files: 0% (1/6336) 2026-10-24T10:51:25.7690788Z Updating files: 1% (64/6336) 2026-10-24T10:51:25.7710743Z Updating files: 2% (127/6336) 2026-10-24T10:51:25.7733225Z Updating files: 3% (191/6336) 2026-10-24T10:51:25.7754062Z Updating files: 4% (254/6336) 2026-10-24T10:51:25.7789457Z Updating files: 5% (317/6336) 2026-10-24T10:51:25.7811444Z Updating files: 6% (381/6336) 2026-10-24T10:51:25.7872451Z Updating files: 7% (444/6336) 2026-10-24T10:51:25.7911013Z Updating files: 8% (507/6336) 2026-10-24T10:51:25.7938255Z Updating files: 9% (571/6336) 2026-10-24T10:51:25.8233178Z Updating files: 10% (634/6336) 2026-10-24T10:51:25.8248847Z Updating files: 11% (697/6336) 2026-10-24T10:51:25.8259532Z Updating files: 12% (761/6336) 2026-10-24T10:51:25.8273942Z Updating files: 13% (824/6336) 2026-10-24T10:51:25.8289647Z Updating files: 14% (888/6336) 2026-10-24T10:51:25.8306915Z Updating files: 15% (951/6336) 2026-10-24T10:51:25.8325581Z Updating files: 16% (1014/6336) 2026-10-24T10:51:25.8339927Z Updating files: 17% (1078/6336) 2026-10-24T10:51:25.8358474Z Updating files: 18% (1141/6336) 2026-10-24T10:51:25.8373401Z Updating files: 19% (1204/6336) 2026-10-24T10:51:25.8395883Z Updating files: 20% (1268/6336) 2026-10-24T10:51:25.8413564Z Updating files: 21% (1331/6336) 2026-10-24T10:51:25.8433130Z Updating files: 22% (1394/6336) 2026-10-24T10:51:25.8446831Z Updating files: 23% (1458/6336) 2026-10-24T10:51:25.8460065Z Updating files: 24% (1521/6336) 2026-10-24T10:51:25.8476215Z Updating files: 25% (1584/6336) 2026-10-24T10:51:25.8489828Z Updating files: 26% (1648/6336) 2026-10-24T10:51:25.8502227Z Updating files: 27% (1711/6336) 2026-10-24T10:51:25.8522061Z Updating files: 28% (1775/6336) 2026-10-24T10:51:25.8553163Z Updating files: 29% (1838/6336) 2026-10-24T10:51:25.8573533Z Updating files: 30% (1901/6336) 2026-10-24T10:51:25.8596874Z Updating files: 31% (1965/6336) 2026-10-24T10:51:25.8627267Z Updating files: 32% (2028/6336) 2026-10-24T10:51:25.8657634Z Updating files: 33% (2091/6336) 2026-10-24T10:51:25.8724606Z Updating files: 34% (2155/6336) 2026-10-24T10:51:25.8777559Z Updating files: 35% (2218/6336) 2026-10-24T10:51:25.8813423Z Updating files: 36% (2281/6336) 2026-10-24T10:51:25.8846288Z Updating files: 37% (2345/6336) 2026-10-24T10:51:25.8893139Z Updating files: 38% (2408/6336) 2026-10-24T10:51:25.8919420Z Updating files: 39% (2472/6336) 2026-10-24T10:51:25.8949800Z Updating files: 40% (2535/6336) 2026-10-24T10:51:25.8979174Z Updating files: 41% (2598/6336) 2026-10-24T10:51:25.8997298Z Updating files: 42% (2662/6336) 2026-10-24T10:51:25.9007481Z Updating files: 43% (2725/6336) 2026-10-24T10:51:25.9028517Z Updating files: 44% (2788/6336) 2026-10-24T10:51:25.9061331Z Updating files: 45% (2852/6336) 2026-10-24T10:51:25.9084645Z Updating files: 46% (2915/6336) 2026-10-24T10:51:25.9112629Z Updating files: 47% (2978/6336) 2026-10-24T10:51:25.9140199Z Updating files: 48% (3042/6336) 2026-10-24T10:51:25.9170988Z Updating files: 49% (3105/6336) 2026-10-24T10:51:25.9207700Z Updating files: 50% (3168/6336) 2026-10-24T10:51:25.9222440Z Updating files: 51% (3232/6336) 2026-10-24T10:51:25.9255323Z Updating files: 52% (3295/6336) 2026-10-24T10:51:25.9281180Z Updating files: 53% (3359/6336) 2026-10-24T10:51:25.9300798Z Updating files: 54% (3422/6336) 2026-10-24T10:51:25.9324102Z Updating files: 55% (3485/6336) 2026-10-24T10:51:25.9342214Z Updating files: 56% (3549/6336) 2026-10-24T10:51:25.9359009Z Updating files: 57% (3612/6336) 2026-10-24T10:51:25.9376637Z Updating files: 58% (3675/6336) 2026-10-24T10:51:25.9734263Z Updating files: 59% (3739/6336) 2026-10-24T10:51:25.9748295Z Updating files: 60% (3802/6336) 2026-10-24T10:51:25.9764784Z Updating files: 61% (3865/6336) 2026-10-24T10:51:25.9782307Z Updating files: 62% (3929/6336) 2026-10-24T10:51:25.9803352Z Updating files: 63% (3992/6336) 2026-10-24T10:51:25.9829288Z Updating files: 64% (4056/6336) 2026-10-24T10:51:25.9850902Z Updating files: 65% (4119/6336) 2026-10-24T10:51:25.9866737Z Updating files: 66% (4182/6336) 2026-10-24T10:51:25.9892140Z Updating files: 67% (4246/6336) 2026-10-24T10:51:25.9904684Z Updating files: 68% (4309/6336) 2026-10-24T10:51:25.9924706Z Updating files: 69% (4372/6336) 2026-10-24T10:51:25.9937032Z Updating files: 70% (4436/6336) 2026-10-24T10:51:25.9953209Z Updating files: 71% (4499/6336) 2026-10-24T10:51:25.9969440Z Updating files: 72% (4562/6336) 2026-10-24T10:51:25.9994618Z Updating files: 73% (4626/6336) 2026-10-24T10:51:26.0252472Z Updating files: 74% (4689/6336) 2026-10-24T10:51:26.0436269Z Updating files: 75% (4752/6336) 2026-10-24T10:51:26.0459717Z Updating files: 76% (4816/6336) 2026-10-24T10:51:26.0480980Z Updating files: 77% (4879/6336) 2026-10-24T10:51:26.0505276Z Updating files: 78% (4943/6336) 2026-10-24T10:51:26.0523804Z Updating files: 79% (5006/6336) 2026-10-24T10:51:26.0542365Z Updating files: 80% (5069/6336) 2026-10-24T10:51:26.0558916Z Updating files: 81% (5133/6336) 2026-10-24T10:51:26.0577361Z Updating files: 82% (5196/6336) 2026-10-24T10:51:26.0595877Z Updating files: 83% (5259/6336) 2026-10-24T10:51:26.0616715Z Updating files: 84% (5323/6336) 2026-10-24T10:51:26.0638409Z Updating files: 85% (5386/6336) 2026-10-24T10:51:26.0662676Z Updating files: 86% (5449/6336) 2026-10-24T10:51:26.0728626Z Updating files: 87% (5513/6336) 2026-10-24T10:51:26.0759992Z Updating files: 88% (5576/6336) 2026-10-24T10:51:26.0779994Z Updating files: 89% (5640/6336) 2026-10-24T10:51:26.0803575Z Updating files: 90% (5703/6336) 2026-10-24T10:51:26.0836938Z Updating files: 91% (5766/6336) 2026-10-24T10:51:26.0851884Z Updating files: 92% (5830/6336) 2026-10-24T10:51:26.0867578Z Updating files: 93% (5893/6336) 2026-10-24T10:51:26.0888534Z Updating files: 94% (5956/6336) 2026-10-24T10:51:26.0911356Z Updating files: 95% (6020/6336) 2026-10-24T10:51:26.0963339Z Updating files: 96% (6083/6336) 2026-10-24T10:51:26.0990603Z Updating files: 97% (6146/6336) 2026-10-24T10:51:26.1035175Z Updating files: 98% (6210/6336) 2026-10-24T10:51:26.1053839Z Updating files: 99% (6273/6336) 2026-10-24T10:51:26.1054095Z Updating files: 100% (6336/6336) 2026-10-24T10:51:26.1054264Z Updating files: 100% (6336/6336), done. 2026-10-24T10:51:26.1200988Z Note: switching to 'refs/remotes/pull/24099/merge'. 2026-10-24T10:51:26.1201173Z 2026-10-24T10:51:26.1201280Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T10:51:26.1201514Z changes and commit them, and you can discard any commits you make in this 2026-10-24T10:51:26.1201742Z state without impacting any branches by switching back to a branch. 2026-10-24T10:51:26.1201877Z 2026-10-24T10:51:26.1201973Z If you want to create a new branch to retain commits you create, you may 2026-10-24T10:51:26.1202194Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T10:51:26.1202318Z 2026-10-24T10:51:26.1202381Z git switch -c 2026-10-24T10:51:26.1202469Z 2026-10-24T10:51:26.1202530Z Or undo this operation with: 2026-10-24T10:51:26.1202613Z 2026-10-24T10:51:26.1202664Z git switch - 2026-10-24T10:51:26.1202743Z 2026-10-24T10:51:26.1202856Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T10:51:26.1203003Z 2026-10-24T10:51:26.1203171Z HEAD is now at 338a760 Merge a1e2f80ed48ee7cb8ce11b8705d596bec619dfab into fef851bee09102641061aeb78a3092c2ba2c72ab 2026-10-24T10:51:26.1213979Z ##[endgroup] 2026-10-24T10:51:26.1244136Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T10:51:26.1261789Z 338a76050034a0e63f17384b2d3051c4353f81c7 2026-10-24T10:51:26.1334024Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T10:51:26.1334259Z files="$(git ls-files .github/pr-assets)" 2026-10-24T10:51:26.1334446Z if test -n "$files"; then 2026-10-24T10:51:26.1334709Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T10:51:26.1334950Z  exit 1 2026-10-24T10:51:26.1335055Z fi 2026-10-24T10:51:26.1355380Z shell: /usr/bin/bash -e {0} 2026-10-24T10:51:26.1355520Z env: 2026-10-24T10:51:26.1355634Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:26.1355794Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:26.1355937Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:26.1356079Z ##[endgroup] 2026-10-24T10:51:26.1505056Z Prepare all required actions 2026-10-24T10:51:26.1505442Z Getting action download info 2026-10-24T10:51:26.2184071Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T10:51:26.3089047Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T10:51:26.3089220Z env: 2026-10-24T10:51:26.3089341Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:26.3089494Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:26.3089649Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:26.3089788Z ##[endgroup] 2026-10-24T10:51:26.3175542Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T10:51:26.3191330Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T10:51:26.3191813Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T10:51:26.3192228Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T10:51:26.3192473Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T10:51:26.3211636Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:51:26.3211809Z env: 2026-10-24T10:51:26.3211928Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:26.3212075Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:26.3212220Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:26.3212362Z ##[endgroup] 2026-10-24T10:51:26.3289158Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T10:51:26.3290532Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T10:51:26.3335347Z ##[group]Run actions/cache@v6 2026-10-24T10:51:26.3335499Z with: 2026-10-24T10:51:26.3335605Z path: ~/.vite-plus 2026-10-24T10:51:26.3335773Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T10:51:26.3335981Z enableCrossOsArchive: false 2026-10-24T10:51:26.3336113Z fail-on-cache-miss: false 2026-10-24T10:51:26.3336240Z lookup-only: false 2026-10-24T10:51:26.3336351Z save-always: false 2026-10-24T10:51:26.3336461Z env: 2026-10-24T10:51:26.3336570Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:26.3336719Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:26.3336862Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:26.3336996Z ##[endgroup] 2026-10-24T10:51:26.5298428Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T10:51:27.3552625Z Received 170349591 of 170349591 (100.0%), 200.3 MBs/sec 2026-10-24T10:51:27.3553364Z Cache Size: ~162 MB (170349591 B) 2026-10-24T10:51:27.3573630Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d211a0c6-512c-48a0-8578-b0360774e11e/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T10:51:27.9984064Z Cache restored successfully 2026-10-24T10:51:28.0120539Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T10:51:28.0193979Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1690] 2026-10-24T10:51:28.0196436Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T10:51:28.0215784Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T10:51:28.0216005Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T10:51:28.0216180Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T10:51:28.0237742Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:51:28.0237920Z env: 2026-10-24T10:51:28.0238037Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:28.0238185Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:28.0238331Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:28.0238481Z ##[endgroup] 2026-10-24T10:51:28.0279811Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T10:51:28.0286388Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T10:51:28.0287639Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T10:51:28.0291234Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T10:51:28.0292571Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T10:51:28.0318983Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T10:51:28.0319157Z store_path="$(vp pm cache dir)" 2026-10-24T10:51:28.0319318Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T10:51:28.0336615Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:51:28.0336784Z env: 2026-10-24T10:51:28.0336895Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:28.0337040Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:28.0337307Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:28.0337438Z ##[endgroup] 2026-10-24T10:51:28.0464736Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=17] 2026-10-24T10:51:28.0465993Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T10:51:28.0777053Z ##[group]Run actions/cache@v6 2026-10-24T10:51:28.0777183Z with: 2026-10-24T10:51:28.0777310Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T10:51:28.0777566Z key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T10:51:28.0777822Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T10:51:28.0777968Z enableCrossOsArchive: false 2026-10-24T10:51:28.0778101Z fail-on-cache-miss: false 2026-10-24T10:51:28.0778224Z lookup-only: false 2026-10-24T10:51:28.0778333Z save-always: false 2026-10-24T10:51:28.0778439Z env: 2026-10-24T10:51:28.0778546Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:28.0778706Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:28.0778846Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:28.0778981Z ##[endgroup] 2026-10-24T10:51:28.2645066Z Cache hit for: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T10:51:29.3543766Z Received 671088640 of 995169257 (67.4%), 595.3 MBs/sec 2026-10-24T10:51:29.7912613Z Received 995169257 of 995169257 (100.0%), 628.1 MBs/sec 2026-10-24T10:51:29.7914167Z Cache Size: ~949 MB (995169257 B) 2026-10-24T10:51:29.7957535Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/12a8eb56-c5e7-4e63-bf7b-55619de677c8/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T10:51:34.9792733Z Cache restored successfully 2026-10-24T10:51:35.0240361Z Cache restored from key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T10:51:35.0299478Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6983] 2026-10-24T10:51:35.0301718Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T10:51:35.0312648Z ##[group]Run vp install 2026-10-24T10:51:35.0312794Z vp install 2026-10-24T10:51:35.0332174Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T10:51:35.0332343Z env: 2026-10-24T10:51:35.0332464Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:35.0332614Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:35.0332756Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:35.0332894Z ##[endgroup] 2026-10-24T10:51:35.0635060Z Scope: all 33 workspace projects 2026-10-24T10:51:35.1693680Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T10:51:35.4018770Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T10:51:35.4019180Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T10:51:35.4019430Z Virtual store is at: node_modules/.pnpm 2026-10-24T10:51:37.4252023Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.3s) 2026-10-24T10:51:37.4252389Z Lockfile is up to date, resolution step is skipped 2026-10-24T10:51:37.4407057Z Packages: +1721 2026-10-24T10:51:37.4407348Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T10:51:37.4788801Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T10:51:38.3776848Z . prepare$ vp config --no-agent 2026-10-24T10:51:38.4666657Z . prepare: Done 2026-10-24T10:51:38.4678331Z 2026-10-24T10:51:38.4678381Z devDependencies: 2026-10-24T10:51:38.4678530Z + @coderabbitai/config 1.1.0 2026-10-24T10:51:38.4678662Z + @shadcn/lint 0.1.5 2026-10-24T10:51:38.4678804Z + @types/node 24.12.4 2026-10-24T10:51:38.4678924Z + knip 6.34.0 2026-10-24T10:51:38.4679059Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T10:51:38.4679203Z + vite-plus 1.3.0 2026-10-24T10:51:38.4679271Z 2026-10-24T10:51:38.4694057Z Done in 3.4s using pnpm v12.14.0 2026-10-24T10:51:38.4821413Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3451] 2026-10-24T10:51:38.5249699Z ##[group]Run actions/cache@v6 2026-10-24T10:51:38.5249842Z with: 2026-10-24T10:51:38.5249947Z path: ~/.cache/electron 2026-10-24T10:51:38.5250189Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T10:51:38.5250437Z enableCrossOsArchive: false 2026-10-24T10:51:38.5250577Z fail-on-cache-miss: false 2026-10-24T10:51:38.5250700Z lookup-only: false 2026-10-24T10:51:38.5250814Z save-always: false 2026-10-24T10:51:38.5250924Z env: 2026-10-24T10:51:38.5251032Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:38.5251177Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:38.5251331Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:38.5251468Z ##[endgroup] 2026-10-24T10:51:38.7107873Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T10:51:38.8637077Z Received 122906203 of 122906203 (100.0%), 861.9 MBs/sec 2026-10-24T10:51:38.8637729Z Cache Size: ~117 MB (122906203 B) 2026-10-24T10:51:38.8669742Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/4297be49-f49f-428a-9f1e-ef5b614a4b30/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T10:51:38.9200403Z Cache restored successfully 2026-10-24T10:51:38.9369099Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T10:51:38.9473595Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T10:51:38.9474007Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T10:51:38.9496154Z shell: /usr/bin/bash -e {0} 2026-10-24T10:51:38.9496308Z env: 2026-10-24T10:51:38.9496613Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:38.9496766Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:38.9496970Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:38.9497125Z ##[endgroup] 2026-10-24T10:51:39.1283784Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T10:51:39.6854126Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T10:51:39.6876414Z 2026-10-24T10:51:39.7014479Z ##[group]Run vp run knip:check 2026-10-24T10:51:39.7014738Z vp run knip:check 2026-10-24T10:51:39.7040507Z shell: /usr/bin/bash -e {0} 2026-10-24T10:51:39.7040650Z env: 2026-10-24T10:51:39.7040776Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:39.7040936Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:39.7041084Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:39.7041233Z ##[endgroup] 2026-10-24T10:51:39.8615533Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T10:51:43.4625074Z 2026-10-24T10:51:43.4628458Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T10:51:51.3732581Z 2026-10-24T10:51:51.3733871Z --- 2026-10-24T10:51:51.3787453Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T10:51:51.3805517Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T10:51:51.3805839Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T10:51:51.3826895Z shell: /usr/bin/bash -e {0} 2026-10-24T10:51:51.3827094Z env: 2026-10-24T10:51:51.3827224Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:51.3827381Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:51.3827532Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:51.3827671Z ##[endgroup] 2026-10-24T10:51:51.5260407Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T10:51:51.7034203Z 2026-10-24T10:51:51.7097993Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T10:51:51.7098229Z vp run --filter t3 generate --check 2026-10-24T10:51:51.7118425Z shell: /usr/bin/bash -e {0} 2026-10-24T10:51:51.7118555Z env: 2026-10-24T10:51:51.7118683Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:51.7118831Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:51.7118975Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:51.7119111Z ##[endgroup] 2026-10-24T10:51:51.8522682Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T10:51:52.0084404Z 2026-10-24T10:51:52.0154166Z ##[group]Run vp check 2026-10-24T10:51:52.0154384Z vp check 2026-10-24T10:51:52.0175733Z shell: /usr/bin/bash -e {0} 2026-10-24T10:51:52.0175886Z env: 2026-10-24T10:51:52.0176000Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 189 2026-10-24T10:51:52.0176147Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 378 2026-10-24T10:51:52.0176288Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T10:51:52.0176423Z ##[endgroup] 2026-10-24T10:51:52.5502469Z pass: All 5690 files are correctly formatted (393ms, 8 threads) 2026-10-24T10:51:57.5031767Z warn: Lint warnings found 2026-10-24T10:51:57.5032982Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T10:51:57.5033577Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T10:51:57.5033985Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T10:51:57.5034330Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T10:51:57.5034673Z ·  ────┬─── 2026-10-24T10:51:57.5035093Z · ╰── 'Duration' is imported here 2026-10-24T10:51:57.5035456Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T10:51:57.5035715Z ╰──── 2026-10-24T10:51:57.5035957Z  help: Consider removing this import. 2026-10-24T10:51:57.5036149Z 2026-10-24T10:51:57.5036607Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5037362Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T10:51:57.5037750Z 55 │ 2026-10-24T10:51:57.5037955Z 56 │ useEffect(() => { 2026-10-24T10:51:57.5038214Z ·  ────┬──── 2026-10-24T10:51:57.5038567Z · ╰── This is the containing effect 2026-10-24T10:51:57.5038887Z 57 │ scheduler.reset(); 2026-10-24T10:51:57.5039186Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T10:51:57.5039503Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T10:51:57.5039865Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T10:51:57.5040199Z ·  ───────┬─────── 2026-10-24T10:51:57.5040640Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5041096Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T10:51:57.5041397Z ╰──── 2026-10-24T10:51:57.5042482Z  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-24T10:51:57.5044288Z  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-24T10:51:57.5044797Z 2026-10-24T10:51:57.5045125Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5045741Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T10:51:57.5046185Z 62 │ return () => scheduler.cancel(); 2026-10-24T10:51:57.5046526Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T10:51:57.5046925Z ·  ───┬─── ─────┬───── 2026-10-24T10:51:57.5047470Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T10:51:57.5047853Z · ╰── Unnecessary dependency `enabled` 2026-10-24T10:51:57.5048045Z 64 │ 2026-10-24T10:51:57.5048158Z ╰──── 2026-10-24T10:51:57.5048528Z  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-24T10:51:57.5049378Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5049823Z 2026-10-24T10:51:57.5050131Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5050716Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:414:7] 2026-10-24T10:51:57.5051080Z 413 │ 2026-10-24T10:51:57.5051378Z 414 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T10:51:57.5051725Z ·  ──┬── 2026-10-24T10:51:57.5052055Z · ╰── 'layer' is declared here 2026-10-24T10:51:57.5052358Z ╰──── 2026-10-24T10:51:57.5052543Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5052662Z 2026-10-24T10:51:57.5052895Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T10:51:57.5053264Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-24T10:51:57.5053476Z 227 │ ): string { 2026-10-24T10:51:57.5053720Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T10:51:57.5053995Z ·  ────── 2026-10-24T10:51:57.5054249Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T10:51:57.5054450Z ╰──── 2026-10-24T10:51:57.5054680Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T10:51:57.5054861Z 2026-10-24T10:51:57.5055029Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5055324Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T10:51:57.5055508Z 265 │ 2026-10-24T10:51:57.5055676Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T10:51:57.5055870Z ·  ── 2026-10-24T10:51:57.5056017Z 267 │ } 2026-10-24T10:51:57.5056129Z ╰──── 2026-10-24T10:51:57.5056416Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5056643Z 2026-10-24T10:51:57.5057116Z ⚠ 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-24T10:51:57.5057760Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T10:51:57.5057986Z 27 │ ) { 2026-10-24T10:51:57.5058272Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5058606Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T10:51:57.5058883Z 30 │ │ if (predicate(available)) return available; 2026-10-24T10:51:57.5059128Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5059364Z 32 │ ╰─▶ } 2026-10-24T10:51:57.5059675Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T10:51:57.5059908Z ╰──── 2026-10-24T10:51:57.5059965Z 2026-10-24T10:51:57.5060541Z ⚠ 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-24T10:51:57.5061183Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T10:51:57.5061402Z 130 │ ) { 2026-10-24T10:51:57.5061753Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5062076Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T10:51:57.5062306Z 133 │ │ return; 2026-10-24T10:51:57.5062501Z 134 │ │ } 2026-10-24T10:51:57.5062712Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5063057Z 136 │ ╰─▶ } 2026-10-24T10:51:57.5063502Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T10:51:57.5063729Z ╰──── 2026-10-24T10:51:57.5063784Z 2026-10-24T10:51:57.5064246Z ⚠ 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-24T10:51:57.5064799Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T10:51:57.5065105Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T10:51:57.5065537Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T10:51:57.5065894Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5066159Z 254 │ ╰─▶ } 2026-10-24T10:51:57.5066425Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T10:51:57.5066617Z ╰──── 2026-10-24T10:51:57.5066671Z 2026-10-24T10:51:57.5067139Z ⚠ 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-24T10:51:57.5067763Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T10:51:57.5067963Z 257 │ 2026-10-24T10:51:57.5068283Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T10:51:57.5068618Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5068872Z 260 │ ╰─▶ } 2026-10-24T10:51:57.5069115Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T10:51:57.5069289Z ╰──── 2026-10-24T10:51:57.5069344Z 2026-10-24T10:51:57.5069809Z ⚠ 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-24T10:51:57.5070358Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T10:51:57.5070560Z 321 │ ); 2026-10-24T10:51:57.5070965Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T10:51:57.5071387Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5071637Z 324 │ ╰─▶ } 2026-10-24T10:51:57.5071896Z 325 │ 2026-10-24T10:51:57.5072049Z ╰──── 2026-10-24T10:51:57.5072447Z 2026-10-24T10:51:57.5072989Z ⚠ 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-24T10:51:57.5073540Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T10:51:57.5073846Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T10:51:57.5074276Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T10:51:57.5074611Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5074864Z 332 │ ╰─▶ } 2026-10-24T10:51:57.5075105Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T10:51:57.5075281Z ╰──── 2026-10-24T10:51:57.5075335Z 2026-10-24T10:51:57.5075796Z ⚠ 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-24T10:51:57.5076386Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T10:51:57.5076669Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T10:51:57.5076984Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T10:51:57.5077346Z 567 │ │ const nextEvent = { 2026-10-24T10:51:57.5077625Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T10:51:57.5077920Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T10:51:57.5078160Z 570 │ │ threadId, 2026-10-24T10:51:57.5078376Z 571 │ │ providerInstanceId, 2026-10-24T10:51:57.5078598Z 572 │ │ occurredAt: now, 2026-10-24T10:51:57.5078872Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T10:51:57.5079156Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T10:51:57.5079413Z 575 │ │ const reader = yield* eventSink 2026-10-24T10:51:57.5079661Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T10:51:57.5079931Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T10:51:57.5080284Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5080577Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T10:51:57.5080880Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T10:51:57.5081135Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T10:51:57.5081608Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T10:51:57.5081970Z 583 │ │ } 2026-10-24T10:51:57.5082233Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T10:51:57.5082622Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T10:51:57.5082911Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T10:51:57.5083184Z 587 │ ╰─▶ } 2026-10-24T10:51:57.5083389Z 588 │ }), 2026-10-24T10:51:57.5083525Z ╰──── 2026-10-24T10:51:57.5083583Z 2026-10-24T10:51:57.5084054Z ⚠ 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-24T10:51:57.5084647Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T10:51:57.5084901Z 2326 │ let settled = false; 2026-10-24T10:51:57.5085164Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T10:51:57.5085485Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T10:51:57.5085785Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T10:51:57.5086011Z 2330 │ │ ); 2026-10-24T10:51:57.5086237Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T10:51:57.5086520Z 2332 │ ╰─▶ } 2026-10-24T10:51:57.5086789Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T10:51:57.5086974Z ╰──── 2026-10-24T10:51:57.5087032Z 2026-10-24T10:51:57.5087537Z ⚠ 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-24T10:51:57.5088095Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T10:51:57.5088297Z 93 │ ) { 2026-10-24T10:51:57.5088562Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5088926Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T10:51:57.5089226Z 96 │ │ if (predicate(project)) return project; 2026-10-24T10:51:57.5089466Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5089701Z 98 │ ╰─▶ } 2026-10-24T10:51:57.5089986Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T10:51:57.5090198Z ╰──── 2026-10-24T10:51:57.5090255Z 2026-10-24T10:51:57.5090719Z ⚠ 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-24T10:51:57.5091274Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T10:51:57.5091566Z 225 │ ) { 2026-10-24T10:51:57.5092051Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5092574Z 227 │ │ const socket = sockets[index]; 2026-10-24T10:51:57.5092912Z 228 │ │ if (socket) { 2026-10-24T10:51:57.5093235Z 229 │ │ return socket; 2026-10-24T10:51:57.5093526Z 230 │ │ } 2026-10-24T10:51:57.5093855Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5094257Z 232 │ ╰─▶ } 2026-10-24T10:51:57.5094763Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T10:51:57.5095148Z ╰──── 2026-10-24T10:51:57.5095238Z 2026-10-24T10:51:57.5095798Z ⚠ 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-24T10:51:57.5096367Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T10:51:57.5096757Z 239 │ ) { 2026-10-24T10:51:57.5097221Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5097864Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T10:51:57.5098240Z 242 │ │ if (request) { 2026-10-24T10:51:57.5098447Z 243 │ │ return request; 2026-10-24T10:51:57.5098653Z 244 │ │ } 2026-10-24T10:51:57.5098857Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5099114Z 246 │ ╰─▶ } 2026-10-24T10:51:57.5140413Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T10:51:57.5140816Z ╰──── 2026-10-24T10:51:57.5140881Z 2026-10-24T10:51:57.5141183Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5141595Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T10:51:57.5141801Z 913 │ 2026-10-24T10:51:57.5142072Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T10:51:57.5142356Z ·  ─────┬───── 2026-10-24T10:51:57.5142611Z · ╰── 'layerDaemon' is declared here 2026-10-24T10:51:57.5142840Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T10:51:57.5142998Z ╰──── 2026-10-24T10:51:57.5143164Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5143284Z 2026-10-24T10:51:57.5143731Z ⚠ 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-24T10:51:57.5144268Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-24T10:51:57.5144544Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T10:51:57.5144883Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T10:51:57.5145370Z ·  ─────────────────── 2026-10-24T10:51:57.5145647Z 1044 │ expect(encoded).not.toContain(url); 2026-10-24T10:51:57.5145810Z ╰──── 2026-10-24T10:51:57.5145870Z 2026-10-24T10:51:57.5146129Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5146492Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T10:51:57.5146681Z 727 │ 2026-10-24T10:51:57.5146818Z 728 │ const layer = layerWithOptions(); 2026-10-24T10:51:57.5146989Z ·  ──┬── 2026-10-24T10:51:57.5147230Z · ╰── 'layer' is declared here 2026-10-24T10:51:57.5147414Z ╰──── 2026-10-24T10:51:57.5147571Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5147687Z 2026-10-24T10:51:57.5147887Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T10:51:57.5148174Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T10:51:57.5148369Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T10:51:57.5148557Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T10:51:57.5148732Z ·  ──┬── 2026-10-24T10:51:57.5148955Z · ╰── 'Fiber' is imported here 2026-10-24T10:51:57.5149194Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T10:51:57.5149366Z ╰──── 2026-10-24T10:51:57.5149517Z  help: Consider removing this import. 2026-10-24T10:51:57.5149631Z 2026-10-24T10:51:57.5149831Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T10:51:57.5150121Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T10:51:57.5150311Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T10:51:57.5150502Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T10:51:57.5150689Z ·  ────┬─── 2026-10-24T10:51:57.5150912Z · ╰── 'Schedule' is imported here 2026-10-24T10:51:57.5151131Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T10:51:57.5151286Z ╰──── 2026-10-24T10:51:57.5151435Z  help: Consider removing this import. 2026-10-24T10:51:57.5151547Z 2026-10-24T10:51:57.5151846Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5152365Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-24T10:51:57.5152714Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T10:51:57.5153109Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T10:51:57.5153417Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5153696Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T10:51:57.5154039Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T10:51:57.5154269Z ╰──── 2026-10-24T10:51:57.5154433Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5154549Z 2026-10-24T10:51:57.5154808Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5155226Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T10:51:57.5155453Z 10577 │ 2026-10-24T10:51:57.5155591Z 10578 │ const layer: Layer.Layer< 2026-10-24T10:51:57.5155754Z ·  ──┬── 2026-10-24T10:51:57.5155976Z · ╰── 'layer' is declared here 2026-10-24T10:51:57.5156208Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T10:51:57.5156372Z ╰──── 2026-10-24T10:51:57.5156535Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5156653Z 2026-10-24T10:51:57.5156981Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5157536Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T10:51:57.5157754Z 1443 │ 2026-10-24T10:51:57.5157940Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T10:51:57.5158194Z ·  ───────────────────┬─────────────────── 2026-10-24T10:51:57.5158526Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T10:51:57.5158846Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T10:51:57.5159034Z ╰──── 2026-10-24T10:51:57.5159195Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5159314Z 2026-10-24T10:51:57.5159570Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5159970Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T10:51:57.5160192Z 1679 │ 2026-10-24T10:51:57.5160330Z 1680 │ const layer: Layer.Layer< 2026-10-24T10:51:57.5160498Z ·  ──┬── 2026-10-24T10:51:57.5160712Z · ╰── 'layer' is declared here 2026-10-24T10:51:57.5160939Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T10:51:57.5161102Z ╰──── 2026-10-24T10:51:57.5161257Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5161376Z 2026-10-24T10:51:57.5161629Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T10:51:57.5162048Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T10:51:57.5162285Z 959 │ 2026-10-24T10:51:57.5162455Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T10:51:57.5162760Z ·  ──────────────────┬───────────────── 2026-10-24T10:51:57.5163110Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T10:51:57.5163408Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T10:51:57.5163581Z ╰──── 2026-10-24T10:51:57.5163740Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5163854Z 2026-10-24T10:51:57.5164023Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5164331Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T10:51:57.5164529Z 185 │ 2026-10-24T10:51:57.5164692Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T10:51:57.5164880Z ·  ── 2026-10-24T10:51:57.5165019Z 187 │ } 2026-10-24T10:51:57.5165132Z ╰──── 2026-10-24T10:51:57.5165421Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5165647Z 2026-10-24T10:51:57.5165815Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5166118Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T10:51:57.5166321Z 188 │ 2026-10-24T10:51:57.5166447Z 189 │ for (const {} of [ 2026-10-24T10:51:57.5166601Z ·  ── 2026-10-24T10:51:57.5166780Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T10:51:57.5166943Z ╰──── 2026-10-24T10:51:57.5167280Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5167506Z 2026-10-24T10:51:57.5167679Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5167982Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T10:51:57.5168180Z 310 │ 2026-10-24T10:51:57.5168374Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T10:51:57.5168582Z ·  ── 2026-10-24T10:51:57.5168724Z 312 │ } 2026-10-24T10:51:57.5168834Z ╰──── 2026-10-24T10:51:57.5169110Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5169327Z 2026-10-24T10:51:57.5169492Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5169791Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T10:51:57.5169986Z 313 │ 2026-10-24T10:51:57.5170113Z 314 │ for (const {} of [ 2026-10-24T10:51:57.5170263Z ·  ── 2026-10-24T10:51:57.5170399Z 315 │ { 2026-10-24T10:51:57.5170513Z ╰──── 2026-10-24T10:51:57.5170788Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5171008Z 2026-10-24T10:51:57.5171232Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T10:51:57.5171606Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T10:51:57.5171823Z 1397 │ 2026-10-24T10:51:57.5171971Z 1398 │ function assertUserMessagesExclude( 2026-10-24T10:51:57.5172188Z ·  ────────────┬──────────── 2026-10-24T10:51:57.5172524Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T10:51:57.5172832Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T10:51:57.5173006Z ╰──── 2026-10-24T10:51:57.5173166Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5173281Z 2026-10-24T10:51:57.5173479Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5173814Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T10:51:57.5174049Z 35 │ item.type === "assistant_message").at(-1)?.text, 2026-10-24T10:51:57.5176362Z ·  ────── 2026-10-24T10:51:57.5176531Z 1999 │ "authoritative answer", 2026-10-24T10:51:57.5176680Z ╰──── 2026-10-24T10:51:57.5176905Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T10:51:57.5177080Z 2026-10-24T10:51:57.5177593Z ⚠ 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-24T10:51:57.5178195Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T10:51:57.5178548Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T10:51:57.5178946Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T10:51:57.5179256Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5179512Z 3953 │ ╰─▶ } 2026-10-24T10:51:57.5179772Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T10:51:57.5179957Z ╰──── 2026-10-24T10:51:57.5180020Z 2026-10-24T10:51:57.5180479Z ⚠ 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-24T10:51:57.5181053Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T10:51:57.5181313Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T10:51:57.5181604Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T10:51:57.5181890Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5182150Z 6064 │ ╰─▶ } 2026-10-24T10:51:57.5182519Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T10:51:57.5182778Z ╰──── 2026-10-24T10:51:57.5182835Z 2026-10-24T10:51:57.5183289Z ⚠ 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-24T10:51:57.5183863Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T10:51:57.5184117Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T10:51:57.5184403Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T10:51:57.5184688Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5184948Z 6199 │ ╰─▶ } 2026-10-24T10:51:57.5185261Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T10:51:57.5185482Z ╰──── 2026-10-24T10:51:57.5185537Z 2026-10-24T10:51:57.5185821Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T10:51:57.5186216Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T10:51:57.5186415Z 248 │ }, 2026-10-24T10:51:57.5186563Z 249 │ (effect, flow, stopSessions) => 2026-10-24T10:51:57.5186760Z ·  ──────┬───── 2026-10-24T10:51:57.5187019Z · ╰── 'stopSessions' is declared here 2026-10-24T10:51:57.5187249Z 250 │ effect.pipe( 2026-10-24T10:51:57.5187417Z ╰──── 2026-10-24T10:51:57.5187580Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5187702Z 2026-10-24T10:51:57.5187903Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T10:51:57.5188263Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T10:51:57.5188499Z 1782 │ assert.equal( 2026-10-24T10:51:57.5188724Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T10:51:57.5188984Z ·  ────────────────────────── 2026-10-24T10:51:57.5189179Z 1784 │ stored.attachments[0]?.id, 2026-10-24T10:51:57.5189332Z ╰──── 2026-10-24T10:51:57.5189560Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T10:51:57.5189733Z 2026-10-24T10:51:57.5189946Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T10:51:57.5190319Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T10:51:57.5190563Z 14 │ } from "@t3tools/contracts"; 2026-10-24T10:51:57.5190741Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T10:51:57.5190915Z ·  ── 2026-10-24T10:51:57.5191183Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-24T10:51:57.5191420Z ╰──── 2026-10-24T10:51:57.5191557Z  help: Remove empty braces 2026-10-24T10:51:57.5191661Z 2026-10-24T10:51:57.5192267Z ⚠ 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-24T10:51:57.5192842Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T10:51:57.5193029Z 499 │ 2026-10-24T10:51:57.5193206Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T10:51:57.5193463Z ·  ────────────────────────── 2026-10-24T10:51:57.5193701Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T10:51:57.5193910Z ╰──── 2026-10-24T10:51:57.5193970Z 2026-10-24T10:51:57.5194180Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T10:51:57.5194530Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-24T10:51:57.5194737Z 233 │ 2026-10-24T10:51:57.5194912Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T10:51:57.5195135Z ·  ───────┬────── 2026-10-24T10:51:57.5195383Z · ╰── 'nonEmptyString' is declared here 2026-10-24T10:51:57.5195673Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T10:51:57.5195879Z ╰──── 2026-10-24T10:51:57.5196042Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5196163Z 2026-10-24T10:51:57.5196622Z ⚠ 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-24T10:51:57.5197187Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T10:51:57.5197426Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T10:51:57.5197653Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T10:51:57.5197906Z ·  ────────────────────────── 2026-10-24T10:51:57.5198102Z 130 │ Schema.Struct({ 2026-10-24T10:51:57.5198243Z ╰──── 2026-10-24T10:51:57.5198301Z 2026-10-24T10:51:57.5198563Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5198954Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T10:51:57.5199159Z 3754 │ 2026-10-24T10:51:57.5199427Z 3755 │ const layer: Layer.Layer = 2026-10-24T10:51:57.5199705Z ·  ──┬── 2026-10-24T10:51:57.5199924Z · ╰── 'layer' is declared here 2026-10-24T10:51:57.5200179Z 3756 │ Layer.effect( 2026-10-24T10:51:57.5200344Z ╰──── 2026-10-24T10:51:57.5200502Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5200621Z 2026-10-24T10:51:57.5200853Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T10:51:57.5201195Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T10:51:57.5201385Z 730 │ ); 2026-10-24T10:51:57.5201627Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T10:51:57.5201903Z ·  ────── 2026-10-24T10:51:57.5202129Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T10:51:57.5202299Z ╰──── 2026-10-24T10:51:57.5202528Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T10:51:57.5202713Z 2026-10-24T10:51:57.5203052Z ⚠ 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-24T10:51:57.5203482Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T10:51:57.5203771Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T10:51:57.5204062Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T10:51:57.5204278Z ·  ───────── 2026-10-24T10:51:57.5204436Z 19 │ expect( 2026-10-24T10:51:57.5204561Z ╰──── 2026-10-24T10:51:57.5204619Z 2026-10-24T10:51:57.5204958Z ⚠ 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-24T10:51:57.5205384Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T10:51:57.5205575Z 19 │ expect( 2026-10-24T10:51:57.5205815Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T10:51:57.5206065Z ·  ───────── 2026-10-24T10:51:57.5206218Z 21 │ ).toBe(true); 2026-10-24T10:51:57.5206347Z ╰──── 2026-10-24T10:51:57.5206405Z 2026-10-24T10:51:57.5206618Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T10:51:57.5206948Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T10:51:57.5207192Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T10:51:57.5207356Z 3 │ type AuthSessionState, 2026-10-24T10:51:57.5207531Z ·  ────────┬─────── 2026-10-24T10:51:57.5207784Z · ╰── 'AuthSessionState' is imported here 2026-10-24T10:51:57.5208010Z 4 │ sessionGrantsScope, 2026-10-24T10:51:57.5208146Z ╰──── 2026-10-24T10:51:57.5208298Z  help: Consider removing this import. 2026-10-24T10:51:57.5208414Z 2026-10-24T10:51:57.5208788Z ⚠ 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-24T10:51:57.5209246Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T10:51:57.5209528Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T10:51:57.5209868Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T10:51:57.5210212Z ·  ────────────────────────── 2026-10-24T10:51:57.5210504Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T10:51:57.5210713Z ╰──── 2026-10-24T10:51:57.5210770Z 2026-10-24T10:51:57.5210938Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5211300Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T10:51:57.5211544Z 52 │ 2026-10-24T10:51:57.5211668Z 53 │ for (const {} of [ 2026-10-24T10:51:57.5211822Z ·  ── 2026-10-24T10:51:57.5211979Z 54 │ { healthy: true }, 2026-10-24T10:51:57.5212113Z ╰──── 2026-10-24T10:51:57.5212401Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5212627Z 2026-10-24T10:51:57.5212896Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5213302Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:523:5] 2026-10-24T10:51:57.5213517Z 521 │ }, []); 2026-10-24T10:51:57.5213652Z 522 │ useEffect(() => { 2026-10-24T10:51:57.5213806Z ·  ────┬──── 2026-10-24T10:51:57.5214026Z · ╰── This is the containing effect 2026-10-24T10:51:57.5214253Z 523 │ setKeyboardStateSuspect(false); 2026-10-24T10:51:57.5214450Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5214727Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5215002Z 524 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T10:51:57.5215181Z ╰──── 2026-10-24T10:51:57.5215839Z  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-24T10:51:57.5216710Z  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-24T10:51:57.5217019Z 2026-10-24T10:51:57.5217314Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5217713Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:888:7] 2026-10-24T10:51:57.5218038Z 885 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T10:51:57.5218271Z 886 │ useEffect(() => { 2026-10-24T10:51:57.5218424Z ·  ────┬──── 2026-10-24T10:51:57.5218641Z · ╰── This is the containing effect 2026-10-24T10:51:57.5218938Z 887 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T10:51:57.5219228Z 888 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T10:51:57.5219459Z ·  ─────────────┬──────────── 2026-10-24T10:51:57.5219748Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5219978Z 889 │ } 2026-10-24T10:51:57.5220099Z ╰──── 2026-10-24T10:51:57.5220801Z  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-24T10:51:57.5221689Z  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-24T10:51:57.5221999Z 2026-10-24T10:51:57.5222257Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5222660Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1135:5] 2026-10-24T10:51:57.5222877Z 1133 │ 2026-10-24T10:51:57.5223007Z 1134 │ useEffect(() => { 2026-10-24T10:51:57.5223165Z ·  ────┬──── 2026-10-24T10:51:57.5223395Z · ╰── This is the containing effect 2026-10-24T10:51:57.5223616Z 1135 │ setAnchorMessageId(null); 2026-10-24T10:51:57.5223802Z ·  ─────────┬──────── 2026-10-24T10:51:57.5224075Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5224329Z 1136 │ setSubmittedMessageId(null); 2026-10-24T10:51:57.5224484Z ╰──── 2026-10-24T10:51:57.5225136Z  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-24T10:51:57.5226003Z  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-24T10:51:57.5226312Z 2026-10-24T10:51:57.5226514Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5226862Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:524:7] 2026-10-24T10:51:57.5227105Z 523 │ setKeyboardStateSuspect(false); 2026-10-24T10:51:57.5227336Z 524 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T10:51:57.5227604Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T10:51:57.5227962Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T10:51:57.5228322Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T10:51:57.5228619Z 525 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T10:51:57.5228824Z ╰──── 2026-10-24T10:51:57.5229183Z  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-24T10:51:57.5229780Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5230081Z 2026-10-24T10:51:57.5230285Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5230639Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1083:7] 2026-10-24T10:51:57.5230885Z 1082 │ userInputInsetProgress.set(1); 2026-10-24T10:51:57.5231212Z 1083 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T10:51:57.5231508Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5231802Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T10:51:57.5232537Z 1084 │ const showContent = props.showContent ?? true; 2026-10-24T10:51:57.5232815Z ╰──── 2026-10-24T10:51:57.5233356Z  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-24T10:51:57.5233946Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5234243Z 2026-10-24T10:51:57.5234453Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5234812Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1141:15] 2026-10-24T10:51:57.5235045Z 1140 │ freeze.set(false); 2026-10-24T10:51:57.5235214Z 1141 │ }, [freeze, selectedThreadKey]); 2026-10-24T10:51:57.5235417Z ·  ────────┬──────── 2026-10-24T10:51:57.5235691Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T10:51:57.5235909Z 1142 │ 2026-10-24T10:51:57.5236023Z ╰──── 2026-10-24T10:51:57.5236373Z  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-24T10:51:57.5236964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5237369Z 2026-10-24T10:51:57.5237530Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5237839Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:971:5] 2026-10-24T10:51:57.5238112Z 966 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T10:51:57.5238345Z 967 │ const floatingControlCoverage = useSharedValue( 2026-10-24T10:51:57.5238570Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5238844Z · ╰── `floatingControlCoverage` originates here 2026-10-24T10:51:57.5239135Z 968 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T10:51:57.5239326Z 969 │ ); 2026-10-24T10:51:57.5239460Z 970 │ useEffect(() => { 2026-10-24T10:51:57.5239722Z 971 │ floatingControlCoverage.value = withTiming( 2026-10-24T10:51:57.5239970Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5240233Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T10:51:57.5240515Z 972 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T10:51:57.5240706Z ╰──── 2026-10-24T10:51:57.5241026Z  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-24T10:51:57.5241590Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5241881Z 2026-10-24T10:51:57.5242038Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5242351Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:989:7] 2026-10-24T10:51:57.5242695Z 979 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T10:51:57.5243010Z 980 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T10:51:57.5243261Z ·  ────────────────┬──────────────── 2026-10-24T10:51:57.5243568Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T10:51:57.5243878Z 981 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T10:51:57.5244076Z 982 │ ); 2026-10-24T10:51:57.5244209Z 983 │ useAnimatedReaction( 2026-10-24T10:51:57.5244360Z 984 │ () => 2026-10-24T10:51:57.5244520Z 985 │ contentInsetEndAdjustment.value + 2026-10-24T10:51:57.5244718Z 986 │ floatingControlCoverage.value + 2026-10-24T10:51:57.5245025Z 987 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T10:51:57.5245288Z 988 │ (value) => { 2026-10-24T10:51:57.5245482Z 989 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T10:51:57.5245720Z ·  ────────────────┬──────────────── 2026-10-24T10:51:57.5246027Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T10:51:57.5246264Z 990 │ }, 2026-10-24T10:51:57.5246384Z ╰──── 2026-10-24T10:51:57.5246700Z  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-24T10:51:57.5247307Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5247601Z 2026-10-24T10:51:57.5247897Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5248339Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T10:51:57.5248556Z 345 │ 2026-10-24T10:51:57.5248721Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T10:51:57.5248933Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5249202Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T10:51:57.5249444Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T10:51:57.5249598Z ╰──── 2026-10-24T10:51:57.5249757Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5249875Z 2026-10-24T10:51:57.5250191Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5250615Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T10:51:57.5250891Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T10:51:57.5251085Z 38 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5251250Z ·  ───────┬─────── 2026-10-24T10:51:57.5251474Z · ╰── This is the containing effect 2026-10-24T10:51:57.5251671Z 39 │ reset(); 2026-10-24T10:51:57.5251810Z 40 │ setInitialized(true); 2026-10-24T10:51:57.5251974Z ·  ───────┬────── 2026-10-24T10:51:57.5252235Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5252467Z 41 │ }, [reset]); 2026-10-24T10:51:57.5252597Z ╰──── 2026-10-24T10:51:57.5253240Z  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-24T10:51:57.5254090Z  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-24T10:51:57.5254392Z 2026-10-24T10:51:57.5254647Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5255052Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T10:51:57.5255268Z 88 │ 2026-10-24T10:51:57.5255392Z 89 │ useEffect(() => { 2026-10-24T10:51:57.5255541Z ·  ────┬──── 2026-10-24T10:51:57.5255754Z · ╰── This is the containing effect 2026-10-24T10:51:57.5256048Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T10:51:57.5256315Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T10:51:57.5256499Z 92 │ let active = true; 2026-10-24T10:51:57.5256679Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T10:51:57.5256874Z ·  ─────────┬───────── 2026-10-24T10:51:57.5257142Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5257500Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T10:51:57.5257715Z ╰──── 2026-10-24T10:51:57.5258356Z  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-24T10:51:57.5259194Z  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-24T10:51:57.5259491Z 2026-10-24T10:51:57.5259769Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5260182Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12366:7] 2026-10-24T10:51:57.5260434Z 12365 │ 2026-10-24T10:51:57.5260670Z 12366 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T10:51:57.5260907Z ·  ────────┬─────── 2026-10-24T10:51:57.5261151Z · ╰── 'layerUnavailable' is declared here 2026-10-24T10:51:57.5261368Z 12367 │ OrchestratorV2, 2026-10-24T10:51:57.5261504Z ╰──── 2026-10-24T10:51:57.5261663Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5261780Z 2026-10-24T10:51:57.5261946Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5262244Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-24T10:51:57.5262504Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T10:51:57.5262741Z 1996 │ createdAt: new Date().toISOString(), 2026-10-24T10:51:57.5262945Z ·  ─────┬──── 2026-10-24T10:51:57.5263190Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5263440Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T10:51:57.5263612Z ╰──── 2026-10-24T10:51:57.5263946Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5264506Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5264790Z 2026-10-24T10:51:57.5264980Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5265347Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T10:51:57.5265607Z 554 │ assert.deepStrictEqual( 2026-10-24T10:51:57.5265878Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T10:51:57.5266168Z ·  ┬ 2026-10-24T10:51:57.5266462Z · ╰── '_' is declared here 2026-10-24T10:51:57.5266679Z 556 │ [ 2026-10-24T10:51:57.5266808Z ╰──── 2026-10-24T10:51:57.5266966Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5267085Z 2026-10-24T10:51:57.5267295Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5267660Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T10:51:57.5267917Z 1154 │ assert.deepStrictEqual( 2026-10-24T10:51:57.5268186Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T10:51:57.5268476Z ·  ┬ 2026-10-24T10:51:57.5268771Z · ╰── '_' is declared here 2026-10-24T10:51:57.5268989Z 1156 │ [ 2026-10-24T10:51:57.5269119Z ╰──── 2026-10-24T10:51:57.5269275Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5269393Z 2026-10-24T10:51:57.5269707Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5270114Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5] 2026-10-24T10:51:57.5270320Z 2137 │ ); 2026-10-24T10:51:57.5270453Z 2138 │ useEffect(() => { 2026-10-24T10:51:57.5270615Z ·  ────┬──── 2026-10-24T10:51:57.5270833Z · ╰── This is the containing effect 2026-10-24T10:51:57.5271046Z 2139 │ setExpandedVideo(null); 2026-10-24T10:51:57.5271220Z ·  ────────┬─────── 2026-10-24T10:51:57.5271487Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5271726Z 2140 │ setExpandedFile(null); 2026-10-24T10:51:57.5271868Z ╰──── 2026-10-24T10:51:57.5272628Z  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-24T10:51:57.5273491Z  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-24T10:51:57.5273800Z 2026-10-24T10:51:57.5274029Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T10:51:57.5274384Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T10:51:57.5274666Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T10:51:57.5274959Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T10:51:57.5275216Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5275495Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T10:51:57.5275817Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T10:51:57.5276037Z ╰──── 2026-10-24T10:51:57.5276196Z  help: Consider removing this import. 2026-10-24T10:51:57.5276315Z 2026-10-24T10:51:57.5276521Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T10:51:57.5276857Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T10:51:57.5277058Z 91 │ import { 2026-10-24T10:51:57.5277229Z 92 │ createContext, 2026-10-24T10:51:57.5277385Z ·  ──────┬────── 2026-10-24T10:51:57.5277681Z · ╰── 'createContext' is imported here 2026-10-24T10:51:57.5277922Z 93 │ memo, 2026-10-24T10:51:57.5278039Z ╰──── 2026-10-24T10:51:57.5278192Z  help: Consider removing this import. 2026-10-24T10:51:57.5278307Z 2026-10-24T10:51:57.5278518Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T10:51:57.5278857Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T10:51:57.5279057Z 107 │ import { 2026-10-24T10:51:57.5279192Z 108 │ ActivityIndicator, 2026-10-24T10:51:57.5279361Z ·  ────────┬──────── 2026-10-24T10:51:57.5279601Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T10:51:57.5279802Z 109 │ Image, 2026-10-24T10:51:57.5279923Z ╰──── 2026-10-24T10:51:57.5280081Z  help: Consider removing this import. 2026-10-24T10:51:57.5280198Z 2026-10-24T10:51:57.5280399Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T10:51:57.5280728Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T10:51:57.5280935Z 114 │ Pressable, 2026-10-24T10:51:57.5281072Z 115 │ ScrollView, 2026-10-24T10:51:57.5281219Z ·  ─────┬──── 2026-10-24T10:51:57.5281443Z · ╰── 'ScrollView' is imported here 2026-10-24T10:51:57.5281642Z 116 │ StyleSheet, 2026-10-24T10:51:57.5281771Z ╰──── 2026-10-24T10:51:57.5281922Z  help: Consider removing this import. 2026-10-24T10:51:57.5282039Z 2026-10-24T10:51:57.5282238Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T10:51:57.5282572Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T10:51:57.5282782Z 116 │ StyleSheet, 2026-10-24T10:51:57.5282924Z 117 │ Text as NativeText, 2026-10-24T10:51:57.5283158Z ·  ─────┬──── 2026-10-24T10:51:57.5283391Z · ╰── 'NativeText' is imported here 2026-10-24T10:51:57.5283599Z 118 │ type ColorValue, 2026-10-24T10:51:57.5283737Z ╰──── 2026-10-24T10:51:57.5283887Z  help: Consider removing this import. 2026-10-24T10:51:57.5284002Z 2026-10-24T10:51:57.5284218Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T10:51:57.5284557Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T10:51:57.5284846Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T10:51:57.5285120Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T10:51:57.5285350Z ·  ─────────┬──────── 2026-10-24T10:51:57.5285604Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T10:51:57.5285904Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T10:51:57.5286115Z ╰──── 2026-10-24T10:51:57.5286269Z  help: Consider removing this import. 2026-10-24T10:51:57.5286383Z 2026-10-24T10:51:57.5286602Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T10:51:57.5286947Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T10:51:57.5287318Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T10:51:57.5287621Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T10:51:57.5287848Z ·  ─────────┬───────── 2026-10-24T10:51:57.5288105Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T10:51:57.5288316Z 144 │ import { 2026-10-24T10:51:57.5288437Z ╰──── 2026-10-24T10:51:57.5288593Z  help: Consider removing this import. 2026-10-24T10:51:57.5288708Z 2026-10-24T10:51:57.5288918Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T10:51:57.5289256Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T10:51:57.5289549Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T10:51:57.5289851Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T10:51:57.5290091Z ·  ────────┬─────── 2026-10-24T10:51:57.5290340Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T10:51:57.5290626Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T10:51:57.5290834Z ╰──── 2026-10-24T10:51:57.5290984Z  help: Consider removing this import. 2026-10-24T10:51:57.5291099Z 2026-10-24T10:51:57.5291327Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T10:51:57.5291673Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T10:51:57.5291901Z 160 │ attachmentVideoPreviewSource, 2026-10-24T10:51:57.5292073Z 161 │ mediaVideoPreviewUri, 2026-10-24T10:51:57.5292254Z ·  ──────────┬───────── 2026-10-24T10:51:57.5292505Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T10:51:57.5292729Z 162 │ mediaVideoThumbnailKey, 2026-10-24T10:51:57.5292873Z ╰──── 2026-10-24T10:51:57.5293023Z  help: Consider removing this import. 2026-10-24T10:51:57.5293138Z 2026-10-24T10:51:57.5293364Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T10:51:57.5293711Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T10:51:57.5293927Z 161 │ mediaVideoPreviewUri, 2026-10-24T10:51:57.5294084Z 162 │ mediaVideoThumbnailKey, 2026-10-24T10:51:57.5294262Z ·  ───────────┬────────── 2026-10-24T10:51:57.5294520Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T10:51:57.5294760Z 163 │ type MediaVideoPreviewSource, 2026-10-24T10:51:57.5294912Z ╰──── 2026-10-24T10:51:57.5295065Z  help: Consider removing this import. 2026-10-24T10:51:57.5295177Z 2026-10-24T10:51:57.5295393Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T10:51:57.5295731Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T10:51:57.5295946Z 162 │ mediaVideoThumbnailKey, 2026-10-24T10:51:57.5296118Z 163 │ type MediaVideoPreviewSource, 2026-10-24T10:51:57.5296318Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5296586Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T10:51:57.5296835Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T10:51:57.5297044Z ╰──── 2026-10-24T10:51:57.5297236Z  help: Consider removing this import. 2026-10-24T10:51:57.5297371Z 2026-10-24T10:51:57.5297576Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T10:51:57.5297903Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T10:51:57.5298221Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T10:51:57.5298540Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T10:51:57.5298787Z ·  ───────┬─────── 2026-10-24T10:51:57.5299040Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T10:51:57.5299247Z 172 │ import { 2026-10-24T10:51:57.5299367Z ╰──── 2026-10-24T10:51:57.5299520Z  help: Consider removing this import. 2026-10-24T10:51:57.5299635Z 2026-10-24T10:51:57.5299861Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T10:51:57.5300210Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T10:51:57.5300408Z 185 │ import { 2026-10-24T10:51:57.5300552Z 186 │ resolveMarkdownFontSizes, 2026-10-24T10:51:57.5300734Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5300993Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T10:51:57.5301235Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T10:51:57.5301395Z ╰──── 2026-10-24T10:51:57.5301545Z  help: Consider removing this import. 2026-10-24T10:51:57.5307076Z 2026-10-24T10:51:57.5307392Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-24T10:51:57.5307762Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10] 2026-10-24T10:51:57.5308051Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-24T10:51:57.5308333Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-24T10:51:57.5308584Z ·  ───────────┬────────── 2026-10-24T10:51:57.5308852Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-24T10:51:57.5309071Z 192 │ import { 2026-10-24T10:51:57.5309190Z ╰──── 2026-10-24T10:51:57.5309342Z  help: Consider removing this import. 2026-10-24T10:51:57.5309457Z 2026-10-24T10:51:57.5309726Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T10:51:57.5310112Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3] 2026-10-24T10:51:57.5310333Z 193 │ normalizeNativeMarkdownUrl, 2026-10-24T10:51:57.5310524Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T10:51:57.5310751Z ·  ──────────────────┬────────────────── 2026-10-24T10:51:57.5311061Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T10:51:57.5311325Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T10:51:57.5311468Z ╰──── 2026-10-24T10:51:57.5311618Z  help: Consider removing this import. 2026-10-24T10:51:57.5311730Z 2026-10-24T10:51:57.5311956Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-24T10:51:57.5312542Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3] 2026-10-24T10:51:57.5312816Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T10:51:57.5312998Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T10:51:57.5313179Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5313434Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-24T10:51:57.5313678Z 196 │ resolveMarkdownLinkPresentation, 2026-10-24T10:51:57.5313834Z ╰──── 2026-10-24T10:51:57.5313987Z  help: Consider removing this import. 2026-10-24T10:51:57.5314099Z 2026-10-24T10:51:57.5314328Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T10:51:57.5314679Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10] 2026-10-24T10:51:57.5314930Z 233 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T10:51:57.5315200Z 234 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T10:51:57.5315462Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5315740Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T10:51:57.5315964Z 235 │ import { 2026-10-24T10:51:57.5316085Z ╰──── 2026-10-24T10:51:57.5316234Z  help: Consider removing this import. 2026-10-24T10:51:57.5316348Z 2026-10-24T10:51:57.5316558Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T10:51:57.5316895Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3] 2026-10-24T10:51:57.5317101Z 237 │ useAssetUrl, 2026-10-24T10:51:57.5317294Z 238 │ useAssetUrlState, 2026-10-24T10:51:57.5317460Z ·  ────────┬─────── 2026-10-24T10:51:57.5317696Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T10:51:57.5317905Z 239 │ useRefreshAssetUrl, 2026-10-24T10:51:57.5318047Z ╰──── 2026-10-24T10:51:57.5318196Z  help: Consider removing this import. 2026-10-24T10:51:57.5318309Z 2026-10-24T10:51:57.5318510Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5318842Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7] 2026-10-24T10:51:57.5319059Z 2140 │ setExpandedFile(null); 2026-10-24T10:51:57.5319309Z 2141 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T10:51:57.5319758Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T10:51:57.5320283Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T10:51:57.5320740Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T10:51:57.5321089Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T10:51:57.5321393Z 2142 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T10:51:57.5321598Z ╰──── 2026-10-24T10:51:57.5321951Z  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-24T10:51:57.5322547Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5322850Z 2026-10-24T10:51:57.5323051Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5323384Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7] 2026-10-24T10:51:57.5323627Z 2608 │ reportHeaderMaterialVisibility(false); 2026-10-24T10:51:57.5323859Z 2609 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T10:51:57.5324071Z ·  ──────┬────── 2026-10-24T10:51:57.5324318Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T10:51:57.5324523Z 2610 │ 2026-10-24T10:51:57.5324633Z ╰──── 2026-10-24T10:51:57.5324986Z  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-24T10:51:57.5325581Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5325880Z 2026-10-24T10:51:57.5326080Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5326409Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7] 2026-10-24T10:51:57.5326614Z 2624 │ } 2026-10-24T10:51:57.5326812Z 2625 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T10:51:57.5327032Z ·  ──────┬───── 2026-10-24T10:51:57.5327307Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T10:51:57.5327509Z 2626 │ 2026-10-24T10:51:57.5327622Z ╰──── 2026-10-24T10:51:57.5327968Z  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-24T10:51:57.5328555Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5328851Z 2026-10-24T10:51:57.5329048Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5329377Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7] 2026-10-24T10:51:57.5329575Z 2781 │ } 2026-10-24T10:51:57.5329879Z 2782 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T10:51:57.5330297Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T10:51:57.5330732Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T10:51:57.5331157Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T10:51:57.5331504Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T10:51:57.5331709Z 2783 │ 2026-10-24T10:51:57.5331824Z ╰──── 2026-10-24T10:51:57.5332174Z  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-24T10:51:57.5332758Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5333050Z 2026-10-24T10:51:57.5333230Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:51:57.5333540Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9] 2026-10-24T10:51:57.5333739Z 612 │ }; 2026-10-24T10:51:57.5333927Z 613 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T10:51:57.5334249Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T10:51:57.5334668Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T10:51:57.5335079Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T10:51:57.5335425Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T10:51:57.5335640Z 614 │ ); 2026-10-24T10:51:57.5335762Z ╰──── 2026-10-24T10:51:57.5336125Z  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-24T10:51:57.5336723Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5337013Z 2026-10-24T10:51:57.5337236Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T10:51:57.5337599Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T10:51:57.5337812Z 2 │ AuthFilesystemReadScope, 2026-10-24T10:51:57.5337981Z 3 │ type AuthSessionState, 2026-10-24T10:51:57.5338155Z ·  ────────┬─────── 2026-10-24T10:51:57.5338400Z · ╰── 'AuthSessionState' is imported here 2026-10-24T10:51:57.5338617Z 4 │ type FilesystemBrowseEntry, 2026-10-24T10:51:57.5338759Z ╰──── 2026-10-24T10:51:57.5338910Z  help: Consider removing this import. 2026-10-24T10:51:57.5339024Z 2026-10-24T10:51:57.5339280Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5339755Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T10:51:57.5340011Z 58 │ 2026-10-24T10:51:57.5340136Z 59 │ useEffect(() => { 2026-10-24T10:51:57.5340289Z ·  ────┬──── 2026-10-24T10:51:57.5340504Z · ╰── This is the containing effect 2026-10-24T10:51:57.5340721Z 60 │ setMountedModes((current) => { 2026-10-24T10:51:57.5340900Z ·  ───────┬─────── 2026-10-24T10:51:57.5341160Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5341409Z 61 │ if (current.has(props.mode)) { 2026-10-24T10:51:57.5341560Z ╰──── 2026-10-24T10:51:57.5342223Z  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-24T10:51:57.5343093Z  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-24T10:51:57.5343400Z 2026-10-24T10:51:57.5343591Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T10:51:57.5343903Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T10:51:57.5344152Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T10:51:57.5344398Z 187 │ let next = initial; 2026-10-24T10:51:57.5344555Z ·  ──┬─ 2026-10-24T10:51:57.5344764Z · ╰── From this accumulator 2026-10-24T10:51:57.5344976Z 188 │ let receivedSnapshot = false; 2026-10-24T10:51:57.5345153Z 189 │ for (const item of items) { 2026-10-24T10:51:57.5345316Z ·  ─┬─ 2026-10-24T10:51:57.5345501Z · ╰── For this loop 2026-10-24T10:51:57.5345707Z 190 │ if (item.kind === "synchronized") { 2026-10-24T10:51:57.5345879Z 191 │ waiting = false; 2026-10-24T10:51:57.5346057Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T10:51:57.5346290Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T10:51:57.5346508Z ·  ───┬─── 2026-10-24T10:51:57.5346741Z · ╰── From this spread 2026-10-24T10:51:57.5346931Z 194 │ } 2026-10-24T10:51:57.5347051Z ╰──── 2026-10-24T10:51:57.5347290Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T10:51:57.5347614Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T10:51:57.5347781Z 2026-10-24T10:51:57.5348041Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5348424Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T10:51:57.5348624Z 3404 │ 2026-10-24T10:51:57.5348881Z 3405 │ const layer: Layer.Layer = 2026-10-24T10:51:57.5349145Z ·  ──┬── 2026-10-24T10:51:57.5349358Z · ╰── 'layer' is declared here 2026-10-24T10:51:57.5349558Z 3406 │ Layer.effect( 2026-10-24T10:51:57.5349689Z ╰──── 2026-10-24T10:51:57.5349907Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5350058Z 2026-10-24T10:51:57.5350528Z ⚠ 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-24T10:51:57.5351104Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T10:51:57.5351357Z 1679 │ yield* harness.replaceSession; 2026-10-24T10:51:57.5351681Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5352047Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T10:51:57.5352356Z 1682 │ │ break; 2026-10-24T10:51:57.5352547Z 1683 │ │ } 2026-10-24T10:51:57.5352759Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5353015Z 1685 │ ╰─▶ } 2026-10-24T10:51:57.5353229Z 1686 │ yield* Queue.offer( 2026-10-24T10:51:57.5353375Z ╰──── 2026-10-24T10:51:57.5353432Z 2026-10-24T10:51:57.5353893Z ⚠ 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-24T10:51:57.5354456Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T10:51:57.5354707Z 1788 │ yield* harness.replaceSession; 2026-10-24T10:51:57.5355027Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T10:51:57.5355386Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T10:51:57.5355700Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5356094Z 1792 │ ╰─▶ } 2026-10-24T10:51:57.5356458Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T10:51:57.5356650Z ╰──── 2026-10-24T10:51:57.5356706Z 2026-10-24T10:51:57.5356923Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5357335Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T10:51:57.5357677Z 248 │ mountedRef.current = false; 2026-10-24T10:51:57.5357891Z 249 │ flow.setBranchQuery(""); 2026-10-24T10:51:57.5358059Z ·  ──┬─ 2026-10-24T10:51:57.5358271Z · ╰── Missing dependency `flow` 2026-10-24T10:51:57.5358463Z 250 │ }; 2026-10-24T10:51:57.5358603Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T10:51:57.5358785Z ·  ─────────┬───────── 2026-10-24T10:51:57.5359090Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T10:51:57.5359340Z 252 │ 2026-10-24T10:51:57.5359459Z ╰──── 2026-10-24T10:51:57.5359938Z  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-24T10:51:57.5360644Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5360945Z 2026-10-24T10:51:57.5361117Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5361407Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T10:51:57.5361644Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T10:51:57.5361921Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T10:51:57.5362208Z ·  ─────┬──── 2026-10-24T10:51:57.5362503Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5362750Z 822 │ return AsyncResult.failure( 2026-10-24T10:51:57.5362903Z ╰──── 2026-10-24T10:51:57.5363236Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5363787Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5364066Z 2026-10-24T10:51:57.5364233Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5364517Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T10:51:57.5364719Z 708 │ const wokeAt = resolved 2026-10-24T10:51:57.5364946Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T10:51:57.5365212Z ·  ─────┬──── 2026-10-24T10:51:57.5365493Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5365708Z 710 │ : null; 2026-10-24T10:51:57.5365838Z ╰──── 2026-10-24T10:51:57.5366165Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5366714Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5366990Z 2026-10-24T10:51:57.5367277Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5367747Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T10:51:57.5368006Z 118 │ 2026-10-24T10:51:57.5368137Z 119 │ useEffect(() => { 2026-10-24T10:51:57.5368290Z ·  ────┬──── 2026-10-24T10:51:57.5368510Z · ╰── This is the containing effect 2026-10-24T10:51:57.5368729Z 120 │ if (orientationSettled) return; 2026-10-24T10:51:57.5368945Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T10:51:57.5369148Z 122 │ if (orientation === null) { 2026-10-24T10:51:57.5369325Z 123 │ setOrientationSettled(true); 2026-10-24T10:51:57.5369518Z ·  ──────────┬────────── 2026-10-24T10:51:57.5369792Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5370024Z 124 │ return; 2026-10-24T10:51:57.5370156Z ╰──── 2026-10-24T10:51:57.5370812Z  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-24T10:51:57.5371662Z  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-24T10:51:57.5371965Z 2026-10-24T10:51:57.5372225Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5372646Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T10:51:57.5372874Z 292 │ 2026-10-24T10:51:57.5373003Z 293 │ useEffect(() => { 2026-10-24T10:51:57.5373160Z ·  ────┬──── 2026-10-24T10:51:57.5373376Z · ╰── This is the containing effect 2026-10-24T10:51:57.5373571Z 294 │ if ( 2026-10-24T10:51:57.5373711Z 295 │ scene === null || 2026-10-24T10:51:57.5373876Z 296 │ requestedScene === null || 2026-10-24T10:51:57.5374049Z 297 │ scene !== requestedScene || 2026-10-24T10:51:57.5374215Z 298 │ !hasFixture || 2026-10-24T10:51:57.5374370Z 299 │ !orientationSettled || 2026-10-24T10:51:57.5374532Z 300 │ !themeApplied || 2026-10-24T10:51:57.5374735Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T10:51:57.5375005Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T10:51:57.5375210Z 303 │ ) { 2026-10-24T10:51:57.5375352Z 304 │ setReadyScene(null); 2026-10-24T10:51:57.5375528Z ·  ──────┬────── 2026-10-24T10:51:57.5375790Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5376020Z 305 │ return; 2026-10-24T10:51:57.5376148Z ╰──── 2026-10-24T10:51:57.5376794Z  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-24T10:51:57.5377677Z  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-24T10:51:57.5377980Z 2026-10-24T10:51:57.5378310Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5378765Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T10:51:57.5379012Z 127 │ let cancelled = false; 2026-10-24T10:51:57.5379193Z 128 │ let lastOutcome: string | null = null; 2026-10-24T10:51:57.5379382Z ·  ─────┬───── 2026-10-24T10:51:57.5379611Z · ╰── 'lastOutcome' is declared here 2026-10-24T10:51:57.5379931Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T10:51:57.5380164Z ╰──── 2026-10-24T10:51:57.5380325Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5380328Z 2026-10-24T10:51:57.5380588Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5380734Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T10:51:57.5380788Z 150 │ 2026-10-24T10:51:57.5380855Z 151 │ useEffect(() => { 2026-10-24T10:51:57.5380924Z ·  ────┬──── 2026-10-24T10:51:57.5381052Z · ╰── This is the containing effect 2026-10-24T10:51:57.5381137Z 152 │ if (!controlledSelectedPath) { 2026-10-24T10:51:57.5381200Z 153 │ return; 2026-10-24T10:51:57.5381254Z 154 │ } 2026-10-24T10:51:57.5381339Z 155 │ setExpandedPaths((current) => { 2026-10-24T10:51:57.5381421Z ·  ────────┬─────── 2026-10-24T10:51:57.5381595Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5381722Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T10:51:57.5381776Z ╰──── 2026-10-24T10:51:57.5382366Z  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-24T10:51:57.5382686Z  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-24T10:51:57.5382689Z 2026-10-24T10:51:57.5382880Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T10:51:57.5383018Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T10:51:57.5383143Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T10:51:57.5383225Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T10:51:57.5383300Z ·  ─┬─ 2026-10-24T10:51:57.5383423Z · ╰── 'Arr' is imported here 2026-10-24T10:51:57.5383507Z 5 │ import * as Order from "effect/Order"; 2026-10-24T10:51:57.5383560Z ╰──── 2026-10-24T10:51:57.5383660Z  help: Consider removing this import. 2026-10-24T10:51:57.5383663Z 2026-10-24T10:51:57.5383852Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T10:51:57.5383986Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T10:51:57.5384068Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T10:51:57.5384202Z 5 │ import * as Order from "effect/Order"; 2026-10-24T10:51:57.5384307Z ·  ──┬── 2026-10-24T10:51:57.5384439Z · ╰── 'Order' is imported here 2026-10-24T10:51:57.5384494Z 6 │ 2026-10-24T10:51:57.5384547Z ╰──── 2026-10-24T10:51:57.5384643Z  help: Consider removing this import. 2026-10-24T10:51:57.5384645Z 2026-10-24T10:51:57.5385108Z ⚠ 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-24T10:51:57.5385288Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T10:51:57.5385361Z 222 │ let idlePasses = 0; 2026-10-24T10:51:57.5385513Z 223 │ ╭─▶ for (;;) { 2026-10-24T10:51:57.5385651Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T10:51:57.5385798Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T10:51:57.5385895Z 226 │ │ if (!pending) { 2026-10-24T10:51:57.5385990Z 227 │ │ idlePasses++; 2026-10-24T10:51:57.5386094Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T10:51:57.5386182Z 229 │ │ return; 2026-10-24T10:51:57.5386260Z 230 │ │ } 2026-10-24T10:51:57.5386347Z 231 │ │ continue; 2026-10-24T10:51:57.5386422Z 232 │ │ } 2026-10-24T10:51:57.5386523Z 233 │ │ idlePasses = 0; 2026-10-24T10:51:57.5386642Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T10:51:57.5386855Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T10:51:57.5386932Z 236 │ │ ); 2026-10-24T10:51:57.5387040Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T10:51:57.5387146Z 238 │ │ pending.resolve(exit); 2026-10-24T10:51:57.5387236Z 239 │ │ }); 2026-10-24T10:51:57.5387386Z 240 │ ╰─▶ } 2026-10-24T10:51:57.5387447Z 241 │ }, 2026-10-24T10:51:57.5387500Z ╰──── 2026-10-24T10:51:57.5387502Z 2026-10-24T10:51:57.5387721Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:51:57.5387864Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T10:51:57.5387991Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T10:51:57.5388098Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T10:51:57.5388209Z ·  ─────── 2026-10-24T10:51:57.5388317Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T10:51:57.5388370Z ╰──── 2026-10-24T10:51:57.5388633Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:51:57.5388635Z 2026-10-24T10:51:57.5389153Z ⚠ 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-24T10:51:57.5389329Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T10:51:57.5389389Z 168 │ }); 2026-10-24T10:51:57.5389586Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T10:51:57.5389778Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T10:51:57.5389885Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5390016Z 172 │ ╰─▶ } 2026-10-24T10:51:57.5390073Z 173 │ 2026-10-24T10:51:57.5390129Z ╰──── 2026-10-24T10:51:57.5390131Z 2026-10-24T10:51:57.5390596Z ⚠ 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-24T10:51:57.5390744Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T10:51:57.5390854Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T10:51:57.5391051Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T10:51:57.5391187Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T10:51:57.5391294Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5391423Z 181 │ ╰─▶ } 2026-10-24T10:51:57.5391485Z 182 │ 2026-10-24T10:51:57.5391540Z ╰──── 2026-10-24T10:51:57.5391543Z 2026-10-24T10:51:57.5392010Z ⚠ 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-24T10:51:57.5392350Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T10:51:57.5392553Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T10:51:57.5392802Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T10:51:57.5392927Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T10:51:57.5393124Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T10:51:57.5393215Z 310 │ │ break; 2026-10-24T10:51:57.5393295Z 311 │ │ } 2026-10-24T10:51:57.5393399Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5393528Z 313 │ ╰─▶ } 2026-10-24T10:51:57.5393583Z 314 │ 2026-10-24T10:51:57.5393635Z ╰──── 2026-10-24T10:51:57.5393638Z 2026-10-24T10:51:57.5393897Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5394070Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T10:51:57.5394123Z 638 │ 2026-10-24T10:51:57.5394191Z 639 │ useEffect(() => { 2026-10-24T10:51:57.5394334Z ·  ────┬──── 2026-10-24T10:51:57.5394501Z · ╰── This is the containing effect 2026-10-24T10:51:57.5394613Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T10:51:57.5394675Z 641 │ return; 2026-10-24T10:51:57.5394730Z 642 │ } 2026-10-24T10:51:57.5394804Z 643 │ setPendingLaunchEntry({ 2026-10-24T10:51:57.5394894Z ·  ──────────┬────────── 2026-10-24T10:51:57.5395068Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5395142Z 644 │ key: launchTargetKey, 2026-10-24T10:51:57.5395194Z ╰──── 2026-10-24T10:51:57.5395790Z  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-24T10:51:57.5396116Z  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-24T10:51:57.5396118Z 2026-10-24T10:51:57.5396374Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5396543Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T10:51:57.5396596Z 648 │ 2026-10-24T10:51:57.5396663Z 649 │ useEffect(() => { 2026-10-24T10:51:57.5396737Z ·  ────┬──── 2026-10-24T10:51:57.5396869Z · ╰── This is the containing effect 2026-10-24T10:51:57.5396985Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T10:51:57.5397048Z 651 │ return; 2026-10-24T10:51:57.5397103Z 652 │ } 2026-10-24T10:51:57.5397221Z 653 │ setInitialAttachGridEntry({ 2026-10-24T10:51:57.5397314Z ·  ────────────┬──────────── 2026-10-24T10:51:57.5397488Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5397561Z 654 │ key: launchTargetKey, 2026-10-24T10:51:57.5397616Z ╰──── 2026-10-24T10:51:57.5398246Z  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-24T10:51:57.5398598Z  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-24T10:51:57.5398601Z 2026-10-24T10:51:57.5398855Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5399024Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T10:51:57.5399078Z 743 │ 2026-10-24T10:51:57.5399144Z 744 │ useEffect(() => { 2026-10-24T10:51:57.5399217Z ·  ────┬──── 2026-10-24T10:51:57.5399346Z · ╰── This is the containing effect 2026-10-24T10:51:57.5399450Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T10:51:57.5399523Z 746 │ setLastGridSize({ 2026-10-24T10:51:57.5399610Z ·  ───────┬─────── 2026-10-24T10:51:57.5399779Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5399862Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T10:51:57.5399914Z ╰──── 2026-10-24T10:51:57.5400498Z  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-24T10:51:57.5400815Z  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-24T10:51:57.5400818Z 2026-10-24T10:51:57.5401023Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5401197Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T10:51:57.5401253Z 537 │ }); 2026-10-24T10:51:57.5401378Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T10:51:57.5401490Z ·  ───────────┬────────── 2026-10-24T10:51:57.5401733Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T10:51:57.5401894Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T10:51:57.5401948Z ╰──── 2026-10-24T10:51:57.5402244Z  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-24T10:51:57.5402554Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5402556Z 2026-10-24T10:51:57.5402756Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5402922Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T10:51:57.5403021Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T10:51:57.5403088Z 709 │ }, [terminalKey]); 2026-10-24T10:51:57.5403167Z ·  ─────┬───── 2026-10-24T10:51:57.5403310Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T10:51:57.5403367Z 710 │ 2026-10-24T10:51:57.5403469Z ╰──── 2026-10-24T10:51:57.5403789Z  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-24T10:51:57.5404097Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5404099Z 2026-10-24T10:51:57.5404298Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5404466Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T10:51:57.5404524Z 799 │ }; 2026-10-24T10:51:57.5404701Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T10:51:57.5404884Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T10:51:57.5405115Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T10:51:57.5405325Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T10:51:57.5405379Z 801 │ 2026-10-24T10:51:57.5405430Z ╰──── 2026-10-24T10:51:57.5405718Z  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-24T10:51:57.5406030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5406036Z 2026-10-24T10:51:57.5406183Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5406349Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T10:51:57.5406405Z 792 │ } 2026-10-24T10:51:57.5406513Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T10:51:57.5406629Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5406788Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5406844Z 794 │ 2026-10-24T10:51:57.5406896Z ╰──── 2026-10-24T10:51:57.5407391Z  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-24T10:51:57.5407682Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5407685Z 2026-10-24T10:51:57.5407877Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5408036Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T10:51:57.5408106Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T10:51:57.5409262Z 113 │ useEffect(() => { 2026-10-24T10:51:57.5409332Z ·  ────┬──── 2026-10-24T10:51:57.5409461Z · ╰── This is the containing effect 2026-10-24T10:51:57.5409626Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T10:51:57.5409687Z 115 │ return; 2026-10-24T10:51:57.5409747Z 116 │ } 2026-10-24T10:51:57.5409869Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T10:51:57.5409941Z ·  ────┬─── 2026-10-24T10:51:57.5410110Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5410231Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T10:51:57.5410283Z ╰──── 2026-10-24T10:51:57.5410873Z  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-24T10:51:57.5411195Z  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-24T10:51:57.5411200Z 2026-10-24T10:51:57.5411398Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T10:51:57.5411535Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T10:51:57.5411602Z 1 │ import type { 2026-10-24T10:51:57.5411666Z 2 │ EnvironmentId, 2026-10-24T10:51:57.5411740Z ·  ──────┬────── 2026-10-24T10:51:57.5411876Z · ╰── 'EnvironmentId' is imported here 2026-10-24T10:51:57.5411963Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T10:51:57.5412017Z ╰──── 2026-10-24T10:51:57.5412116Z  help: Consider removing this import. 2026-10-24T10:51:57.5412118Z 2026-10-24T10:51:57.5412305Z ⚠ react(static-components): Cannot create components during render 2026-10-24T10:51:57.5412474Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T10:51:57.5412562Z 196 │ const { onInput, onResize } = props; 2026-10-24T10:51:57.5412713Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T10:51:57.5412841Z ·  ────────────────┬─────────────── 2026-10-24T10:51:57.5413027Z · ╰── The component is created during render here 2026-10-24T10:51:57.5413154Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T10:51:57.5413208Z 199 │ 2026-10-24T10:51:57.5413273Z 200 │ useEffect(() => { 2026-10-24T10:51:57.5413362Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T10:51:57.5413500Z 202 │ terminalKey: props.terminalKey, 2026-10-24T10:51:57.5413608Z 203 │ native: hasNativeSurface, 2026-10-24T10:51:57.5413741Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T10:51:57.5413827Z 205 │ bufferLen: props.buffer.length, 2026-10-24T10:51:57.5413907Z 206 │ isRunning: props.isRunning, 2026-10-24T10:51:57.5413964Z 207 │ }); 2026-10-24T10:51:57.5414119Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T10:51:57.5414207Z 209 │ const handleNativeInput = useCallback( 2026-10-24T10:51:57.5414323Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T10:51:57.5414421Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T10:51:57.5414482Z 212 │ return; 2026-10-24T10:51:57.5414538Z 213 │ } 2026-10-24T10:51:57.5414633Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T10:51:57.5414785Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T10:51:57.5414841Z 216 │ }); 2026-10-24T10:51:57.5414928Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T10:51:57.5414984Z 218 │ }, 2026-10-24T10:51:57.5415083Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T10:51:57.5415136Z 220 │ ); 2026-10-24T10:51:57.5415227Z 221 │ const handleNativeResize = useCallback( 2026-10-24T10:51:57.5415342Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T10:51:57.5415405Z 223 │ onResize({ 2026-10-24T10:51:57.5415486Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T10:51:57.5415568Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T10:51:57.5415626Z 226 │ }); 2026-10-24T10:51:57.5415679Z 227 │ }, 2026-10-24T10:51:57.5415746Z 228 │ [onResize], 2026-10-24T10:51:57.5415804Z 229 │ ); 2026-10-24T10:51:57.5415857Z 230 │ 2026-10-24T10:51:57.5415938Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T10:51:57.5416000Z 232 │ return ( 2026-10-24T10:51:57.5416078Z 233 │ 2026-10-24T10:51:57.5416159Z 234 │ { 2026-10-24T10:51:57.5419106Z 57 │ if (pulse) { 2026-10-24T10:51:57.5419190Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T10:51:57.5419272Z ·  ──────┬────── 2026-10-24T10:51:57.5419420Z · ╰── `pulseProgress` cannot be modified 2026-10-24T10:51:57.5419494Z 59 │ withTiming(1, { 2026-10-24T10:51:57.5419544Z ╰──── 2026-10-24T10:51:57.5419808Z  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-24T10:51:57.5420113Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5420115Z 2026-10-24T10:51:57.5420334Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:51:57.5420453Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T10:51:57.5420553Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T10:51:57.5420688Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T10:51:57.5420842Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T10:51:57.5420901Z 347 │ }; 2026-10-24T10:51:57.5420953Z ╰──── 2026-10-24T10:51:57.5421217Z  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-24T10:51:57.5421220Z 2026-10-24T10:51:57.5421438Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T10:51:57.5421557Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T10:51:57.5421623Z 447 │ const favorites = 2026-10-24T10:51:57.5421731Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T10:51:57.5421867Z ·  ───┬── 2026-10-24T10:51:57.5422022Z · ╰── For this reduce 2026-10-24T10:51:57.5422101Z 449 │ const exists = current.some( 2026-10-24T10:51:57.5422272Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T10:51:57.5422331Z 451 │ ); 2026-10-24T10:51:57.5422404Z 452 │ return change.favorite 2026-10-24T10:51:57.5422465Z 453 │ ? exists 2026-10-24T10:51:57.5422528Z 454 │ ? current 2026-10-24T10:51:57.5422663Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T10:51:57.5422746Z ·  ─────┬──── 2026-10-24T10:51:57.5422867Z · ╰── From this spread 2026-10-24T10:51:57.5422938Z 456 │ : current.filter( 2026-10-24T10:51:57.5422999Z ╰──── 2026-10-24T10:51:57.5423205Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T10:51:57.5423359Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T10:51:57.5423362Z 2026-10-24T10:51:57.5423551Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T10:51:57.5423669Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T10:51:57.5423727Z 464 │ null; 2026-10-24T10:51:57.5423841Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T10:51:57.5423931Z ·  ──────────┬───────── 2026-10-24T10:51:57.5424059Z · ╰── From this accumulator 2026-10-24T10:51:57.5424162Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T10:51:57.5424231Z ·  ─┬─ 2026-10-24T10:51:57.5424336Z · ╰── For this loop 2026-10-24T10:51:57.5424473Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T10:51:57.5424543Z 468 │ hiddenModels: [], 2026-10-24T10:51:57.5424608Z 469 │ modelOrder: [], 2026-10-24T10:51:57.5424664Z 470 │ }; 2026-10-24T10:51:57.5424843Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T10:51:57.5424953Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T10:51:57.5425026Z 473 │ nextModelPreferences = { 2026-10-24T10:51:57.5425102Z 474 │ ...nextModelPreferences, 2026-10-24T10:51:57.5425199Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5425328Z · ╰── From this spread 2026-10-24T10:51:57.5425440Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T10:51:57.5425493Z ╰──── 2026-10-24T10:51:57.5425647Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T10:51:57.5425800Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T10:51:57.5425803Z 2026-10-24T10:51:57.5426058Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5426227Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T10:51:57.5426281Z 76 │ 2026-10-24T10:51:57.5426347Z 77 │ useEffect(() => { 2026-10-24T10:51:57.5426417Z ·  ────┬──── 2026-10-24T10:51:57.5426597Z · ╰── This is the containing effect 2026-10-24T10:51:57.5426750Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T10:51:57.5426819Z 79 │ setHostInput(host); 2026-10-24T10:51:57.5426893Z ·  ──────┬───── 2026-10-24T10:51:57.5427062Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5427129Z 80 │ setCodeInput(code); 2026-10-24T10:51:57.5427206Z ╰──── 2026-10-24T10:51:57.5427797Z  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-24T10:51:57.5428122Z  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-24T10:51:57.5428127Z 2026-10-24T10:51:57.5428386Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5428556Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T10:51:57.5428609Z 82 │ 2026-10-24T10:51:57.5428672Z 83 │ useEffect(() => { 2026-10-24T10:51:57.5428743Z ·  ────┬──── 2026-10-24T10:51:57.5428875Z · ╰── This is the containing effect 2026-10-24T10:51:57.5428963Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T10:51:57.5429023Z 85 │ return; 2026-10-24T10:51:57.5429078Z 86 │ } 2026-10-24T10:51:57.5429137Z 87 │ 2026-10-24T10:51:57.5429258Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T10:51:57.5429324Z 89 │ setHostInput(host); 2026-10-24T10:51:57.5429401Z ·  ──────┬───── 2026-10-24T10:51:57.5429571Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5429639Z 90 │ setCodeInput(code); 2026-10-24T10:51:57.5429689Z ╰──── 2026-10-24T10:51:57.5430273Z  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-24T10:51:57.5430599Z  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-24T10:51:57.5430604Z 2026-10-24T10:51:57.5430858Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5431025Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T10:51:57.5431076Z 92 │ 2026-10-24T10:51:57.5431142Z 93 │ useEffect(() => { 2026-10-24T10:51:57.5431214Z ·  ────┬──── 2026-10-24T10:51:57.5431342Z · ╰── This is the containing effect 2026-10-24T10:51:57.5431424Z 94 │ if (pairingConnectionError) { 2026-10-24T10:51:57.5431496Z 95 │ setIsSubmitting(false); 2026-10-24T10:51:57.5431577Z ·  ───────┬─────── 2026-10-24T10:51:57.5431800Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5431882Z 96 │ } 2026-10-24T10:51:57.5431936Z ╰──── 2026-10-24T10:51:57.5432640Z  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-24T10:51:57.5432958Z  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-24T10:51:57.5432961Z 2026-10-24T10:51:57.5433216Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T10:51:57.5433375Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T10:51:57.5433433Z 1619 │ 2026-10-24T10:51:57.5433645Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T10:51:57.5433766Z ·  ──────────────────┬────────────────── 2026-10-24T10:51:57.5433967Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T10:51:57.5434046Z 1621 │ const meta = response._meta; 2026-10-24T10:51:57.5434099Z ╰──── 2026-10-24T10:51:57.5434205Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5434208Z 2026-10-24T10:51:57.5434409Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T10:51:57.5434539Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T10:51:57.5434610Z 37 │ get isConnected() { 2026-10-24T10:51:57.5434702Z 38 │ let current: FakeElement | null = this; 2026-10-24T10:51:57.5434774Z ·  ─────── 2026-10-24T10:51:57.5434847Z 39 │ while (current?.parent) { 2026-10-24T10:51:57.5434899Z ╰──── 2026-10-24T10:51:57.5435170Z  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-24T10:51:57.5435172Z 2026-10-24T10:51:57.5435315Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5435474Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T10:51:57.5435634Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T10:51:57.5435763Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T10:51:57.5435885Z ·  ───────────┬────────── 2026-10-24T10:51:57.5436057Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5436177Z 123 │ const sessionRef = useRef(null); 2026-10-24T10:51:57.5436231Z ╰──── 2026-10-24T10:51:57.5436692Z  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-24T10:51:57.5437043Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5437081Z 2026-10-24T10:51:57.5437304Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5437505Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T10:51:57.5437560Z 125 │ 2026-10-24T10:51:57.5437669Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:51:57.5437758Z ·  ─────────┬──────── 2026-10-24T10:51:57.5437908Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5438011Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:51:57.5438062Z ╰──── 2026-10-24T10:51:57.5438527Z  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-24T10:51:57.5438816Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5438819Z 2026-10-24T10:51:57.5438964Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5439119Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T10:51:57.5439171Z 125 │ 2026-10-24T10:51:57.5439282Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:51:57.5439369Z ·  ─────────┬───────── 2026-10-24T10:51:57.5439517Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5439621Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:51:57.5439679Z ╰──── 2026-10-24T10:51:57.5440136Z  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-24T10:51:57.5440423Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5440425Z 2026-10-24T10:51:57.5440568Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5440723Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T10:51:57.5440777Z 125 │ 2026-10-24T10:51:57.5440884Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:51:57.5441052Z ·  ─────────┬───────── 2026-10-24T10:51:57.5441244Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5441347Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:51:57.5441400Z ╰──── 2026-10-24T10:51:57.5441856Z  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-24T10:51:57.5442140Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5442142Z 2026-10-24T10:51:57.5442288Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5442449Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T10:51:57.5442504Z 125 │ 2026-10-24T10:51:57.5442609Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:51:57.5442723Z ·  ──────────┬───────── 2026-10-24T10:51:57.5442889Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5442989Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:51:57.5443039Z ╰──── 2026-10-24T10:51:57.5443495Z  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-24T10:51:57.5443787Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5443793Z 2026-10-24T10:51:57.5443934Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5444089Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T10:51:57.5444200Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:51:57.5444392Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:51:57.5444568Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T10:51:57.5444694Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T10:51:57.5444853Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T10:51:57.5444974Z 131 │ │ isFinished: status.isFinished, 2026-10-24T10:51:57.5445150Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T10:51:57.5445254Z 133 │ │ error: status.error, 2026-10-24T10:51:57.5445353Z 134 │ │ url: status.url, 2026-10-24T10:51:57.5445433Z 135 │ │ }); 2026-10-24T10:51:57.5445511Z 136 │ │ }, 2026-10-24T10:51:57.5445708Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T10:51:57.5445816Z 138 │ │ selectInput: (inputs) => { 2026-10-24T10:51:57.5446019Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T10:51:57.5446198Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T10:51:57.5446362Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T10:51:57.5446500Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T10:51:57.5446601Z 143 │ │ if (order !== known) { 2026-10-24T10:51:57.5446740Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T10:51:57.5446855Z 145 │ │ transform: (current) => ({ 2026-10-24T10:51:57.5447059Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T10:51:57.5447149Z 147 │ │ }), 2026-10-24T10:51:57.5447280Z 148 │ │ }); 2026-10-24T10:51:57.5447359Z 149 │ │ } 2026-10-24T10:51:57.5447498Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T10:51:57.5447573Z 151 │ │ }, 2026-10-24T10:51:57.5447707Z 152 │ ├─▶ }); 2026-10-24T10:51:57.5447941Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5448027Z 153 │ recorderRef.current = recorder; 2026-10-24T10:51:57.5448079Z ╰──── 2026-10-24T10:51:57.5448541Z  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-24T10:51:57.5448831Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5448834Z 2026-10-24T10:51:57.5448978Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5449136Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T10:51:57.5449193Z 152 │ }); 2026-10-24T10:51:57.5449275Z 153 │ recorderRef.current = recorder; 2026-10-24T10:51:57.5449391Z ·  ─────┬─────────┬─── 2026-10-24T10:51:57.5449577Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5449695Z · ╰── This value is a ref 2026-10-24T10:51:57.5449801Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:51:57.5449856Z ╰──── 2026-10-24T10:51:57.5450311Z  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-24T10:51:57.5450597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5450600Z 2026-10-24T10:51:57.5450741Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5450946Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T10:51:57.5451062Z 153 │ recorderRef.current = recorder; 2026-10-24T10:51:57.5451256Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:51:57.5451341Z 155 │ │ recorder, 2026-10-24T10:51:57.5451472Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T10:51:57.5451589Z 157 │ │ requestPermission: async () => { 2026-10-24T10:51:57.5451756Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T10:51:57.5451945Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T10:51:57.5452023Z 160 │ │ }, 2026-10-24T10:51:57.5452170Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T10:51:57.5452311Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T10:51:57.5452446Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T10:51:57.5452557Z 164 │ │ onStateChange: (nextState) => 2026-10-24T10:51:57.5452649Z 165 │ │ setState({ 2026-10-24T10:51:57.5452751Z 166 │ │ state: nextState, 2026-10-24T10:51:57.5452891Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T10:51:57.5453018Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T10:51:57.5453099Z 169 │ │ }), 2026-10-24T10:51:57.5453234Z 170 │ ├─▶ }); 2026-10-24T10:51:57.5453437Z · ╰──── Cannot access ref value during render 2026-10-24T10:51:57.5453493Z 171 │ } 2026-10-24T10:51:57.5453546Z ╰──── 2026-10-24T10:51:57.5454006Z  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-24T10:51:57.5454294Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5454296Z 2026-10-24T10:51:57.5454442Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5454605Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T10:51:57.5454690Z 153 │ recorderRef.current = recorder; 2026-10-24T10:51:57.5454793Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:51:57.5454903Z ·  ─────┬────────┬─── 2026-10-24T10:51:57.5455083Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5455197Z · ╰── This value is a ref 2026-10-24T10:51:57.5455262Z 155 │ recorder, 2026-10-24T10:51:57.5455313Z ╰──── 2026-10-24T10:51:57.5455820Z  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-24T10:51:57.5456136Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5456138Z 2026-10-24T10:51:57.5456284Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5456439Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T10:51:57.5456524Z 184 │ return () => subscription.remove(); 2026-10-24T10:51:57.5456591Z 185 │ }, [controller]); 2026-10-24T10:51:57.5456668Z ·  ─────┬──── 2026-10-24T10:51:57.5456813Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5456865Z 186 │ 2026-10-24T10:51:57.5456919Z ╰──── 2026-10-24T10:51:57.5457407Z  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-24T10:51:57.5457695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5457697Z 2026-10-24T10:51:57.5457839Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5457993Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T10:51:57.5458078Z 184 │ return () => subscription.remove(); 2026-10-24T10:51:57.5458145Z 185 │ }, [controller]); 2026-10-24T10:51:57.5458222Z ·  ──────┬───── 2026-10-24T10:51:57.5458367Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5458424Z 186 │ 2026-10-24T10:51:57.5458477Z ╰──── 2026-10-24T10:51:57.5458932Z  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-24T10:51:57.5459215Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5459220Z 2026-10-24T10:51:57.5459361Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5459515Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T10:51:57.5459575Z 191 │ }, 2026-10-24T10:51:57.5459652Z 192 │ [controller, recorder], 2026-10-24T10:51:57.5459725Z ·  ─────┬──── 2026-10-24T10:51:57.5459867Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5459925Z 193 │ ); 2026-10-24T10:51:57.5459976Z ╰──── 2026-10-24T10:51:57.5460432Z  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-24T10:51:57.5460718Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5460720Z 2026-10-24T10:51:57.5460919Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5461104Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T10:51:57.5461194Z 174 │ const controller = session.controller; 2026-10-24T10:51:57.5461282Z 175 │ const recorder = recorderRef.current; 2026-10-24T10:51:57.5461388Z ·  ─────────┬───────── 2026-10-24T10:51:57.5461546Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5461599Z 176 │ 2026-10-24T10:51:57.5461652Z ╰──── 2026-10-24T10:51:57.5462108Z  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-24T10:51:57.5462398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5462403Z 2026-10-24T10:51:57.5462545Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5462697Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T10:51:57.5462755Z 191 │ }, 2026-10-24T10:51:57.5462828Z 192 │ [controller, recorder], 2026-10-24T10:51:57.5462919Z ·  ───────────┬────────── 2026-10-24T10:51:57.5463063Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5463120Z 193 │ ); 2026-10-24T10:51:57.5463172Z ╰──── 2026-10-24T10:51:57.5463633Z  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-24T10:51:57.5463919Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5463924Z 2026-10-24T10:51:57.5464064Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5464219Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T10:51:57.5464313Z 245 │ return () => clearInterval(intervalId); 2026-10-24T10:51:57.5464425Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T10:51:57.5464511Z ·  ─────┬──── 2026-10-24T10:51:57.5464668Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5464725Z 247 │ 2026-10-24T10:51:57.5464775Z ╰──── 2026-10-24T10:51:57.5465230Z  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-24T10:51:57.5465518Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5465520Z 2026-10-24T10:51:57.5465660Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5465814Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T10:51:57.5465948Z 245 │ return () => clearInterval(intervalId); 2026-10-24T10:51:57.5466084Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T10:51:57.5466214Z ·  ────────────────────────┬─────────────────────── 2026-10-24T10:51:57.5466377Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5466430Z 247 │ 2026-10-24T10:51:57.5466481Z ╰──── 2026-10-24T10:51:57.5466935Z  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-24T10:51:57.5467244Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5467246Z 2026-10-24T10:51:57.5467394Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5467550Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T10:51:57.5467620Z 260 │ setOwnerFocused, 2026-10-24T10:51:57.5467683Z 261 │ session, 2026-10-24T10:51:57.5467754Z ·  ───┬─── 2026-10-24T10:51:57.5467890Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5467951Z 262 │ stop, 2026-10-24T10:51:57.5468004Z ╰──── 2026-10-24T10:51:57.5468459Z  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-24T10:51:57.5468746Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5468755Z 2026-10-24T10:51:57.5468894Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5469050Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T10:51:57.5469105Z 250 │ 2026-10-24T10:51:57.5469244Z 251 │ ╭─▶ return { 2026-10-24T10:51:57.5469450Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T10:51:57.5469530Z 253 │ │ state, 2026-10-24T10:51:57.5469618Z 254 │ │ audioLevels, 2026-10-24T10:51:57.5469759Z 255 │ │ elapsedSeconds, 2026-10-24T10:51:57.5469916Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T10:51:57.5469998Z 257 │ │ ownerKey, 2026-10-24T10:51:57.5470077Z 258 │ │ label, 2026-10-24T10:51:57.5470167Z 259 │ │ focusedOwners, 2026-10-24T10:51:57.5470259Z 260 │ │ setOwnerFocused, 2026-10-24T10:51:57.5470340Z 261 │ │ session, 2026-10-24T10:51:57.5470420Z 262 │ │ stop, 2026-10-24T10:51:57.5470500Z 263 │ │ cancel, 2026-10-24T10:51:57.5470626Z 264 │ ├─▶ }; 2026-10-24T10:51:57.5470826Z · ╰──── Cannot access ref value during render 2026-10-24T10:51:57.5470888Z 265 │ } 2026-10-24T10:51:57.5470945Z ╰──── 2026-10-24T10:51:57.5471398Z  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-24T10:51:57.5471686Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5471688Z 2026-10-24T10:51:57.5471849Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5472018Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T10:51:57.5472247Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T10:51:57.5472375Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T10:51:57.5472457Z ·  ─────┬───── 2026-10-24T10:51:57.5472592Z · ╰── `audioLevels` originates here 2026-10-24T10:51:57.5472711Z 123 │ const sessionRef = useRef(null); 2026-10-24T10:51:57.5472856Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T10:51:57.5472911Z 125 │ 2026-10-24T10:51:57.5473017Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T10:51:57.5473117Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T10:51:57.5473255Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T10:51:57.5473350Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T10:51:57.5473477Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T10:51:57.5473567Z 131 │ isFinished: status.isFinished, 2026-10-24T10:51:57.5473710Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T10:51:57.5473785Z 133 │ error: status.error, 2026-10-24T10:51:57.5473856Z 134 │ url: status.url, 2026-10-24T10:51:57.5473915Z 135 │ }); 2026-10-24T10:51:57.5473975Z 136 │ }, 2026-10-24T10:51:57.5476702Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T10:51:57.5476799Z 138 │ selectInput: (inputs) => { 2026-10-24T10:51:57.5476925Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T10:51:57.5477039Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T10:51:57.5477316Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T10:51:57.5477477Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T10:51:57.5477549Z 143 │ if (order !== known) { 2026-10-24T10:51:57.5477657Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T10:51:57.5477740Z 145 │ transform: (current) => ({ 2026-10-24T10:51:57.5477913Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T10:51:57.5477976Z 147 │ }), 2026-10-24T10:51:57.5478038Z 148 │ }); 2026-10-24T10:51:57.5478096Z 149 │ } 2026-10-24T10:51:57.5478205Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T10:51:57.5478264Z 151 │ }, 2026-10-24T10:51:57.5478320Z 152 │ }); 2026-10-24T10:51:57.5478403Z 153 │ recorderRef.current = recorder; 2026-10-24T10:51:57.5478512Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T10:51:57.5478578Z 155 │ recorder, 2026-10-24T10:51:57.5478677Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T10:51:57.5478762Z 157 │ requestPermission: async () => { 2026-10-24T10:51:57.5478892Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T10:51:57.5479049Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T10:51:57.5479108Z 160 │ }, 2026-10-24T10:51:57.5479220Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T10:51:57.5479325Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T10:51:57.5479429Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T10:51:57.5479510Z 164 │ onStateChange: (nextState) => 2026-10-24T10:51:57.5479577Z 165 │ setState({ 2026-10-24T10:51:57.5479651Z 166 │ state: nextState, 2026-10-24T10:51:57.5479760Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T10:51:57.5479858Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T10:51:57.5479918Z 169 │ }), 2026-10-24T10:51:57.5479973Z 170 │ }); 2026-10-24T10:51:57.5480028Z 171 │ } 2026-10-24T10:51:57.5480082Z 172 │ 2026-10-24T10:51:57.5480169Z 173 │ const session = sessionRef.current; 2026-10-24T10:51:57.5480257Z 174 │ const controller = session.controller; 2026-10-24T10:51:57.5480343Z 175 │ const recorder = recorderRef.current; 2026-10-24T10:51:57.5480397Z 176 │ 2026-10-24T10:51:57.5480460Z 177 │ useEffect(() => { 2026-10-24T10:51:57.5480612Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T10:51:57.5480760Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T10:51:57.5480901Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T10:51:57.5481005Z 181 │ // calls and route interruptions during capture. 2026-10-24T10:51:57.5481141Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T10:51:57.5481196Z 183 │ }); 2026-10-24T10:51:57.5481281Z 184 │ return () => subscription.remove(); 2026-10-24T10:51:57.5481345Z 185 │ }, [controller]); 2026-10-24T10:51:57.5481400Z 186 │ 2026-10-24T10:51:57.5481462Z 187 │ useEffect( 2026-10-24T10:51:57.5481528Z 188 │ () => () => { 2026-10-24T10:51:57.5481599Z 189 │ controller.dispose(); 2026-10-24T10:51:57.5481669Z 190 │ recorder.release(); 2026-10-24T10:51:57.5481724Z 191 │ }, 2026-10-24T10:51:57.5481793Z 192 │ [controller, recorder], 2026-10-24T10:51:57.5481900Z 193 │ ); 2026-10-24T10:51:57.5481986Z 194 │ 2026-10-24T10:51:57.5482051Z 195 │ useEffect(() => { 2026-10-24T10:51:57.5482143Z 196 │ if (state.phase !== "recording") return; 2026-10-24T10:51:57.5482195Z 197 │ 2026-10-24T10:51:57.5482343Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T10:51:57.5482449Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T10:51:57.5482530Z 200 │ void activation.catch(() => {}); 2026-10-24T10:51:57.5482595Z 201 │ return () => { 2026-10-24T10:51:57.5482748Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T10:51:57.5482888Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T10:51:57.5482942Z 204 │ }; 2026-10-24T10:51:57.5483024Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T10:51:57.5483084Z 206 │ 2026-10-24T10:51:57.5483152Z 207 │ useEffect(() => { 2026-10-24T10:51:57.5483286Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T10:51:57.5483342Z 209 │ 2026-10-24T10:51:57.5483466Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T10:51:57.5483620Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T10:51:57.5483722Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T10:51:57.5483804Z ·  ─────┬───── 2026-10-24T10:51:57.5483946Z · ╰── `audioLevels` cannot be modified 2026-10-24T10:51:57.5484001Z 213 │ } 2026-10-24T10:51:57.5484053Z ╰──── 2026-10-24T10:51:57.5484331Z  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-24T10:51:57.5484643Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5484646Z 2026-10-24T10:51:57.5484851Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:51:57.5485010Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T10:51:57.5485062Z 206 │ 2026-10-24T10:51:57.5485134Z 207 │ useEffect(() => { 2026-10-24T10:51:57.5485214Z ·  ───┬─── 2026-10-24T10:51:57.5485433Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T10:51:57.5485575Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T10:51:57.5485633Z 209 │ 2026-10-24T10:51:57.5485756Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T10:51:57.5485909Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T10:51:57.5486011Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T10:51:57.5486088Z ·  ─────┬───── 2026-10-24T10:51:57.5486223Z · ╰── This modifies `audioLevels` 2026-10-24T10:51:57.5486279Z 213 │ } 2026-10-24T10:51:57.5486330Z ╰──── 2026-10-24T10:51:57.5486668Z  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-24T10:51:57.5487025Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5487057Z 2026-10-24T10:51:57.5487369Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5487526Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T10:51:57.5487581Z 14 │ 2026-10-24T10:51:57.5487654Z 15 │ const legacyCredentials = { 2026-10-24T10:51:57.5487738Z ·  ────────┬──────── 2026-10-24T10:51:57.5487883Z · ╰── 'legacyCredentials' is declared here 2026-10-24T10:51:57.5487952Z 16 │ version: 1 as const, 2026-10-24T10:51:57.5488006Z ╰──── 2026-10-24T10:51:57.5488118Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5488123Z 2026-10-24T10:51:57.5488278Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5488445Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T10:51:57.5488550Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T10:51:57.5488635Z 66 │ const progress = useSharedValue(0); 2026-10-24T10:51:57.5488709Z ·  ────┬─── 2026-10-24T10:51:57.5488842Z · ╰── `progress` originates here 2026-10-24T10:51:57.5488909Z 67 │ useEffect(() => { 2026-10-24T10:51:57.5489037Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T10:51:57.5489107Z ·  ────┬─── 2026-10-24T10:51:57.5489247Z · ╰── `progress` cannot be modified 2026-10-24T10:51:57.5489323Z 69 │ }, [expanded, progress]); 2026-10-24T10:51:57.5489376Z ╰──── 2026-10-24T10:51:57.5489636Z  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-24T10:51:57.5489941Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5489944Z 2026-10-24T10:51:57.5490103Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5490270Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T10:51:57.5490326Z 90 │ }) { 2026-10-24T10:51:57.5490438Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T10:51:57.5490519Z ·  ────┬─── 2026-10-24T10:51:57.5490651Z · ╰── `rotation` originates here 2026-10-24T10:51:57.5490721Z 92 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5490862Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T10:51:57.5490936Z ·  ────┬─── 2026-10-24T10:51:57.5491065Z · ╰── `rotation` cannot be modified 2026-10-24T10:51:57.5491142Z 94 │ }, [props.hidden, rotation]); 2026-10-24T10:51:57.5491193Z ╰──── 2026-10-24T10:51:57.5491453Z  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-24T10:51:57.5491805Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5491834Z 2026-10-24T10:51:57.5491989Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5492158Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T10:51:57.5492254Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T10:51:57.5492389Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T10:51:57.5492477Z ·  ────────┬──────── 2026-10-24T10:51:57.5492627Z · ╰── `loadingVisibility` originates here 2026-10-24T10:51:57.5492699Z 268 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5492857Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T10:51:57.5492941Z ·  ────────┬──────── 2026-10-24T10:51:57.5493094Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T10:51:57.5493191Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T10:51:57.5493245Z ╰──── 2026-10-24T10:51:57.5493508Z  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-24T10:51:57.5493808Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5493810Z 2026-10-24T10:51:57.5493963Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5494131Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T10:51:57.5494187Z 325 │ }) { 2026-10-24T10:51:57.5494352Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T10:51:57.5494441Z ·  ─────────┬───────── 2026-10-24T10:51:57.5494595Z · ╰── `recordingVisibility` originates here 2026-10-24T10:51:57.5494665Z 327 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5494855Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T10:51:57.5494940Z ·  ─────────┬───────── 2026-10-24T10:51:57.5495093Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T10:51:57.5495186Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T10:51:57.5495238Z ╰──── 2026-10-24T10:51:57.5495502Z  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-24T10:51:57.5495805Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5495807Z 2026-10-24T10:51:57.5495951Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5496116Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T10:51:57.5496199Z 26 │ const latestInput = useRef(input); 2026-10-24T10:51:57.5496276Z 27 │ latestInput.current = input; 2026-10-24T10:51:57.5496388Z ·  ─────┬─────────┬─── 2026-10-24T10:51:57.5496570Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5496737Z · ╰── This value is a ref 2026-10-24T10:51:57.5496846Z 28 │ const mounted = useRef(true); 2026-10-24T10:51:57.5496898Z ╰──── 2026-10-24T10:51:57.5497400Z  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-24T10:51:57.5497689Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5497692Z 2026-10-24T10:51:57.5498159Z ⚠ 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-24T10:51:57.5498284Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T10:51:57.5498360Z 138 │ Effect.gen(function* () { 2026-10-24T10:51:57.5498552Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T10:51:57.5498678Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T10:51:57.5498995Z 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-24T10:51:57.5499181Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T10:51:57.5499312Z 143 │ ╰─▶ } 2026-10-24T10:51:57.5499406Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T10:51:57.5499460Z ╰──── 2026-10-24T10:51:57.5499463Z 2026-10-24T10:51:57.5499683Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:51:57.5499812Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T10:51:57.5499884Z 113 │ const declared = { 2026-10-24T10:51:57.5499974Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T10:51:57.5500087Z ·  ──────────────────────────────── 2026-10-24T10:51:57.5500194Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T10:51:57.5500247Z ╰──── 2026-10-24T10:51:57.5500509Z  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-24T10:51:57.5500515Z 2026-10-24T10:51:57.5500772Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:51:57.5500926Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T10:51:57.5501016Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T10:51:57.5501119Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T10:51:57.5501240Z ·  ──────────────────────────────────────── 2026-10-24T10:51:57.5501340Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T10:51:57.5501394Z ╰──── 2026-10-24T10:51:57.5501658Z  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-24T10:51:57.5501660Z 2026-10-24T10:51:57.5501879Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:51:57.5502008Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T10:51:57.5502110Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T10:51:57.5502209Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T10:51:57.5502323Z ·  ──────────────────────────────────── 2026-10-24T10:51:57.5502385Z 117 │ }; 2026-10-24T10:51:57.5502439Z ╰──── 2026-10-24T10:51:57.5502700Z  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-24T10:51:57.5502703Z 2026-10-24T10:51:57.5502900Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5503069Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T10:51:57.5503170Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T10:51:57.5503267Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T10:51:57.5503371Z ·  ──────┬───── 2026-10-24T10:51:57.5503541Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T10:51:57.5503645Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T10:51:57.5503697Z ╰──── 2026-10-24T10:51:57.5503987Z  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-24T10:51:57.5504299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5504304Z 2026-10-24T10:51:57.5504767Z ⚠ 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-24T10:51:57.5504923Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T10:51:57.5505036Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T10:51:57.5505247Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T10:51:57.5505382Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T10:51:57.5505489Z 137 │ │ if (predicate(lastState)) { 2026-10-24T10:51:57.5505632Z 138 │ │ return lastState; 2026-10-24T10:51:57.5505751Z 139 │ │ } 2026-10-24T10:51:57.5505853Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5505980Z 141 │ ╰─▶ } 2026-10-24T10:51:57.5506055Z 142 │ return yield* Effect.die( 2026-10-24T10:51:57.5506109Z ╰──── 2026-10-24T10:51:57.5506111Z 2026-10-24T10:51:57.5506358Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T10:51:57.5506473Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T10:51:57.5506527Z 55 │ 2026-10-24T10:51:57.5506628Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T10:51:57.5506736Z ·  ────────────────┬──────────────── 2026-10-24T10:51:57.5506932Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T10:51:57.5507024Z 57 │ selection: TerminalContextSelection, 2026-10-24T10:51:57.5507076Z ╰──── 2026-10-24T10:51:57.5507187Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5507189Z 2026-10-24T10:51:57.5507442Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T10:51:57.5507569Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T10:51:57.5507758Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T10:51:57.5507852Z 35 │ instanceId === configured ? true : false, 2026-10-24T10:51:57.5507968Z ·  ──────────────────────────────────────── 2026-10-24T10:51:57.5508030Z 36 │ ); 2026-10-24T10:51:57.5508084Z ╰──── 2026-10-24T10:51:57.5508179Z  help: Remove this ternary operator 2026-10-24T10:51:57.5508181Z 2026-10-24T10:51:57.5508359Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T10:51:57.5508480Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T10:51:57.5508604Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T10:51:57.5508693Z 194 │ const codes = new Array(count); 2026-10-24T10:51:57.5508800Z ·  ──────────────────────── 2026-10-24T10:51:57.5508905Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T10:51:57.5508958Z ╰──── 2026-10-24T10:51:57.5509377Z  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-24T10:51:57.5509384Z 2026-10-24T10:51:57.5509751Z ⚠ 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-24T10:51:57.5509871Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T10:51:57.5509931Z 145 │ name, 2026-10-24T10:51:57.5510070Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T10:51:57.5510171Z ·  ────────────────────────── 2026-10-24T10:51:57.5510292Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T10:51:57.5510343Z ╰──── 2026-10-24T10:51:57.5510345Z 2026-10-24T10:51:57.5510579Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5510712Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T10:51:57.5510780Z 457 │ ): Array { 2026-10-24T10:51:57.5510885Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T10:51:57.5510986Z ·  ┬ 2026-10-24T10:51:57.5511130Z · ╰── '_' is declared here 2026-10-24T10:51:57.5511204Z 459 │ for (const b of data) { 2026-10-24T10:51:57.5511257Z ╰──── 2026-10-24T10:51:57.5511360Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5511362Z 2026-10-24T10:51:57.5511824Z ⚠ 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-24T10:51:57.5511978Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T10:51:57.5512218Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T10:51:57.5512363Z 133 │ ╭─▶ for ( 2026-10-24T10:51:57.5512467Z 134 │ │ let attempt = 0; 2026-10-24T10:51:57.5512633Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T10:51:57.5512733Z 136 │ │ attempt += 1 2026-10-24T10:51:57.5512814Z 137 │ │ ) { 2026-10-24T10:51:57.5512932Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5513069Z 139 │ ╰─▶ } 2026-10-24T10:51:57.5513194Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T10:51:57.5513247Z ╰──── 2026-10-24T10:51:57.5513249Z 2026-10-24T10:51:57.5513463Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:51:57.5513595Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T10:51:57.5513676Z 89 │ let cursor = prompt.length; 2026-10-24T10:51:57.5513779Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T10:51:57.5513884Z ·  ─────── 2026-10-24T10:51:57.5513964Z 91 │ let { start, end } = occurrence; 2026-10-24T10:51:57.5514017Z ╰──── 2026-10-24T10:51:57.5514282Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:51:57.5514288Z 2026-10-24T10:51:57.5514553Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5514661Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T10:51:57.5514715Z 35 │ 2026-10-24T10:51:57.5514845Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T10:51:57.5514921Z ·  ─────┬──── 2026-10-24T10:51:57.5515055Z · ╰── 'claudeCaps' is declared here 2026-10-24T10:51:57.5515127Z 37 │ optionDescriptors: [ 2026-10-24T10:51:57.5515180Z ╰──── 2026-10-24T10:51:57.5515357Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5515400Z 2026-10-24T10:51:57.5515750Z ⚠ 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-24T10:51:57.5515884Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T10:51:57.5516021Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T10:51:57.5516170Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T10:51:57.5516288Z ·  ─────────────────── 2026-10-24T10:51:57.5516352Z 1787 │ cwd, 2026-10-24T10:51:57.5516405Z ╰──── 2026-10-24T10:51:57.5516407Z 2026-10-24T10:51:57.5516651Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T10:51:57.5516777Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-24T10:51:57.5516876Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T10:51:57.5517012Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T10:51:57.5517098Z ·  ─────────────── 2026-10-24T10:51:57.5517154Z 510 │ ) 2026-10-24T10:51:57.5517239Z ╰──── 2026-10-24T10:51:57.5517394Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T10:51:57.5517396Z 2026-10-24T10:51:57.5517600Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T10:51:57.5517723Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T10:51:57.5517829Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T10:51:57.5517992Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T10:51:57.5518122Z 159 │ │ constructor(data: Record) { 2026-10-24T10:51:57.5518239Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T10:51:57.5518312Z 161 │ │ } 2026-10-24T10:51:57.5518439Z 162 │ ╰─▶ }, 2026-10-24T10:51:57.5518504Z 163 │ clipboard: { 2026-10-24T10:51:57.5518555Z ╰──── 2026-10-24T10:51:57.5518723Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T10:51:57.5518725Z 2026-10-24T10:51:57.5519028Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5519244Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T10:51:57.5519298Z 104 │ 2026-10-24T10:51:57.5519363Z 105 │ useEffect(() => { 2026-10-24T10:51:57.5519434Z ·  ────┬──── 2026-10-24T10:51:57.5519564Z · ╰── This is the containing effect 2026-10-24T10:51:57.5519643Z 106 │ clearReviewCommentTarget(); 2026-10-24T10:51:57.5519741Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T10:51:57.5519846Z ·  ────────────────┬─────────────── 2026-10-24T10:51:57.5520024Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5520098Z 108 │ }, [selectedSection?.id]); 2026-10-24T10:51:57.5520149Z ╰──── 2026-10-24T10:51:57.5520749Z  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-24T10:51:57.5521077Z  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-24T10:51:57.5521080Z 2026-10-24T10:51:57.5521336Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5521520Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T10:51:57.5521572Z 109 │ 2026-10-24T10:51:57.5521643Z 110 │ useEffect(() => { 2026-10-24T10:51:57.5521718Z ·  ────┬──── 2026-10-24T10:51:57.5521847Z · ╰── This is the containing effect 2026-10-24T10:51:57.5521934Z 111 │ if (activeCommentTarget === null) { 2026-10-24T10:51:57.5522037Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T10:51:57.5522146Z ·  ────────────────┬─────────────── 2026-10-24T10:51:57.5522324Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5522378Z 113 │ } 2026-10-24T10:51:57.5522430Z ╰──── 2026-10-24T10:51:57.5523025Z  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-24T10:51:57.5523350Z  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-24T10:51:57.5523352Z 2026-10-24T10:51:57.5523552Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5523733Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T10:51:57.5523831Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T10:51:57.5523906Z 108 │ }, [selectedSection?.id]); 2026-10-24T10:51:57.5523993Z ·  ─────────┬───────── 2026-10-24T10:51:57.5524153Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T10:51:57.5524260Z 109 │ 2026-10-24T10:51:57.5524343Z ╰──── 2026-10-24T10:51:57.5524635Z  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-24T10:51:57.5524943Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5524948Z 2026-10-24T10:51:57.5525201Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5525365Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T10:51:57.5525419Z 100 │ 2026-10-24T10:51:57.5525486Z 101 │ useEffect(() => { 2026-10-24T10:51:57.5525560Z ·  ────┬──── 2026-10-24T10:51:57.5525692Z · ╰── This is the containing effect 2026-10-24T10:51:57.5525794Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T10:51:57.5525880Z 103 │ setHighlightedLinesById({}); 2026-10-24T10:51:57.5525970Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5526143Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5526205Z 104 │ return; 2026-10-24T10:51:57.5526257Z ╰──── 2026-10-24T10:51:57.5526849Z  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-24T10:51:57.5527194Z  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-24T10:51:57.5527197Z 2026-10-24T10:51:57.5527389Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5527540Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T10:51:57.5527648Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T10:51:57.5527740Z 223 │ 2026-10-24T10:51:57.5527847Z ·  ─────────────── 2026-10-24T10:51:57.5527940Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T10:51:57.5527995Z ╰──── 2026-10-24T10:51:57.5528148Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T10:51:57.5528154Z 2026-10-24T10:51:57.5528346Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5528494Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T10:51:57.5528571Z 226 │ (null); 2026-10-24T10:51:57.5531927Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T10:51:57.5532059Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T10:51:57.5532151Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T10:51:57.5532230Z 498 │ setIsPullRefreshing(true); 2026-10-24T10:51:57.5532312Z 499 │ await refreshSelectedSection(); 2026-10-24T10:51:57.5532393Z 500 │ setIsPullRefreshing(false); 2026-10-24T10:51:57.5532447Z 501 │ }; 2026-10-24T10:51:57.5532592Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T10:51:57.5532733Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T10:51:57.5532846Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T10:51:57.5532932Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T10:51:57.5533023Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T10:51:57.5533091Z 507 │ files: reviewFiles, 2026-10-24T10:51:57.5533191Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T10:51:57.5533320Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T10:51:57.5533384Z 510 │ : undefined, 2026-10-24T10:51:57.5533479Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T10:51:57.5533602Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T10:51:57.5533664Z 513 │ : undefined, 2026-10-24T10:51:57.5533720Z 514 │ }); 2026-10-24T10:51:57.5533910Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T10:51:57.5534097Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T10:51:57.5534195Z 517 │ environmentId, 2026-10-24T10:51:57.5534258Z 518 │ threadId, 2026-10-24T10:51:57.5534324Z 519 │ selectedSection, 2026-10-24T10:51:57.5534395Z 520 │ nativeReviewDiffData, 2026-10-24T10:51:57.5534448Z 521 │ }); 2026-10-24T10:51:57.5534554Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T10:51:57.5534640Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T10:51:57.5534727Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T10:51:57.5534804Z 525 │ diff: selectedSection?.diff, 2026-10-24T10:51:57.5534881Z 526 │ data: nativeReviewDiffData, 2026-10-24T10:51:57.5534949Z 527 │ collapsedFileIds, 2026-10-24T10:51:57.5535010Z 528 │ viewedFileIds, 2026-10-24T10:51:57.5535122Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T10:51:57.5535223Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T10:51:57.5535280Z 531 │ }); 2026-10-24T10:51:57.5535351Z 532 │ const showcaseReviewKey = 2026-10-24T10:51:57.5535483Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T10:51:57.5535691Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T10:51:57.5535754Z 535 │ : null; 2026-10-24T10:51:57.5535920Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T10:51:57.5535999Z 537 │ nativeBridge.onDebug(event); 2026-10-24T10:51:57.5536058Z 538 │ if ( 2026-10-24T10:51:57.5536138Z 539 │ showcaseReviewKey === null || 2026-10-24T10:51:57.5536258Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T10:51:57.5536374Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T10:51:57.5536433Z 542 │ ) { 2026-10-24T10:51:57.5536494Z 543 │ return; 2026-10-24T10:51:57.5536547Z 544 │ } 2026-10-24T10:51:57.5536660Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T10:51:57.5536822Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T10:51:57.5536877Z 547 │ }; 2026-10-24T10:51:57.5536928Z 548 │ 2026-10-24T10:51:57.5537047Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T10:51:57.5537127Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T10:51:57.5537228Z 551 │ commentSelection.clearSelection(); 2026-10-24T10:51:57.5537373Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T10:51:57.5537453Z 553 │ toggleExpandedFile(fileId); 2026-10-24T10:51:57.5537509Z 554 │ } 2026-10-24T10:51:57.5537625Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T10:51:57.5537699Z 556 │ if (!nativeView) return; 2026-10-24T10:51:57.5537793Z 557 │ const result = await settlePromise(() => 2026-10-24T10:51:57.5537968Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T10:51:57.5538023Z 559 │ ); 2026-10-24T10:51:57.5538111Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T10:51:57.5538292Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T10:51:57.5538347Z 562 │ } 2026-10-24T10:51:57.5538400Z 563 │ }; 2026-10-24T10:51:57.5538484Z 564 │ const handleVisibleFileChange = ( 2026-10-24T10:51:57.5538616Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T10:51:57.5538724Z 566 │ ) => { 2026-10-24T10:51:57.5538860Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T10:51:57.5539029Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T10:51:57.5539083Z 569 │ }; 2026-10-24T10:51:57.5539162Z 570 │ const renderInspector = () => ( 2026-10-24T10:51:57.5539230Z 571 │ void handleSelectFile(fileId)} 2026-10-24T10:51:57.5539746Z 577 │ /> 2026-10-24T10:51:57.5539799Z 578 │ ); 2026-10-24T10:51:57.5539849Z 579 │ 2026-10-24T10:51:57.5540041Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T10:51:57.5540131Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T10:51:57.5540196Z 582 │ if (fileId) { 2026-10-24T10:51:57.5540276Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T10:51:57.5540355Z 584 │ toggleExpandedFile(fileId); 2026-10-24T10:51:57.5540409Z 585 │ } 2026-10-24T10:51:57.5540461Z 586 │ }; 2026-10-24T10:51:57.5540513Z 587 │ 2026-10-24T10:51:57.5540603Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T10:51:57.5540722Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T10:51:57.5540777Z 590 │ ) => { 2026-10-24T10:51:57.5540865Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T10:51:57.5540927Z 592 │ if (fileId) { 2026-10-24T10:51:57.5541009Z 593 │ toggleViewedFile(fileId); 2026-10-24T10:51:57.5541063Z 594 │ } 2026-10-24T10:51:57.5541117Z 595 │ }; 2026-10-24T10:51:57.5541169Z 596 │ 2026-10-24T10:51:57.5541241Z 597 │ const parsedDiffNotice = 2026-10-24T10:51:57.5541401Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T10:51:57.5541522Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T10:51:57.5541678Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T10:51:57.5541799Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T10:51:57.5541957Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T10:51:57.5542067Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T10:51:57.5542230Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T10:51:57.5542329Z 605 │ hasCachedSelectedDiff, 2026-10-24T10:51:57.5542394Z 606 │ hasAnyCachedDiff, 2026-10-24T10:51:57.5542447Z 607 │ }); 2026-10-24T10:51:57.5542534Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T10:51:57.5542621Z 609 │ void retryEnvironment(environmentId); 2026-10-24T10:51:57.5542673Z 610 │ }; 2026-10-24T10:51:57.5542758Z 611 │ const handleReturnToThread = () => { 2026-10-24T10:51:57.5542837Z 612 │ if (navigation.canGoBack()) { 2026-10-24T10:51:57.5542904Z 613 │ navigation.goBack(); 2026-10-24T10:51:57.5542964Z 614 │ return; 2026-10-24T10:51:57.5543017Z 615 │ } 2026-10-24T10:51:57.5543099Z 616 │ navigation.navigate("Thread", { 2026-10-24T10:51:57.5543186Z 617 │ environmentId: String(environmentId), 2026-10-24T10:51:57.5543262Z 618 │ threadId: String(threadId), 2026-10-24T10:51:57.5543323Z 619 │ }); 2026-10-24T10:51:57.5543379Z 620 │ }; 2026-10-24T10:51:57.5543456Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T10:51:57.5543527Z 622 │ selectedSection?.title, 2026-10-24T10:51:57.5543606Z 623 │ headerDiffSummary.additions, 2026-10-24T10:51:57.5543683Z 624 │ headerDiffSummary.deletions, 2026-10-24T10:51:57.5543735Z 625 │ ] 2026-10-24T10:51:57.5543841Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T10:51:57.5543905Z 627 │ .join(" · "); 2026-10-24T10:51:57.5543958Z 628 │ 2026-10-24T10:51:57.5544034Z 629 │ const showChangedFilesPane = 2026-10-24T10:51:57.5544108Z 630 │ !showConnectionNotice && 2026-10-24T10:51:57.5544182Z 631 │ selectedSection !== null && 2026-10-24T10:51:57.5544261Z 632 │ parsedDiff.kind === "files" && 2026-10-24T10:51:57.5544340Z 633 │ NativeReviewDiffView !== null; 2026-10-24T10:51:57.5544516Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T10:51:57.5544690Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T10:51:57.5544742Z 636 │ 2026-10-24T10:51:57.5544818Z 637 │ const listHeader = (() => { 2026-10-24T10:51:57.5544904Z 638 │ const children: ReactElement[] = []; 2026-10-24T10:51:57.5544956Z 639 │ 2026-10-24T10:51:57.5545016Z 640 │ if (error) { 2026-10-24T10:51:57.5545083Z 641 │ children.push( 2026-10-24T10:51:57.5545143Z 642 │ 2026-10-24T10:51:57.5545798Z 649 │ Review unavailable 2026-10-24T10:51:57.5545956Z 650 │ {error} 2026-10-24T10:51:57.5546017Z 651 │ , 2026-10-24T10:51:57.5546072Z 652 │ ); 2026-10-24T10:51:57.5546124Z 653 │ } 2026-10-24T10:51:57.5546176Z 654 │ 2026-10-24T10:51:57.5546247Z 655 │ if (parsedDiffNotice) { 2026-10-24T10:51:57.5546406Z 656 │ children.push(); 2026-10-24T10:51:57.5546460Z 657 │ } 2026-10-24T10:51:57.5546513Z 658 │ 2026-10-24T10:51:57.5546589Z 659 │ if (children.length === 0) { 2026-10-24T10:51:57.5546711Z 660 │ return null; 2026-10-24T10:51:57.5546803Z 661 │ } 2026-10-24T10:51:57.5546857Z 662 │ 2026-10-24T10:51:57.5546925Z 663 │ return <>{children}; 2026-10-24T10:51:57.5546982Z 664 │ })(); 2026-10-24T10:51:57.5547053Z 665 │ const headerSubtitle = [ 2026-10-24T10:51:57.5547132Z 666 │ headerDiffSummary.additions, 2026-10-24T10:51:57.5547218Z 667 │ headerDiffSummary.deletions, 2026-10-24T10:51:57.5547323Z 668 │ pendingReviewCommentCount > 0 2026-10-24T10:51:57.5547496Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T10:51:57.5547557Z 670 │ : null, 2026-10-24T10:51:57.5547610Z 671 │ ] 2026-10-24T10:51:57.5547676Z 672 │ .filter(Boolean) 2026-10-24T10:51:57.5547740Z 673 │ .join(" · "); 2026-10-24T10:51:57.5547875Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T10:51:57.5547935Z 675 │ 2026-10-24T10:51:57.5547997Z 676 │ return ( 2026-10-24T10:51:57.5548054Z 677 │ <> 2026-10-24T10:51:57.5548117Z 678 │ 2026-10-24T10:51:57.5549441Z 694 │ 2026-10-24T10:51:57.5549508Z 695 │ 2026-10-24T10:51:57.5549629Z 696 │ 2026-10-24T10:51:57.5549708Z 697 │ {showConnectionNotice ? ( 2026-10-24T10:51:57.5549849Z 698 │ 2026-10-24T10:51:57.5549939Z 699 │ 2026-10-24T10:51:57.5550961Z 711 │ 2026-10-24T10:51:57.5551119Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T10:51:57.5551232Z 713 │ 2026-10-24T10:51:57.5551710Z 719 │ 2026-10-24T10:51:57.5552153Z 723 │ {listHeader} 2026-10-24T10:51:57.5552279Z 724 │ 2026-10-24T10:51:57.5552366Z 725 │ => 2026-10-24T10:51:57.5555012Z ·  ──────────┬────────── 2026-10-24T10:51:57.5555170Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T10:51:57.5555358Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T10:51:57.5555411Z ╰──── 2026-10-24T10:51:57.5555518Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5555521Z 2026-10-24T10:51:57.5555826Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5555948Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T10:51:57.5556003Z 220 │ 2026-10-24T10:51:57.5556205Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T10:51:57.5556347Z ·  ──────────────┬────────────── 2026-10-24T10:51:57.5556522Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T10:51:57.5556684Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T10:51:57.5556738Z ╰──── 2026-10-24T10:51:57.5556843Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5556845Z 2026-10-24T10:51:57.5557027Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5557198Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T10:51:57.5557362Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T10:51:57.5557457Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T10:51:57.5557542Z ·  ┬ 2026-10-24T10:51:57.5557675Z · ╰── '_' is declared here 2026-10-24T10:51:57.5557776Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T10:51:57.5557828Z ╰──── 2026-10-24T10:51:57.5557928Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5557930Z 2026-10-24T10:51:57.5558113Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5558249Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T10:51:57.5558305Z 133 │ ); 2026-10-24T10:51:57.5558410Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T10:51:57.5558508Z ·  ┬ 2026-10-24T10:51:57.5558654Z · ╰── '_' is declared here 2026-10-24T10:51:57.5558724Z 135 │ Effect.succeed( 2026-10-24T10:51:57.5558774Z ╰──── 2026-10-24T10:51:57.5558873Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5558876Z 2026-10-24T10:51:57.5559057Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5559189Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T10:51:57.5559243Z 177 │ }); 2026-10-24T10:51:57.5559342Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T10:51:57.5559429Z ·  ┬ 2026-10-24T10:51:57.5559563Z · ╰── '_' is declared here 2026-10-24T10:51:57.5559665Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T10:51:57.5559719Z ╰──── 2026-10-24T10:51:57.5559816Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5559819Z 2026-10-24T10:51:57.5559999Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5560130Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T10:51:57.5560183Z 202 │ ); 2026-10-24T10:51:57.5560280Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T10:51:57.5560369Z ·  ┬ 2026-10-24T10:51:57.5560503Z · ╰── '_' is declared here 2026-10-24T10:51:57.5560581Z 204 │ options.removeWorktreeFails 2026-10-24T10:51:57.5560632Z ╰──── 2026-10-24T10:51:57.5560780Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5560812Z 2026-10-24T10:51:57.5560990Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5561121Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T10:51:57.5561176Z 207 │ ); 2026-10-24T10:51:57.5561277Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T10:51:57.5561371Z ·  ┬ 2026-10-24T10:51:57.5561507Z · ╰── '_' is declared here 2026-10-24T10:51:57.5561593Z 209 │ options.deleteLocalBranchFails 2026-10-24T10:51:57.5561644Z ╰──── 2026-10-24T10:51:57.5561743Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5561746Z 2026-10-24T10:51:57.5561928Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5562064Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T10:51:57.5562120Z 212 │ ); 2026-10-24T10:51:57.5562233Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T10:51:57.5562329Z ·  ┬ 2026-10-24T10:51:57.5562471Z · ╰── '_' is declared here 2026-10-24T10:51:57.5562556Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T10:51:57.5562608Z ╰──── 2026-10-24T10:51:57.5562704Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5562706Z 2026-10-24T10:51:57.5562884Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5563022Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T10:51:57.5563081Z 253 │ ); 2026-10-24T10:51:57.5563170Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T10:51:57.5563258Z ·  ┬ 2026-10-24T10:51:57.5563392Z · ╰── '_' is declared here 2026-10-24T10:51:57.5563461Z 255 │ Effect.succeed({ 2026-10-24T10:51:57.5563513Z ╰──── 2026-10-24T10:51:57.5563612Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5563614Z 2026-10-24T10:51:57.5563793Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T10:51:57.5563925Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T10:51:57.5563978Z 263 │ ); 2026-10-24T10:51:57.5564134Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T10:51:57.5564225Z ·  ┬ 2026-10-24T10:51:57.5564359Z · ╰── '_' is declared here 2026-10-24T10:51:57.5564503Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T10:51:57.5564557Z ╰──── 2026-10-24T10:51:57.5564656Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5564658Z 2026-10-24T10:51:57.5564824Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5564955Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T10:51:57.5565086Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T10:51:57.5565280Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T10:51:57.5565450Z ·  ─────┬──── 2026-10-24T10:51:57.5565620Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5565715Z 141 │ onSelect={(selected) => { 2026-10-24T10:51:57.5565767Z ╰──── 2026-10-24T10:51:57.5566044Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5566338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5566341Z 2026-10-24T10:51:57.5566497Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T10:51:57.5566626Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T10:51:57.5566738Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T10:51:57.5566833Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T10:51:57.5566928Z ·  ───────────────────────────── 2026-10-24T10:51:57.5567056Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T10:51:57.5567108Z ╰──── 2026-10-24T10:51:57.5567298Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T10:51:57.5567301Z 2026-10-24T10:51:57.5567500Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T10:51:57.5567593Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T10:51:57.5567671Z 21 │ EnvironmentThreadShell, 2026-10-24T10:51:57.5567741Z 22 │ ThreadRunSummary, 2026-10-24T10:51:57.5567818Z ·  ────────┬─────── 2026-10-24T10:51:57.5567957Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T10:51:57.5568027Z 23 │ ThreadRuntimeSummary, 2026-10-24T10:51:57.5568080Z ╰──── 2026-10-24T10:51:57.5568176Z  help: Consider removing this import. 2026-10-24T10:51:57.5568178Z 2026-10-24T10:51:57.5568437Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5568585Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-24T10:51:57.5568639Z 398 │ 2026-10-24T10:51:57.5568704Z 399 │ useEffect(() => { 2026-10-24T10:51:57.5568781Z ·  ────┬──── 2026-10-24T10:51:57.5568915Z · ╰── This is the containing effect 2026-10-24T10:51:57.5569005Z 400 │ setInspectorSelection((current) => { 2026-10-24T10:51:57.5569090Z ·  ──────────┬────────── 2026-10-24T10:51:57.5569261Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5569363Z 401 │ if (props.renderInspector === undefined) { 2026-10-24T10:51:57.5569415Z ╰──── 2026-10-24T10:51:57.5570013Z  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-24T10:51:57.5570385Z  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-24T10:51:57.5570415Z 2026-10-24T10:51:57.5570629Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T10:51:57.5570780Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-24T10:51:57.5570940Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T10:51:57.5571107Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-24T10:51:57.5571205Z 529 │ │ 2026-10-24T10:51:57.5571824Z 534 │ ╰─▶ ); 2026-10-24T10:51:57.5571904Z 535 │ const FilesInspector = () => 2026-10-24T10:51:57.5571957Z ╰──── 2026-10-24T10:51:57.5572173Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T10:51:57.5572176Z 2026-10-24T10:51:57.5572387Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T10:51:57.5572537Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-24T10:51:57.5572600Z 534 │ ); 2026-10-24T10:51:57.5572767Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-24T10:51:57.5572917Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T10:51:57.5573025Z 537 │ │ 2026-10-24T10:51:57.5574061Z 545 │ ╰─▶ ) : null; 2026-10-24T10:51:57.5574214Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T10:51:57.5574265Z ╰──── 2026-10-24T10:51:57.5574479Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T10:51:57.5574481Z 2026-10-24T10:51:57.5574737Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5574887Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T10:51:57.5574941Z 55 │ 2026-10-24T10:51:57.5575011Z 56 │ useEffect(() => { 2026-10-24T10:51:57.5575086Z ·  ────┬──── 2026-10-24T10:51:57.5575214Z · ╰── This is the containing effect 2026-10-24T10:51:57.5575282Z 57 │ setDecodedSize(null); 2026-10-24T10:51:57.5575359Z ·  ───────┬────── 2026-10-24T10:51:57.5575525Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5575595Z 58 │ }, [props.sourceKey]); 2026-10-24T10:51:57.5575645Z ╰──── 2026-10-24T10:51:57.5576236Z  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-24T10:51:57.5576569Z  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-24T10:51:57.5576574Z 2026-10-24T10:51:57.5576830Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5576981Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T10:51:57.5577034Z 59 │ 2026-10-24T10:51:57.5577097Z 60 │ useEffect(() => { 2026-10-24T10:51:57.5577192Z ·  ────┬──── 2026-10-24T10:51:57.5577318Z · ╰── This is the containing effect 2026-10-24T10:51:57.5577384Z 61 │ setFailedUri(null); 2026-10-24T10:51:57.5577460Z ·  ──────┬───── 2026-10-24T10:51:57.5577629Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5577698Z 62 │ }, [props.uri]); 2026-10-24T10:51:57.5577749Z ╰──── 2026-10-24T10:51:57.5578332Z  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-24T10:51:57.5578650Z  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-24T10:51:57.5578653Z 2026-10-24T10:51:57.5578870Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T10:51:57.5579067Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T10:51:57.5579216Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T10:51:57.5579393Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T10:51:57.5579481Z ·  ────────┬──────── 2026-10-24T10:51:57.5579633Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T10:51:57.5579684Z 8 │ 2026-10-24T10:51:57.5579737Z ╰──── 2026-10-24T10:51:57.5579835Z  help: Consider removing this import. 2026-10-24T10:51:57.5579837Z 2026-10-24T10:51:57.5580037Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5580185Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T10:51:57.5580257Z 57 │ setDecodedSize(null); 2026-10-24T10:51:57.5580329Z 58 │ }, [props.sourceKey]); 2026-10-24T10:51:57.5580411Z ·  ───────┬─────── 2026-10-24T10:51:57.5580562Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T10:51:57.5580615Z 59 │ 2026-10-24T10:51:57.5580668Z ╰──── 2026-10-24T10:51:57.5580957Z  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-24T10:51:57.5581266Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5581269Z 2026-10-24T10:51:57.5581470Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5581623Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T10:51:57.5581692Z 61 │ setFailedUri(null); 2026-10-24T10:51:57.5581758Z 62 │ }, [props.uri]); 2026-10-24T10:51:57.5581831Z ·  ────┬──── 2026-10-24T10:51:57.5581972Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T10:51:57.5582027Z 63 │ 2026-10-24T10:51:57.5582079Z ╰──── 2026-10-24T10:51:57.5582363Z  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-24T10:51:57.5582671Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5582674Z 2026-10-24T10:51:57.5582876Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5582994Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T10:51:57.5583067Z 28 │ getPendingThreadOrder(); 2026-10-24T10:51:57.5583148Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T10:51:57.5583271Z ·  ────┬──── ───────┬────── 2026-10-24T10:51:57.5583462Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T10:51:57.5583600Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T10:51:57.5583665Z 30 │ return pending; 2026-10-24T10:51:57.5583717Z ╰──── 2026-10-24T10:51:57.5584062Z  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-24T10:51:57.5584397Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5584400Z 2026-10-24T10:51:57.5584611Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5584756Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T10:51:57.5584862Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T10:51:57.5584996Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T10:51:57.5585091Z ·  ────────────┬──────────── 2026-10-24T10:51:57.5585268Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T10:51:57.5585330Z 774 │ } 2026-10-24T10:51:57.5585531Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T10:51:57.5585640Z ·  ────────────────┬──────────────── 2026-10-24T10:51:57.5585920Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T10:51:57.5585975Z 776 │ 2026-10-24T10:51:57.5586027Z ╰──── 2026-10-24T10:51:57.5586444Z  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-24T10:51:57.5586759Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5586764Z 2026-10-24T10:51:57.5586921Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5587062Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T10:51:57.5587247Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T10:51:57.5587381Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T10:51:57.5587475Z ·  ──────────┬───────── 2026-10-24T10:51:57.5587629Z · ╰── `animatedBorderRadius` originates here 2026-10-24T10:51:57.5587788Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T10:51:57.5587864Z 390 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5587970Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T10:51:57.5588057Z ·  ──────────┬───────── 2026-10-24T10:51:57.5588212Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T10:51:57.5588300Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T10:51:57.5588354Z ╰──── 2026-10-24T10:51:57.5588619Z  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-24T10:51:57.5588920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5588922Z 2026-10-24T10:51:57.5589209Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:51:57.5589391Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T10:51:57.5589452Z 289 │ return ( 2026-10-24T10:51:57.5589591Z 290 │ 2026-10-24T10:51:57.5589711Z ·  ───────────── 2026-10-24T10:51:57.5589779Z 291 │ {props.children} 2026-10-24T10:51:57.5589831Z ╰──── 2026-10-24T10:51:57.5590052Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:51:57.5590193Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:51:57.5590196Z 2026-10-24T10:51:57.5590436Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:51:57.5590593Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T10:51:57.5590655Z 653 │ return ( 2026-10-24T10:51:57.5590781Z 654 │ 2026-10-24T10:51:57.5590894Z ·  ───────────── 2026-10-24T10:51:57.5590963Z 655 │ {props.children} 2026-10-24T10:51:57.5591014Z ╰──── 2026-10-24T10:51:57.5591235Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:51:57.5591370Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:51:57.5591374Z 2026-10-24T10:51:57.5591612Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:51:57.5591772Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T10:51:57.5591834Z 1461 │ return ( 2026-10-24T10:51:57.5592057Z 1462 │ 2026-10-24T10:51:57.5592230Z ·  ──────────────────── 2026-10-24T10:51:57.5592333Z 1463 │ { 2026-10-24T10:51:57.5593665Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T10:51:57.5593772Z ·  ──────────────────────── 2026-10-24T10:51:57.5593840Z 182 │ version: 1, 2026-10-24T10:51:57.5593893Z ╰──── 2026-10-24T10:51:57.5593896Z 2026-10-24T10:51:57.5594346Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T10:51:57.5594567Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T10:51:57.5594631Z 472 │ onFilters, 2026-10-24T10:51:57.5594701Z 473 │ authorOptions = [], 2026-10-24T10:51:57.5594780Z ·  ── 2026-10-24T10:51:57.5594847Z 474 │ labelOptions = [], 2026-10-24T10:51:57.5594900Z ╰──── 2026-10-24T10:51:57.5595219Z  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-24T10:51:57.5595221Z 2026-10-24T10:51:57.5595499Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T10:51:57.5595669Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T10:51:57.5595740Z 473 │ authorOptions = [], 2026-10-24T10:51:57.5595807Z 474 │ labelOptions = [], 2026-10-24T10:51:57.5595885Z ·  ── 2026-10-24T10:51:57.5595948Z 475 │ optionScope, 2026-10-24T10:51:57.5596001Z ╰──── 2026-10-24T10:51:57.5596312Z  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-24T10:51:57.5596314Z 2026-10-24T10:51:57.5596519Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T10:51:57.5596624Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T10:51:57.5596691Z 296 │ } from "./device.ts"; 2026-10-24T10:51:57.5596783Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T10:51:57.5596859Z ·  ── 2026-10-24T10:51:57.5596919Z 298 │ import { 2026-10-24T10:51:57.5596996Z ╰──── 2026-10-24T10:51:57.5597122Z  help: Remove empty braces 2026-10-24T10:51:57.5597320Z 2026-10-24T10:51:57.5597762Z ⚠ 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-24T10:51:57.5598296Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T10:51:57.5598601Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T10:51:57.5598964Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T10:51:57.5599328Z ·  ─────────────────── 2026-10-24T10:51:57.5599589Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T10:51:57.5599767Z ╰──── 2026-10-24T10:51:57.5599828Z 2026-10-24T10:51:57.5600270Z ⚠ 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-24T10:51:57.5600996Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T10:51:57.5601404Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T10:51:57.5601703Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T10:51:57.5601946Z ·  ─────────────────── 2026-10-24T10:51:57.5602190Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T10:51:57.5602384Z ╰──── 2026-10-24T10:51:57.5602444Z 2026-10-24T10:51:57.5602683Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T10:51:57.5603080Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-24T10:51:57.5603310Z 264 │ ): boolean { 2026-10-24T10:51:57.5603544Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T10:51:57.5603870Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T10:51:57.5604170Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T10:51:57.5604379Z ╰──── 2026-10-24T10:51:57.5604513Z  help: Switch to `Set` 2026-10-24T10:51:57.5604610Z 2026-10-24T10:51:57.5604981Z ⚠ 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-24T10:51:57.5605433Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T10:51:57.5605719Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T10:51:57.5606060Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T10:51:57.5606339Z ·  ──────────────────────── 2026-10-24T10:51:57.5606521Z 18 │ "review:write", 2026-10-24T10:51:57.5606657Z ╰──── 2026-10-24T10:51:57.5606714Z 2026-10-24T10:51:57.5607079Z ⚠ 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-24T10:51:57.5607594Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T10:51:57.5607777Z 19 │ ]); 2026-10-24T10:51:57.5608006Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T10:51:57.5608279Z ·  ──────────────────────── 2026-10-24T10:51:57.5608528Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T10:51:57.5608721Z ╰──── 2026-10-24T10:51:57.5608777Z 2026-10-24T10:51:57.5609134Z ⚠ 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-24T10:51:57.5609569Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T10:51:57.5609924Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T10:51:57.5610620Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T10:51:57.5610919Z ·  ──────────────────────── 2026-10-24T10:51:57.5611103Z 59 │ authenticated: true, 2026-10-24T10:51:57.5611242Z ╰──── 2026-10-24T10:51:57.5611296Z 2026-10-24T10:51:57.5611876Z ⚠ 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-24T10:51:57.5612412Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T10:51:57.5612612Z 38 │ JSON.stringify( 2026-10-24T10:51:57.5612815Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T10:51:57.5613050Z ·  ──────────────────────── 2026-10-24T10:51:57.5613228Z 40 │ { name: "a" }, 2026-10-24T10:51:57.5613367Z ╰──── 2026-10-24T10:51:57.5613422Z 2026-10-24T10:51:57.5613624Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5613967Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T10:51:57.5614222Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T10:51:57.5614418Z 257 │ }, [props.path, targetIndex]); 2026-10-24T10:51:57.5614594Z ·  ─────┬──── 2026-10-24T10:51:57.5614837Z · ╰── Unnecessary dependency `props.path` 2026-10-24T10:51:57.5615039Z 258 │ 2026-10-24T10:51:57.5615154Z ╰──── 2026-10-24T10:51:57.5615511Z  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-24T10:51:57.5616108Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5616407Z 2026-10-24T10:51:57.5616600Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5616941Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T10:51:57.5617183Z 292 │ 2026-10-24T10:51:57.5619469Z ·  ─────────── 2026-10-24T10:51:57.5619644Z 310 │ {body} 2026-10-24T10:51:57.5619781Z ╰──── 2026-10-24T10:51:57.5619979Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T10:51:57.5620134Z 2026-10-24T10:51:57.5620480Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T10:51:57.5620996Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T10:51:57.5621263Z 21 │ 2026-10-24T10:51:57.5621484Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T10:51:57.5624355Z ·  ────────┬─────── 2026-10-24T10:51:57.5624618Z · ╰── 'summarizePayload' is declared here 2026-10-24T10:51:57.5624871Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T10:51:57.5625043Z ╰──── 2026-10-24T10:51:57.5625203Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5625323Z 2026-10-24T10:51:57.5625514Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T10:51:57.5625859Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T10:51:57.5626080Z  80 │ 2026-10-24T10:51:57.5626416Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T10:51:57.5626788Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T10:51:57.5627039Z  83 │ │ ): Effect.fn.Return { 2026-10-24T10:51:57.5627400Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T10:51:57.5627704Z  85 │ │ const connections = new Map(); 2026-10-24T10:51:57.5627919Z  86 │ │ 2026-10-24T10:51:57.5628222Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T10:51:57.5628534Z  88 │ │ Effect.suspend(() => { 2026-10-24T10:51:57.5628781Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T10:51:57.5629033Z  90 │ │ return connection === undefined 2026-10-24T10:51:57.5629367Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T10:51:57.5629683Z  92 │ │ : Effect.succeed(connection); 2026-10-24T10:51:57.5629882Z  93 │ │ }); 2026-10-24T10:51:57.5630043Z  94 │ │ 2026-10-24T10:51:57.5630218Z  95 │ │ const send = ( 2026-10-24T10:51:57.5630513Z  96 │ │ connection: Connection, 2026-10-24T10:51:57.5630810Z  97 │ │ message: unknown, 2026-10-24T10:51:57.5631107Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T10:51:57.5631383Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T10:51:57.5631613Z 100 │ │ Effect.gen(function* () { 2026-10-24T10:51:57.5631920Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T10:51:57.5632286Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T10:51:57.5632651Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T10:51:57.5632936Z 104 │ │ } 2026-10-24T10:51:57.5633168Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T10:51:57.5633417Z 106 │ │ try: (signal) => 2026-10-24T10:51:57.5633665Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T10:51:57.5633911Z 108 │ │ method: "POST", 2026-10-24T10:51:57.5634120Z 109 │ │ signal, 2026-10-24T10:51:57.5634327Z 110 │ │ headers: { 2026-10-24T10:51:57.5634563Z 111 │ │ "content-type": "application/json", 2026-10-24T10:51:57.5634845Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T10:51:57.5635124Z 113 │ │ authorization: options.authorization, 2026-10-24T10:51:57.5635394Z 114 │ │ ...(connection.sessionId === null 2026-10-24T10:51:57.5635628Z 115 │ │ ? {} 2026-10-24T10:51:57.5635888Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T10:51:57.5636168Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T10:51:57.5636403Z 118 │ │ ? {} 2026-10-24T10:51:57.5636681Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T10:51:57.5636932Z 120 │ │ }, 2026-10-24T10:51:57.5637124Z 121 │ │ body, 2026-10-24T10:51:57.5637348Z 122 │ │ }), 2026-10-24T10:51:57.5637550Z 123 │ │ catch: bridgeError, 2026-10-24T10:51:57.5637746Z 124 │ │ }); 2026-10-24T10:51:57.5638069Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T10:51:57.5638379Z 126 │ │ if (!response.ok) { 2026-10-24T10:51:57.5638605Z 127 │ │ yield* Effect.promise( 2026-10-24T10:51:57.5638907Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T10:51:57.5639171Z 129 │ │ ); 2026-10-24T10:51:57.5639381Z 130 │ │ return yield* Effect.fail( 2026-10-24T10:51:57.5639718Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T10:51:57.5640008Z 132 │ │ ); 2026-10-24T10:51:57.5640259Z 133 │ │ } 2026-10-24T10:51:57.5640609Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T10:51:57.5640934Z 135 │ │ for (const payload of payloads) { 2026-10-24T10:51:57.5641281Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T10:51:57.5641571Z 137 │ │ } 2026-10-24T10:51:57.5641763Z 138 │ │ return payloads; 2026-10-24T10:51:57.5642000Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T10:51:57.5642209Z 140 │ │ ); 2026-10-24T10:51:57.5642374Z 141 │ │ 2026-10-24T10:51:57.5642641Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T10:51:57.5642951Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T10:51:57.5643274Z 144 │ │ ): Effect.fn.Return { 2026-10-24T10:51:57.5643618Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T10:51:57.5643911Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T10:51:57.5644168Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T10:51:57.5644406Z 148 │ │ if (sessionId !== null) { 2026-10-24T10:51:57.5644651Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T10:51:57.5644890Z 150 │ │ try: (signal) => 2026-10-24T10:51:57.5645136Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T10:51:57.5645380Z 152 │ │ method: "DELETE", 2026-10-24T10:51:57.5645585Z 153 │ │ signal, 2026-10-24T10:51:57.5645784Z 154 │ │ headers: { 2026-10-24T10:51:57.5646023Z 155 │ │ authorization: options.authorization, 2026-10-24T10:51:57.5646283Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T10:51:57.5646543Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T10:51:57.5646775Z 158 │ │ ? {} 2026-10-24T10:51:57.5647042Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T10:51:57.5647319Z 160 │ │ }, 2026-10-24T10:51:57.5647500Z 161 │ │ }), 2026-10-24T10:51:57.5647696Z 162 │ │ catch: bridgeError, 2026-10-24T10:51:57.5647889Z 163 │ │ }); 2026-10-24T10:51:57.5648117Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T10:51:57.5648367Z 165 │ │ return yield* Effect.fail( 2026-10-24T10:51:57.5648603Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T10:51:57.5648910Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T10:51:57.5649169Z 168 │ │ ), 2026-10-24T10:51:57.5649346Z 169 │ │ ); 2026-10-24T10:51:57.5649518Z 170 │ │ } 2026-10-24T10:51:57.5649773Z 171 │ │ yield* Effect.promise( 2026-10-24T10:51:57.5650098Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T10:51:57.5650353Z 173 │ │ ); 2026-10-24T10:51:57.5650524Z 174 │ │ } 2026-10-24T10:51:57.5650700Z 175 │ │ return {}; 2026-10-24T10:51:57.5650873Z 176 │ │ }); 2026-10-24T10:51:57.5651031Z 177 │ │ 2026-10-24T10:51:57.5651197Z 178 │ │ return { 2026-10-24T10:51:57.5651464Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T10:51:57.5651759Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T10:51:57.5652002Z 181 │ │ return yield* Effect.fail( 2026-10-24T10:51:57.5652312Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T10:51:57.5652575Z 183 │ │ ); 2026-10-24T10:51:57.5652748Z 184 │ │ } 2026-10-24T10:51:57.5652968Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T10:51:57.5653313Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T10:51:57.5653596Z 187 │ │ } 2026-10-24T10:51:57.5653844Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T10:51:57.5654116Z 189 │ │ connections.set(connectionId, { 2026-10-24T10:51:57.5654368Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T10:51:57.5654597Z 191 │ │ sessionId: null, 2026-10-24T10:51:57.5654814Z 192 │ │ protocolVersion: null, 2026-10-24T10:51:57.5655034Z 193 │ │ nextRequestId: 0, 2026-10-24T10:51:57.5655224Z 194 │ │ }); 2026-10-24T10:51:57.5655424Z 195 │ │ return { connectionId }; 2026-10-24T10:51:57.5655618Z 196 │ │ }), 2026-10-24T10:51:57.5655880Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T10:51:57.5656215Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T10:51:57.5656504Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T10:51:57.5656770Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T10:51:57.5657008Z 201 │ │ jsonrpc: "2.0", 2026-10-24T10:51:57.5657368Z 202 │ │ id, 2026-10-24T10:51:57.5657571Z 203 │ │ method: request.method, 2026-10-24T10:51:57.5657848Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T10:51:57.5658088Z 205 │ │ }); 2026-10-24T10:51:57.5658371Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T10:51:57.5658678Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T10:51:57.5658916Z 208 │ │ if (envelope === null) { 2026-10-24T10:51:57.5659196Z 209 │ │ return yield* Effect.fail( 2026-10-24T10:51:57.5659533Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T10:51:57.5659796Z 211 │ │ ); 2026-10-24T10:51:57.5659969Z 212 │ │ } 2026-10-24T10:51:57.5660175Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T10:51:57.5660500Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T10:51:57.5660767Z 215 │ │ } 2026-10-24T10:51:57.5661029Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T10:51:57.5661279Z 217 │ │ }), 2026-10-24T10:51:57.5661568Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T10:51:57.5661924Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T10:51:57.5662194Z 220 │ │ yield* send(connection, { 2026-10-24T10:51:57.5662410Z 221 │ │ jsonrpc: "2.0", 2026-10-24T10:51:57.5662624Z 222 │ │ method: request.method, 2026-10-24T10:51:57.5662896Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T10:51:57.5663137Z 224 │ │ }); 2026-10-24T10:51:57.5663306Z 225 │ │ }), 2026-10-24T10:51:57.5663487Z 226 │ │ disconnect, 2026-10-24T10:51:57.5663695Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T10:51:57.5663919Z 228 │ │ Effect.forEach( 2026-10-24T10:51:57.5664139Z 229 │ │ [...connections.keys()], 2026-10-24T10:51:57.5664430Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T10:51:57.5664699Z 231 │ │ { discard: true }, 2026-10-24T10:51:57.5664891Z 232 │ │ ), 2026-10-24T10:51:57.5665062Z 233 │ │ ), 2026-10-24T10:51:57.5665229Z 234 │ │ }; 2026-10-24T10:51:57.5665447Z 235 │ ╰─▶ }); 2026-10-24T10:51:57.5665634Z ╰──── 2026-10-24T10:51:57.5665942Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T10:51:57.5666186Z 2026-10-24T10:51:57.5666388Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5666759Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T10:51:57.5666997Z 87 │
  • } 2026-10-24T10:51:57.5683229Z ·  ───────────────────────────────────────────── 2026-10-24T10:51:57.5683446Z 1080 │ screenOptions={({ route }) => 2026-10-24T10:51:57.5683602Z ╰──── 2026-10-24T10:51:57.5684026Z  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-24T10:51:57.5684365Z 2026-10-24T10:51:57.5684830Z ⚠ 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-24T10:51:57.5685377Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T10:51:57.5685617Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T10:51:57.5685961Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T10:51:57.5686299Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T10:51:57.5686633Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T10:51:57.5686948Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T10:51:57.5687213Z 2619 │ │ flush: () => { 2026-10-24T10:51:57.5687449Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T10:51:57.5687728Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T10:51:57.5687960Z 2622 │ │ }, 2026-10-24T10:51:57.5688138Z 2623 │ │ }; 2026-10-24T10:51:57.5688304Z 2624 │ │ 2026-10-24T10:51:57.5688551Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T10:51:57.5688822Z 2626 │ │ let requestChecks = 0; 2026-10-24T10:51:57.5689075Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T10:51:57.5689328Z 2628 │ │ executionMode: "async", 2026-10-24T10:51:57.5689571Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T10:51:57.5689815Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T10:51:57.5690072Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T10:51:57.5690319Z 2632 │ │ requestChecks += 1; 2026-10-24T10:51:57.5690583Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T10:51:57.5690845Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T10:51:57.5691073Z 2635 │ │ return true; 2026-10-24T10:51:57.5691266Z 2636 │ │ }, 2026-10-24T10:51:57.5691444Z 2637 │ │ }; 2026-10-24T10:51:57.5691609Z 2638 │ │ 2026-10-24T10:51:57.5691812Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T10:51:57.5692040Z 2640 │ │ ...WINDOW, 2026-10-24T10:51:57.5692274Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T10:51:57.5692600Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T10:51:57.5692867Z 2643 │ │ }; 2026-10-24T10:51:57.5693076Z 2644 │ │ const first = yield* service 2026-10-24T10:51:57.5693310Z 2645 │ │ .readSummary(input) 2026-10-24T10:51:57.5693520Z 2646 │ │ .pipe( 2026-10-24T10:51:57.5693723Z 2647 │ │ Effect.exit, 2026-10-24T10:51:57.5693993Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T10:51:57.5694255Z 2649 │ │ Effect.forkChild, 2026-10-24T10:51:57.5694454Z 2650 │ │ ); 2026-10-24T10:51:57.5694655Z 2651 │ │ requestFiber = first; 2026-10-24T10:51:57.5694878Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5695099Z 2653 │ │ dispatcher.flush(); 2026-10-24T10:51:57.5695283Z 2654 │ │ 2026-10-24T10:51:57.5695579Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T10:51:57.5695858Z 2656 │ │ Effect.match({ 2026-10-24T10:51:57.5696095Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T10:51:57.5696351Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T10:51:57.5696569Z 2659 │ │ }), 2026-10-24T10:51:57.5696820Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T10:51:57.5697081Z 2661 │ │ Effect.forkChild, 2026-10-24T10:51:57.5697311Z 2662 │ │ ); 2026-10-24T10:51:57.5697512Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5697732Z 2664 │ │ dispatcher.flush(); 2026-10-24T10:51:57.5697978Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T10:51:57.5698236Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T10:51:57.5698478Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T10:51:57.5698715Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T10:51:57.5698925Z 2669 │ │ break; 2026-10-24T10:51:57.5699110Z 2670 │ │ } 2026-10-24T10:51:57.5699325Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T10:51:57.5699615Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T10:51:57.5699853Z 2673 │ │ } 2026-10-24T10:51:57.5700102Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T10:51:57.5700398Z 2675 │ ╰─▶ } 2026-10-24T10:51:57.5700593Z 2676 │ 2026-10-24T10:51:57.5700710Z ╰──── 2026-10-24T10:51:57.5700768Z 2026-10-24T10:51:57.5701029Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5701407Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T10:51:57.5701653Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T10:51:57.5701840Z 84 │ useEffect(() => { 2026-10-24T10:51:57.5701996Z ·  ────┬──── 2026-10-24T10:51:57.5702211Z · ╰── This is the containing effect 2026-10-24T10:51:57.5702431Z 85 │ if (!actionState.isRunning) return; 2026-10-24T10:51:57.5702610Z 86 │ setNowMs(Date.now()); 2026-10-24T10:51:57.5702769Z ·  ────┬─── 2026-10-24T10:51:57.5703020Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5703309Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T10:51:57.5703497Z ╰──── 2026-10-24T10:51:57.5704146Z  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-24T10:51:57.5705003Z  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-24T10:51:57.5705309Z 2026-10-24T10:51:57.5705634Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5706064Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T10:51:57.5706275Z 60 │ ) { 2026-10-24T10:51:57.5706506Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T10:51:57.5706756Z ·  ──────┬────── 2026-10-24T10:51:57.5706992Z · ╰── 'useDragRegion' is declared here 2026-10-24T10:51:57.5707249Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T10:51:57.5707410Z ╰──── 2026-10-24T10:51:57.5707570Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5707689Z 2026-10-24T10:51:57.5707861Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5708176Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T10:51:57.5708460Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T10:51:57.5708754Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T10:51:57.5709035Z ·  ─────┬──── 2026-10-24T10:51:57.5709317Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5709533Z 373 │ return ( 2026-10-24T10:51:57.5709655Z ╰──── 2026-10-24T10:51:57.5709990Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5710554Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5710841Z 2026-10-24T10:51:57.5711007Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5711319Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T10:51:57.5711566Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T10:51:57.5711807Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T10:51:57.5712106Z ·  ─────┬──── 2026-10-24T10:51:57.5712376Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5712580Z 854 │ } 2026-10-24T10:51:57.5712702Z ╰──── 2026-10-24T10:51:57.5713034Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5713590Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5713870Z 2026-10-24T10:51:57.5714067Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T10:51:57.5714367Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T10:51:57.5714568Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T10:51:57.5714768Z 28 │ import { identity } from "effect/Function"; 2026-10-24T10:51:57.5714952Z ·  ────┬─── 2026-10-24T10:51:57.5715248Z · ╰── 'identity' is imported here 2026-10-24T10:51:57.5715508Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T10:51:57.5715662Z ╰──── 2026-10-24T10:51:57.5715811Z  help: Consider removing this import. 2026-10-24T10:51:57.5715927Z 2026-10-24T10:51:57.5716148Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:51:57.5716493Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T10:51:57.5716703Z 20 │ [instanceId]: { 2026-10-24T10:51:57.5716865Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T10:51:57.5717062Z ·  ──────────────────────────── 2026-10-24T10:51:57.5717266Z 22 │ [model]: options, 2026-10-24T10:51:57.5717399Z ╰──── 2026-10-24T10:51:57.5717725Z  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-24T10:51:57.5717983Z 2026-10-24T10:51:57.5718345Z ⚠ 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-24T10:51:57.5718805Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T10:51:57.5719075Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T10:51:57.5719351Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T10:51:57.5719600Z ·  ──────────────────────── 2026-10-24T10:51:57.5719853Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T10:51:57.5720056Z ╰──── 2026-10-24T10:51:57.5720114Z 2026-10-24T10:51:57.5720484Z ⚠ 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-24T10:51:57.5720937Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T10:51:57.5721179Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T10:51:57.5721448Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T10:51:57.5721723Z ·  ──────────────────────── 2026-10-24T10:51:57.5721901Z 257 │ return [ 2026-10-24T10:51:57.5722028Z ╰──── 2026-10-24T10:51:57.5722083Z 2026-10-24T10:51:57.5722302Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T10:51:57.5722651Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T10:51:57.5722864Z 1021 │ instanceId, 2026-10-24T10:51:57.5723095Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T10:51:57.5723380Z ·  ────────────────────────────────────────────────── 2026-10-24T10:51:57.5723574Z 1023 │ ]), 2026-10-24T10:51:57.5723700Z ╰──── 2026-10-24T10:51:57.5724018Z  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-24T10:51:57.5724274Z 2026-10-24T10:51:57.5724475Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5724810Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-24T10:51:57.5725039Z 1314 │ queuedMessagesByThreadKey, 2026-10-24T10:51:57.5725257Z 1315 │ retryTick, 2026-10-24T10:51:57.5725438Z ·  ────┬──── 2026-10-24T10:51:57.5725667Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T10:51:57.5725881Z 1316 │ restoreQueuedMessage, 2026-10-24T10:51:57.5726022Z ╰──── 2026-10-24T10:51:57.5726368Z  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-24T10:51:57.5726956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5727261Z 2026-10-24T10:51:57.5727483Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5727841Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-24T10:51:57.5728076Z 813 │
    approval.requestId, 2026-10-24T10:51:57.5737523Z 987 │ ╰─▶ ); 2026-10-24T10:51:57.5737659Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T10:51:57.5737718Z ╰──── 2026-10-24T10:51:57.5737799Z  help: Switch to `Set` 2026-10-24T10:51:57.5737802Z 2026-10-24T10:51:57.5738084Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T10:51:57.5738237Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T10:51:57.5738297Z 162 │ keys, 2026-10-24T10:51:57.5738369Z 163 │ overridingProjects = [], 2026-10-24T10:51:57.5738452Z ·  ── 2026-10-24T10:51:57.5738518Z 164 │ onClearOverrides, 2026-10-24T10:51:57.5738571Z ╰──── 2026-10-24T10:51:57.5738888Z  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-24T10:51:57.5738938Z 2026-10-24T10:51:57.5739242Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T10:51:57.5739372Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T10:51:57.5739428Z 284 │ }, 2026-10-24T10:51:57.5739511Z 285 │ (effect, flow, stopSessions) => 2026-10-24T10:51:57.5739605Z ·  ──────┬───── 2026-10-24T10:51:57.5739751Z · ╰── 'stopSessions' is declared here 2026-10-24T10:51:57.5739816Z 286 │ effect.pipe( 2026-10-24T10:51:57.5739869Z ╰──── 2026-10-24T10:51:57.5739974Z  help: Consider removing this parameter. 2026-10-24T10:51:57.5739976Z 2026-10-24T10:51:57.5740192Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:51:57.5740316Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T10:51:57.5740417Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T10:51:57.5740502Z 259 │ for (const edit of edits.reverse()) 2026-10-24T10:51:57.5740596Z ·  ─────── 2026-10-24T10:51:57.5740759Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T10:51:57.5740812Z ╰──── 2026-10-24T10:51:57.5741072Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:51:57.5741074Z 2026-10-24T10:51:57.5741287Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:51:57.5741412Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T10:51:57.5741497Z 289 │ visit(parser.parse(markdown)); 2026-10-24T10:51:57.5741582Z 290 │ for (const edit of edits.reverse()) 2026-10-24T10:51:57.5741676Z ·  ─────── 2026-10-24T10:51:57.5741837Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T10:51:57.5741889Z ╰──── 2026-10-24T10:51:57.5742144Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:51:57.5742146Z 2026-10-24T10:51:57.5742355Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T10:51:57.5742473Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T10:51:57.5742557Z 343 │ visit(parser.parse(markdown)); 2026-10-24T10:51:57.5742662Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T10:51:57.5742765Z ·  ─────── 2026-10-24T10:51:57.5742926Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T10:51:57.5742978Z ╰──── 2026-10-24T10:51:57.5743233Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T10:51:57.5743236Z 2026-10-24T10:51:57.5743660Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-24T10:51:57.5743862Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T10:51:57.5743968Z 262 │ ...(update._meta !== undefined 2026-10-24T10:51:57.5744136Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T10:51:57.5744224Z ·  ───────── 2026-10-24T10:51:57.5744287Z 264 │ : {}), 2026-10-24T10:51:57.5744337Z ╰──── 2026-10-24T10:51:57.5744339Z 2026-10-24T10:51:57.5744504Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T10:51:57.5744649Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T10:51:57.5744704Z 465 │ 2026-10-24T10:51:57.5744808Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T10:51:57.5744882Z ·  ── 2026-10-24T10:51:57.5744937Z 467 │ } 2026-10-24T10:51:57.5744995Z ╰──── 2026-10-24T10:51:57.5745225Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T10:51:57.5745228Z 2026-10-24T10:51:57.5745434Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T10:51:57.5745536Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T10:51:57.5745678Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T10:51:57.5745792Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T10:51:57.5745879Z ·  ──────┬────── 2026-10-24T10:51:57.5746023Z · ╰── 'HookForwarder' is imported here 2026-10-24T10:51:57.5746126Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T10:51:57.5746182Z ╰──── 2026-10-24T10:51:57.5746281Z  help: Consider removing this import. 2026-10-24T10:51:57.5746284Z 2026-10-24T10:51:57.5746465Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T10:51:57.5746600Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T10:51:57.5746685Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T10:51:57.5746775Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T10:51:57.5746854Z ·  ──┬── 2026-10-24T10:51:57.5746986Z · ╰── 'Scope' is imported here 2026-10-24T10:51:57.5747070Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T10:51:57.5747122Z ╰──── 2026-10-24T10:51:57.5747228Z  help: Consider removing this import. 2026-10-24T10:51:57.5747236Z 2026-10-24T10:51:57.5747476Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T10:51:57.5747602Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T10:51:57.5747654Z 78 │ 2026-10-24T10:51:57.5747789Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T10:51:57.5747875Z ·  ────────┬─────── 2026-10-24T10:51:57.5748021Z · ╰── 'describeSchedule' is declared here 2026-10-24T10:51:57.5748128Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T10:51:57.5748181Z ╰──── 2026-10-24T10:51:57.5748285Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5748287Z 2026-10-24T10:51:57.5748801Z ⚠ 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-24T10:51:57.5749009Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T10:51:57.5749083Z 520 │ })).delivery; 2026-10-24T10:51:57.5749279Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T10:51:57.5749395Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T10:51:57.5749538Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T10:51:57.5749641Z 524 │ │ id: task.id, 2026-10-24T10:51:57.5749761Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T10:51:57.5749863Z 526 │ │ })).delivery; 2026-10-24T10:51:57.5749998Z 527 │ ╰─▶ } 2026-10-24T10:51:57.5750113Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T10:51:57.5750165Z ╰──── 2026-10-24T10:51:57.5750168Z 2026-10-24T10:51:57.5750426Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5750591Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-24T10:51:57.5750645Z 211 │ }; 2026-10-24T10:51:57.5750713Z 212 │ useEffect(() => { 2026-10-24T10:51:57.5750786Z ·  ────┬──── 2026-10-24T10:51:57.5750925Z · ╰── This is the containing effect 2026-10-24T10:51:57.5751099Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T10:51:57.5751164Z 214 │ if (inserted) { 2026-10-24T10:51:57.5751239Z 215 │ setSelection((current) => 2026-10-24T10:51:57.5751319Z ·  ──────┬───── 2026-10-24T10:51:57.5751486Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5751654Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T10:51:57.5751705Z ╰──── 2026-10-24T10:51:57.5752366Z  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-24T10:51:57.5752689Z  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-24T10:51:57.5752693Z 2026-10-24T10:51:57.5752948Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5753111Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-24T10:51:57.5753189Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-24T10:51:57.5753254Z 285 │ useEffect(() => { 2026-10-24T10:51:57.5753323Z ·  ────┬──── 2026-10-24T10:51:57.5753452Z · ╰── This is the containing effect 2026-10-24T10:51:57.5753658Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T10:51:57.5753848Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T10:51:57.5753918Z 288 │ const now = Date.now(); 2026-10-24T10:51:57.5754032Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T10:51:57.5754091Z 290 │ if ( 2026-10-24T10:51:57.5754169Z 291 │ lastRequest?.key === key && 2026-10-24T10:51:57.5754307Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T10:51:57.5754363Z 293 │ ) 2026-10-24T10:51:57.5754424Z 294 │ return; 2026-10-24T10:51:57.5754597Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T10:51:57.5754684Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-24T10:51:57.5754780Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5754962Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5755028Z 297 │ return; 2026-10-24T10:51:57.5755079Z ╰──── 2026-10-24T10:51:57.5755666Z  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-24T10:51:57.5755984Z  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-24T10:51:57.5755987Z 2026-10-24T10:51:57.5756190Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5756354Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-24T10:51:57.5756408Z 325 │ }, [ 2026-10-24T10:51:57.5756472Z 326 │ draftMessage, 2026-10-24T10:51:57.5756549Z ·  ──────┬───── 2026-10-24T10:51:57.5756692Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T10:51:57.5756759Z 327 │ environmentId, 2026-10-24T10:51:57.5756811Z ╰──── 2026-10-24T10:51:57.5757102Z  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-24T10:51:57.5757431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5757434Z 2026-10-24T10:51:57.5757735Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T10:51:57.5757912Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T10:51:57.5758066Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T10:51:57.5758146Z 12 │ this.onmessage = listener; 2026-10-24T10:51:57.5758225Z ·  ───────── 2026-10-24T10:51:57.5758281Z 13 │ } 2026-10-24T10:51:57.5758334Z ╰──── 2026-10-24T10:51:57.5758646Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T10:51:57.5758649Z 2026-10-24T10:51:57.5758856Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T10:51:57.5758998Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T10:51:57.5759066Z 15 │ constructor() { 2026-10-24T10:51:57.5759132Z 16 │ source = this; 2026-10-24T10:51:57.5759203Z ·  ────── 2026-10-24T10:51:57.5759259Z 17 │ } 2026-10-24T10:51:57.5759314Z ╰──── 2026-10-24T10:51:57.5759583Z  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-24T10:51:57.5759585Z 2026-10-24T10:51:57.5759728Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5759844Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T10:51:57.5760026Z 53 │ const child = children as ReactElement>; 2026-10-24T10:51:57.5760200Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T10:51:57.5760305Z 55 │ │ onTouchStart: (event) => { 2026-10-24T10:51:57.5760461Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T10:51:57.5760617Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T10:51:57.5760743Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T10:51:57.5760911Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T10:51:57.5761023Z 60 │ │ pendingPress.current = null; 2026-10-24T10:51:57.5761151Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T10:51:57.5761231Z 62 │ │ }, 2026-10-24T10:51:57.5761329Z 63 │ │ onPress: (event) => { 2026-10-24T10:51:57.5761496Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T10:51:57.5761633Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T10:51:57.5761798Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T10:51:57.5761986Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T10:51:57.5762072Z 68 │ │ return; 2026-10-24T10:51:57.5762148Z 69 │ │ } 2026-10-24T10:51:57.5762333Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T10:51:57.5762529Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T10:51:57.5762692Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T10:51:57.5762790Z 73 │ │ event.persist(); 2026-10-24T10:51:57.5762947Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T10:51:57.5763033Z 75 │ │ return; 2026-10-24T10:51:57.5763109Z 76 │ │ } 2026-10-24T10:51:57.5763220Z 77 │ │ child.props.onPress?.(event); 2026-10-24T10:51:57.5763296Z 78 │ │ }, 2026-10-24T10:51:57.5763431Z 79 │ ├─▶ }); 2026-10-24T10:51:57.5763668Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5763770Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T10:51:57.5763824Z ╰──── 2026-10-24T10:51:57.5764289Z  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-24T10:51:57.5764576Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5764578Z 2026-10-24T10:51:57.5764785Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T10:51:57.5764950Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T10:51:57.5765038Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T10:51:57.5765154Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T10:51:57.5765238Z ·  ─────┬───── 2026-10-24T10:51:57.5765376Z · ╰── 'HostProcess' is imported here 2026-10-24T10:51:57.5765430Z 26 │ 2026-10-24T10:51:57.5765482Z ╰──── 2026-10-24T10:51:57.5765578Z  help: Consider removing this import. 2026-10-24T10:51:57.5765582Z 2026-10-24T10:51:57.5765850Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5766019Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T10:51:57.5766104Z 123 │ const path = yield* Path.Path; 2026-10-24T10:51:57.5766223Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T10:51:57.5766304Z ·  ──────┬───── 2026-10-24T10:51:57.5766443Z · ╰── 'serverConfig' is declared here 2026-10-24T10:51:57.5766586Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T10:51:57.5766640Z ╰──── 2026-10-24T10:51:57.5766742Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5766745Z 2026-10-24T10:51:57.5767018Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T10:51:57.5767246Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T10:51:57.5767412Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T10:51:57.5767551Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T10:51:57.5767638Z ·  ───────┬────── 2026-10-24T10:51:57.5767783Z · ╰── 'serverSettings' is declared here 2026-10-24T10:51:57.5767920Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T10:51:57.5767970Z ╰──── 2026-10-24T10:51:57.5768073Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5768076Z 2026-10-24T10:51:57.5768332Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5768494Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T10:51:57.5768559Z 434 │ : null; 2026-10-24T10:51:57.5768625Z 435 │ useEffect(() => { 2026-10-24T10:51:57.5768699Z ·  ────┬──── 2026-10-24T10:51:57.5768827Z · ╰── This is the containing effect 2026-10-24T10:51:57.5768883Z 436 │ if ( 2026-10-24T10:51:57.5768959Z 437 │ props.active === false || 2026-10-24T10:51:57.5769037Z 438 │ activeDraftKey !== null || 2026-10-24T10:51:57.5769119Z 439 │ editingPendingTask !== null || 2026-10-24T10:51:57.5769193Z 440 │ selectedProject === null 2026-10-24T10:51:57.5769250Z 441 │ ) { 2026-10-24T10:51:57.5769310Z 442 │ return; 2026-10-24T10:51:57.5769365Z 443 │ } 2026-10-24T10:51:57.5769435Z 444 │ setActiveDraftKey( 2026-10-24T10:51:57.5769522Z ·  ────────┬──────── 2026-10-24T10:51:57.5769695Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5769768Z 445 │ createNewTaskDraft({ 2026-10-24T10:51:57.5769818Z ╰──── 2026-10-24T10:51:57.5770410Z  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-24T10:51:57.5770730Z  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-24T10:51:57.5770733Z 2026-10-24T10:51:57.5770975Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:51:57.5771142Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T10:51:57.5771246Z 1243 │ 2026-10-24T10:51:57.5771447Z 1244 │ {props.children} 2026-10-24T10:51:57.5771562Z ·  ───────────── 2026-10-24T10:51:57.5771637Z 1245 │ 2026-10-24T10:51:57.5771688Z ╰──── 2026-10-24T10:51:57.5771912Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:51:57.5772053Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:51:57.5772055Z 2026-10-24T10:51:57.5772359Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5772555Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:7] 2026-10-24T10:51:57.5772610Z 324 │ }; 2026-10-24T10:51:57.5772675Z 325 │ useEffect(() => { 2026-10-24T10:51:57.5772748Z ·  ────┬──── 2026-10-24T10:51:57.5772875Z · ╰── This is the containing effect 2026-10-24T10:51:57.5772975Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T10:51:57.5773071Z 327 │ requestedSection.current = "overview"; 2026-10-24T10:51:57.5773237Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T10:51:57.5773309Z 329 │ setSection("overview"); 2026-10-24T10:51:57.5773391Z ·  ─────┬──── 2026-10-24T10:51:57.5773559Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5773613Z 330 │ } 2026-10-24T10:51:57.5773665Z ╰──── 2026-10-24T10:51:57.5774257Z  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-24T10:51:57.5774575Z  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-24T10:51:57.5774578Z 2026-10-24T10:51:57.5774786Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:51:57.5774957Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:331:6] 2026-10-24T10:51:57.5775055Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T10:51:57.5775150Z 327 │ requestedSection.current = "overview"; 2026-10-24T10:51:57.5775232Z ·  ────────┬─────── 2026-10-24T10:51:57.5775669Z · ╰── 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-24T10:51:57.5775832Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T10:51:57.5775979Z ·  ─────────┬───────── ──────┬────── 2026-10-24T10:51:57.5776472Z · │ ╰── 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-24T10:51:57.5776913Z · ╰── 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-24T10:51:57.5776988Z 329 │ setSection("overview"); 2026-10-24T10:51:57.5777043Z 330 │ } 2026-10-24T10:51:57.5777134Z 331 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T10:51:57.5777274Z ·  ──────────────────┬───────────────── 2026-10-24T10:51:57.5777516Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5777638Z 332 │ const tabContent = activityContent; 2026-10-24T10:51:57.5777690Z ╰──── 2026-10-24T10:51:57.5777857Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:51:57.5778166Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5778169Z 2026-10-24T10:51:57.5778372Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:51:57.5778538Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:868:6] 2026-10-24T10:51:57.5778596Z 851 │ if ( 2026-10-24T10:51:57.5778717Z 852 │ lastSelection.current.path === route.params.path && 2026-10-24T10:51:57.5778800Z ·  ──────┬────── 2026-10-24T10:51:57.5779227Z · ╰── 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-24T10:51:57.5779355Z 853 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T10:51:57.5779410Z 854 │ ) 2026-10-24T10:51:57.5779472Z 855 │ return; 2026-10-24T10:51:57.5779645Z 856 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T10:51:57.5779779Z 857 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T10:51:57.5779866Z 858 │ setJumpPath(route.params.path); 2026-10-24T10:51:57.5779938Z 859 │ setSelectedRowId(null); 2026-10-24T10:51:57.5780021Z 860 │ jumpStarted.current = false; 2026-10-24T10:51:57.5780170Z 861 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T10:51:57.5780264Z 862 │ if (!file || !nativeView.current) return; 2026-10-24T10:51:57.5780353Z ·  ─────┬──── 2026-10-24T10:51:57.5780779Z · ╰── 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-24T10:51:57.5780905Z 863 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T10:51:57.5780984Z 864 │ jumpStarted.current = true; 2026-10-24T10:51:57.5781122Z 865 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T10:51:57.5781209Z 866 │ jumpStarted.current = false; 2026-10-24T10:51:57.5781266Z 867 │ }); 2026-10-24T10:51:57.5781462Z 868 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T10:51:57.5781660Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T10:51:57.5781877Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5781987Z 869 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T10:51:57.5784487Z ╰──── 2026-10-24T10:51:57.5784668Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:51:57.5785060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5785095Z 2026-10-24T10:51:57.5785358Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5785509Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T10:51:57.5785568Z 61 │ }, []); 2026-10-24T10:51:57.5785632Z 62 │ useEffect(() => { 2026-10-24T10:51:57.5785707Z ·  ────┬──── 2026-10-24T10:51:57.5785836Z · ╰── This is the containing effect 2026-10-24T10:51:57.5785985Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T10:51:57.5786107Z ·  ───────┬────── 2026-10-24T10:51:57.5786317Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5786402Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T10:51:57.5786454Z ╰──── 2026-10-24T10:51:57.5787048Z  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-24T10:51:57.5787405Z  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-24T10:51:57.5787407Z 2026-10-24T10:51:57.5787641Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T10:51:57.5787760Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T10:51:57.5787813Z 11 │ 2026-10-24T10:51:57.5787909Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T10:51:57.5788012Z ·  ────────────┬──────────── 2026-10-24T10:51:57.5788179Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T10:51:57.5788246Z 13 │ readonly thread: { 2026-10-24T10:51:57.5788297Z ╰──── 2026-10-24T10:51:57.5788402Z  help: Consider removing this declaration. 2026-10-24T10:51:57.5788405Z 2026-10-24T10:51:57.5788660Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5788858Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T10:51:57.5789045Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T10:51:57.5789110Z 29 │ useEffect(() => { 2026-10-24T10:51:57.5789183Z ·  ────┬──── 2026-10-24T10:51:57.5789310Z · ╰── This is the containing effect 2026-10-24T10:51:57.5789432Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T10:51:57.5789535Z ·  ───┬─── 2026-10-24T10:51:57.5789723Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5789795Z 31 │ }, [key, live, snapshot]); 2026-10-24T10:51:57.5789845Z ╰──── 2026-10-24T10:51:57.5790444Z  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-24T10:51:57.5790766Z  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-24T10:51:57.5790769Z 2026-10-24T10:51:57.5790913Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5791073Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T10:51:57.5791129Z 276 │ 2026-10-24T10:51:57.5791311Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T10:51:57.5791411Z 278 │ │ ...nativeProps, 2026-10-24T10:51:57.5791558Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T10:51:57.5791649Z 280 │ │ ref: nativeRef, 2026-10-24T10:51:57.5791777Z 281 │ ├─▶ }); 2026-10-24T10:51:57.5792074Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5792132Z 282 │ } 2026-10-24T10:51:57.5792183Z ╰──── 2026-10-24T10:51:57.5792645Z  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-24T10:51:57.5792939Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5792944Z 2026-10-24T10:51:57.5793201Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5793359Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T10:51:57.5793423Z 259 │ .join("|"); 2026-10-24T10:51:57.5793488Z 260 │ useEffect(() => { 2026-10-24T10:51:57.5793561Z ·  ────┬──── 2026-10-24T10:51:57.5793695Z · ╰── This is the containing effect 2026-10-24T10:51:57.5793755Z 261 │ stop(); 2026-10-24T10:51:57.5793824Z ·  ──┬─ 2026-10-24T10:51:57.5794054Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5794161Z 262 │ }, [orderVersion]); 2026-10-24T10:51:57.5794212Z ╰──── 2026-10-24T10:51:57.5794799Z  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-24T10:51:57.5795114Z  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-24T10:51:57.5795116Z 2026-10-24T10:51:57.5795330Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5795493Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T10:51:57.5795558Z 260 │ useEffect(() => { 2026-10-24T10:51:57.5795620Z 261 │ stop(); 2026-10-24T10:51:57.5795688Z ·  ──┬─ 2026-10-24T10:51:57.5795812Z · ╰── Missing dependency `stop` 2026-10-24T10:51:57.5795876Z 262 │ }, [orderVersion]); 2026-10-24T10:51:57.5795955Z ·  ──────┬───── 2026-10-24T10:51:57.5796102Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T10:51:57.5796165Z 263 │ useEffect( 2026-10-24T10:51:57.5796216Z ╰──── 2026-10-24T10:51:57.5796632Z  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-24T10:51:57.5796945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5796950Z 2026-10-24T10:51:57.5797093Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5797259Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T10:51:57.5797360Z 95 │ const latest = useRef(props); 2026-10-24T10:51:57.5797429Z 96 │ latest.current = props; 2026-10-24T10:51:57.5797533Z ·  ───┬──────┬─── 2026-10-24T10:51:57.5797709Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5797821Z · ╰── This value is a ref 2026-10-24T10:51:57.5797895Z 97 │ const gesture = useMemo( 2026-10-24T10:51:57.5797950Z ╰──── 2026-10-24T10:51:57.5798408Z  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-24T10:51:57.5798695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5798697Z 2026-10-24T10:51:57.5798839Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5798999Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T10:51:57.5799066Z 103 │ .runOnJS(true) 2026-10-24T10:51:57.5799214Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T10:51:57.5799357Z ·  ───────────────┬────────────── 2026-10-24T10:51:57.5799554Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5799687Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5799741Z ╰──── 2026-10-24T10:51:57.5800197Z  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-24T10:51:57.5800485Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5800487Z 2026-10-24T10:51:57.5800635Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5800795Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T10:51:57.5800893Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T10:51:57.5801023Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5801162Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T10:51:57.5801369Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5801494Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5801545Z ╰──── 2026-10-24T10:51:57.5802011Z  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-24T10:51:57.5802300Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5802303Z 2026-10-24T10:51:57.5802443Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5802598Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T10:51:57.5802726Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5802847Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5802989Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T10:51:57.5803196Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5803321Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T10:51:57.5803373Z ╰──── 2026-10-24T10:51:57.5803838Z  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-24T10:51:57.5804124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5804126Z 2026-10-24T10:51:57.5804311Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5804493Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T10:51:57.5804615Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5804737Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T10:51:57.5804872Z ·  ───────────────────────┬────────────────────── 2026-10-24T10:51:57.5805075Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5805146Z 108 │ [props.disabled], 2026-10-24T10:51:57.5805198Z ╰──── 2026-10-24T10:51:57.5805659Z  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-24T10:51:57.5805948Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5805953Z 2026-10-24T10:51:57.5806092Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5806250Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T10:51:57.5806365Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T10:51:57.5806469Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T10:51:57.5806571Z ·  ───┬──────┬─── 2026-10-24T10:51:57.5806754Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5806871Z · ╰── This value is a ref 2026-10-24T10:51:57.5806925Z 250 │ 2026-10-24T10:51:57.5806976Z ╰──── 2026-10-24T10:51:57.5807462Z  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-24T10:51:57.5807747Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5807751Z 2026-10-24T10:51:57.5807895Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5808049Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T10:51:57.5808211Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T10:51:57.5808352Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T10:51:57.5808474Z ·  ──────────────────┬────────────────── 2026-10-24T10:51:57.5808639Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5808749Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T10:51:57.5808802Z ╰──── 2026-10-24T10:51:57.5809264Z  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-24T10:51:57.5809559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5809565Z 2026-10-24T10:51:57.5809731Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5809888Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T10:51:57.5809952Z 323 │ update(0); 2026-10-24T10:51:57.5810033Z 324 │ let last = performance.now(); 2026-10-24T10:51:57.5810128Z ·  ────────┬──────── 2026-10-24T10:51:57.5810267Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5810335Z 325 │ const tick = () => { 2026-10-24T10:51:57.5810386Z ╰──── 2026-10-24T10:51:57.5810686Z  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-24T10:51:57.5810978Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5810981Z 2026-10-24T10:51:57.5811168Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T10:51:57.5811324Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T10:51:57.5811382Z  98 │ () => 2026-10-24T10:51:57.5811447Z  99 │ Gesture.Pan() 2026-10-24T10:51:57.5811523Z ·  ─┬─ 2026-10-24T10:51:57.5811652Z · ╰── `Pan` may be a component 2026-10-24T10:51:57.5811731Z 100 │ .enabled(!props.disabled) 2026-10-24T10:51:57.5811786Z ╰──── 2026-10-24T10:51:57.5812059Z  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-24T10:51:57.5812497Z  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-24T10:51:57.5812500Z 2026-10-24T10:51:57.5812685Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:51:57.5812840Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T10:51:57.5812906Z 103 │ .runOnJS(true) 2026-10-24T10:51:57.5813003Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T10:51:57.5813133Z ·  ───┬── 2026-10-24T10:51:57.5813585Z · ╰── 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-24T10:51:57.5813715Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5813838Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T10:51:57.5813961Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T10:51:57.5814027Z 108 │ [props.disabled], 2026-10-24T10:51:57.5814108Z ·  ────────┬─────── 2026-10-24T10:51:57.5814292Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5814463Z 109 │ ); 2026-10-24T10:51:57.5814517Z ╰──── 2026-10-24T10:51:57.5814718Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:51:57.5815026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5815028Z 2026-10-24T10:51:57.5815193Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5815347Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-24T10:51:57.5815526Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T10:51:57.5815690Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T10:51:57.5815829Z ·  ─────┬──── 2026-10-24T10:51:57.5816011Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5816145Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T10:51:57.5816195Z ╰──── 2026-10-24T10:51:57.5816477Z  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-24T10:51:57.5816769Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5816771Z 2026-10-24T10:51:57.5816943Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5817100Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-24T10:51:57.5817189Z 717 │ const snoozePresets = useMemo( 2026-10-24T10:51:57.5817399Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T10:51:57.5817530Z ·  ─────┬──── 2026-10-24T10:51:57.5817706Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5817822Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T10:51:57.5817875Z ╰──── 2026-10-24T10:51:57.5818199Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T10:51:57.5818512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5818514Z 2026-10-24T10:51:57.5818693Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:51:57.5818844Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-24T10:51:57.5819018Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T10:51:57.5819131Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T10:51:57.5819223Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5819398Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T10:51:57.5819459Z 720 │ ); 2026-10-24T10:51:57.5819514Z ╰──── 2026-10-24T10:51:57.5819825Z  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-24T10:51:57.5820134Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5820136Z 2026-10-24T10:51:57.5820314Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:51:57.5820465Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-24T10:51:57.5820533Z 764 │ thread.pinnedAt, 2026-10-24T10:51:57.5820594Z 765 │ variant, 2026-10-24T10:51:57.5820667Z ·  ───┬─── 2026-10-24T10:51:57.5820806Z · ╰── Unnecessary dependency `variant` 2026-10-24T10:51:57.5820864Z 766 │ ], 2026-10-24T10:51:57.5820913Z ╰──── 2026-10-24T10:51:57.5821221Z  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-24T10:51:57.5821527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5821529Z 2026-10-24T10:51:57.5821720Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5821878Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-24T10:51:57.5822009Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T10:51:57.5822146Z 1215 │ 2026-10-24T10:51:57.5822260Z ·  ────────────────────────── 2026-10-24T10:51:57.5822368Z 1216 │ 2026-10-24T10:51:57.5822421Z ╰──── 2026-10-24T10:51:57.5822568Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T10:51:57.5822571Z 2026-10-24T10:51:57.5822827Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5823012Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T10:51:57.5823064Z 117 │ 2026-10-24T10:51:57.5823129Z 118 │ useEffect(() => { 2026-10-24T10:51:57.5823244Z ·  ────┬──── 2026-10-24T10:51:57.5823402Z · ╰── This is the containing effect 2026-10-24T10:51:57.5823482Z 119 │ void refreshNotifications(); 2026-10-24T10:51:57.5823571Z ·  ──────────┬───────── 2026-10-24T10:51:57.5823743Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5823885Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T10:51:57.5823936Z ╰──── 2026-10-24T10:51:57.5824530Z  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-24T10:51:57.5824850Z  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-24T10:51:57.5824853Z 2026-10-24T10:51:57.5825105Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5825288Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T10:51:57.5825340Z 125 │ 2026-10-24T10:51:57.5825405Z 126 │ useEffect(() => { 2026-10-24T10:51:57.5825477Z ·  ────┬──── 2026-10-24T10:51:57.5825606Z · ╰── This is the containing effect 2026-10-24T10:51:57.5825670Z 127 │ if (!isLoaded) { 2026-10-24T10:51:57.5825764Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T10:51:57.5825856Z ·  ──────────┬────────── 2026-10-24T10:51:57.5826028Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5826088Z 129 │ return; 2026-10-24T10:51:57.5826141Z ╰──── 2026-10-24T10:51:57.5826737Z  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-24T10:51:57.5827052Z  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-24T10:51:57.5827055Z 2026-10-24T10:51:57.5827228Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5827348Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T10:51:57.5827413Z 184 │ "options", 2026-10-24T10:51:57.5827508Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T10:51:57.5827616Z ·  ────────────────┬─────────────── 2026-10-24T10:51:57.5827806Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5827902Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T10:51:57.5827954Z ╰──── 2026-10-24T10:51:57.5828459Z  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-24T10:51:57.5828774Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5828777Z 2026-10-24T10:51:57.5828920Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5829039Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T10:51:57.5829130Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T10:51:57.5829225Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T10:51:57.5829332Z ·  ────────────────┬──────────────── 2026-10-24T10:51:57.5829520Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5829614Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T10:51:57.5829672Z ╰──── 2026-10-24T10:51:57.5830131Z  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-24T10:51:57.5830415Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5830418Z 2026-10-24T10:51:57.5830672Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5830832Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-24T10:51:57.5830951Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T10:51:57.5831020Z 284 │ useEffect(() => { 2026-10-24T10:51:57.5831093Z ·  ────┬──── 2026-10-24T10:51:57.5831220Z · ╰── This is the containing effect 2026-10-24T10:51:57.5831307Z 285 │ setNow(new Date().toISOString()); 2026-10-24T10:51:57.5831375Z ·  ───┬── 2026-10-24T10:51:57.5831537Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5831673Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T10:51:57.5831725Z ╰──── 2026-10-24T10:51:57.5832424Z  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-24T10:51:57.5832781Z  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-24T10:51:57.5832783Z 2026-10-24T10:51:57.5832981Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5833145Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-24T10:51:57.5833276Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-24T10:51:57.5833365Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T10:51:57.5833464Z ·  ───────┬────── 2026-10-24T10:51:57.5833633Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T10:51:57.5833748Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T10:51:57.5833799Z ╰──── 2026-10-24T10:51:57.5834087Z  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-24T10:51:57.5834395Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5834397Z 2026-10-24T10:51:57.5834561Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T10:51:57.5834721Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-24T10:51:57.5834807Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T10:51:57.5834965Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T10:51:57.5835086Z ·  ─────┬──── 2026-10-24T10:51:57.5835249Z · ╰── Cannot call impure function 2026-10-24T10:51:57.5835327Z 357 │ const id = setTimeout(() => { 2026-10-24T10:51:57.5835377Z ╰──── 2026-10-24T10:51:57.5835658Z  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-24T10:51:57.5835947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5835949Z 2026-10-24T10:51:57.5836134Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:51:57.5836294Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T10:51:57.5836395Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T10:51:57.5836576Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T10:51:57.5836719Z ·  ─────┬───── 2026-10-24T10:51:57.5836918Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T10:51:57.5836995Z 101 │ const readEditor = useCallback( 2026-10-24T10:51:57.5837045Z ╰──── 2026-10-24T10:51:57.5837430Z  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-24T10:51:57.5837767Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5837770Z 2026-10-24T10:51:57.5837948Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T10:51:57.5838105Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T10:51:57.5838168Z 120 │ setEditor, 2026-10-24T10:51:57.5838232Z 121 │ startEditor, 2026-10-24T10:51:57.5838308Z ·  ─────┬───── 2026-10-24T10:51:57.5838452Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T10:51:57.5838516Z 122 │ hasChanges, 2026-10-24T10:51:57.5838573Z ╰──── 2026-10-24T10:51:57.5838880Z  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-24T10:51:57.5839185Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5839188Z 2026-10-24T10:51:57.5839341Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5839500Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T10:51:57.5839554Z 35 │ 2026-10-24T10:51:57.5839691Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T10:51:57.5839779Z ·  ────────┬──────── 2026-10-24T10:51:57.5839930Z · ╰── `inspectorProgress` originates here 2026-10-24T10:51:57.5840026Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T10:51:57.5840156Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T10:51:57.5840208Z 39 │ 2026-10-24T10:51:57.5840292Z 40 │ const onClosed = props.onClosed; 2026-10-24T10:51:57.5840357Z 41 │ useEffect(() => { 2026-10-24T10:51:57.5840445Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T10:51:57.5840526Z ·  ────────┬──────── 2026-10-24T10:51:57.5840673Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T10:51:57.5840749Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T10:51:57.5840799Z ╰──── 2026-10-24T10:51:57.5841067Z  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-24T10:51:57.5841371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5841374Z 2026-10-24T10:51:57.5841526Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5841682Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T10:51:57.5841774Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T10:51:57.5841904Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T10:51:57.5841993Z ·  ──────────┬───────── 2026-10-24T10:51:57.5842143Z · ╰── `renderedContentWidth` originates here 2026-10-24T10:51:57.5842240Z 39 │ 2026-10-24T10:51:57.5842347Z 40 │ const onClosed = props.onClosed; 2026-10-24T10:51:57.5842409Z 41 │ useEffect(() => { 2026-10-24T10:51:57.5842497Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T10:51:57.5842572Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T10:51:57.5842643Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T10:51:57.5842707Z 45 │ (finished) => { 2026-10-24T10:51:57.5842844Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T10:51:57.5842916Z 47 │ runOnJS(onClosed)(); 2026-10-24T10:51:57.5842972Z 48 │ } 2026-10-24T10:51:57.5843027Z 49 │ }, 2026-10-24T10:51:57.5843080Z 50 │ ); 2026-10-24T10:51:57.5843211Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T10:51:57.5843289Z 52 │ renderedInspectorWidth.set( 2026-10-24T10:51:57.5843437Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T10:51:57.5843492Z 54 │ ); 2026-10-24T10:51:57.5843545Z 55 │ }, [ 2026-10-24T10:51:57.5843612Z 56 │ inspectorProgress, 2026-10-24T10:51:57.5843677Z 57 │ inspectorVisible, 2026-10-24T10:51:57.5843738Z 58 │ inspectorWidth, 2026-10-24T10:51:57.5843798Z 59 │ onClosed, 2026-10-24T10:51:57.5843869Z 60 │ renderedInspectorWidth, 2026-10-24T10:51:57.5843926Z 61 │ resizing, 2026-10-24T10:51:57.5843980Z 62 │ ]); 2026-10-24T10:51:57.5844031Z 63 │ 2026-10-24T10:51:57.5844093Z 64 │ useEffect(() => { 2026-10-24T10:51:57.5844182Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T10:51:57.5844269Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T10:51:57.5844367Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T10:51:57.5844460Z ·  ──────────┬───────── 2026-10-24T10:51:57.5844619Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T10:51:57.5844677Z 68 │ return; 2026-10-24T10:51:57.5844729Z ╰──── 2026-10-24T10:51:57.5844990Z  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-24T10:51:57.5845290Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5845292Z 2026-10-24T10:51:57.5845457Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T10:51:57.5845647Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T10:51:57.5845790Z 219 │ 2026-10-24T10:51:57.5845929Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T10:51:57.5846036Z ·  ──┬─ 2026-10-24T10:51:57.5846200Z · ╰── 'U+001B' is a control character. 2026-10-24T10:51:57.5846264Z 221 │ 2026-10-24T10:51:57.5846315Z ╰──── 2026-10-24T10:51:57.5846543Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T10:51:57.5846545Z 2026-10-24T10:51:57.5846750Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:51:57.5846933Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T10:51:57.5847120Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T10:51:57.5847219Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5847335Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5847790Z · ╰── 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-24T10:51:57.5847863Z 229 │ mostRecentEventCount, 2026-10-24T10:51:57.5847917Z 230 │ ); 2026-10-24T10:51:57.5848040Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T10:51:57.5848173Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T10:51:57.5848378Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5848463Z 232 │ const assumedValue = props.value; 2026-10-24T10:51:57.5848514Z ╰──── 2026-10-24T10:51:57.5848680Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:51:57.5848990Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5848993Z 2026-10-24T10:51:57.5849207Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5849340Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T10:51:57.5849489Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T10:51:57.5849579Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5849669Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5850117Z · ╰── 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-24T10:51:57.5850190Z 240 │ controlledEventCount, 2026-10-24T10:51:57.5850255Z 241 │ assumedValue, 2026-10-24T10:51:57.5850310Z 242 │ ); 2026-10-24T10:51:57.5850465Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T10:51:57.5850604Z ·  ───────────┬────────── 2026-10-24T10:51:57.5850908Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T10:51:57.5851034Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T10:51:57.5851085Z ╰──── 2026-10-24T10:51:57.5851500Z  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-24T10:51:57.5851811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5851814Z 2026-10-24T10:51:57.5851957Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5852096Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T10:51:57.5852221Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:51:57.5852333Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:51:57.5852448Z ·  ─────────────┬──────────── 2026-10-24T10:51:57.5852612Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5852667Z 165 │ }); 2026-10-24T10:51:57.5852717Z ╰──── 2026-10-24T10:51:57.5853175Z  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-24T10:51:57.5853465Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5853470Z 2026-10-24T10:51:57.5853613Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5853745Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T10:51:57.5853866Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:51:57.5853975Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:51:57.5854089Z ·  ─────────────┬──────────── 2026-10-24T10:51:57.5854292Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5854348Z 165 │ }); 2026-10-24T10:51:57.5854399Z ╰──── 2026-10-24T10:51:57.5854864Z  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-24T10:51:57.5855153Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5855155Z 2026-10-24T10:51:57.5855296Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5855431Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T10:51:57.5855486Z 165 │ }); 2026-10-24T10:51:57.5855574Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T10:51:57.5855694Z ·  ─────────┬────────────┬─── 2026-10-24T10:51:57.5855927Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5856069Z · ╰── This value is a ref 2026-10-24T10:51:57.5856140Z 167 │ return JSON.stringify( 2026-10-24T10:51:57.5856190Z ╰──── 2026-10-24T10:51:57.5856643Z  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-24T10:51:57.5856928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5856930Z 2026-10-24T10:51:57.5857072Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5857219Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T10:51:57.5857314Z 207 │ mostRecentEventCount, 2026-10-24T10:51:57.5857401Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5857504Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5857689Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5857742Z 209 │ ); 2026-10-24T10:51:57.5857793Z ╰──── 2026-10-24T10:51:57.5858246Z  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-24T10:51:57.5858535Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5858541Z 2026-10-24T10:51:57.5858683Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5858814Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T10:51:57.5858884Z 213 │ mostRecentEventCount, 2026-10-24T10:51:57.5858971Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5859071Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5859254Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5859308Z 215 │ ); 2026-10-24T10:51:57.5859359Z ╰──── 2026-10-24T10:51:57.5859817Z  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-24T10:51:57.5860104Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5860107Z 2026-10-24T10:51:57.5860299Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:51:57.5860432Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T10:51:57.5860553Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:51:57.5860663Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:51:57.5860772Z ·  ─────────┬──────── 2026-10-24T10:51:57.5861289Z · ╰── 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-24T10:51:57.5861372Z 165 │ }); 2026-10-24T10:51:57.5861461Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T10:51:57.5861530Z 167 │ return JSON.stringify( 2026-10-24T10:51:57.5861692Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T10:51:57.5861759Z 169 │ const record = 2026-10-24T10:51:57.5861837Z 170 │ token.type === "context" 2026-10-24T10:51:57.5862000Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T10:51:57.5862066Z 172 │ : undefined; 2026-10-24T10:51:57.5862180Z 173 │ const presentation = contextChipPresentation( 2026-10-24T10:51:57.5862290Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T10:51:57.5862352Z 175 │ record, 2026-10-24T10:51:57.5862411Z 176 │ ); 2026-10-24T10:51:57.5862494Z 177 │ const icon = contextChipIcon( 2026-10-24T10:51:57.5862559Z 178 │ presentation, 2026-10-24T10:51:57.5862701Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T10:51:57.5862759Z 180 │ ); 2026-10-24T10:51:57.5862820Z 181 │ return { 2026-10-24T10:51:57.5862890Z 182 │ type: token.type, 2026-10-24T10:51:57.5862964Z 183 │ source: token.source, 2026-10-24T10:51:57.5863034Z 184 │ start: token.start, 2026-10-24T10:51:57.5863100Z 185 │ end: token.end, 2026-10-24T10:51:57.5863252Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T10:51:57.5863315Z 187 │ label: 2026-10-24T10:51:57.5863392Z 188 │ token.type === "skill" 2026-10-24T10:51:57.5863500Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T10:51:57.5863580Z 190 │ : token.type === "context" 2026-10-24T10:51:57.5863814Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T10:51:57.5863895Z 192 │ : basename(token.value), 2026-10-24T10:51:57.5864038Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T10:51:57.5864128Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T10:51:57.5864215Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T10:51:57.5864272Z 196 │ }; 2026-10-24T10:51:57.5864334Z 197 │ }), 2026-10-24T10:51:57.5864390Z 198 │ ); 2026-10-24T10:51:57.5864522Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T10:51:57.5864670Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T10:51:57.5864874Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5865012Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T10:51:57.5865063Z ╰──── 2026-10-24T10:51:57.5865268Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:51:57.5865624Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5865653Z 2026-10-24T10:51:57.5865840Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:51:57.5865974Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T10:51:57.5866104Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T10:51:57.5866204Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T10:51:57.5866294Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5866744Z · ╰── 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-24T10:51:57.5866834Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T10:51:57.5866900Z 256 │ value, 2026-10-24T10:51:57.5866980Z 257 │ selection: nextSelection, 2026-10-24T10:51:57.5867036Z 258 │ }); 2026-10-24T10:51:57.5867119Z 259 │ return acknowledgedEventCount; 2026-10-24T10:51:57.5867184Z 260 │ }, 2026-10-24T10:51:57.5867238Z 261 │ [], 2026-10-24T10:51:57.5867328Z ·  ─┬ 2026-10-24T10:51:57.5867507Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5867561Z 262 │ ); 2026-10-24T10:51:57.5867611Z ╰──── 2026-10-24T10:51:57.5867812Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:51:57.5868127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5868132Z 2026-10-24T10:51:57.5868389Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5868520Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T10:51:57.5868706Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T10:51:57.5868777Z 168 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5868854Z ·  ───────┬─────── 2026-10-24T10:51:57.5868986Z · ╰── This is the containing effect 2026-10-24T10:51:57.5869070Z 169 │ if (faviconRequest === null) return; 2026-10-24T10:51:57.5869123Z 170 │ 2026-10-24T10:51:57.5869253Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T10:51:57.5869354Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T10:51:57.5869445Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5869615Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5869682Z 173 │ return endRequest; 2026-10-24T10:51:57.5869733Z ╰──── 2026-10-24T10:51:57.5870323Z  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-24T10:51:57.5870641Z  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-24T10:51:57.5870692Z 2026-10-24T10:51:57.5870916Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T10:51:57.5871058Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T10:51:57.5871193Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T10:51:57.5871307Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T10:51:57.5871382Z ·  ──┬── 2026-10-24T10:51:57.5871508Z · ╰── 'Image' is imported here 2026-10-24T10:51:57.5871561Z 18 │ 2026-10-24T10:51:57.5871611Z ╰──── 2026-10-24T10:51:57.5871708Z  help: Consider removing this import. 2026-10-24T10:51:57.5871711Z 2026-10-24T10:51:57.5871922Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T10:51:57.5872113Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T10:51:57.5872275Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T10:51:57.5872364Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5872454Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5872903Z · ╰── 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-24T10:51:57.5872977Z 227 │ mostRecentEventCount, 2026-10-24T10:51:57.5873031Z 228 │ ); 2026-10-24T10:51:57.5873152Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T10:51:57.5873290Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T10:51:57.5873490Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5873570Z 230 │ const assumedValue = props.value; 2026-10-24T10:51:57.5873623Z ╰──── 2026-10-24T10:51:57.5873788Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T10:51:57.5874096Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5874098Z 2026-10-24T10:51:57.5874309Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5874514Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T10:51:57.5874694Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T10:51:57.5874781Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5874869Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5875326Z · ╰── 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-24T10:51:57.5875400Z 238 │ controlledEventCount, 2026-10-24T10:51:57.5875465Z 239 │ assumedValue, 2026-10-24T10:51:57.5875521Z 240 │ ); 2026-10-24T10:51:57.5875677Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T10:51:57.5875816Z ·  ───────────┬────────── 2026-10-24T10:51:57.5876027Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T10:51:57.5876114Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T10:51:57.5876164Z ╰──── 2026-10-24T10:51:57.5876577Z  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-24T10:51:57.5876886Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5876889Z 2026-10-24T10:51:57.5877036Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5877207Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T10:51:57.5877328Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:51:57.5877440Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:51:57.5877557Z ·  ─────────────┬──────────── 2026-10-24T10:51:57.5877722Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5877777Z 163 │ }); 2026-10-24T10:51:57.5877829Z ╰──── 2026-10-24T10:51:57.5878289Z  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-24T10:51:57.5878581Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5878587Z 2026-10-24T10:51:57.5878732Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5878881Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T10:51:57.5879001Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:51:57.5879111Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:51:57.5879226Z ·  ─────────────┬──────────── 2026-10-24T10:51:57.5879428Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5879530Z 163 │ }); 2026-10-24T10:51:57.5879621Z ╰──── 2026-10-24T10:51:57.5880077Z  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-24T10:51:57.5880363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5880365Z 2026-10-24T10:51:57.5880508Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5880650Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T10:51:57.5880706Z 163 │ }); 2026-10-24T10:51:57.5880794Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T10:51:57.5880919Z ·  ─────────┬────────────┬─── 2026-10-24T10:51:57.5881110Z · │ ╰── Cannot update ref value during render 2026-10-24T10:51:57.5881227Z · ╰── This value is a ref 2026-10-24T10:51:57.5881297Z 165 │ return JSON.stringify( 2026-10-24T10:51:57.5881348Z ╰──── 2026-10-24T10:51:57.5881801Z  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-24T10:51:57.5882085Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5882088Z 2026-10-24T10:51:57.5882235Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5882376Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T10:51:57.5882448Z 205 │ mostRecentEventCount, 2026-10-24T10:51:57.5882535Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5882639Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5882822Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5882877Z 207 │ ); 2026-10-24T10:51:57.5882929Z ╰──── 2026-10-24T10:51:57.5883388Z  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-24T10:51:57.5883680Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5883682Z 2026-10-24T10:51:57.5883823Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5883965Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T10:51:57.5884035Z 211 │ mostRecentEventCount, 2026-10-24T10:51:57.5884121Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T10:51:57.5884220Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5884404Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T10:51:57.5884459Z 213 │ ); 2026-10-24T10:51:57.5884510Z ╰──── 2026-10-24T10:51:57.5885016Z  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-24T10:51:57.5885333Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5885335Z 2026-10-24T10:51:57.5885521Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:51:57.5885658Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T10:51:57.5885779Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T10:51:57.5885888Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T10:51:57.5886000Z ·  ─────────┬──────── 2026-10-24T10:51:57.5886460Z · ╰── 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-24T10:51:57.5886517Z 163 │ }); 2026-10-24T10:51:57.5886605Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T10:51:57.5886675Z 165 │ return JSON.stringify( 2026-10-24T10:51:57.5886838Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T10:51:57.5886904Z 167 │ const record = 2026-10-24T10:51:57.5886981Z 168 │ token.type === "context" 2026-10-24T10:51:57.5887150Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T10:51:57.5887231Z 170 │ : undefined; 2026-10-24T10:51:57.5887361Z 171 │ const presentation = contextChipPresentation( 2026-10-24T10:51:57.5887469Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T10:51:57.5887533Z 173 │ record, 2026-10-24T10:51:57.5887591Z 174 │ ); 2026-10-24T10:51:57.5887677Z 175 │ const icon = contextChipIcon( 2026-10-24T10:51:57.5887743Z 176 │ presentation, 2026-10-24T10:51:57.5887885Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T10:51:57.5887942Z 178 │ ); 2026-10-24T10:51:57.5888005Z 179 │ return { 2026-10-24T10:51:57.5888074Z 180 │ type: token.type, 2026-10-24T10:51:57.5888152Z 181 │ source: token.source, 2026-10-24T10:51:57.5888223Z 182 │ start: token.start, 2026-10-24T10:51:57.5888293Z 183 │ end: token.end, 2026-10-24T10:51:57.5888441Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T10:51:57.5888502Z 185 │ label: 2026-10-24T10:51:57.5888579Z 186 │ token.type === "skill" 2026-10-24T10:51:57.5888685Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T10:51:57.5888767Z 188 │ : token.type === "context" 2026-10-24T10:51:57.5889001Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T10:51:57.5889084Z 190 │ : basename(token.value), 2026-10-24T10:51:57.5889226Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T10:51:57.5889316Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T10:51:57.5889454Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T10:51:57.5889540Z 194 │ }; 2026-10-24T10:51:57.5889595Z 195 │ }), 2026-10-24T10:51:57.5889650Z 196 │ ); 2026-10-24T10:51:57.5889780Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T10:51:57.5889929Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T10:51:57.5890130Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5890267Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T10:51:57.5890319Z ╰──── 2026-10-24T10:51:57.5890521Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:51:57.5890835Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5890841Z 2026-10-24T10:51:57.5891024Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T10:51:57.5891164Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T10:51:57.5891294Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T10:51:57.5891394Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T10:51:57.5891484Z ·  ───────────┬─────────── 2026-10-24T10:51:57.5891941Z · ╰── 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-24T10:51:57.5892034Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T10:51:57.5892096Z 254 │ value, 2026-10-24T10:51:57.5892173Z 255 │ selection: nextSelection, 2026-10-24T10:51:57.5892230Z 256 │ }); 2026-10-24T10:51:57.5892314Z 257 │ return acknowledgedEventCount; 2026-10-24T10:51:57.5892368Z 258 │ }, 2026-10-24T10:51:57.5892420Z 259 │ [], 2026-10-24T10:51:57.5892488Z ·  ─┬ 2026-10-24T10:51:57.5892668Z · ╰── This dependency list is missing values used by the callback 2026-10-24T10:51:57.5892721Z 260 │ ); 2026-10-24T10:51:57.5892771Z ╰──── 2026-10-24T10:51:57.5892973Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T10:51:57.5893323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5893353Z 2026-10-24T10:51:57.5893497Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5893648Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T10:51:57.5893704Z 493 │ > 2026-10-24T10:51:57.5893780Z 494 │ {props.children(close)} 2026-10-24T10:51:57.5893870Z ·  ──┬── 2026-10-24T10:51:57.5894024Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5894100Z 495 │ 2026-10-24T10:51:57.5894151Z ╰──── 2026-10-24T10:51:57.5894612Z  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-24T10:51:57.5894901Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5894904Z 2026-10-24T10:51:57.5895159Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5895292Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T10:51:57.5895345Z 57 │ 2026-10-24T10:51:57.5895410Z 58 │ useEffect(() => { 2026-10-24T10:51:57.5895480Z ·  ────┬──── 2026-10-24T10:51:57.5895610Z · ╰── This is the containing effect 2026-10-24T10:51:57.5895708Z 59 │ const controller = new AbortController(); 2026-10-24T10:51:57.5895780Z 60 │ setLoadState("pending"); 2026-10-24T10:51:57.5895853Z ·  ──────┬───── 2026-10-24T10:51:57.5896018Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5896177Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T10:51:57.5896229Z ╰──── 2026-10-24T10:51:57.5896815Z  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-24T10:51:57.5897140Z  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-24T10:51:57.5897144Z 2026-10-24T10:51:57.5897376Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5897509Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T10:51:57.5897591Z 70 │ return () => controller.abort(); 2026-10-24T10:51:57.5897685Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T10:51:57.5897853Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T10:51:57.5898077Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T10:51:57.5898323Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T10:51:57.5898486Z · ╰── Unnecessary dependency `player_0` 2026-10-24T10:51:57.5898538Z 72 │ 2026-10-24T10:51:57.5898591Z ╰──── 2026-10-24T10:51:57.5898880Z  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-24T10:51:57.5899187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5899190Z 2026-10-24T10:51:57.5899387Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5899552Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T10:51:57.5899609Z 154 │ } 2026-10-24T10:51:57.5899675Z 155 │ }, [wrappedRender]); 2026-10-24T10:51:57.5899753Z ·  ──────┬────── 2026-10-24T10:51:57.5899903Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T10:51:57.5899956Z 156 │ 2026-10-24T10:51:57.5900007Z ╰──── 2026-10-24T10:51:57.5900291Z  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-24T10:51:57.5900598Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5900601Z 2026-10-24T10:51:57.5900845Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T10:51:57.5901008Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T10:51:57.5901063Z 799 │ > 2026-10-24T10:51:57.5901191Z 800 │ 2026-10-24T10:51:57.5901312Z ·  ──────────────────── 2026-10-24T10:51:57.5901411Z 801 │ 2026-10-24T10:51:57.5901462Z ╰──── 2026-10-24T10:51:57.5901681Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T10:51:57.5901818Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T10:51:57.5901821Z 2026-10-24T10:51:57.5902023Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5902155Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T10:51:57.5902207Z 81 │ }, 2026-10-24T10:51:57.5902269Z 82 │ [draftKey], 2026-10-24T10:51:57.5902342Z ·  ────┬─── 2026-10-24T10:51:57.5902476Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T10:51:57.5902528Z 83 │ ); 2026-10-24T10:51:57.5902579Z ╰──── 2026-10-24T10:51:57.5902866Z  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-24T10:51:57.5903171Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5903173Z 2026-10-24T10:51:57.5903359Z ⚠ react(refs): Cannot access refs during render 2026-10-24T10:51:57.5903543Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T10:51:57.5903721Z 151 │ 2026-10-24T10:51:57.5903801Z 152 │ {props.children(open)} 2026-10-24T10:51:57.5903894Z ·  ──┬─ 2026-10-24T10:51:57.5904049Z · ╰── Cannot access ref value during render 2026-10-24T10:51:57.5904112Z 153 │ 2026-10-24T10:51:57.5904163Z ╰──── 2026-10-24T10:51:57.5904626Z  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-24T10:51:57.5904914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T10:51:57.5904916Z 2026-10-24T10:51:57.5905111Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T10:51:57.5905260Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T10:51:57.5905341Z 139 │ if (action.id !== undefined) { 2026-10-24T10:51:57.5905417Z 140 │ props.onPressAction?.({ 2026-10-24T10:51:57.5905488Z ·  ──┬── 2026-10-24T10:51:57.5905615Z · ╰── Missing dependency `props` 2026-10-24T10:51:57.5905712Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T10:51:57.5905859Z 142 │ } as Parameters>[0]); 2026-10-24T10:51:57.5905915Z 143 │ } 2026-10-24T10:51:57.5905970Z 144 │ }, 2026-10-24T10:51:57.5906050Z 145 │ [close, props.onPressAction], 2026-10-24T10:51:57.5906142Z ·  ─────────┬───────── 2026-10-24T10:51:57.5906351Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T10:51:57.5906407Z 146 │ ); 2026-10-24T10:51:57.5906461Z ╰──── 2026-10-24T10:51:57.5906934Z  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-24T10:51:57.5907260Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5907295Z 2026-10-24T10:51:57.5907489Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5907634Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-24T10:51:57.5907741Z 266 │ {record.elements?.map((element, index) => ( 2026-10-24T10:51:57.5907904Z 267 │ 2026-10-24T10:51:57.5908054Z ·  ─────────────────────────────────────────────────────── 2026-10-24T10:51:57.5908129Z 268 │ { 2026-10-24T10:51:57.5910966Z ╰──── 2026-10-24T10:51:57.5911249Z  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-24T10:51:57.5911539Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T10:51:57.5911541Z 2026-10-24T10:51:57.5911797Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5911936Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T10:51:57.5912091Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T10:51:57.5912156Z 67 │ useEffect(() => { 2026-10-24T10:51:57.5912227Z ·  ────┬──── 2026-10-24T10:51:57.5912353Z · ╰── This is the containing effect 2026-10-24T10:51:57.5912417Z 68 │ setUri(null); 2026-10-24T10:51:57.5912486Z ·  ───┬── 2026-10-24T10:51:57.5912652Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5912715Z 69 │ setError(null); 2026-10-24T10:51:57.5912766Z ╰──── 2026-10-24T10:51:57.5913423Z  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-24T10:51:57.5913781Z  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-24T10:51:57.5913783Z 2026-10-24T10:51:57.5913983Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5914117Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T10:51:57.5914173Z 90 │ }; 2026-10-24T10:51:57.5914248Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T10:51:57.5914366Z ·  ──────┬───── ───┬─── 2026-10-24T10:51:57.5914544Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T10:51:57.5914696Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T10:51:57.5914831Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T10:51:57.5914883Z ╰──── 2026-10-24T10:51:57.5915169Z  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-24T10:51:57.5915475Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5915477Z 2026-10-24T10:51:57.5915688Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5915825Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T10:51:57.5915894Z 212 │ useEffect(() => { 2026-10-24T10:51:57.5916009Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T10:51:57.5916106Z ·  ──┬── 2026-10-24T10:51:57.5916255Z · ╰── Missing dependency `props` 2026-10-24T10:51:57.5916360Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T10:51:57.5916471Z ·  ──────────┬───────── 2026-10-24T10:51:57.5916695Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T10:51:57.5916766Z 215 │ const { source } = props; 2026-10-24T10:51:57.5916818Z ╰──── 2026-10-24T10:51:57.5917310Z  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-24T10:51:57.5917647Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5917649Z 2026-10-24T10:51:57.5917904Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5918056Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T10:51:57.5918192Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T10:51:57.5918256Z 356 │ useEffect(() => { 2026-10-24T10:51:57.5918327Z ·  ────┬──── 2026-10-24T10:51:57.5918458Z · ╰── This is the containing effect 2026-10-24T10:51:57.5918549Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T10:51:57.5918609Z 358 │ return; 2026-10-24T10:51:57.5918664Z 359 │ } 2026-10-24T10:51:57.5918760Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T10:51:57.5918851Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T10:51:57.5918953Z ·  ──────────────┬────────────── 2026-10-24T10:51:57.5919128Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5919189Z 362 │ return; 2026-10-24T10:51:57.5919239Z ╰──── 2026-10-24T10:51:57.5919839Z  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-24T10:51:57.5920160Z  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-24T10:51:57.5920162Z 2026-10-24T10:51:57.5920415Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5920563Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T10:51:57.5920615Z 447 │ 2026-10-24T10:51:57.5920681Z 448 │ useEffect(() => { 2026-10-24T10:51:57.5920753Z ·  ────┬──── 2026-10-24T10:51:57.5920879Z · ╰── This is the containing effect 2026-10-24T10:51:57.5920982Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T10:51:57.5921045Z 450 │ return; 2026-10-24T10:51:57.5921101Z 451 │ } 2026-10-24T10:51:57.5921241Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T10:51:57.5921374Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T10:51:57.5921483Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T10:51:57.5921537Z 455 │ } 2026-10-24T10:51:57.5921677Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T10:51:57.5921802Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T10:51:57.5921912Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T10:51:57.5921983Z 459 │ const directProject = 2026-10-24T10:51:57.5922050Z 460 │ projects.find( 2026-10-24T10:51:57.5922160Z 461 │ (project) => 2026-10-24T10:51:57.5922366Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T10:51:57.5922428Z 463 │ ) ?? null; 2026-10-24T10:51:57.5922481Z 464 │ 2026-10-24T10:51:57.5922548Z 465 │ if (directProject) { 2026-10-24T10:51:57.5922687Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T10:51:57.5922823Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T10:51:57.5922983Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T10:51:57.5923117Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T10:51:57.5923179Z 470 │ return; 2026-10-24T10:51:57.5923238Z 471 │ } 2026-10-24T10:51:57.5923340Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T10:51:57.5923402Z 473 │ if ( 2026-10-24T10:51:57.5923545Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T10:51:57.5923644Z 475 │ selectedProject.id !== directProject.id 2026-10-24T10:51:57.5923702Z 476 │ ) { 2026-10-24T10:51:57.5923786Z 477 │ setProject(directProject); 2026-10-24T10:51:57.5923850Z 478 │ return; 2026-10-24T10:51:57.5923910Z 479 │ } 2026-10-24T10:51:57.5923993Z 480 │ if (!flow.draftKey) return; 2026-10-24T10:51:57.5924130Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T10:51:57.5924273Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T10:51:57.5924385Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T10:51:57.5924470Z 484 │ workspaceSelection: { 2026-10-24T10:51:57.5924543Z 485 │ mode: "local", 2026-10-24T10:51:57.5924647Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T10:51:57.5924781Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T10:51:57.5924863Z 488 │ startFromOrigin: false, 2026-10-24T10:51:57.5924922Z 489 │ }, 2026-10-24T10:51:57.5924981Z 490 │ }); 2026-10-24T10:51:57.5925037Z 491 │ } 2026-10-24T10:51:57.5925162Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T10:51:57.5925220Z 493 │ if ( 2026-10-24T10:51:57.5925360Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T10:51:57.5925457Z 495 │ selectedProject.id === directProject.id 2026-10-24T10:51:57.5925520Z 496 │ ) { 2026-10-24T10:51:57.5925586Z 497 │ return; 2026-10-24T10:51:57.5925641Z 498 │ } 2026-10-24T10:51:57.5925723Z 499 │ setProject(directProject); 2026-10-24T10:51:57.5925782Z 500 │ return; 2026-10-24T10:51:57.5925836Z 501 │ } 2026-10-24T10:51:57.5925888Z 502 │ 2026-10-24T10:51:57.5925965Z 503 │ if (projects.length > 0) { 2026-10-24T10:51:57.5926060Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T10:51:57.5926166Z ·  ──────────────┬────────────── 2026-10-24T10:51:57.5926347Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5926402Z 505 │ } 2026-10-24T10:51:57.5926452Z ╰──── 2026-10-24T10:51:57.5927144Z  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-24T10:51:57.5927531Z  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-24T10:51:57.5927534Z 2026-10-24T10:51:57.5927790Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T10:51:57.5927940Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T10:51:57.5927993Z 545 │ 2026-10-24T10:51:57.5928059Z 546 │ useEffect(() => { 2026-10-24T10:51:57.5928130Z ·  ────┬──── 2026-10-24T10:51:57.5928261Z · ╰── This is the containing effect 2026-10-24T10:51:57.5928358Z 547 │ const shareId = props.incomingShareId; 2026-10-24T10:51:57.5928439Z 548 │ const draftKey = flow.draftKey; 2026-10-24T10:51:57.5928539Z 549 │ const destinationProject = selectedProject; 2026-10-24T10:51:57.5928678Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T10:51:57.5928804Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T10:51:57.5928893Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T10:51:57.5928969Z 553 │ !initialEnvironmentId || 2026-10-24T10:51:57.5929038Z 554 │ !initialProjectId || 2026-10-24T10:51:57.5929168Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T10:51:57.5929271Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T10:51:57.5929333Z 557 │ if ( 2026-10-24T10:51:57.5929397Z 558 │ !shareId || 2026-10-24T10:51:57.5929461Z 559 │ !draftKey || 2026-10-24T10:51:57.5929533Z 560 │ !destinationProject || 2026-10-24T10:51:57.5929619Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T10:51:57.5929709Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T10:51:57.5929765Z 563 │ ) { 2026-10-24T10:51:57.5929825Z 564 │ return; 2026-10-24T10:51:57.5929878Z 565 │ } 2026-10-24T10:51:57.5929971Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T10:51:57.5930027Z 567 │ if ( 2026-10-24T10:51:57.5930139Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T10:51:57.5930250Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T10:51:57.5930303Z 570 │ ) { 2026-10-24T10:51:57.5930363Z 571 │ return; 2026-10-24T10:51:57.5930423Z 572 │ } 2026-10-24T10:51:57.5930478Z 573 │ 2026-10-24T10:51:57.5930545Z 574 │ if (!incomingShare) { 2026-10-24T10:51:57.5930741Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T10:51:57.5930868Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T10:51:57.5930933Z 577 │ Dialog.alert( 2026-10-24T10:51:57.5931017Z 578 │ "Shared content unavailable", 2026-10-24T10:51:57.5931190Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T10:51:57.5931248Z 580 │ ); 2026-10-24T10:51:57.5931301Z 581 │ } 2026-10-24T10:51:57.5931359Z 582 │ return; 2026-10-24T10:51:57.5931412Z 583 │ } 2026-10-24T10:51:57.5931463Z 584 │ 2026-10-24T10:51:57.5931517Z 585 │ if ( 2026-10-24T10:51:57.5931726Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T10:51:57.5931857Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T10:51:57.5931912Z 588 │ ) { 2026-10-24T10:51:57.5931969Z 589 │ return; 2026-10-24T10:51:57.5932024Z 590 │ } 2026-10-24T10:51:57.5932077Z 591 │ 2026-10-24T10:51:57.5932216Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T10:51:57.5932337Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T10:51:57.5932390Z 594 │ } 2026-10-24T10:51:57.5932497Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T10:51:57.5932565Z 596 │ const draftBackup = 2026-10-24T10:51:57.5932748Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T10:51:57.5932888Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T10:51:57.5932982Z 599 │ const importToken = Symbol(importKey); 2026-10-24T10:51:57.5933060Z 600 │ let didReserveShare = false; 2026-10-24T10:51:57.5933135Z 601 │ let didConsumeShare = false; 2026-10-24T10:51:57.5933213Z 602 │ let needsDraftRestore = false; 2026-10-24T10:51:57.5933323Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T10:51:57.5933404Z 604 │ setImportingShareKey(importKey); 2026-10-24T10:51:57.5933489Z ·  ──────────┬───────── 2026-10-24T10:51:57.5933662Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T10:51:57.5933731Z 605 │ void (async () => { 2026-10-24T10:51:57.5933781Z ╰──── 2026-10-24T10:51:57.5934376Z  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-24T10:51:57.5934697Z  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-24T10:51:57.5934699Z 2026-10-24T10:51:57.5934899Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5935050Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T10:51:57.5935124Z 523 │ props.initialProjectRef, 2026-10-24T10:51:57.5935195Z 524 │ props.incomingShareId, 2026-10-24T10:51:57.5935281Z ·  ──────────┬────────── 2026-10-24T10:51:57.5935452Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T10:51:57.5935524Z 525 │ props.pendingTaskId, 2026-10-24T10:51:57.5935576Z ╰──── 2026-10-24T10:51:57.5935866Z  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-24T10:51:57.5936174Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5936177Z 2026-10-24T10:51:57.5936388Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T10:51:57.5936537Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T10:51:57.5936699Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T10:51:57.5936795Z 543 │ flow.loadBranches(); 2026-10-24T10:51:57.5936865Z ·  ──┬─ 2026-10-24T10:51:57.5936986Z · ╰── Missing dependency `flow` 2026-10-24T10:51:57.5937079Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T10:51:57.5937164Z ·  ────────┬──────── 2026-10-24T10:51:57.5937387Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T10:51:57.5937443Z 545 │ 2026-10-24T10:51:57.5937496Z ╰──── 2026-10-24T10:51:57.5937916Z  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-24T10:51:57.5938226Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5938229Z 2026-10-24T10:51:57.5938427Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T10:51:57.5938575Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T10:51:57.5938640Z 765 │ flow.draftKey, 2026-10-24T10:51:57.5938716Z 766 │ hasImportedIncomingShare, 2026-10-24T10:51:57.5938806Z ·  ────────────┬─────────── 2026-10-24T10:51:57.5938979Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T10:51:57.5939045Z 767 │ incomingShare, 2026-10-24T10:51:57.5939132Z 768 │ isIncomingShareInboxLoading, 2026-10-24T10:51:57.5939230Z ·  ─────────────┬───────────── 2026-10-24T10:51:57.5939410Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T10:51:57.5939489Z 769 │ isIncomingShareUnavailable, 2026-10-24T10:51:57.5939561Z 770 │ props.incomingShareId, 2026-10-24T10:51:57.5939655Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T10:51:57.5939741Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T10:51:57.5939814Z 773 │ releaseShareReservation, 2026-10-24T10:51:57.5939877Z 774 │ reserveShare, 2026-10-24T10:51:57.5939961Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T10:51:57.5940029Z 776 │ selectedProject, 2026-10-24T10:51:57.5940096Z 777 │ shareImportAttempt, 2026-10-24T10:51:57.5940181Z ·  ─────────┬──────── 2026-10-24T10:51:57.5940398Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T10:51:57.5940481Z 778 │ ]); 2026-10-24T10:51:57.5940532Z ╰──── 2026-10-24T10:51:57.5940819Z  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-24T10:51:57.5941126Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T10:51:57.5941128Z 2026-10-24T10:51:57.5941315Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T10:51:57.5941430Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T10:51:57.5941486Z 7 │ () => 2026-10-24T10:51:57.5941555Z 8 │ Gesture.Hover() 2026-10-24T10:51:57.5941632Z ·  ──┬── 2026-10-24T10:51:57.5941765Z · ╰── `Hover` may be a component 2026-10-24T10:51:57.5941840Z 9 │ .manualActivation(true) 2026-10-24T10:51:57.5941893Z ╰──── 2026-10-24T10:51:57.5942167Z  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-24T10:51:57.5942614Z  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-24T10:51:57.5942616Z 2026-10-24T10:51:57.5942775Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5942945Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T10:51:57.5943001Z 107 │ ); 2026-10-24T10:51:57.5943153Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T10:51:57.5943241Z ·  ─────────┬──────── 2026-10-24T10:51:57.5943391Z · ╰── `separationProgress` originates here 2026-10-24T10:51:57.5943442Z 109 │ 2026-10-24T10:51:57.5943506Z 110 │ useEffect(() => { 2026-10-24T10:51:57.5943681Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T10:51:57.5943763Z ·  ─────────┬──────── 2026-10-24T10:51:57.5943912Z · ╰── `separationProgress` cannot be modified 2026-10-24T10:51:57.5944028Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T10:51:57.5944084Z ╰──── 2026-10-24T10:51:57.5944348Z  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-24T10:51:57.5944651Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5944653Z 2026-10-24T10:51:57.5944805Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5944966Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T10:51:57.5945079Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T10:51:57.5945194Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T10:51:57.5945322Z ·  ──────┬───── 2026-10-24T10:51:57.5945487Z · ╰── `capsuleWidth` originates here 2026-10-24T10:51:57.5945598Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T10:51:57.5945713Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5945818Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T10:51:57.5945913Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T10:51:57.5945974Z 134 │ return; 2026-10-24T10:51:57.5946029Z 135 │ } 2026-10-24T10:51:57.5946132Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T10:51:57.5946218Z 137 │ measuredWidthRef.current = width; 2026-10-24T10:51:57.5946359Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T10:51:57.5946434Z ·  ──────┬───── 2026-10-24T10:51:57.5946577Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T10:51:57.5946635Z 139 │ }; 2026-10-24T10:51:57.5946685Z ╰──── 2026-10-24T10:51:57.5946945Z  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-24T10:51:57.5947255Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5947258Z 2026-10-24T10:51:57.5947435Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5947596Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T10:51:57.5947704Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T10:51:57.5947820Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T10:51:57.5947903Z ·  ──────┬───── 2026-10-24T10:51:57.5948037Z · ╰── `capsuleWidth` originates here 2026-10-24T10:51:57.5948145Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T10:51:57.5948257Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5948361Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T10:51:57.5948456Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T10:51:57.5948516Z 134 │ return; 2026-10-24T10:51:57.5948568Z 135 │ } 2026-10-24T10:51:57.5948674Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T10:51:57.5948759Z 137 │ measuredWidthRef.current = width; 2026-10-24T10:51:57.5948902Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T10:51:57.5948957Z 139 │ }; 2026-10-24T10:51:57.5949046Z 140 │ const hasStatus = props.status !== null; 2026-10-24T10:51:57.5949179Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T10:51:57.5949244Z 142 │ useEffect(() => { 2026-10-24T10:51:57.5949307Z 143 │ if (!hasStatus) { 2026-10-24T10:51:57.5949396Z 144 │ measuredWidthRef.current = null; 2026-10-24T10:51:57.5949474Z 145 │ capsuleWidth.value = null; 2026-10-24T10:51:57.5949551Z ·  ──────┬───── 2026-10-24T10:51:57.5949688Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T10:51:57.5949742Z 146 │ } 2026-10-24T10:51:57.5949793Z ╰──── 2026-10-24T10:51:57.5950110Z  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-24T10:51:57.5950443Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5950446Z 2026-10-24T10:51:57.5952939Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:51:57.5953117Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T10:51:57.5953252Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T10:51:57.5953318Z 142 │ useEffect(() => { 2026-10-24T10:51:57.5953397Z ·  ───┬─── 2026-10-24T10:51:57.5953625Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T10:51:57.5953692Z 143 │ if (!hasStatus) { 2026-10-24T10:51:57.5953781Z 144 │ measuredWidthRef.current = null; 2026-10-24T10:51:57.5953859Z 145 │ capsuleWidth.value = null; 2026-10-24T10:51:57.5953935Z ·  ──────┬───── 2026-10-24T10:51:57.5954070Z · ╰── This modifies `capsuleWidth` 2026-10-24T10:51:57.5954126Z 146 │ } 2026-10-24T10:51:57.5954177Z ╰──── 2026-10-24T10:51:57.5954518Z  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-24T10:51:57.5954822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5954825Z 2026-10-24T10:51:57.5955029Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:51:57.5955193Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T10:51:57.5955305Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T10:51:57.5955420Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5955542Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5955780Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T10:51:57.5955887Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T10:51:57.5955983Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T10:51:57.5956048Z 134 │ return; 2026-10-24T10:51:57.5956105Z 135 │ } 2026-10-24T10:51:57.5956212Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T10:51:57.5956297Z 137 │ measuredWidthRef.current = width; 2026-10-24T10:51:57.5956438Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T10:51:57.5956516Z ·  ──────┬───── 2026-10-24T10:51:57.5956648Z · ╰── This modifies `capsuleWidth` 2026-10-24T10:51:57.5956702Z 139 │ }; 2026-10-24T10:51:57.5956752Z ╰──── 2026-10-24T10:51:57.5957086Z  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-24T10:51:57.5957505Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5957546Z 2026-10-24T10:51:57.5957737Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T10:51:57.5957890Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T10:51:57.5958056Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T10:51:57.5958134Z 602 │ const gesture = Gesture.Pan() 2026-10-24T10:51:57.5958221Z ·  ─┬─ 2026-10-24T10:51:57.5958361Z · ╰── `Pan` may be a component 2026-10-24T10:51:57.5958435Z 603 │ .enabled(!props.disabled) 2026-10-24T10:51:57.5958487Z ╰──── 2026-10-24T10:51:57.5958762Z  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-24T10:51:57.5959206Z  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-24T10:51:57.5959208Z 2026-10-24T10:51:57.5959361Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5959515Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T10:51:57.5959569Z  86 │ 2026-10-24T10:51:57.5959660Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-24T10:51:57.5959739Z ·  ──────┬───── 2026-10-24T10:51:57.5959879Z · ╰── `cardCoverage` originates here 2026-10-24T10:51:57.5959961Z  88 │ const barHeightRef = useRef(0); 2026-10-24T10:51:57.5960039Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T10:51:57.5960123Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T10:51:57.5960214Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T10:51:57.5960281Z  92 │ if (!cardCoverage) { 2026-10-24T10:51:57.5960344Z  93 │ return; 2026-10-24T10:51:57.5960396Z  94 │ } 2026-10-24T10:51:57.5960547Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T10:51:57.5960633Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T10:51:57.5960693Z  97 │ return; 2026-10-24T10:51:57.5960745Z  98 │ } 2026-10-24T10:51:57.5960825Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:51:57.5960905Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:51:57.5960989Z ·  ──────┬───── 2026-10-24T10:51:57.5961130Z · ╰── `cardCoverage` cannot be modified 2026-10-24T10:51:57.5961190Z 101 │ return; 2026-10-24T10:51:57.5961242Z ╰──── 2026-10-24T10:51:57.5961535Z  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-24T10:51:57.5961838Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5961841Z 2026-10-24T10:51:57.5961998Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5962152Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T10:51:57.5962283Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T10:51:57.5962398Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T10:51:57.5962476Z ·  ─────┬──── 2026-10-24T10:51:57.5962609Z · ╰── `cardHeight` originates here 2026-10-24T10:51:57.5962701Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T10:51:57.5962767Z  92 │ if (!cardCoverage) { 2026-10-24T10:51:57.5962825Z  93 │ return; 2026-10-24T10:51:57.5962881Z  94 │ } 2026-10-24T10:51:57.5963029Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T10:51:57.5963113Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T10:51:57.5963171Z  97 │ return; 2026-10-24T10:51:57.5963223Z  98 │ } 2026-10-24T10:51:57.5963301Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:51:57.5963385Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:51:57.5963446Z 101 │ return; 2026-10-24T10:51:57.5963498Z 102 │ } 2026-10-24T10:51:57.5963598Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T10:51:57.5963693Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T10:51:57.5963776Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T10:51:57.5963831Z 106 │ }); 2026-10-24T10:51:57.5963895Z 107 │ }, [cardCoverage]); 2026-10-24T10:51:57.5963978Z 108 │ const handleBarLayout = useCallback( 2026-10-24T10:51:57.5964057Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5964186Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:51:57.5964252Z 111 │ notifyCoverage(); 2026-10-24T10:51:57.5964307Z 112 │ }, 2026-10-24T10:51:57.5964372Z 113 │ [notifyCoverage], 2026-10-24T10:51:57.5964432Z 114 │ ); 2026-10-24T10:51:57.5964516Z 115 │ const handleCardLayout = useCallback( 2026-10-24T10:51:57.5964595Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5964722Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:51:57.5964835Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T10:51:57.5964910Z ·  ─────┬──── 2026-10-24T10:51:57.5965046Z · ╰── `cardHeight` cannot be modified 2026-10-24T10:51:57.5965112Z 119 │ notifyCoverage(); 2026-10-24T10:51:57.5965165Z ╰──── 2026-10-24T10:51:57.5965426Z  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-24T10:51:57.5965734Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5965739Z 2026-10-24T10:51:57.5965937Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:51:57.5966089Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T10:51:57.5966174Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T10:51:57.5966264Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T10:51:57.5966367Z ·  ───┬─── 2026-10-24T10:51:57.5966601Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T10:51:57.5966668Z  92 │ if (!cardCoverage) { 2026-10-24T10:51:57.5966725Z  93 │ return; 2026-10-24T10:51:57.5966828Z  94 │ } 2026-10-24T10:51:57.5967005Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T10:51:57.5967091Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T10:51:57.5967148Z  97 │ return; 2026-10-24T10:51:57.5967212Z  98 │ } 2026-10-24T10:51:57.5967317Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:51:57.5967397Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:51:57.5967475Z ·  ──────┬───── 2026-10-24T10:51:57.5967608Z · ╰── This modifies `cardCoverage` 2026-10-24T10:51:57.5967666Z 101 │ return; 2026-10-24T10:51:57.5967717Z ╰──── 2026-10-24T10:51:57.5968059Z  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-24T10:51:57.5968363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5968365Z 2026-10-24T10:51:57.5968563Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:51:57.5968715Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T10:51:57.5968793Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T10:51:57.5968874Z 100 │ cardCoverage.value = coverage; 2026-10-24T10:51:57.5968950Z ·  ──────┬───── 2026-10-24T10:51:57.5969082Z · ╰── This modifies `cardCoverage` 2026-10-24T10:51:57.5969140Z 101 │ return; 2026-10-24T10:51:57.5969198Z 102 │ } 2026-10-24T10:51:57.5969301Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T10:51:57.5969396Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T10:51:57.5969478Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T10:51:57.5969533Z 106 │ }); 2026-10-24T10:51:57.5969597Z 107 │ }, [cardCoverage]); 2026-10-24T10:51:57.5969678Z 108 │ const handleBarLayout = useCallback( 2026-10-24T10:51:57.5969758Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5969861Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5970084Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T10:51:57.5970208Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:51:57.5970260Z ╰──── 2026-10-24T10:51:57.5970643Z  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-24T10:51:57.5970978Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5970980Z 2026-10-24T10:51:57.5971177Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T10:51:57.5971328Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T10:51:57.5971413Z 115 │ const handleCardLayout = useCallback( 2026-10-24T10:51:57.5971494Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T10:51:57.5971597Z ·  ───────────────┬─────────────── 2026-10-24T10:51:57.5971814Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T10:51:57.5971944Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T10:51:57.5972057Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T10:51:57.5972132Z ·  ─────┬──── 2026-10-24T10:51:57.5972261Z · ╰── This modifies `cardHeight` 2026-10-24T10:51:57.5972327Z 119 │ notifyCoverage(); 2026-10-24T10:51:57.5972378Z ╰──── 2026-10-24T10:51:57.5972708Z  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-24T10:51:57.5973013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5973018Z 2026-10-24T10:51:57.5973170Z ⚠ react(immutability): This value cannot be modified 2026-10-24T10:51:57.5973315Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T10:51:57.5973458Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T10:51:57.5973594Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T10:51:57.5973667Z ·  ────┬─── 2026-10-24T10:51:57.5973797Z · ╰── `rotation` originates here 2026-10-24T10:51:57.5973849Z 172 │ 2026-10-24T10:51:57.5973918Z 173 │ useLayoutEffect(() => { 2026-10-24T10:51:57.5974050Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T10:51:57.5974127Z ·  ────┬─── 2026-10-24T10:51:57.5974258Z · ╰── `rotation` cannot be modified 2026-10-24T10:51:57.5974356Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T10:51:57.5974407Z ╰──── 2026-10-24T10:51:57.5974665Z  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-24T10:51:57.5974963Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T10:51:57.5974965Z 2026-10-24T10:51:57.5975158Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T10:51:57.5975306Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T10:51:57.5975420Z 1245 │