2026-10-24T11:05:54.7707323Z Current runner version: '2.338.1' 2026-10-24T11:05:54.7710774Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-ceirmz6wjaiay42p' 2026-10-24T11:05:54.7711452Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T11:05:54.7712193Z Machine name: 'ip-172-31-73-130' 2026-10-24T11:05:54.7713747Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T11:05:54.7715088Z Contents: read 2026-10-24T11:05:54.7715585Z Metadata: read 2026-10-24T11:05:54.7715961Z ##[endgroup] 2026-10-24T11:05:54.7717241Z Secret source: Actions 2026-10-24T11:05:54.7717929Z Cache mode: write 2026-10-24T11:05:54.7718424Z Prepare workflow directory 2026-10-24T11:05:54.7897996Z Prepare all required actions 2026-10-24T11:05:54.7924630Z Getting action download info 2026-10-24T11:05:54.9036155Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T11:05:54.9381947Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T11:05:55.0578175Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T11:05:55.0616308Z Complete job name: Lint 2026-10-24T11:05:55.0999562Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T11:05:55.1092018Z ##[group]Run '/setup.sh' 2026-10-24T11:05:55.1109510Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:05:55.1109921Z env: 2026-10-24T11:05:55.1110145Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:05:55.1110439Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:05:55.1110719Z BLACKSMITH_CHECK_RUN_ID: 120856234521 2026-10-24T11:05:55.1111002Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T11:05:55.1111273Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T11:05:55.1111534Z ##[endgroup] 2026-10-24T11:05:55.1366221Z Logging daemon started (blacksmithd for logs) 2026-10-24T11:05:55.1457959Z Results daemon started (blacksmithd for results) 2026-10-24T11:05:55.1595909Z Background adoption and SSH setup started (PID: 3073) 2026-10-24T11:05:55.1598946Z 2026-10-24T11:05:55.1599063Z ---------------------------------------- 2026-10-24T11:05:55.1600734Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40088515833/jobs/120856234521 2026-10-24T11:05:55.1601275Z SSH Access (using your GitHub SSH key): 2026-10-24T11:05:55.1601733Z ssh -p 64001 runner@blacksmith-8vcpu-ubuntu-2404-ceirmz6wjaiay42p.vm.blacksmith.sh 2026-10-24T11:05:55.1602051Z 2026-10-24T11:05:55.1602177Z No GitHub SSH key? Add one at: 2026-10-24T11:05:55.1602718Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T11:05:55.1603118Z 2026-10-24T11:05:55.1603227Z ---------------------------------------- 2026-10-24T11:05:55.1603410Z 2026-10-24T11:05:55.1603559Z VM ID: blacksmith-8vcpu-ubuntu-2404-ceirmz6wjaiay42p 2026-10-24T11:05:55.1603888Z Host: production-152.236.41.166-x8664 2026-10-24T11:05:55.1604168Z Host Agent PID: 2972132 2026-10-24T11:05:55.1604427Z Host Agent Git SHA: 1637818df 2026-10-24T11:05:55.1604692Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T11:05:55.1604975Z Blacksmith Host Generation: gen 2 2026-10-24T11:05:55.1605257Z Petname: production-many-lynx-45ef8054 2026-10-24T11:05:55.1605591Z Region: us-east 2026-10-24T11:05:55.1605831Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T11:05:55.1613443Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T11:05:55.1613850Z 2026-10-24T11:05:55.1613980Z Enabling Blacksmith transparent cache 2026-10-24T11:05:55.1822103Z ##[group]Run actions/checkout@v6 2026-10-24T11:05:55.1822394Z with: 2026-10-24T11:05:55.1822721Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T11:05:55.1823108Z sparse-checkout-cone-mode: false 2026-10-24T11:05:55.1823481Z repository: pingdotgg/t3code 2026-10-24T11:05:55.1825363Z token: *** 2026-10-24T11:05:55.1825578Z ssh-strict: true 2026-10-24T11:05:55.1825804Z ssh-user: git 2026-10-24T11:05:55.1826027Z persist-credentials: true 2026-10-24T11:05:55.1826466Z clean: true 2026-10-24T11:05:55.1826679Z fetch-depth: 1 2026-10-24T11:05:55.1826896Z fetch-tags: false 2026-10-24T11:05:55.1827123Z show-progress: true 2026-10-24T11:05:55.1827350Z lfs: false 2026-10-24T11:05:55.1827558Z submodules: false 2026-10-24T11:05:55.1827785Z set-safe-directory: true 2026-10-24T11:05:55.1828038Z allow-unsafe-pr-checkout: false 2026-10-24T11:05:55.1828296Z env: 2026-10-24T11:05:55.1828538Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:05:55.1828824Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:05:55.1829106Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:05:55.1829367Z ##[endgroup] 2026-10-24T11:05:55.2876846Z Syncing repository: pingdotgg/t3code 2026-10-24T11:05:55.2877855Z ##[group]Getting Git version info 2026-10-24T11:05:55.2878184Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T11:05:55.2878671Z [command]/usr/local/bin/git version 2026-10-24T11:05:55.2949154Z git version 2.55.0 2026-10-24T11:05:55.2960502Z ##[endgroup] 2026-10-24T11:05:55.2967976Z Temporarily overriding HOME='/home/runner/_work/_temp/fb9c5e61-8d2d-4002-941d-6a44b1cd250a' before making global git config changes 2026-10-24T11:05:55.2968623Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T11:05:55.2971243Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T11:05:55.3002450Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T11:05:55.3004322Z ##[group]Determining repository object format 2026-10-24T11:05:55.3005494Z ##[endgroup] 2026-10-24T11:05:55.3005872Z ##[group]Initializing the repository 2026-10-24T11:05:55.3007765Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T11:05:55.3051733Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T11:05:55.3052235Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T11:05:55.3052700Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T11:05:55.3053061Z hint: call: 2026-10-24T11:05:55.3053279Z hint: 2026-10-24T11:05:55.3053547Z hint: git config --global init.defaultBranch 2026-10-24T11:05:55.3053857Z hint: 2026-10-24T11:05:55.3054148Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T11:05:55.3054599Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T11:05:55.3054965Z hint: 2026-10-24T11:05:55.3055182Z hint: git branch -m 2026-10-24T11:05:55.3055466Z hint: 2026-10-24T11:05:55.3055780Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T11:05:55.3056254Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T11:05:55.3057323Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T11:05:55.3086421Z ##[endgroup] 2026-10-24T11:05:55.3086823Z ##[group]Disabling automatic garbage collection 2026-10-24T11:05:55.3088401Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T11:05:55.3108220Z ##[endgroup] 2026-10-24T11:05:55.3108586Z ##[group]Setting up auth 2026-10-24T11:05:55.3108865Z Removing SSH command configuration 2026-10-24T11:05:55.3112231Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T11:05:55.3142796Z [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-24T11:05:55.3303973Z Removing HTTP extra header 2026-10-24T11:05:55.3307107Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T11:05:55.3330653Z [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-24T11:05:55.3444776Z Removing includeIf entries pointing to credentials config files 2026-10-24T11:05:55.3447970Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T11:05:55.3474387Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T11:05:55.3589226Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-7079a8c4-2242-4dbf-913d-bd5a59a2bdac.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T11:05:55.3620834Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-7079a8c4-2242-4dbf-913d-bd5a59a2bdac.config 2026-10-24T11:05:55.3643041Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-7079a8c4-2242-4dbf-913d-bd5a59a2bdac.config 2026-10-24T11:05:55.3667407Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-7079a8c4-2242-4dbf-913d-bd5a59a2bdac.config 2026-10-24T11:05:55.3687916Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-7079a8c4-2242-4dbf-913d-bd5a59a2bdac.config 2026-10-24T11:05:55.3706995Z ##[endgroup] 2026-10-24T11:05:55.3707381Z ##[group]Fetching the repository 2026-10-24T11:05:55.3711357Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +bb7783e295506ad423f527ed28a019836e331e8c:refs/remotes/origin/main 2026-10-24T11:05:55.6893091Z From https://github.com/pingdotgg/t3code 2026-10-24T11:05:55.6897255Z * [new ref] bb7783e295506ad423f527ed28a019836e331e8c -> origin/main 2026-10-24T11:05:55.6921845Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T11:05:55.6943327Z origin/main 2026-10-24T11:05:55.6947658Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T11:05:55.6964164Z bb7783e295506ad423f527ed28a019836e331e8c 2026-10-24T11:05:55.6966347Z ##[endgroup] 2026-10-24T11:05:55.6967108Z ##[group]Determining the checkout info 2026-10-24T11:05:55.6967993Z ##[endgroup] 2026-10-24T11:05:55.6968796Z ##[group]Setting up sparse checkout 2026-10-24T11:05:55.6969544Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T11:05:55.6992020Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T11:05:55.7013380Z .git/info/sparse-checkout 2026-10-24T11:05:55.7017216Z ##[endgroup] 2026-10-24T11:05:55.7018199Z ##[group]Checking out the ref 2026-10-24T11:05:55.7019740Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T11:06:02.3059915Z Updating files: 0% (1/6346) 2026-10-24T11:06:02.3089842Z Updating files: 1% (64/6346) 2026-10-24T11:06:02.3108210Z Updating files: 2% (127/6346) 2026-10-24T11:06:02.3130632Z Updating files: 3% (191/6346) 2026-10-24T11:06:02.3152655Z Updating files: 4% (254/6346) 2026-10-24T11:06:02.3185301Z Updating files: 5% (318/6346) 2026-10-24T11:06:02.3208146Z Updating files: 6% (381/6346) 2026-10-24T11:06:02.3268976Z Updating files: 7% (445/6346) 2026-10-24T11:06:02.3301146Z Updating files: 8% (508/6346) 2026-10-24T11:06:02.3324763Z Updating files: 9% (572/6346) 2026-10-24T11:06:02.3585624Z Updating files: 10% (635/6346) 2026-10-24T11:06:02.3600935Z Updating files: 11% (699/6346) 2026-10-24T11:06:02.3610520Z Updating files: 12% (762/6346) 2026-10-24T11:06:02.3624718Z Updating files: 13% (825/6346) 2026-10-24T11:06:02.3641464Z Updating files: 14% (889/6346) 2026-10-24T11:06:02.3661393Z Updating files: 15% (952/6346) 2026-10-24T11:06:02.3680837Z Updating files: 16% (1016/6346) 2026-10-24T11:06:02.3697143Z Updating files: 17% (1079/6346) 2026-10-24T11:06:02.3716596Z Updating files: 18% (1143/6346) 2026-10-24T11:06:02.3732600Z Updating files: 19% (1206/6346) 2026-10-24T11:06:02.3756833Z Updating files: 20% (1270/6346) 2026-10-24T11:06:02.3775937Z Updating files: 21% (1333/6346) 2026-10-24T11:06:02.3795456Z Updating files: 22% (1397/6346) 2026-10-24T11:06:02.3811064Z Updating files: 23% (1460/6346) 2026-10-24T11:06:02.3826380Z Updating files: 24% (1524/6346) 2026-10-24T11:06:02.3842474Z Updating files: 25% (1587/6346) 2026-10-24T11:06:02.3857947Z Updating files: 26% (1650/6346) 2026-10-24T11:06:02.3872288Z Updating files: 27% (1714/6346) 2026-10-24T11:06:02.3893843Z Updating files: 28% (1777/6346) 2026-10-24T11:06:02.3927984Z Updating files: 29% (1841/6346) 2026-10-24T11:06:02.3950371Z Updating files: 30% (1904/6346) 2026-10-24T11:06:02.3976149Z Updating files: 31% (1968/6346) 2026-10-24T11:06:02.4009830Z Updating files: 32% (2031/6346) 2026-10-24T11:06:02.4042824Z Updating files: 33% (2095/6346) 2026-10-24T11:06:02.4114919Z Updating files: 34% (2158/6346) 2026-10-24T11:06:02.4173555Z Updating files: 35% (2222/6346) 2026-10-24T11:06:02.4213464Z Updating files: 36% (2285/6346) 2026-10-24T11:06:02.4250846Z Updating files: 37% (2349/6346) 2026-10-24T11:06:02.4295886Z Updating files: 38% (2412/6346) 2026-10-24T11:06:02.4324602Z Updating files: 39% (2475/6346) 2026-10-24T11:06:02.4358889Z Updating files: 40% (2539/6346) 2026-10-24T11:06:02.4389087Z Updating files: 41% (2602/6346) 2026-10-24T11:06:02.4409343Z Updating files: 42% (2666/6346) 2026-10-24T11:06:02.4420599Z Updating files: 43% (2729/6346) 2026-10-24T11:06:02.4443272Z Updating files: 44% (2793/6346) 2026-10-24T11:06:02.4479735Z Updating files: 45% (2856/6346) 2026-10-24T11:06:02.4504779Z Updating files: 46% (2920/6346) 2026-10-24T11:06:02.4535947Z Updating files: 47% (2983/6346) 2026-10-24T11:06:02.4564712Z Updating files: 48% (3047/6346) 2026-10-24T11:06:02.4598259Z Updating files: 49% (3110/6346) 2026-10-24T11:06:02.4638702Z Updating files: 50% (3173/6346) 2026-10-24T11:06:02.4655746Z Updating files: 51% (3237/6346) 2026-10-24T11:06:02.4691241Z Updating files: 52% (3300/6346) 2026-10-24T11:06:02.4719988Z Updating files: 53% (3364/6346) 2026-10-24T11:06:02.4742359Z Updating files: 54% (3427/6346) 2026-10-24T11:06:02.4767562Z Updating files: 55% (3491/6346) 2026-10-24T11:06:02.4786715Z Updating files: 56% (3554/6346) 2026-10-24T11:06:02.4803934Z Updating files: 57% (3618/6346) 2026-10-24T11:06:02.4824557Z Updating files: 58% (3681/6346) 2026-10-24T11:06:02.5220248Z Updating files: 59% (3745/6346) 2026-10-24T11:06:02.5235661Z Updating files: 60% (3808/6346) 2026-10-24T11:06:02.5252203Z Updating files: 61% (3872/6346) 2026-10-24T11:06:02.5271154Z Updating files: 62% (3935/6346) 2026-10-24T11:06:02.5293859Z Updating files: 63% (3998/6346) 2026-10-24T11:06:02.5322959Z Updating files: 64% (4062/6346) 2026-10-24T11:06:02.5346192Z Updating files: 65% (4125/6346) 2026-10-24T11:06:02.5363640Z Updating files: 66% (4189/6346) 2026-10-24T11:06:02.5391735Z Updating files: 67% (4252/6346) 2026-10-24T11:06:02.5405449Z Updating files: 68% (4316/6346) 2026-10-24T11:06:02.5425754Z Updating files: 69% (4379/6346) 2026-10-24T11:06:02.5438913Z Updating files: 70% (4443/6346) 2026-10-24T11:06:02.5456417Z Updating files: 71% (4506/6346) 2026-10-24T11:06:02.5474156Z Updating files: 72% (4570/6346) 2026-10-24T11:06:02.5501217Z Updating files: 73% (4633/6346) 2026-10-24T11:06:02.5781472Z Updating files: 74% (4697/6346) 2026-10-24T11:06:02.5983370Z Updating files: 75% (4760/6346) 2026-10-24T11:06:02.6006599Z Updating files: 76% (4823/6346) 2026-10-24T11:06:02.6028294Z Updating files: 77% (4887/6346) 2026-10-24T11:06:02.6055411Z Updating files: 78% (4950/6346) 2026-10-24T11:06:02.6075977Z Updating files: 79% (5014/6346) 2026-10-24T11:06:02.6097452Z Updating files: 80% (5077/6346) 2026-10-24T11:06:02.6115638Z Updating files: 81% (5141/6346) 2026-10-24T11:06:02.6136446Z Updating files: 82% (5204/6346) 2026-10-24T11:06:02.6157188Z Updating files: 83% (5268/6346) 2026-10-24T11:06:02.6180702Z Updating files: 84% (5331/6346) 2026-10-24T11:06:02.6204783Z Updating files: 85% (5395/6346) 2026-10-24T11:06:02.6230591Z Updating files: 86% (5458/6346) 2026-10-24T11:06:02.6303140Z Updating files: 87% (5522/6346) 2026-10-24T11:06:02.6338261Z Updating files: 88% (5585/6346) 2026-10-24T11:06:02.6360921Z Updating files: 89% (5648/6346) 2026-10-24T11:06:02.6386151Z Updating files: 90% (5712/6346) 2026-10-24T11:06:02.6422798Z Updating files: 91% (5775/6346) 2026-10-24T11:06:02.6439463Z Updating files: 92% (5839/6346) 2026-10-24T11:06:02.6458066Z Updating files: 93% (5902/6346) 2026-10-24T11:06:02.6481338Z Updating files: 94% (5966/6346) 2026-10-24T11:06:02.6506469Z Updating files: 95% (6029/6346) 2026-10-24T11:06:02.6563730Z Updating files: 96% (6093/6346) 2026-10-24T11:06:02.6592746Z Updating files: 97% (6156/6346) 2026-10-24T11:06:02.6641024Z Updating files: 98% (6220/6346) 2026-10-24T11:06:02.6661604Z Updating files: 99% (6283/6346) 2026-10-24T11:06:02.6661907Z Updating files: 100% (6346/6346) 2026-10-24T11:06:02.6662122Z Updating files: 100% (6346/6346), done. 2026-10-24T11:06:02.6827592Z Switched to a new branch 'main' 2026-10-24T11:06:02.6828942Z branch 'main' set up to track 'origin/main'. 2026-10-24T11:06:02.6842944Z ##[endgroup] 2026-10-24T11:06:02.6882434Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T11:06:02.6906391Z bb7783e295506ad423f527ed28a019836e331e8c 2026-10-24T11:06:02.6987769Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T11:06:02.6988027Z files="$(git ls-files .github/pr-assets)" 2026-10-24T11:06:02.6988217Z if test -n "$files"; then 2026-10-24T11:06:02.6988457Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T11:06:02.6988677Z  exit 1 2026-10-24T11:06:02.6988791Z fi 2026-10-24T11:06:02.7009206Z shell: /usr/bin/bash -e {0} 2026-10-24T11:06:02.7009344Z env: 2026-10-24T11:06:02.7009466Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:02.7009633Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:02.7009782Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:02.7009944Z ##[endgroup] 2026-10-24T11:06:02.7167874Z Prepare all required actions 2026-10-24T11:06:02.7168202Z Getting action download info 2026-10-24T11:06:02.7995198Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T11:06:02.9038065Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T11:06:02.9038327Z env: 2026-10-24T11:06:02.9038497Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:02.9038745Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:02.9038980Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:02.9039196Z ##[endgroup] 2026-10-24T11:06:02.9136354Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T11:06:02.9150798Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T11:06:02.9151171Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T11:06:02.9151478Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T11:06:02.9151721Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T11:06:02.9171387Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:06:02.9171557Z env: 2026-10-24T11:06:02.9171675Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:02.9171824Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:02.9171968Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:02.9172106Z ##[endgroup] 2026-10-24T11:06:02.9254163Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T11:06:02.9256091Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T11:06:02.9299036Z ##[group]Run actions/cache@v6 2026-10-24T11:06:02.9299175Z with: 2026-10-24T11:06:02.9299494Z path: ~/.vite-plus 2026-10-24T11:06:02.9299663Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T11:06:02.9299920Z enableCrossOsArchive: false 2026-10-24T11:06:02.9300057Z fail-on-cache-miss: false 2026-10-24T11:06:02.9300193Z lookup-only: false 2026-10-24T11:06:02.9300308Z save-always: false 2026-10-24T11:06:02.9300426Z env: 2026-10-24T11:06:02.9300541Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:02.9300693Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:02.9300839Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:02.9300974Z ##[endgroup] 2026-10-24T11:06:03.1347236Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T11:06:03.6127883Z Received 170349591 of 170349591 (100.0%), 357.8 MBs/sec 2026-10-24T11:06:03.6129304Z Cache Size: ~162 MB (170349591 B) 2026-10-24T11:06:03.6155659Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/9a5bcd41-4d37-4f49-93da-162e65fe59ec/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T11:06:04.3438530Z Cache restored successfully 2026-10-24T11:06:04.3631960Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T11:06:04.3723330Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1446] 2026-10-24T11:06:04.3725874Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T11:06:04.3745128Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T11:06:04.3745347Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T11:06:04.3745526Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T11:06:04.3765849Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:06:04.3766021Z env: 2026-10-24T11:06:04.3766145Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:04.3766299Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:04.3766449Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:04.3766599Z ##[endgroup] 2026-10-24T11:06:04.3811865Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T11:06:04.3820555Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=9] 2026-10-24T11:06:04.3822436Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T11:06:04.3827467Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T11:06:04.3829070Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T11:06:04.3840485Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T11:06:04.3840749Z store_path="$(vp pm cache dir)" 2026-10-24T11:06:04.3841005Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T11:06:04.3858813Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:06:04.3859039Z env: 2026-10-24T11:06:04.3859152Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:04.3859307Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:04.3859462Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:04.3859632Z ##[endgroup] 2026-10-24T11:06:04.4009452Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=17] 2026-10-24T11:06:04.4010892Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T11:06:04.4371800Z ##[group]Run actions/cache@v6 2026-10-24T11:06:04.4372067Z with: 2026-10-24T11:06:04.4372267Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T11:06:04.4372561Z key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T11:06:04.4372904Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T11:06:04.4373102Z enableCrossOsArchive: false 2026-10-24T11:06:04.4373314Z fail-on-cache-miss: false 2026-10-24T11:06:04.4373479Z lookup-only: false 2026-10-24T11:06:04.4373667Z save-always: false 2026-10-24T11:06:04.4373845Z env: 2026-10-24T11:06:04.4373984Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:04.4374456Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:04.4374636Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:04.4374836Z ##[endgroup] 2026-10-24T11:06:04.6224922Z Cache hit for: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T11:06:05.6464592Z Received 700448768 of 995169257 (70.4%), 666.0 MBs/sec 2026-10-24T11:06:06.0647560Z Received 995169257 of 995169257 (100.0%), 667.9 MBs/sec 2026-10-24T11:06:06.0649297Z Cache Size: ~949 MB (995169257 B) 2026-10-24T11:06:06.0685779Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/f36fed8a-17f7-450a-ad79-6ed7fc68e847/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T11:06:11.9773682Z Cache restored successfully 2026-10-24T11:06:12.0254456Z Cache restored from key: pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d 2026-10-24T11:06:12.0319490Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7630] 2026-10-24T11:06:12.0321641Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T11:06:12.0333427Z ##[group]Run vp install 2026-10-24T11:06:12.0333580Z vp install 2026-10-24T11:06:12.0353269Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:06:12.0353443Z env: 2026-10-24T11:06:12.0353565Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:12.0353716Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:12.0353868Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:12.0354005Z ##[endgroup] 2026-10-24T11:06:12.0700521Z Scope: all 33 workspace projects 2026-10-24T11:06:12.1788714Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T11:06:12.4810442Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T11:06:12.4812106Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T11:06:12.4812407Z Virtual store is at: node_modules/.pnpm 2026-10-24T11:06:15.3884457Z ✓ Lockfile passes supply-chain policies (2088 entries in 3.2s) 2026-10-24T11:06:15.3884744Z Lockfile is up to date, resolution step is skipped 2026-10-24T11:06:15.4074705Z Packages: +1721 2026-10-24T11:06:15.4075051Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T11:06:15.4693408Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T11:06:16.5519288Z . prepare$ vp config --no-agent 2026-10-24T11:06:16.6580936Z . prepare: Done 2026-10-24T11:06:16.6600043Z 2026-10-24T11:06:16.6600759Z devDependencies: 2026-10-24T11:06:16.6600955Z + @coderabbitai/config 1.1.0 2026-10-24T11:06:16.6601109Z + @shadcn/lint 0.1.5 2026-10-24T11:06:16.6601301Z + @types/node 24.12.4 2026-10-24T11:06:16.6601430Z + knip 6.34.0 2026-10-24T11:06:16.6601566Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T11:06:16.6601717Z + vite-plus 1.3.0 2026-10-24T11:06:16.6601792Z 2026-10-24T11:06:16.6635226Z Done in 4.6s using pnpm v12.14.0 2026-10-24T11:06:16.6821760Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=4649] 2026-10-24T11:06:16.7332455Z ##[group]Run actions/cache@v6 2026-10-24T11:06:16.7332594Z with: 2026-10-24T11:06:16.7332703Z path: ~/.cache/electron 2026-10-24T11:06:16.7332925Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T11:06:16.7333164Z enableCrossOsArchive: false 2026-10-24T11:06:16.7333299Z fail-on-cache-miss: false 2026-10-24T11:06:16.7333426Z lookup-only: false 2026-10-24T11:06:16.7333542Z save-always: false 2026-10-24T11:06:16.7333652Z env: 2026-10-24T11:06:16.7333769Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:16.7333919Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:16.7334077Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:16.7334214Z ##[endgroup] 2026-10-24T11:06:16.9227569Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T11:06:17.0856846Z Received 122906203 of 122906203 (100.0%), 797.4 MBs/sec 2026-10-24T11:06:17.0857620Z Cache Size: ~117 MB (122906203 B) 2026-10-24T11:06:17.0872221Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/8ca720b2-5bac-492d-bf79-f5877ae26a7e/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T11:06:17.1458903Z Cache restored successfully 2026-10-24T11:06:17.1590922Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T11:06:17.1777344Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T11:06:17.1777734Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T11:06:17.1799280Z shell: /usr/bin/bash -e {0} 2026-10-24T11:06:17.1799469Z env: 2026-10-24T11:06:17.1799586Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:17.1799746Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:17.1799892Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:17.1800029Z ##[endgroup] 2026-10-24T11:06:17.3459688Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T11:06:17.9529705Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T11:06:17.9550075Z 2026-10-24T11:06:17.9646401Z ##[group]Run vp run knip:check 2026-10-24T11:06:17.9646586Z vp run knip:check 2026-10-24T11:06:17.9667500Z shell: /usr/bin/bash -e {0} 2026-10-24T11:06:17.9667637Z env: 2026-10-24T11:06:17.9667753Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:17.9667911Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:17.9668056Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:17.9668191Z ##[endgroup] 2026-10-24T11:06:18.1247018Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T11:06:22.1436339Z 2026-10-24T11:06:22.1439825Z $ 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-24T11:06:31.1375167Z 2026-10-24T11:06:31.1376286Z --- 2026-10-24T11:06:31.1376603Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T11:06:31.1461616Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T11:06:31.1461908Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T11:06:31.1481340Z shell: /usr/bin/bash -e {0} 2026-10-24T11:06:31.1481478Z env: 2026-10-24T11:06:31.1481592Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:31.1481745Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:31.1481891Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:31.1482032Z ##[endgroup] 2026-10-24T11:06:31.3049545Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T11:06:31.5042706Z 2026-10-24T11:06:31.5147774Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T11:06:31.5148000Z vp run --filter t3 generate --check 2026-10-24T11:06:31.5167103Z shell: /usr/bin/bash -e {0} 2026-10-24T11:06:31.5167241Z env: 2026-10-24T11:06:31.5167374Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:31.5167526Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:31.5167677Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:31.5167813Z ##[endgroup] 2026-10-24T11:06:31.6700966Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T11:06:31.8294242Z 2026-10-24T11:06:31.8373575Z ##[group]Run vp check 2026-10-24T11:06:31.8373750Z vp check 2026-10-24T11:06:31.8393565Z shell: /usr/bin/bash -e {0} 2026-10-24T11:06:31.8393699Z env: 2026-10-24T11:06:31.8393814Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:31.8393974Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:31.8394120Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T11:06:31.8394261Z ##[endgroup] 2026-10-24T11:06:32.4172132Z pass: All 5700 files are correctly formatted (422ms, 8 threads) 2026-10-24T11:06:37.7092140Z warn: Lint warnings found 2026-10-24T11:06:37.7093540Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T11:06:37.7093950Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T11:06:37.7094182Z 14 │ threadSearchMatchKey, 2026-10-24T11:06:37.7094379Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T11:06:37.7094642Z ·  ──────────────┬───────────── 2026-10-24T11:06:37.7094957Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T11:06:37.7095267Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T11:06:37.7095457Z ╰──── 2026-10-24T11:06:37.7095624Z  help: Consider removing this import. 2026-10-24T11:06:37.7095749Z 2026-10-24T11:06:37.7096005Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7096356Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T11:06:37.7096646Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T11:06:37.7096889Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T11:06:37.7097130Z ·  ───────┬────── 2026-10-24T11:06:37.7097420Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T11:06:37.7097739Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T11:06:37.7097961Z ╰──── 2026-10-24T11:06:37.7098389Z  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-24T11:06:37.7099037Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7099348Z 2026-10-24T11:06:37.7099813Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7100124Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T11:06:37.7100360Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T11:06:37.7100640Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T11:06:37.7100932Z ·  ─────┬──── 2026-10-24T11:06:37.7101238Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7101489Z 519 │ const id = setTimeout(() => { 2026-10-24T11:06:37.7101657Z ╰──── 2026-10-24T11:06:37.7102014Z  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-24T11:06:37.7102597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7102885Z 2026-10-24T11:06:37.7103062Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7103508Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T11:06:37.7103865Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T11:06:37.7104431Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T11:06:37.7104825Z ·  ─────┬──── 2026-10-24T11:06:37.7105159Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7105474Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T11:06:37.7105686Z ╰──── 2026-10-24T11:06:37.7106037Z  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-24T11:06:37.7106617Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7106901Z 2026-10-24T11:06:37.7107081Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7107420Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T11:06:37.7107674Z 718 │ const snoozePresets = useMemo( 2026-10-24T11:06:37.7107975Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T11:06:37.7108340Z ·  ─────┬──── 2026-10-24T11:06:37.7108670Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7108972Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T11:06:37.7109171Z ╰──── 2026-10-24T11:06:37.7109526Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7110113Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7110399Z 2026-10-24T11:06:37.7110590Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:06:37.7110974Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T11:06:37.7111326Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T11:06:37.7111630Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T11:06:37.7111864Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7112166Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T11:06:37.7112406Z 721 │ ); 2026-10-24T11:06:37.7112530Z ╰──── 2026-10-24T11:06:37.7112910Z  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-24T11:06:37.7113532Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7113839Z 2026-10-24T11:06:37.7114026Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:06:37.7114377Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T11:06:37.7114617Z 765 │ thread.pinnedAt, 2026-10-24T11:06:37.7114780Z 766 │ variant, 2026-10-24T11:06:37.7115060Z ·  ───┬─── 2026-10-24T11:06:37.7115334Z · ╰── Unnecessary dependency `variant` 2026-10-24T11:06:37.7115542Z 767 │ ], 2026-10-24T11:06:37.7115664Z ╰──── 2026-10-24T11:06:37.7116042Z  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-24T11:06:37.7116655Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7116957Z 2026-10-24T11:06:37.7117158Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7117519Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T11:06:37.7117844Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T11:06:37.7118125Z 1216 │ 2026-10-24T11:06:37.7118425Z ·  ────────────────────────── 2026-10-24T11:06:37.7118661Z 1217 │ 2026-10-24T11:06:37.7118847Z ╰──── 2026-10-24T11:06:37.7119057Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T11:06:37.7119218Z 2026-10-24T11:06:37.7119392Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7119687Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T11:06:37.7119934Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T11:06:37.7120224Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T11:06:37.7120523Z ·  ─────┬──── 2026-10-24T11:06:37.7120823Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7121072Z 822 │ return AsyncResult.failure( 2026-10-24T11:06:37.7121229Z ╰──── 2026-10-24T11:06:37.7121568Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7122138Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7122426Z 2026-10-24T11:06:37.7122603Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7122900Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T11:06:37.7123111Z 708 │ const wokeAt = resolved 2026-10-24T11:06:37.7123346Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T11:06:37.7123614Z ·  ─────┬──── 2026-10-24T11:06:37.7123906Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7124127Z 710 │ : null; 2026-10-24T11:06:37.7124262Z ╰──── 2026-10-24T11:06:37.7124601Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7125258Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7125600Z 2026-10-24T11:06:37.7125769Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7126084Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T11:06:37.7126371Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T11:06:37.7126669Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T11:06:37.7126951Z ·  ─────┬──── 2026-10-24T11:06:37.7127258Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7127527Z 141 │ onSelect={(selected) => { 2026-10-24T11:06:37.7127703Z ╰──── 2026-10-24T11:06:37.7128042Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7128643Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7128926Z 2026-10-24T11:06:37.7129191Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7129601Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:568:5] 2026-10-24T11:06:37.7129827Z 566 │ }, []); 2026-10-24T11:06:37.7129973Z 567 │ useEffect(() => { 2026-10-24T11:06:37.7130134Z ·  ────┬──── 2026-10-24T11:06:37.7130366Z · ╰── This is the containing effect 2026-10-24T11:06:37.7130598Z 568 │ setKeyboardStateSuspect(false); 2026-10-24T11:06:37.7130804Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7131084Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7131363Z 569 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T11:06:37.7131536Z ╰──── 2026-10-24T11:06:37.7132207Z  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-24T11:06:37.7133122Z  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-24T11:06:37.7133437Z 2026-10-24T11:06:37.7133701Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7134104Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T11:06:37.7134428Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T11:06:37.7134666Z 964 │ useEffect(() => { 2026-10-24T11:06:37.7134834Z ·  ────┬──── 2026-10-24T11:06:37.7135054Z · ╰── This is the containing effect 2026-10-24T11:06:37.7135357Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T11:06:37.7135723Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T11:06:37.7136083Z ·  ─────────────┬──────────── 2026-10-24T11:06:37.7136384Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7136621Z 967 │ } 2026-10-24T11:06:37.7136746Z ╰──── 2026-10-24T11:06:37.7137420Z  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-24T11:06:37.7138323Z  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-24T11:06:37.7138628Z 2026-10-24T11:06:37.7138900Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7139310Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1213:5] 2026-10-24T11:06:37.7139532Z 1211 │ 2026-10-24T11:06:37.7139667Z 1212 │ useEffect(() => { 2026-10-24T11:06:37.7139831Z ·  ────┬──── 2026-10-24T11:06:37.7140054Z · ╰── This is the containing effect 2026-10-24T11:06:37.7140275Z 1213 │ setAnchorMessageId(null); 2026-10-24T11:06:37.7140476Z ·  ─────────┬──────── 2026-10-24T11:06:37.7140752Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7141005Z 1214 │ setSubmittedMessageId(null); 2026-10-24T11:06:37.7141174Z ╰──── 2026-10-24T11:06:37.7141841Z  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-24T11:06:37.7142712Z  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-24T11:06:37.7143022Z 2026-10-24T11:06:37.7143427Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7143787Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:569:7] 2026-10-24T11:06:37.7144036Z 568 │ setKeyboardStateSuspect(false); 2026-10-24T11:06:37.7144258Z 569 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T11:06:37.7144527Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T11:06:37.7144884Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T11:06:37.7145240Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T11:06:37.7145534Z 570 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T11:06:37.7145730Z ╰──── 2026-10-24T11:06:37.7146089Z  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-24T11:06:37.7146821Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7147174Z 2026-10-24T11:06:37.7147381Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7147744Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1161:7] 2026-10-24T11:06:37.7148001Z 1160 │ userInputInsetProgress.set(1); 2026-10-24T11:06:37.7148310Z 1161 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T11:06:37.7148591Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7148883Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T11:06:37.7149174Z 1162 │ const showContent = props.showContent ?? true; 2026-10-24T11:06:37.7149352Z ╰──── 2026-10-24T11:06:37.7149720Z  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-24T11:06:37.7150321Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7150623Z 2026-10-24T11:06:37.7150830Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7151187Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1219:15] 2026-10-24T11:06:37.7151427Z 1218 │ freeze.set(false); 2026-10-24T11:06:37.7151604Z 1219 │ }, [freeze, selectedThreadKey]); 2026-10-24T11:06:37.7151809Z ·  ────────┬──────── 2026-10-24T11:06:37.7152090Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T11:06:37.7152316Z 1220 │ 2026-10-24T11:06:37.7152433Z ╰──── 2026-10-24T11:06:37.7152788Z  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-24T11:06:37.7153389Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7153688Z 2026-10-24T11:06:37.7153849Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7154165Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1049:5] 2026-10-24T11:06:37.7154441Z 1044 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T11:06:37.7154793Z 1045 │ const floatingControlCoverage = useSharedValue( 2026-10-24T11:06:37.7155066Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7155344Z · ╰── `floatingControlCoverage` originates here 2026-10-24T11:06:37.7155639Z 1046 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T11:06:37.7155845Z 1047 │ ); 2026-10-24T11:06:37.7155983Z 1048 │ useEffect(() => { 2026-10-24T11:06:37.7156183Z 1049 │ floatingControlCoverage.value = withTiming( 2026-10-24T11:06:37.7156401Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7156676Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T11:06:37.7156970Z 1050 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T11:06:37.7157177Z ╰──── 2026-10-24T11:06:37.7157516Z  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-24T11:06:37.7158091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7158413Z 2026-10-24T11:06:37.7158577Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7158896Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-24T11:06:37.7159248Z 1057 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T11:06:37.7159577Z 1058 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T11:06:37.7159835Z ·  ────────────────┬──────────────── 2026-10-24T11:06:37.7160156Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T11:06:37.7160483Z 1059 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T11:06:37.7160684Z 1060 │ ); 2026-10-24T11:06:37.7160827Z 1061 │ useAnimatedReaction( 2026-10-24T11:06:37.7160983Z 1062 │ () => 2026-10-24T11:06:37.7161159Z 1063 │ contentInsetEndAdjustment.value + 2026-10-24T11:06:37.7161364Z 1064 │ floatingControlCoverage.value + 2026-10-24T11:06:37.7161682Z 1065 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T11:06:37.7161955Z 1066 │ (value) => { 2026-10-24T11:06:37.7162160Z 1067 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T11:06:37.7162407Z ·  ────────────────┬──────────────── 2026-10-24T11:06:37.7162734Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T11:06:37.7162984Z 1068 │ }, 2026-10-24T11:06:37.7163108Z ╰──── 2026-10-24T11:06:37.7163438Z  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-24T11:06:37.7164006Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7164304Z 2026-10-24T11:06:37.7164567Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7164959Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2145:5] 2026-10-24T11:06:37.7165166Z 2143 │ ); 2026-10-24T11:06:37.7165408Z 2144 │ useEffect(() => { 2026-10-24T11:06:37.7165635Z ·  ────┬──── 2026-10-24T11:06:37.7165859Z · ╰── This is the containing effect 2026-10-24T11:06:37.7166077Z 2145 │ setExpandedVideo(null); 2026-10-24T11:06:37.7166258Z ·  ────────┬─────── 2026-10-24T11:06:37.7166535Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7166780Z 2146 │ setExpandedFile(null); 2026-10-24T11:06:37.7166934Z ╰──── 2026-10-24T11:06:37.7167603Z  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-24T11:06:37.7168518Z  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-24T11:06:37.7168833Z 2026-10-24T11:06:37.7169093Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7169483Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2646:9] 2026-10-24T11:06:37.7169772Z 2637 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T11:06:37.7169996Z 2638 │ useEffect(() => { 2026-10-24T11:06:37.7170157Z ·  ────┬──── 2026-10-24T11:06:37.7170383Z · ╰── This is the containing effect 2026-10-24T11:06:37.7170659Z 2639 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T11:06:37.7170911Z 2640 │ const index = presentedFeed.findIndex( 2026-10-24T11:06:37.7171163Z 2641 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T11:06:37.7171372Z 2642 │ ); 2026-10-24T11:06:37.7171516Z 2643 │ if (index === -1) { 2026-10-24T11:06:37.7171739Z 2644 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T11:06:37.7171994Z 2645 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T11:06:37.7172211Z 2646 │ setInteractionState((current) => ({ 2026-10-24T11:06:37.7172421Z ·  ─────────┬───────── 2026-10-24T11:06:37.7172703Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7172949Z 2647 │ ...current, 2026-10-24T11:06:37.7173089Z ╰──── 2026-10-24T11:06:37.7173767Z  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-24T11:06:37.7174644Z  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-24T11:06:37.7175297Z 2026-10-24T11:06:37.7175536Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T11:06:37.7175898Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T11:06:37.7176192Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T11:06:37.7176566Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T11:06:37.7176864Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7177141Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T11:06:37.7177470Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T11:06:37.7177696Z ╰──── 2026-10-24T11:06:37.7177859Z  help: Consider removing this import. 2026-10-24T11:06:37.7177980Z 2026-10-24T11:06:37.7178191Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T11:06:37.7178562Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T11:06:37.7178768Z 91 │ import { 2026-10-24T11:06:37.7178909Z 92 │ createContext, 2026-10-24T11:06:37.7179075Z ·  ──────┬────── 2026-10-24T11:06:37.7179313Z · ╰── 'createContext' is imported here 2026-10-24T11:06:37.7179513Z 93 │ memo, 2026-10-24T11:06:37.7179635Z ╰──── 2026-10-24T11:06:37.7179794Z  help: Consider removing this import. 2026-10-24T11:06:37.7179911Z 2026-10-24T11:06:37.7180127Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T11:06:37.7180477Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T11:06:37.7180722Z 107 │ import { 2026-10-24T11:06:37.7180920Z 108 │ ActivityIndicator, 2026-10-24T11:06:37.7181114Z ·  ────────┬──────── 2026-10-24T11:06:37.7181365Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T11:06:37.7181580Z 109 │ Image, 2026-10-24T11:06:37.7181714Z ╰──── 2026-10-24T11:06:37.7181872Z  help: Consider removing this import. 2026-10-24T11:06:37.7181989Z 2026-10-24T11:06:37.7182196Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T11:06:37.7182530Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T11:06:37.7182743Z 114 │ Pressable, 2026-10-24T11:06:37.7182889Z 115 │ ScrollView, 2026-10-24T11:06:37.7183046Z ·  ─────┬──── 2026-10-24T11:06:37.7183354Z · ╰── 'ScrollView' is imported here 2026-10-24T11:06:37.7183561Z 116 │ StyleSheet, 2026-10-24T11:06:37.7183696Z ╰──── 2026-10-24T11:06:37.7183853Z  help: Consider removing this import. 2026-10-24T11:06:37.7183971Z 2026-10-24T11:06:37.7184186Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T11:06:37.7184530Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T11:06:37.7184747Z 116 │ StyleSheet, 2026-10-24T11:06:37.7184893Z 117 │ Text as NativeText, 2026-10-24T11:06:37.7185070Z ·  ─────┬──── 2026-10-24T11:06:37.7185314Z · ╰── 'NativeText' is imported here 2026-10-24T11:06:37.7185534Z 118 │ type ColorValue, 2026-10-24T11:06:37.7185674Z ╰──── 2026-10-24T11:06:37.7185834Z  help: Consider removing this import. 2026-10-24T11:06:37.7185947Z 2026-10-24T11:06:37.7186172Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T11:06:37.7186626Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T11:06:37.7186965Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T11:06:37.7187245Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T11:06:37.7187484Z ·  ─────────┬──────── 2026-10-24T11:06:37.7187747Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T11:06:37.7188060Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T11:06:37.7188301Z ╰──── 2026-10-24T11:06:37.7188463Z  help: Consider removing this import. 2026-10-24T11:06:37.7188580Z 2026-10-24T11:06:37.7188803Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T11:06:37.7189170Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T11:06:37.7189462Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T11:06:37.7189747Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T11:06:37.7189986Z ·  ─────────┬───────── 2026-10-24T11:06:37.7190255Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T11:06:37.7190477Z 144 │ import { 2026-10-24T11:06:37.7190608Z ╰──── 2026-10-24T11:06:37.7190764Z  help: Consider removing this import. 2026-10-24T11:06:37.7190879Z 2026-10-24T11:06:37.7191100Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T11:06:37.7191451Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T11:06:37.7191760Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T11:06:37.7192068Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T11:06:37.7192311Z ·  ────────┬─────── 2026-10-24T11:06:37.7192571Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T11:06:37.7192869Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T11:06:37.7193084Z ╰──── 2026-10-24T11:06:37.7193240Z  help: Consider removing this import. 2026-10-24T11:06:37.7193357Z 2026-10-24T11:06:37.7193587Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T11:06:37.7193941Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T11:06:37.7194248Z 160 │ attachmentVideoPreviewSource, 2026-10-24T11:06:37.7194467Z 161 │ mediaVideoPreviewUri, 2026-10-24T11:06:37.7194652Z ·  ──────────┬───────── 2026-10-24T11:06:37.7194911Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T11:06:37.7195148Z 162 │ mediaVideoThumbnailKey, 2026-10-24T11:06:37.7195298Z ╰──── 2026-10-24T11:06:37.7195454Z  help: Consider removing this import. 2026-10-24T11:06:37.7195571Z 2026-10-24T11:06:37.7195805Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T11:06:37.7196163Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T11:06:37.7196386Z 161 │ mediaVideoPreviewUri, 2026-10-24T11:06:37.7196551Z 162 │ mediaVideoThumbnailKey, 2026-10-24T11:06:37.7196748Z ·  ───────────┬────────── 2026-10-24T11:06:37.7197018Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T11:06:37.7197266Z 163 │ type MediaVideoPreviewSource, 2026-10-24T11:06:37.7197422Z ╰──── 2026-10-24T11:06:37.7197582Z  help: Consider removing this import. 2026-10-24T11:06:37.7197694Z 2026-10-24T11:06:37.7197916Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T11:06:37.7198269Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T11:06:37.7198521Z 162 │ mediaVideoThumbnailKey, 2026-10-24T11:06:37.7198700Z 163 │ type MediaVideoPreviewSource, 2026-10-24T11:06:37.7198901Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7199186Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T11:06:37.7199446Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T11:06:37.7199608Z ╰──── 2026-10-24T11:06:37.7199767Z  help: Consider removing this import. 2026-10-24T11:06:37.7199885Z 2026-10-24T11:06:37.7200089Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T11:06:37.7200430Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T11:06:37.7200759Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T11:06:37.7201093Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T11:06:37.7201345Z ·  ───────┬─────── 2026-10-24T11:06:37.7201614Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T11:06:37.7201833Z 172 │ import { 2026-10-24T11:06:37.7201962Z ╰──── 2026-10-24T11:06:37.7202125Z  help: Consider removing this import. 2026-10-24T11:06:37.7202243Z 2026-10-24T11:06:37.7202482Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T11:06:37.7202847Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T11:06:37.7203060Z 185 │ import { 2026-10-24T11:06:37.7203208Z 186 │ resolveMarkdownFontSizes, 2026-10-24T11:06:37.7203399Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7203671Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T11:06:37.7203927Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T11:06:37.7204101Z ╰──── 2026-10-24T11:06:37.7204339Z  help: Consider removing this import. 2026-10-24T11:06:37.7204490Z 2026-10-24T11:06:37.7204723Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-24T11:06:37.7205085Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10] 2026-10-24T11:06:37.7205377Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-24T11:06:37.7205670Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-24T11:06:37.7205934Z ·  ───────────┬────────── 2026-10-24T11:06:37.7206214Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-24T11:06:37.7206446Z 192 │ import { 2026-10-24T11:06:37.7206576Z ╰──── 2026-10-24T11:06:37.7206738Z  help: Consider removing this import. 2026-10-24T11:06:37.7206859Z 2026-10-24T11:06:37.7207131Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T11:06:37.7207522Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3] 2026-10-24T11:06:37.7207785Z 193 │ normalizeNativeMarkdownUrl, 2026-10-24T11:06:37.7207983Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T11:06:37.7208222Z ·  ──────────────────┬────────────────── 2026-10-24T11:06:37.7226286Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T11:06:37.7226575Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T11:06:37.7226726Z ╰──── 2026-10-24T11:06:37.7226885Z  help: Consider removing this import. 2026-10-24T11:06:37.7227002Z 2026-10-24T11:06:37.7227257Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-24T11:06:37.7227662Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3] 2026-10-24T11:06:37.7227907Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T11:06:37.7228092Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T11:06:37.7228304Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7228568Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-24T11:06:37.7228814Z 196 │ resolveMarkdownLinkPresentation, 2026-10-24T11:06:37.7228970Z ╰──── 2026-10-24T11:06:37.7229122Z  help: Consider removing this import. 2026-10-24T11:06:37.7229234Z 2026-10-24T11:06:37.7229467Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T11:06:37.7229837Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:235:10] 2026-10-24T11:06:37.7230093Z 234 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T11:06:37.7230360Z 235 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T11:06:37.7230623Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7230905Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T11:06:37.7231133Z 236 │ import { 2026-10-24T11:06:37.7231260Z ╰──── 2026-10-24T11:06:37.7231415Z  help: Consider removing this import. 2026-10-24T11:06:37.7231531Z 2026-10-24T11:06:37.7231750Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T11:06:37.7232220Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:239:3] 2026-10-24T11:06:37.7232490Z 238 │ useAssetUrl, 2026-10-24T11:06:37.7232638Z 239 │ useAssetUrlState, 2026-10-24T11:06:37.7232808Z ·  ────────┬─────── 2026-10-24T11:06:37.7233057Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T11:06:37.7233276Z 240 │ useRefreshAssetUrl, 2026-10-24T11:06:37.7233421Z ╰──── 2026-10-24T11:06:37.7233577Z  help: Consider removing this import. 2026-10-24T11:06:37.7233693Z 2026-10-24T11:06:37.7233907Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7234249Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2147:7] 2026-10-24T11:06:37.7234473Z 2146 │ setExpandedFile(null); 2026-10-24T11:06:37.7234741Z 2147 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T11:06:37.7235160Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T11:06:37.7235676Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T11:06:37.7236145Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T11:06:37.7236505Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T11:06:37.7236817Z 2148 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T11:06:37.7237025Z ╰──── 2026-10-24T11:06:37.7237394Z  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-24T11:06:37.7238007Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7238341Z 2026-10-24T11:06:37.7238549Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7238889Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2615:7] 2026-10-24T11:06:37.7239143Z 2614 │ reportHeaderMaterialVisibility(false); 2026-10-24T11:06:37.7239378Z 2615 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T11:06:37.7239600Z ·  ──────┬────── 2026-10-24T11:06:37.7239926Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T11:06:37.7240176Z 2616 │ 2026-10-24T11:06:37.7240293Z ╰──── 2026-10-24T11:06:37.7240647Z  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-24T11:06:37.7241250Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7241555Z 2026-10-24T11:06:37.7241763Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7242103Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2631:7] 2026-10-24T11:06:37.7242315Z 2630 │ } 2026-10-24T11:06:37.7242518Z 2631 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T11:06:37.7242752Z ·  ──────┬───── 2026-10-24T11:06:37.7243012Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T11:06:37.7243312Z 2632 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T11:06:37.7243526Z ╰──── 2026-10-24T11:06:37.7243883Z  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-24T11:06:37.7244485Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7244787Z 2026-10-24T11:06:37.7244987Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7245335Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2827:7] 2026-10-24T11:06:37.7245544Z 2826 │ } 2026-10-24T11:06:37.7245804Z 2827 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T11:06:37.7246215Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T11:06:37.7246673Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T11:06:37.7247116Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T11:06:37.7247477Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T11:06:37.7247692Z 2828 │ 2026-10-24T11:06:37.7247822Z ╰──── 2026-10-24T11:06:37.7248177Z  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-24T11:06:37.7248798Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7249098Z 2026-10-24T11:06:37.7249285Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:06:37.7249611Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:619:9] 2026-10-24T11:06:37.7249820Z 618 │ }; 2026-10-24T11:06:37.7250014Z 619 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T11:06:37.7250438Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T11:06:37.7250923Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T11:06:37.7251348Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T11:06:37.7251709Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T11:06:37.7251932Z 620 │ ); 2026-10-24T11:06:37.7252057Z ╰──── 2026-10-24T11:06:37.7252434Z  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-24T11:06:37.7253060Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7253369Z 2026-10-24T11:06:37.7253593Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:06:37.7253949Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T11:06:37.7254165Z 113 │ const declared = { 2026-10-24T11:06:37.7254359Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T11:06:37.7254589Z ·  ──────────────────────────────── 2026-10-24T11:06:37.7254825Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T11:06:37.7255004Z ╰──── 2026-10-24T11:06:37.7255338Z  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-24T11:06:37.7255596Z 2026-10-24T11:06:37.7255829Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:06:37.7256189Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T11:06:37.7256427Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T11:06:37.7256649Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T11:06:37.7256902Z ·  ──────────────────────────────────────── 2026-10-24T11:06:37.7257133Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T11:06:37.7257309Z ╰──── 2026-10-24T11:06:37.7257635Z  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-24T11:06:37.7257894Z 2026-10-24T11:06:37.7258126Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:06:37.7258502Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T11:06:37.7258755Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T11:06:37.7258976Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T11:06:37.7259218Z ·  ──────────────────────────────────── 2026-10-24T11:06:37.7259405Z 117 │ }; 2026-10-24T11:06:37.7259536Z ╰──── 2026-10-24T11:06:37.7259861Z  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-24T11:06:37.7260121Z 2026-10-24T11:06:37.7260316Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T11:06:37.7260744Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T11:06:37.7261129Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T11:06:37.7261391Z 602 │ const gesture = Gesture.Pan() 2026-10-24T11:06:37.7261589Z ·  ─┬─ 2026-10-24T11:06:37.7261843Z · ╰── `Pan` may be a component 2026-10-24T11:06:37.7262071Z 603 │ .enabled(!props.disabled) 2026-10-24T11:06:37.7262223Z ╰──── 2026-10-24T11:06:37.7262561Z  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-24T11:06:37.7263362Z  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-24T11:06:37.7263786Z 2026-10-24T11:06:37.7263962Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7264270Z ╭─[apps/web/src/components/CommandPalette.tsx:2022:20] 2026-10-24T11:06:37.7264539Z 2021 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T11:06:37.7264771Z 2022 │ createdAt: new Date().toISOString(), 2026-10-24T11:06:37.7264985Z ·  ─────┬──── 2026-10-24T11:06:37.7265237Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7265498Z 2023 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T11:06:37.7265681Z ╰──── 2026-10-24T11:06:37.7266028Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7266602Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7266890Z 2026-10-24T11:06:37.7267155Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7267562Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T11:06:37.7267782Z 404 │ 2026-10-24T11:06:37.7267916Z 405 │ useEffect(() => { 2026-10-24T11:06:37.7268079Z ·  ────┬──── 2026-10-24T11:06:37.7268333Z · ╰── This is the containing effect 2026-10-24T11:06:37.7268568Z 406 │ setInspectorSelection((current) => { 2026-10-24T11:06:37.7268780Z ·  ──────────┬────────── 2026-10-24T11:06:37.7269064Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7269345Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T11:06:37.7269516Z ╰──── 2026-10-24T11:06:37.7270191Z  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-24T11:06:37.7271064Z  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-24T11:06:37.7271375Z 2026-10-24T11:06:37.7271689Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T11:06:37.7272103Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T11:06:37.7272433Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T11:06:37.7272779Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T11:06:37.7273052Z 535 │ │ 2026-10-24T11:06:37.7274351Z 540 │ ╰─▶ ); 2026-10-24T11:06:37.7274572Z 541 │ const FilesInspector = () => 2026-10-24T11:06:37.7274729Z ╰──── 2026-10-24T11:06:37.7275012Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T11:06:37.7275232Z 2026-10-24T11:06:37.7275451Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T11:06:37.7275817Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T11:06:37.7276038Z 540 │ ); 2026-10-24T11:06:37.7276281Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T11:06:37.7276607Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T11:06:37.7276877Z 543 │ │ 2026-10-24T11:06:37.7278949Z 551 │ ╰─▶ ) : null; 2026-10-24T11:06:37.7279329Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T11:06:37.7279587Z ╰──── 2026-10-24T11:06:37.7279869Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T11:06:37.7280086Z 2026-10-24T11:06:37.7280329Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T11:06:37.7280701Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T11:06:37.7280976Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T11:06:37.7281363Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T11:06:37.7281722Z 986 │ │ (approval) => approval.requestId, 2026-10-24T11:06:37.7281999Z 987 │ ╰─▶ ); 2026-10-24T11:06:37.7282283Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T11:06:37.7282497Z ╰──── 2026-10-24T11:06:37.7282632Z  help: Switch to `Set` 2026-10-24T11:06:37.7282734Z 2026-10-24T11:06:37.7282953Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T11:06:37.7283269Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T11:06:37.7283452Z 1078 │ } 2026-10-24T11:06:37.7283959Z ·  ───────────────────────────────────────────── 2026-10-24T11:06:37.7284195Z 1080 │ screenOptions={({ route }) => 2026-10-24T11:06:37.7284362Z ╰──── 2026-10-24T11:06:37.7284794Z  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-24T11:06:37.7285137Z 2026-10-24T11:06:37.7285346Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T11:06:37.7285678Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T11:06:37.7285885Z 37 │ get isConnected() { 2026-10-24T11:06:37.7286071Z 38 │ let current: FakeElement | null = this; 2026-10-24T11:06:37.7286256Z ·  ─────── 2026-10-24T11:06:37.7286423Z 39 │ while (current?.parent) { 2026-10-24T11:06:37.7286570Z ╰──── 2026-10-24T11:06:37.7286914Z  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-24T11:06:37.7287179Z 2026-10-24T11:06:37.7287413Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T11:06:37.7287764Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T11:06:37.7287961Z 730 │ ); 2026-10-24T11:06:37.7288212Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T11:06:37.7288516Z ·  ────── 2026-10-24T11:06:37.7288744Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T11:06:37.7288922Z ╰──── 2026-10-24T11:06:37.7289158Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T11:06:37.7289424Z 2026-10-24T11:06:37.7289663Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7290024Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T11:06:37.7290263Z 71 │ { 2026-10-24T11:06:37.7293402Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T11:06:37.7293673Z ·  ─────────┬──────── 2026-10-24T11:06:37.7293929Z · ╰── `separationProgress` cannot be modified 2026-10-24T11:06:37.7294197Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T11:06:37.7294377Z ╰──── 2026-10-24T11:06:37.7294719Z  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-24T11:06:37.7295296Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7295596Z 2026-10-24T11:06:37.7295758Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7296084Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T11:06:37.7296372Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T11:06:37.7296625Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T11:06:37.7296849Z ·  ──────┬───── 2026-10-24T11:06:37.7297095Z · ╰── `capsuleWidth` originates here 2026-10-24T11:06:37.7297359Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T11:06:37.7297606Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7297854Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T11:06:37.7298078Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T11:06:37.7298259Z 134 │ return; 2026-10-24T11:06:37.7298419Z 135 │ } 2026-10-24T11:06:37.7298595Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T11:06:37.7298810Z 137 │ measuredWidthRef.current = width; 2026-10-24T11:06:37.7299062Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T11:06:37.7299304Z ·  ──────┬───── 2026-10-24T11:06:37.7299617Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T11:06:37.7299857Z 139 │ }; 2026-10-24T11:06:37.7299979Z ╰──── 2026-10-24T11:06:37.7300306Z  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-24T11:06:37.7300883Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7301184Z 2026-10-24T11:06:37.7301346Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7301675Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T11:06:37.7301963Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T11:06:37.7302214Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T11:06:37.7302437Z ·  ──────┬───── 2026-10-24T11:06:37.7302679Z · ╰── `capsuleWidth` originates here 2026-10-24T11:06:37.7302937Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T11:06:37.7303249Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7303488Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T11:06:37.7303712Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T11:06:37.7303892Z 134 │ return; 2026-10-24T11:06:37.7304025Z 135 │ } 2026-10-24T11:06:37.7304201Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T11:06:37.7304414Z 137 │ measuredWidthRef.current = width; 2026-10-24T11:06:37.7304664Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T11:06:37.7304886Z 139 │ }; 2026-10-24T11:06:37.7305049Z 140 │ const hasStatus = props.status !== null; 2026-10-24T11:06:37.7305298Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T11:06:37.7305520Z 142 │ useEffect(() => { 2026-10-24T11:06:37.7305672Z 143 │ if (!hasStatus) { 2026-10-24T11:06:37.7305850Z 144 │ measuredWidthRef.current = null; 2026-10-24T11:06:37.7306036Z 145 │ capsuleWidth.value = null; 2026-10-24T11:06:37.7306220Z ·  ──────┬───── 2026-10-24T11:06:37.7306458Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T11:06:37.7306662Z 146 │ } 2026-10-24T11:06:37.7306783Z ╰──── 2026-10-24T11:06:37.7307117Z  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-24T11:06:37.7307693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7307990Z 2026-10-24T11:06:37.7308196Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:06:37.7308587Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T11:06:37.7308899Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T11:06:37.7309117Z 142 │ useEffect(() => { 2026-10-24T11:06:37.7309283Z ·  ───┬─── 2026-10-24T11:06:37.7309611Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T11:06:37.7309974Z 143 │ if (!hasStatus) { 2026-10-24T11:06:37.7310203Z 144 │ measuredWidthRef.current = null; 2026-10-24T11:06:37.7310389Z 145 │ capsuleWidth.value = null; 2026-10-24T11:06:37.7310572Z ·  ──────┬───── 2026-10-24T11:06:37.7310807Z · ╰── This modifies `capsuleWidth` 2026-10-24T11:06:37.7311010Z 146 │ } 2026-10-24T11:06:37.7311131Z ╰──── 2026-10-24T11:06:37.7311542Z  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-24T11:06:37.7312175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7312472Z 2026-10-24T11:06:37.7312688Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:06:37.7313059Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T11:06:37.7313347Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T11:06:37.7313597Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7313864Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7314239Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T11:06:37.7314576Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T11:06:37.7314796Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T11:06:37.7314978Z 134 │ return; 2026-10-24T11:06:37.7315108Z 135 │ } 2026-10-24T11:06:37.7315289Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T11:06:37.7315505Z 137 │ measuredWidthRef.current = width; 2026-10-24T11:06:37.7315756Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T11:06:37.7315996Z ·  ──────┬───── 2026-10-24T11:06:37.7316228Z · ╰── This modifies `capsuleWidth` 2026-10-24T11:06:37.7316429Z 139 │ }; 2026-10-24T11:06:37.7316547Z ╰──── 2026-10-24T11:06:37.7316955Z  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-24T11:06:37.7317593Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7317892Z 2026-10-24T11:06:37.7318158Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7318597Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T11:06:37.7318885Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T11:06:37.7319084Z 38 │ useLayoutEffect(() => { 2026-10-24T11:06:37.7319260Z ·  ───────┬─────── 2026-10-24T11:06:37.7319489Z · ╰── This is the containing effect 2026-10-24T11:06:37.7319694Z 39 │ reset(); 2026-10-24T11:06:37.7319838Z 40 │ setInitialized(true); 2026-10-24T11:06:37.7320008Z ·  ───────┬────── 2026-10-24T11:06:37.7320350Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7320621Z 41 │ }, [reset]); 2026-10-24T11:06:37.7320756Z ╰──── 2026-10-24T11:06:37.7321423Z  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-24T11:06:37.7322296Z  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-24T11:06:37.7322607Z 2026-10-24T11:06:37.7322871Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7323287Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T11:06:37.7323516Z 88 │ 2026-10-24T11:06:37.7323647Z 89 │ useEffect(() => { 2026-10-24T11:06:37.7323806Z ·  ────┬──── 2026-10-24T11:06:37.7324029Z · ╰── This is the containing effect 2026-10-24T11:06:37.7324328Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T11:06:37.7324605Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T11:06:37.7324793Z 92 │ let active = true; 2026-10-24T11:06:37.7324982Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T11:06:37.7325183Z ·  ─────────┬───────── 2026-10-24T11:06:37.7325462Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7325801Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T11:06:37.7326028Z ╰──── 2026-10-24T11:06:37.7326689Z  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-24T11:06:37.7327557Z  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-24T11:06:37.7327865Z 2026-10-24T11:06:37.7328025Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7328366Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T11:06:37.7328741Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T11:06:37.7329079Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T11:06:37.7329306Z ·  ────┬─── 2026-10-24T11:06:37.7329538Z · ╰── `rotation` originates here 2026-10-24T11:06:37.7329732Z 172 │ 2026-10-24T11:06:37.7329867Z 173 │ useLayoutEffect(() => { 2026-10-24T11:06:37.7330099Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T11:06:37.7330322Z ·  ────┬─── 2026-10-24T11:06:37.7330549Z · ╰── `rotation` cannot be modified 2026-10-24T11:06:37.7330792Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T11:06:37.7330969Z ╰──── 2026-10-24T11:06:37.7331301Z  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-24T11:06:37.7331873Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7332168Z 2026-10-24T11:06:37.7332366Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7332720Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T11:06:37.7332951Z 1245 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T11:06:37.7335365Z 113 │ useEffect(() => { 2026-10-24T11:06:37.7335526Z ·  ────┬──── 2026-10-24T11:06:37.7335746Z · ╰── This is the containing effect 2026-10-24T11:06:37.7336055Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T11:06:37.7336294Z 115 │ return; 2026-10-24T11:06:37.7336434Z 116 │ } 2026-10-24T11:06:37.7336623Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T11:06:37.7336832Z ·  ────┬─── 2026-10-24T11:06:37.7337091Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7337388Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T11:06:37.7337578Z ╰──── 2026-10-24T11:06:37.7338248Z  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-24T11:06:37.7339224Z  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-24T11:06:37.7339568Z 2026-10-24T11:06:37.7339831Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7340236Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T11:06:37.7340458Z 55 │ 2026-10-24T11:06:37.7340584Z 56 │ useEffect(() => { 2026-10-24T11:06:37.7340746Z ·  ────┬──── 2026-10-24T11:06:37.7340968Z · ╰── This is the containing effect 2026-10-24T11:06:37.7341179Z 57 │ setDecodedSize(null); 2026-10-24T11:06:37.7341348Z ·  ───────┬────── 2026-10-24T11:06:37.7341624Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7341870Z 58 │ }, [props.sourceKey]); 2026-10-24T11:06:37.7342013Z ╰──── 2026-10-24T11:06:37.7342680Z  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-24T11:06:37.7343617Z  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-24T11:06:37.7343925Z 2026-10-24T11:06:37.7344188Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7344599Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T11:06:37.7344821Z 59 │ 2026-10-24T11:06:37.7344951Z 60 │ useEffect(() => { 2026-10-24T11:06:37.7345106Z ·  ────┬──── 2026-10-24T11:06:37.7345324Z · ╰── This is the containing effect 2026-10-24T11:06:37.7345532Z 61 │ setFailedUri(null); 2026-10-24T11:06:37.7345698Z ·  ──────┬───── 2026-10-24T11:06:37.7345966Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7346202Z 62 │ }, [props.uri]); 2026-10-24T11:06:37.7346342Z ╰──── 2026-10-24T11:06:37.7347010Z  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-24T11:06:37.7347890Z  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-24T11:06:37.7348201Z 2026-10-24T11:06:37.7348524Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T11:06:37.7348898Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T11:06:37.7349187Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T11:06:37.7349512Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T11:06:37.7349791Z ·  ────────┬──────── 2026-10-24T11:06:37.7350136Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T11:06:37.7350388Z 8 │ 2026-10-24T11:06:37.7350506Z ╰──── 2026-10-24T11:06:37.7350664Z  help: Consider removing this import. 2026-10-24T11:06:37.7350782Z 2026-10-24T11:06:37.7350990Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7351343Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T11:06:37.7351578Z 57 │ setDecodedSize(null); 2026-10-24T11:06:37.7351739Z 58 │ }, [props.sourceKey]); 2026-10-24T11:06:37.7351916Z ·  ───────┬─────── 2026-10-24T11:06:37.7352170Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T11:06:37.7352381Z 59 │ 2026-10-24T11:06:37.7352497Z ╰──── 2026-10-24T11:06:37.7352860Z  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-24T11:06:37.7353469Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7353769Z 2026-10-24T11:06:37.7353973Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7354331Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T11:06:37.7354561Z 61 │ setFailedUri(null); 2026-10-24T11:06:37.7354720Z 62 │ }, [props.uri]); 2026-10-24T11:06:37.7354879Z ·  ────┬──── 2026-10-24T11:06:37.7355125Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T11:06:37.7355329Z 63 │ 2026-10-24T11:06:37.7355446Z ╰──── 2026-10-24T11:06:37.7355797Z  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-24T11:06:37.7356396Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7356692Z 2026-10-24T11:06:37.7356889Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T11:06:37.7357218Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T11:06:37.7357483Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T11:06:37.7357702Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T11:06:37.7357886Z ·  ─┬─ 2026-10-24T11:06:37.7358111Z · ╰── 'Arr' is imported here 2026-10-24T11:06:37.7358357Z 5 │ import * as Order from "effect/Order"; 2026-10-24T11:06:37.7358515Z ╰──── 2026-10-24T11:06:37.7358676Z  help: Consider removing this import. 2026-10-24T11:06:37.7358794Z 2026-10-24T11:06:37.7358990Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T11:06:37.7359321Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T11:06:37.7359546Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T11:06:37.7359736Z 5 │ import * as Order from "effect/Order"; 2026-10-24T11:06:37.7359913Z ·  ──┬── 2026-10-24T11:06:37.7360211Z · ╰── 'Order' is imported here 2026-10-24T11:06:37.7360457Z 6 │ 2026-10-24T11:06:37.7360575Z ╰──── 2026-10-24T11:06:37.7360731Z  help: Consider removing this import. 2026-10-24T11:06:37.7360849Z 2026-10-24T11:06:37.7361044Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T11:06:37.7361362Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T11:06:37.7361621Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T11:06:37.7361823Z 187 │ let next = initial; 2026-10-24T11:06:37.7361987Z ·  ──┬─ 2026-10-24T11:06:37.7362206Z · ╰── From this accumulator 2026-10-24T11:06:37.7362424Z 188 │ let receivedSnapshot = false; 2026-10-24T11:06:37.7362609Z 189 │ for (const item of items) { 2026-10-24T11:06:37.7362786Z ·  ─┬─ 2026-10-24T11:06:37.7362988Z · ╰── For this loop 2026-10-24T11:06:37.7363198Z 190 │ if (item.kind === "synchronized") { 2026-10-24T11:06:37.7363378Z 191 │ waiting = false; 2026-10-24T11:06:37.7363556Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T11:06:37.7363784Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T11:06:37.7364002Z ·  ───┬─── 2026-10-24T11:06:37.7364228Z · ╰── From this spread 2026-10-24T11:06:37.7364418Z 194 │ } 2026-10-24T11:06:37.7364538Z ╰──── 2026-10-24T11:06:37.7364749Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T11:06:37.7365078Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T11:06:37.7365251Z 2026-10-24T11:06:37.7365517Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7365919Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T11:06:37.7366243Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T11:06:37.7366478Z 29 │ useEffect(() => { 2026-10-24T11:06:37.7366637Z ·  ────┬──── 2026-10-24T11:06:37.7366851Z · ╰── This is the containing effect 2026-10-24T11:06:37.7367109Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T11:06:37.7367347Z ·  ───┬─── 2026-10-24T11:06:37.7367669Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7367925Z 31 │ }, [key, live, snapshot]); 2026-10-24T11:06:37.7368067Z ╰──── 2026-10-24T11:06:37.7368755Z  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-24T11:06:37.7369622Z  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-24T11:06:37.7369926Z 2026-10-24T11:06:37.7370125Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7370532Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T11:06:37.7370814Z 35 │ { 2026-10-24T11:06:37.7381288Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T11:06:37.7381496Z ·  ──────────┬───────── 2026-10-24T11:06:37.7381758Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T11:06:37.7382008Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T11:06:37.7382170Z ╰──── 2026-10-24T11:06:37.7382499Z  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-24T11:06:37.7383072Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7383424Z 2026-10-24T11:06:37.7383641Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T11:06:37.7383984Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T11:06:37.7384203Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T11:06:37.7384367Z 3 │ type AuthSessionState, 2026-10-24T11:06:37.7384540Z ·  ────────┬─────── 2026-10-24T11:06:37.7384789Z · ╰── 'AuthSessionState' is imported here 2026-10-24T11:06:37.7385009Z 4 │ sessionGrantsScope, 2026-10-24T11:06:37.7385148Z ╰──── 2026-10-24T11:06:37.7385303Z  help: Consider removing this import. 2026-10-24T11:06:37.7385420Z 2026-10-24T11:06:37.7385909Z ⚠ 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-24T11:06:37.7386500Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T11:06:37.7386756Z 1679 │ yield* harness.replaceSession; 2026-10-24T11:06:37.7387090Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7387448Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T11:06:37.7387708Z 1682 │ │ break; 2026-10-24T11:06:37.7387897Z 1683 │ │ } 2026-10-24T11:06:37.7388112Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7388476Z 1685 │ ╰─▶ } 2026-10-24T11:06:37.7388735Z 1686 │ yield* Queue.offer( 2026-10-24T11:06:37.7388885Z ╰──── 2026-10-24T11:06:37.7388944Z 2026-10-24T11:06:37.7389427Z ⚠ 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-24T11:06:37.7390017Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T11:06:37.7390275Z 1788 │ yield* harness.replaceSession; 2026-10-24T11:06:37.7390598Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7390962Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T11:06:37.7391244Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7391511Z 1792 │ ╰─▶ } 2026-10-24T11:06:37.7391784Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T11:06:37.7391985Z ╰──── 2026-10-24T11:06:37.7392042Z 2026-10-24T11:06:37.7392294Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:06:37.7392695Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T11:06:37.7392924Z 289 │ return ( 2026-10-24T11:06:37.7393135Z 290 │ 2026-10-24T11:06:37.7393413Z ·  ───────────── 2026-10-24T11:06:37.7393618Z 291 │ {props.children} 2026-10-24T11:06:37.7393768Z ╰──── 2026-10-24T11:06:37.7394053Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:06:37.7394420Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:06:37.7394602Z 2026-10-24T11:06:37.7394845Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:06:37.7395243Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T11:06:37.7395469Z 653 │ return ( 2026-10-24T11:06:37.7395667Z 654 │ 2026-10-24T11:06:37.7395923Z ·  ───────────── 2026-10-24T11:06:37.7396125Z 655 │ {props.children} 2026-10-24T11:06:37.7396271Z ╰──── 2026-10-24T11:06:37.7396556Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:06:37.7396915Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:06:37.7397096Z 2026-10-24T11:06:37.7397345Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:06:37.7397741Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T11:06:37.7397975Z 1461 │ return ( 2026-10-24T11:06:37.7398211Z 1462 │ 2026-10-24T11:06:37.7404491Z ·  ──────────────────── 2026-10-24T11:06:37.7404815Z 1463 │ 0) break; 2026-10-24T11:06:37.7421131Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7421389Z 181 │ ╰─▶ } 2026-10-24T11:06:37.7421585Z 182 │ 2026-10-24T11:06:37.7421707Z ╰──── 2026-10-24T11:06:37.7421768Z 2026-10-24T11:06:37.7422237Z ⚠ 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-24T11:06:37.7422811Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T11:06:37.7422951Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T11:06:37.7423227Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T11:06:37.7423355Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T11:06:37.7423555Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T11:06:37.7423649Z 310 │ │ break; 2026-10-24T11:06:37.7423734Z 311 │ │ } 2026-10-24T11:06:37.7423840Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7423976Z 313 │ ╰─▶ } 2026-10-24T11:06:37.7424035Z 314 │ 2026-10-24T11:06:37.7424091Z ╰──── 2026-10-24T11:06:37.7424175Z 2026-10-24T11:06:37.7424487Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7424649Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T11:06:37.7424792Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T11:06:37.7424865Z 356 │ useEffect(() => { 2026-10-24T11:06:37.7424941Z ·  ────┬──── 2026-10-24T11:06:37.7425079Z · ╰── This is the containing effect 2026-10-24T11:06:37.7425174Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T11:06:37.7425240Z 358 │ return; 2026-10-24T11:06:37.7425296Z 359 │ } 2026-10-24T11:06:37.7425400Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T11:06:37.7425507Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T11:06:37.7425624Z ·  ──────────────┬────────────── 2026-10-24T11:06:37.7425809Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7425874Z 362 │ return; 2026-10-24T11:06:37.7425930Z ╰──── 2026-10-24T11:06:37.7426548Z  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-24T11:06:37.7426880Z  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-24T11:06:37.7426892Z 2026-10-24T11:06:37.7427157Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7427316Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T11:06:37.7427371Z 447 │ 2026-10-24T11:06:37.7427441Z 448 │ useEffect(() => { 2026-10-24T11:06:37.7427515Z ·  ────┬──── 2026-10-24T11:06:37.7427651Z · ╰── This is the containing effect 2026-10-24T11:06:37.7427760Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T11:06:37.7427821Z 450 │ return; 2026-10-24T11:06:37.7427879Z 451 │ } 2026-10-24T11:06:37.7428028Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T11:06:37.7428227Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T11:06:37.7428406Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T11:06:37.7428464Z 455 │ } 2026-10-24T11:06:37.7428612Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T11:06:37.7428745Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T11:06:37.7428852Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T11:06:37.7428929Z 459 │ const directProject = 2026-10-24T11:06:37.7429001Z 460 │ projects.find( 2026-10-24T11:06:37.7429071Z 461 │ (project) => 2026-10-24T11:06:37.7429251Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T11:06:37.7429319Z 463 │ ) ?? null; 2026-10-24T11:06:37.7429376Z 464 │ 2026-10-24T11:06:37.7429449Z 465 │ if (directProject) { 2026-10-24T11:06:37.7429598Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T11:06:37.7429746Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T11:06:37.7429914Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T11:06:37.7430056Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T11:06:37.7430120Z 470 │ return; 2026-10-24T11:06:37.7430182Z 471 │ } 2026-10-24T11:06:37.7430284Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T11:06:37.7430349Z 473 │ if ( 2026-10-24T11:06:37.7430495Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T11:06:37.7430601Z 475 │ selectedProject.id !== directProject.id 2026-10-24T11:06:37.7430665Z 476 │ ) { 2026-10-24T11:06:37.7430759Z 477 │ setProject(directProject); 2026-10-24T11:06:37.7430828Z 478 │ return; 2026-10-24T11:06:37.7430891Z 479 │ } 2026-10-24T11:06:37.7430979Z 480 │ if (!flow.draftKey) return; 2026-10-24T11:06:37.7431125Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T11:06:37.7431270Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T11:06:37.7431385Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T11:06:37.7431467Z 484 │ workspaceSelection: { 2026-10-24T11:06:37.7431542Z 485 │ mode: "local", 2026-10-24T11:06:37.7431651Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T11:06:37.7431792Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T11:06:37.7431885Z 488 │ startFromOrigin: false, 2026-10-24T11:06:37.7431953Z 489 │ }, 2026-10-24T11:06:37.7432014Z 490 │ }); 2026-10-24T11:06:37.7432076Z 491 │ } 2026-10-24T11:06:37.7432208Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T11:06:37.7432269Z 493 │ if ( 2026-10-24T11:06:37.7432416Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T11:06:37.7432518Z 495 │ selectedProject.id === directProject.id 2026-10-24T11:06:37.7432581Z 496 │ ) { 2026-10-24T11:06:37.7432644Z 497 │ return; 2026-10-24T11:06:37.7432705Z 498 │ } 2026-10-24T11:06:37.7432790Z 499 │ setProject(directProject); 2026-10-24T11:06:37.7432856Z 500 │ return; 2026-10-24T11:06:37.7432913Z 501 │ } 2026-10-24T11:06:37.7432970Z 502 │ 2026-10-24T11:06:37.7433203Z 503 │ if (projects.length > 0) { 2026-10-24T11:06:37.7433345Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T11:06:37.7433460Z ·  ──────────────┬────────────── 2026-10-24T11:06:37.7433650Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7433710Z 505 │ } 2026-10-24T11:06:37.7433766Z ╰──── 2026-10-24T11:06:37.7434377Z  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-24T11:06:37.7434716Z  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-24T11:06:37.7434723Z 2026-10-24T11:06:37.7434988Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7435147Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T11:06:37.7435204Z 545 │ 2026-10-24T11:06:37.7435271Z 546 │ useEffect(() => { 2026-10-24T11:06:37.7435348Z ·  ────┬──── 2026-10-24T11:06:37.7435483Z · ╰── This is the containing effect 2026-10-24T11:06:37.7435583Z 547 │ const shareId = props.incomingShareId; 2026-10-24T11:06:37.7435665Z 548 │ const draftKey = flow.draftKey; 2026-10-24T11:06:37.7435771Z 549 │ const destinationProject = selectedProject; 2026-10-24T11:06:37.7435922Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T11:06:37.7436059Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T11:06:37.7436151Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T11:06:37.7436231Z 553 │ !initialEnvironmentId || 2026-10-24T11:06:37.7436305Z 554 │ !initialProjectId || 2026-10-24T11:06:37.7436441Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T11:06:37.7436548Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T11:06:37.7436610Z 557 │ if ( 2026-10-24T11:06:37.7436677Z 558 │ !shareId || 2026-10-24T11:06:37.7436743Z 559 │ !draftKey || 2026-10-24T11:06:37.7436816Z 560 │ !destinationProject || 2026-10-24T11:06:37.7436907Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T11:06:37.7437006Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T11:06:37.7437065Z 563 │ ) { 2026-10-24T11:06:37.7437130Z 564 │ return; 2026-10-24T11:06:37.7437189Z 565 │ } 2026-10-24T11:06:37.7437289Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T11:06:37.7437348Z 567 │ if ( 2026-10-24T11:06:37.7437465Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T11:06:37.7437580Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T11:06:37.7437639Z 570 │ ) { 2026-10-24T11:06:37.7437699Z 571 │ return; 2026-10-24T11:06:37.7437758Z 572 │ } 2026-10-24T11:06:37.7437814Z 573 │ 2026-10-24T11:06:37.7437888Z 574 │ if (!incomingShare) { 2026-10-24T11:06:37.7438087Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T11:06:37.7438304Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T11:06:37.7438408Z 577 │ Dialog.alert( 2026-10-24T11:06:37.7438498Z 578 │ "Shared content unavailable", 2026-10-24T11:06:37.7438674Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T11:06:37.7438737Z 580 │ ); 2026-10-24T11:06:37.7438796Z 581 │ } 2026-10-24T11:06:37.7438856Z 582 │ return; 2026-10-24T11:06:37.7438914Z 583 │ } 2026-10-24T11:06:37.7438970Z 584 │ 2026-10-24T11:06:37.7439030Z 585 │ if ( 2026-10-24T11:06:37.7439193Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T11:06:37.7439299Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T11:06:37.7439357Z 588 │ ) { 2026-10-24T11:06:37.7439420Z 589 │ return; 2026-10-24T11:06:37.7439474Z 590 │ } 2026-10-24T11:06:37.7439537Z 591 │ 2026-10-24T11:06:37.7439682Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T11:06:37.7439807Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T11:06:37.7439862Z 594 │ } 2026-10-24T11:06:37.7439972Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T11:06:37.7440045Z 596 │ const draftBackup = 2026-10-24T11:06:37.7440238Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T11:06:37.7440376Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T11:06:37.7440471Z 599 │ const importToken = Symbol(importKey); 2026-10-24T11:06:37.7440553Z 600 │ let didReserveShare = false; 2026-10-24T11:06:37.7440633Z 601 │ let didConsumeShare = false; 2026-10-24T11:06:37.7440722Z 602 │ let needsDraftRestore = false; 2026-10-24T11:06:37.7440839Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T11:06:37.7440924Z 604 │ setImportingShareKey(importKey); 2026-10-24T11:06:37.7441015Z ·  ──────────┬───────── 2026-10-24T11:06:37.7441192Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7441264Z 605 │ void (async () => { 2026-10-24T11:06:37.7441318Z ╰──── 2026-10-24T11:06:37.7441930Z  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-24T11:06:37.7442259Z  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-24T11:06:37.7442267Z 2026-10-24T11:06:37.7442472Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7442631Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T11:06:37.7442710Z 523 │ props.initialProjectRef, 2026-10-24T11:06:37.7442785Z 524 │ props.incomingShareId, 2026-10-24T11:06:37.7442876Z ·  ──────────┬────────── 2026-10-24T11:06:37.7443047Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T11:06:37.7443121Z 525 │ props.pendingTaskId, 2026-10-24T11:06:37.7443174Z ╰──── 2026-10-24T11:06:37.7443537Z  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-24T11:06:37.7443884Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7443887Z 2026-10-24T11:06:37.7444105Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:06:37.7444258Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T11:06:37.7444375Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T11:06:37.7444443Z 543 │ flow.loadBranches(); 2026-10-24T11:06:37.7444514Z ·  ──┬─ 2026-10-24T11:06:37.7444643Z · ╰── Missing dependency `flow` 2026-10-24T11:06:37.7444742Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T11:06:37.7444831Z ·  ────────┬──────── 2026-10-24T11:06:37.7445035Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T11:06:37.7445089Z 545 │ 2026-10-24T11:06:37.7445141Z ╰──── 2026-10-24T11:06:37.7445568Z  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-24T11:06:37.7445881Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7445884Z 2026-10-24T11:06:37.7446093Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7446251Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T11:06:37.7446317Z 765 │ flow.draftKey, 2026-10-24T11:06:37.7446394Z 766 │ hasImportedIncomingShare, 2026-10-24T11:06:37.7446487Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7446669Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T11:06:37.7446736Z 767 │ incomingShare, 2026-10-24T11:06:37.7446817Z 768 │ isIncomingShareInboxLoading, 2026-10-24T11:06:37.7446915Z ·  ─────────────┬───────────── 2026-10-24T11:06:37.7447103Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T11:06:37.7447185Z 769 │ isIncomingShareUnavailable, 2026-10-24T11:06:37.7447264Z 770 │ props.incomingShareId, 2026-10-24T11:06:37.7447363Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T11:06:37.7447453Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T11:06:37.7447527Z 773 │ releaseShareReservation, 2026-10-24T11:06:37.7447589Z 774 │ reserveShare, 2026-10-24T11:06:37.7447676Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T11:06:37.7447744Z 776 │ selectedProject, 2026-10-24T11:06:37.7447813Z 777 │ shareImportAttempt, 2026-10-24T11:06:37.7447903Z ·  ─────────┬──────── 2026-10-24T11:06:37.7448072Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T11:06:37.7448128Z 778 │ ]); 2026-10-24T11:06:37.7448180Z ╰──── 2026-10-24T11:06:37.7448561Z  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-24T11:06:37.7448907Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7448910Z 2026-10-24T11:06:37.7449099Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7449208Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T11:06:37.7449272Z 457 │ ): Array { 2026-10-24T11:06:37.7449379Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T11:06:37.7449483Z ·  ┬ 2026-10-24T11:06:37.7449632Z · ╰── '_' is declared here 2026-10-24T11:06:37.7449708Z 459 │ for (const b of data) { 2026-10-24T11:06:37.7449762Z ╰──── 2026-10-24T11:06:37.7449868Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7449870Z 2026-10-24T11:06:37.7450340Z ⚠ 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-24T11:06:37.7450478Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T11:06:37.7450615Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T11:06:37.7450799Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T11:06:37.7450910Z ·  ──────────────────────── 2026-10-24T11:06:37.7450974Z 182 │ version: 1, 2026-10-24T11:06:37.7451032Z ╰──── 2026-10-24T11:06:37.7451037Z 2026-10-24T11:06:37.7451412Z ⚠ 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-24T11:06:37.7451526Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T11:06:37.7451687Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T11:06:37.7451857Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T11:06:37.7451962Z ·  ──────────────────────── 2026-10-24T11:06:37.7452028Z 18 │ "review:write", 2026-10-24T11:06:37.7452081Z ╰──── 2026-10-24T11:06:37.7452084Z 2026-10-24T11:06:37.7452458Z ⚠ 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-24T11:06:37.7452574Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T11:06:37.7452631Z 19 │ ]); 2026-10-24T11:06:37.7452796Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T11:06:37.7452903Z ·  ──────────────────────── 2026-10-24T11:06:37.7453036Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T11:06:37.7453088Z ╰──── 2026-10-24T11:06:37.7453090Z 2026-10-24T11:06:37.7453456Z ⚠ 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-24T11:06:37.7453629Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T11:06:37.7453833Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T11:06:37.7453959Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T11:06:37.7454069Z ·  ──────────────────────── 2026-10-24T11:06:37.7454140Z 59 │ authenticated: true, 2026-10-24T11:06:37.7454190Z ╰──── 2026-10-24T11:06:37.7454193Z 2026-10-24T11:06:37.7454398Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T11:06:37.7454530Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T11:06:37.7454604Z 2 │ AuthFilesystemReadScope, 2026-10-24T11:06:37.7454673Z 3 │ type AuthSessionState, 2026-10-24T11:06:37.7454758Z ·  ────────┬─────── 2026-10-24T11:06:37.7454914Z · ╰── 'AuthSessionState' is imported here 2026-10-24T11:06:37.7454992Z 4 │ type FilesystemBrowseEntry, 2026-10-24T11:06:37.7455043Z ╰──── 2026-10-24T11:06:37.7455142Z  help: Consider removing this import. 2026-10-24T11:06:37.7455145Z 2026-10-24T11:06:37.7455348Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T11:06:37.7455442Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T11:06:37.7455512Z 21 │ EnvironmentThreadShell, 2026-10-24T11:06:37.7455578Z 22 │ ThreadRunSummary, 2026-10-24T11:06:37.7455658Z ·  ────────┬─────── 2026-10-24T11:06:37.7455801Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T11:06:37.7455870Z 23 │ ThreadRuntimeSummary, 2026-10-24T11:06:37.7455922Z ╰──── 2026-10-24T11:06:37.7456027Z  help: Consider removing this import. 2026-10-24T11:06:37.7456033Z 2026-10-24T11:06:37.7456296Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7456459Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T11:06:37.7456582Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T11:06:37.7456649Z 278 │ useEffect(() => { 2026-10-24T11:06:37.7456722Z ·  ────┬──── 2026-10-24T11:06:37.7456855Z · ╰── This is the containing effect 2026-10-24T11:06:37.7456941Z 279 │ setNow(new Date().toISOString()); 2026-10-24T11:06:37.7457011Z ·  ───┬── 2026-10-24T11:06:37.7457233Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7457403Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T11:06:37.7457456Z ╰──── 2026-10-24T11:06:37.7458067Z  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-24T11:06:37.7458415Z  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-24T11:06:37.7458418Z 2026-10-24T11:06:37.7458652Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T11:06:37.7458816Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T11:06:37.7458888Z 12 │ threadSearchMatchKey, 2026-10-24T11:06:37.7458975Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T11:06:37.7459081Z ·  ──────────────┬───────────── 2026-10-24T11:06:37.7459258Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T11:06:37.7459368Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T11:06:37.7459420Z ╰──── 2026-10-24T11:06:37.7459518Z  help: Consider removing this import. 2026-10-24T11:06:37.7459521Z 2026-10-24T11:06:37.7459722Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7459896Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T11:06:37.7460032Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T11:06:37.7460123Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T11:06:37.7460227Z ·  ───────┬────── 2026-10-24T11:06:37.7460394Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T11:06:37.7460508Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T11:06:37.7460562Z ╰──── 2026-10-24T11:06:37.7460860Z  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-24T11:06:37.7461181Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7461186Z 2026-10-24T11:06:37.7461357Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7461524Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T11:06:37.7461611Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T11:06:37.7461770Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T11:06:37.7461893Z ·  ─────┬──── 2026-10-24T11:06:37.7462066Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7462146Z 351 │ const id = setTimeout(() => { 2026-10-24T11:06:37.7462198Z ╰──── 2026-10-24T11:06:37.7462547Z  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-24T11:06:37.7462876Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7462878Z 2026-10-24T11:06:37.7463434Z ⚠ 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-24T11:06:37.7463560Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T11:06:37.7463636Z 138 │ Effect.gen(function* () { 2026-10-24T11:06:37.7463840Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T11:06:37.7463969Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T11:06:37.7464293Z 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-24T11:06:37.7464482Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T11:06:37.7464613Z 143 │ ╰─▶ } 2026-10-24T11:06:37.7464701Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T11:06:37.7464754Z ╰──── 2026-10-24T11:06:37.7464757Z 2026-10-24T11:06:37.7464966Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T11:06:37.7465079Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T11:06:37.7465149Z 296 │ } from "./device.ts"; 2026-10-24T11:06:37.7465241Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T11:06:37.7465310Z ·  ── 2026-10-24T11:06:37.7465369Z 298 │ import { 2026-10-24T11:06:37.7465422Z ╰──── 2026-10-24T11:06:37.7465505Z  help: Remove empty braces 2026-10-24T11:06:37.7465508Z 2026-10-24T11:06:37.7465721Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:06:37.7465859Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T11:06:37.7465986Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T11:06:37.7466096Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T11:06:37.7466214Z ·  ─────── 2026-10-24T11:06:37.7466328Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T11:06:37.7466380Z ╰──── 2026-10-24T11:06:37.7466647Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:06:37.7466650Z 2026-10-24T11:06:37.7466885Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T11:06:37.7467010Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T11:06:37.7467194Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T11:06:37.7467291Z 35 │ instanceId === configured ? true : false, 2026-10-24T11:06:37.7467409Z ·  ──────────────────────────────────────── 2026-10-24T11:06:37.7467540Z 36 │ ); 2026-10-24T11:06:37.7467639Z ╰──── 2026-10-24T11:06:37.7467738Z  help: Remove this ternary operator 2026-10-24T11:06:37.7467742Z 2026-10-24T11:06:37.7468207Z ⚠ 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-24T11:06:37.7468363Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T11:06:37.7468429Z 38 │ JSON.stringify( 2026-10-24T11:06:37.7468549Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T11:06:37.7468646Z ·  ──────────────────────── 2026-10-24T11:06:37.7468714Z 40 │ { name: "a" }, 2026-10-24T11:06:37.7468765Z ╰──── 2026-10-24T11:06:37.7468768Z 2026-10-24T11:06:37.7468986Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T11:06:37.7469122Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T11:06:37.7469200Z 89 │ let cursor = prompt.length; 2026-10-24T11:06:37.7469305Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T11:06:37.7469408Z ·  ─────── 2026-10-24T11:06:37.7469490Z 91 │ let { start, end } = occurrence; 2026-10-24T11:06:37.7469542Z ╰──── 2026-10-24T11:06:37.7469802Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:06:37.7469805Z 2026-10-24T11:06:37.7470027Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:06:37.7470153Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T11:06:37.7470259Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T11:06:37.7470389Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T11:06:37.7470545Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T11:06:37.7470603Z 347 │ }; 2026-10-24T11:06:37.7470655Z ╰──── 2026-10-24T11:06:37.7470927Z  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-24T11:06:37.7470930Z 2026-10-24T11:06:37.7471154Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T11:06:37.7471282Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T11:06:37.7471351Z 447 │ const favorites = 2026-10-24T11:06:37.7471459Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T11:06:37.7471548Z ·  ───┬── 2026-10-24T11:06:37.7471675Z · ╰── For this reduce 2026-10-24T11:06:37.7471756Z 449 │ const exists = current.some( 2026-10-24T11:06:37.7471930Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T11:06:37.7471988Z 451 │ ); 2026-10-24T11:06:37.7472061Z 452 │ return change.favorite 2026-10-24T11:06:37.7472123Z 453 │ ? exists 2026-10-24T11:06:37.7472186Z 454 │ ? current 2026-10-24T11:06:37.7472322Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T11:06:37.7472466Z ·  ─────┬──── 2026-10-24T11:06:37.7472619Z · ╰── From this spread 2026-10-24T11:06:37.7472688Z 456 │ : current.filter( 2026-10-24T11:06:37.7472742Z ╰──── 2026-10-24T11:06:37.7472948Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T11:06:37.7473106Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T11:06:37.7473109Z 2026-10-24T11:06:37.7473299Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T11:06:37.7473417Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T11:06:37.7473477Z 464 │ null; 2026-10-24T11:06:37.7473594Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T11:06:37.7473688Z ·  ──────────┬───────── 2026-10-24T11:06:37.7473820Z · ╰── From this accumulator 2026-10-24T11:06:37.7473920Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T11:06:37.7473988Z ·  ─┬─ 2026-10-24T11:06:37.7474094Z · ╰── For this loop 2026-10-24T11:06:37.7474229Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T11:06:37.7474297Z 468 │ hiddenModels: [], 2026-10-24T11:06:37.7474363Z 469 │ modelOrder: [], 2026-10-24T11:06:37.7474418Z 470 │ }; 2026-10-24T11:06:37.7474600Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T11:06:37.7474711Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T11:06:37.7474787Z 473 │ nextModelPreferences = { 2026-10-24T11:06:37.7474869Z 474 │ ...nextModelPreferences, 2026-10-24T11:06:37.7474970Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7475095Z · ╰── From this spread 2026-10-24T11:06:37.7475208Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T11:06:37.7475259Z ╰──── 2026-10-24T11:06:37.7475416Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T11:06:37.7475573Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T11:06:37.7475576Z 2026-10-24T11:06:37.7475744Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7475893Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T11:06:37.7476079Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T11:06:37.7476266Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T11:06:37.7476382Z ·  ─────┬──── 2026-10-24T11:06:37.7476546Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7476607Z 373 │ return ( 2026-10-24T11:06:37.7476660Z ╰──── 2026-10-24T11:06:37.7476945Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7477246Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7477249Z 2026-10-24T11:06:37.7477420Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7477571Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T11:06:37.7477664Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T11:06:37.7477795Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T11:06:37.7477905Z ·  ─────┬──── 2026-10-24T11:06:37.7478061Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7478116Z 854 │ } 2026-10-24T11:06:37.7478169Z ╰──── 2026-10-24T11:06:37.7478475Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7478778Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7478784Z 2026-10-24T11:06:37.7479258Z ⚠ 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-24T11:06:37.7479406Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T11:06:37.7479541Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T11:06:37.7479687Z 133 │ ╭─▶ for ( 2026-10-24T11:06:37.7479793Z 134 │ │ let attempt = 0; 2026-10-24T11:06:37.7479970Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T11:06:37.7480073Z 136 │ │ attempt += 1 2026-10-24T11:06:37.7480156Z 137 │ │ ) { 2026-10-24T11:06:37.7480268Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7480407Z 139 │ ╰─▶ } 2026-10-24T11:06:37.7480533Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T11:06:37.7480586Z ╰──── 2026-10-24T11:06:37.7480589Z 2026-10-24T11:06:37.7481058Z ⚠ 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-24T11:06:37.7481252Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T11:06:37.7481343Z 130 │ ) { 2026-10-24T11:06:37.7481555Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7481680Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T11:06:37.7481772Z 133 │ │ return; 2026-10-24T11:06:37.7481855Z 134 │ │ } 2026-10-24T11:06:37.7481964Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7482098Z 136 │ ╰─▶ } 2026-10-24T11:06:37.7482265Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T11:06:37.7482324Z ╰──── 2026-10-24T11:06:37.7482330Z 2026-10-24T11:06:37.7482800Z ⚠ 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-24T11:06:37.7482933Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T11:06:37.7483096Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T11:06:37.7483351Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T11:06:37.7483458Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7483590Z 254 │ ╰─▶ } 2026-10-24T11:06:37.7483720Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T11:06:37.7483777Z ╰──── 2026-10-24T11:06:37.7483780Z 2026-10-24T11:06:37.7484245Z ⚠ 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-24T11:06:37.7484379Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T11:06:37.7484436Z 257 │ 2026-10-24T11:06:37.7484688Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T11:06:37.7484794Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7484929Z 260 │ ╰─▶ } 2026-10-24T11:06:37.7485037Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T11:06:37.7485089Z ╰──── 2026-10-24T11:06:37.7485091Z 2026-10-24T11:06:37.7485557Z ⚠ 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-24T11:06:37.7485690Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T11:06:37.7485751Z 321 │ ); 2026-10-24T11:06:37.7486008Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T11:06:37.7486113Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7486305Z 324 │ ╰─▶ } 2026-10-24T11:06:37.7486396Z 325 │ 2026-10-24T11:06:37.7486448Z ╰──── 2026-10-24T11:06:37.7486453Z 2026-10-24T11:06:37.7486915Z ⚠ 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-24T11:06:37.7487047Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T11:06:37.7487212Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T11:06:37.7487464Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T11:06:37.7487574Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7487709Z 332 │ ╰─▶ } 2026-10-24T11:06:37.7487815Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T11:06:37.7487869Z ╰──── 2026-10-24T11:06:37.7487871Z 2026-10-24T11:06:37.7488359Z ⚠ 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-24T11:06:37.7488497Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T11:06:37.7488555Z 225 │ ) { 2026-10-24T11:06:37.7488759Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7488875Z 227 │ │ const socket = sockets[index]; 2026-10-24T11:06:37.7488968Z 228 │ │ if (socket) { 2026-10-24T11:06:37.7489064Z 229 │ │ return socket; 2026-10-24T11:06:37.7489141Z 230 │ │ } 2026-10-24T11:06:37.7489245Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7489370Z 232 │ ╰─▶ } 2026-10-24T11:06:37.7489546Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T11:06:37.7489599Z ╰──── 2026-10-24T11:06:37.7489602Z 2026-10-24T11:06:37.7490070Z ⚠ 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-24T11:06:37.7490206Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T11:06:37.7490263Z 239 │ ) { 2026-10-24T11:06:37.7490465Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7490681Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T11:06:37.7490776Z 242 │ │ if (request) { 2026-10-24T11:06:37.7490871Z 243 │ │ return request; 2026-10-24T11:06:37.7490946Z 244 │ │ } 2026-10-24T11:06:37.7491048Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7491237Z 246 │ ╰─▶ } 2026-10-24T11:06:37.7491445Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T11:06:37.7491500Z ╰──── 2026-10-24T11:06:37.7491502Z 2026-10-24T11:06:37.7491788Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T11:06:37.7491919Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T11:06:37.7491975Z 248 │ }, 2026-10-24T11:06:37.7492059Z 249 │ (effect, flow, stopSessions) => 2026-10-24T11:06:37.7492154Z ·  ──────┬───── 2026-10-24T11:06:37.7492307Z · ╰── 'stopSessions' is declared here 2026-10-24T11:06:37.7492373Z 250 │ effect.pipe( 2026-10-24T11:06:37.7492427Z ╰──── 2026-10-24T11:06:37.7492538Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7492544Z 2026-10-24T11:06:37.7492742Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7492919Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T11:06:37.7492982Z 87 │
  • = 2026-10-24T11:06:37.7501444Z ·  ──┬── 2026-10-24T11:06:37.7501572Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7501637Z 3756 │ Layer.effect( 2026-10-24T11:06:37.7501691Z ╰──── 2026-10-24T11:06:37.7501797Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7501800Z 2026-10-24T11:06:37.7502075Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7502224Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T11:06:37.7502279Z 60 │ ) { 2026-10-24T11:06:37.7502456Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T11:06:37.7502542Z ·  ──────┬────── 2026-10-24T11:06:37.7502683Z · ╰── 'useDragRegion' is declared here 2026-10-24T11:06:37.7502776Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T11:06:37.7502828Z ╰──── 2026-10-24T11:06:37.7502933Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7502936Z 2026-10-24T11:06:37.7503304Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T11:06:37.7503477Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T11:06:37.7503541Z 472 │ onFilters, 2026-10-24T11:06:37.7503608Z 473 │ authorOptions = [], 2026-10-24T11:06:37.7503691Z ·  ── 2026-10-24T11:06:37.7503762Z 474 │ labelOptions = [], 2026-10-24T11:06:37.7503815Z ╰──── 2026-10-24T11:06:37.7504137Z  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-24T11:06:37.7504140Z 2026-10-24T11:06:37.7504421Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T11:06:37.7504590Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T11:06:37.7504658Z 473 │ authorOptions = [], 2026-10-24T11:06:37.7504725Z 474 │ labelOptions = [], 2026-10-24T11:06:37.7504803Z ·  ── 2026-10-24T11:06:37.7504866Z 475 │ optionScope, 2026-10-24T11:06:37.7504918Z ╰──── 2026-10-24T11:06:37.7505311Z  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-24T11:06:37.7505358Z 2026-10-24T11:06:37.7505546Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7505721Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T11:06:37.7505805Z 554 │ assert.deepStrictEqual( 2026-10-24T11:06:37.7505973Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T11:06:37.7506096Z ·  ┬ 2026-10-24T11:06:37.7506270Z · ╰── '_' is declared here 2026-10-24T11:06:37.7506335Z 556 │ [ 2026-10-24T11:06:37.7506389Z ╰──── 2026-10-24T11:06:37.7506494Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7506496Z 2026-10-24T11:06:37.7506682Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7506860Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T11:06:37.7506945Z 1154 │ assert.deepStrictEqual( 2026-10-24T11:06:37.7507112Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T11:06:37.7507236Z ·  ┬ 2026-10-24T11:06:37.7507407Z · ╰── '_' is declared here 2026-10-24T11:06:37.7507473Z 1156 │ [ 2026-10-24T11:06:37.7507527Z ╰──── 2026-10-24T11:06:37.7507632Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7507635Z 2026-10-24T11:06:37.7507862Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T11:06:37.7508009Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-24T11:06:37.7508070Z 227 │ ): string { 2026-10-24T11:06:37.7508256Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T11:06:37.7508454Z ·  ────── 2026-10-24T11:06:37.7508588Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T11:06:37.7508642Z ╰──── 2026-10-24T11:06:37.7508822Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T11:06:37.7508828Z 2026-10-24T11:06:37.7509300Z ⚠ 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-24T11:06:37.7509471Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T11:06:37.7509574Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T11:06:37.7509773Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T11:06:37.7509876Z 567 │ │ const nextEvent = { 2026-10-24T11:06:37.7510100Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T11:06:37.7510272Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T11:06:37.7510366Z 570 │ │ threadId, 2026-10-24T11:06:37.7510474Z 571 │ │ providerInstanceId, 2026-10-24T11:06:37.7510574Z 572 │ │ occurredAt: now, 2026-10-24T11:06:37.7510724Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T11:06:37.7510854Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T11:06:37.7510971Z 575 │ │ const reader = yield* eventSink 2026-10-24T11:06:37.7511092Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T11:06:37.7511234Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T11:06:37.7511344Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7511510Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T11:06:37.7511641Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T11:06:37.7511760Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T11:06:37.7511964Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T11:06:37.7512046Z 583 │ │ } 2026-10-24T11:06:37.7512207Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T11:06:37.7512362Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T11:06:37.7512497Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T11:06:37.7512629Z 587 │ ╰─▶ } 2026-10-24T11:06:37.7512690Z 588 │ }), 2026-10-24T11:06:37.7512742Z ╰──── 2026-10-24T11:06:37.7512745Z 2026-10-24T11:06:37.7513214Z ⚠ 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-24T11:06:37.7513392Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T11:06:37.7513471Z 2326 │ let settled = false; 2026-10-24T11:06:37.7513638Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T11:06:37.7513803Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T11:06:37.7513937Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T11:06:37.7514022Z 2330 │ │ ); 2026-10-24T11:06:37.7514149Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T11:06:37.7514287Z 2332 │ ╰─▶ } 2026-10-24T11:06:37.7514407Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T11:06:37.7514461Z ╰──── 2026-10-24T11:06:37.7514464Z 2026-10-24T11:06:37.7514769Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7514989Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T11:06:37.7515078Z 345 │ 2026-10-24T11:06:37.7515181Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T11:06:37.7515279Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7515446Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T11:06:37.7515526Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T11:06:37.7515578Z ╰──── 2026-10-24T11:06:37.7515684Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7515688Z 2026-10-24T11:06:37.7515896Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T11:06:37.7516045Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-24T11:06:37.7516105Z 233 │ 2026-10-24T11:06:37.7516226Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T11:06:37.7516312Z ·  ───────┬────── 2026-10-24T11:06:37.7516460Z · ╰── 'nonEmptyString' is declared here 2026-10-24T11:06:37.7516605Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T11:06:37.7516657Z ╰──── 2026-10-24T11:06:37.7516761Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7516763Z 2026-10-24T11:06:37.7516945Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T11:06:37.7517066Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T11:06:37.7517191Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T11:06:37.7517288Z 194 │ const codes = new Array(count); 2026-10-24T11:06:37.7517402Z ·  ──────────────────────── 2026-10-24T11:06:37.7517507Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T11:06:37.7517560Z ╰──── 2026-10-24T11:06:37.7517985Z  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-24T11:06:37.7517988Z 2026-10-24T11:06:37.7518300Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T11:06:37.7518459Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T11:06:37.7518518Z 162 │ keys, 2026-10-24T11:06:37.7518596Z 163 │ overridingProjects = [], 2026-10-24T11:06:37.7518683Z ·  ── 2026-10-24T11:06:37.7518752Z 164 │ onClearOverrides, 2026-10-24T11:06:37.7518805Z ╰──── 2026-10-24T11:06:37.7519126Z  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-24T11:06:37.7519131Z 2026-10-24T11:06:37.7519367Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T11:06:37.7519532Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-24T11:06:37.7519595Z 264 │ ): boolean { 2026-10-24T11:06:37.7519748Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T11:06:37.7519976Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T11:06:37.7520161Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T11:06:37.7520214Z ╰──── 2026-10-24T11:06:37.7520292Z  help: Switch to `Set` 2026-10-24T11:06:37.7520295Z 2026-10-24T11:06:37.7520558Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7520730Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T11:06:37.7520787Z 10577 │ 2026-10-24T11:06:37.7520862Z 10578 │ const layer: Layer.Layer< 2026-10-24T11:06:37.7520934Z ·  ──┬── 2026-10-24T11:06:37.7521063Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7521166Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T11:06:37.7521223Z ╰──── 2026-10-24T11:06:37.7521328Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7521330Z 2026-10-24T11:06:37.7521500Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7521655Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T11:06:37.7521838Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T11:06:37.7521972Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T11:06:37.7522096Z ·  ─────┬──── 2026-10-24T11:06:37.7522275Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7522336Z 153 │ } 2026-10-24T11:06:37.7522387Z ╰──── 2026-10-24T11:06:37.7522676Z  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-24T11:06:37.7522979Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7522981Z 2026-10-24T11:06:37.7523243Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T11:06:37.7523389Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T11:06:37.7523544Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T11:06:37.7523683Z 12 │ this.onmessage = listener; 2026-10-24T11:06:37.7523795Z ·  ───────── 2026-10-24T11:06:37.7523853Z 13 │ } 2026-10-24T11:06:37.7523904Z ╰──── 2026-10-24T11:06:37.7524226Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T11:06:37.7524229Z 2026-10-24T11:06:37.7524436Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T11:06:37.7524579Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T11:06:37.7524649Z 15 │ constructor() { 2026-10-24T11:06:37.7524715Z 16 │ source = this; 2026-10-24T11:06:37.7524791Z ·  ────── 2026-10-24T11:06:37.7524848Z 17 │ } 2026-10-24T11:06:37.7524907Z ╰──── 2026-10-24T11:06:37.7525190Z  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-24T11:06:37.7525193Z 2026-10-24T11:06:37.7525397Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T11:06:37.7525539Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T11:06:37.7525605Z 1 │ import type { 2026-10-24T11:06:37.7525669Z 2 │ EnvironmentId, 2026-10-24T11:06:37.7525747Z ·  ──────┬────── 2026-10-24T11:06:37.7525888Z · ╰── 'EnvironmentId' is imported here 2026-10-24T11:06:37.7525979Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T11:06:37.7526031Z ╰──── 2026-10-24T11:06:37.7526133Z  help: Consider removing this import. 2026-10-24T11:06:37.7526141Z 2026-10-24T11:06:37.7526371Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T11:06:37.7526549Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T11:06:37.7526617Z 1997 │ assert.equal( 2026-10-24T11:06:37.7526769Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T11:06:37.7526851Z ·  ────── 2026-10-24T11:06:37.7526934Z 1999 │ "authoritative answer", 2026-10-24T11:06:37.7526988Z ╰──── 2026-10-24T11:06:37.7527163Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T11:06:37.7527166Z 2026-10-24T11:06:37.7527653Z ⚠ 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-24T11:06:37.7527830Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T11:06:37.7528015Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T11:06:37.7528227Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T11:06:37.7528365Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7528503Z 3953 │ ╰─▶ } 2026-10-24T11:06:37.7528629Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T11:06:37.7528683Z ╰──── 2026-10-24T11:06:37.7528749Z 2026-10-24T11:06:37.7529260Z ⚠ 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-24T11:06:37.7529435Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T11:06:37.7529528Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T11:06:37.7529715Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T11:06:37.7529831Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7529971Z 6064 │ ╰─▶ } 2026-10-24T11:06:37.7530151Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T11:06:37.7530207Z ╰──── 2026-10-24T11:06:37.7530213Z 2026-10-24T11:06:37.7530676Z ⚠ 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-24T11:06:37.7530850Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T11:06:37.7530941Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T11:06:37.7531128Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T11:06:37.7531240Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7531384Z 6199 │ ╰─▶ } 2026-10-24T11:06:37.7531556Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T11:06:37.7531613Z ╰──── 2026-10-24T11:06:37.7531616Z 2026-10-24T11:06:37.7531785Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7531937Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T11:06:37.7532052Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T11:06:37.7532220Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T11:06:37.7532347Z ·  ─────┬──── 2026-10-24T11:06:37.7532523Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7532588Z 179 │ } 2026-10-24T11:06:37.7532647Z ╰──── 2026-10-24T11:06:37.7532932Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T11:06:37.7533237Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7533240Z 2026-10-24T11:06:37.7533500Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T11:06:37.7533686Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T11:06:37.7533744Z 959 │ 2026-10-24T11:06:37.7533854Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T11:06:37.7534030Z ·  ──────────────────┬───────────────── 2026-10-24T11:06:37.7534267Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T11:06:37.7534375Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T11:06:37.7534430Z ╰──── 2026-10-24T11:06:37.7534538Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7534541Z 2026-10-24T11:06:37.7534881Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7535049Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T11:06:37.7535106Z 1443 │ 2026-10-24T11:06:37.7535223Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T11:06:37.7535353Z ·  ───────────────────┬─────────────────── 2026-10-24T11:06:37.7535566Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T11:06:37.7535690Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T11:06:37.7535743Z ╰──── 2026-10-24T11:06:37.7535851Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7535853Z 2026-10-24T11:06:37.7536116Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7536282Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T11:06:37.7536336Z 1679 │ 2026-10-24T11:06:37.7536413Z 1680 │ const layer: Layer.Layer< 2026-10-24T11:06:37.7536488Z ·  ──┬── 2026-10-24T11:06:37.7536624Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7536721Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T11:06:37.7536776Z ╰──── 2026-10-24T11:06:37.7536882Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7536884Z 2026-10-24T11:06:37.7537166Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7537312Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12380:7] 2026-10-24T11:06:37.7537371Z 12379 │ 2026-10-24T11:06:37.7537516Z 12380 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T11:06:37.7537607Z ·  ────────┬─────── 2026-10-24T11:06:37.7537763Z · ╰── 'layerUnavailable' is declared here 2026-10-24T11:06:37.7537838Z 12381 │ OrchestratorV2, 2026-10-24T11:06:37.7537894Z ╰──── 2026-10-24T11:06:37.7538000Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7538003Z 2026-10-24T11:06:37.7538401Z ⚠ 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-24T11:06:37.7538529Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T11:06:37.7538592Z 145 │ name, 2026-10-24T11:06:37.7538736Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T11:06:37.7538844Z ·  ────────────────────────── 2026-10-24T11:06:37.7538971Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T11:06:37.7539103Z ╰──── 2026-10-24T11:06:37.7539147Z 2026-10-24T11:06:37.7539420Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7539559Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T11:06:37.7539614Z 913 │ 2026-10-24T11:06:37.7539807Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T11:06:37.7539888Z ·  ─────┬───── 2026-10-24T11:06:37.7540029Z · ╰── 'layerDaemon' is declared here 2026-10-24T11:06:37.7540117Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T11:06:37.7540170Z ╰──── 2026-10-24T11:06:37.7540274Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7540276Z 2026-10-24T11:06:37.7540485Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T11:06:37.7540622Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T11:06:37.7540720Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T11:06:37.7540816Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T11:06:37.7540899Z ·  ────┬─── 2026-10-24T11:06:37.7541036Z · ╰── 'Duration' is imported here 2026-10-24T11:06:37.7541126Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T11:06:37.7541180Z ╰──── 2026-10-24T11:06:37.7541280Z  help: Consider removing this import. 2026-10-24T11:06:37.7541282Z 2026-10-24T11:06:37.7541545Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7541682Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T11:06:37.7541739Z 3404 │ 2026-10-24T11:06:37.7541930Z 3405 │ const layer: Layer.Layer = 2026-10-24T11:06:37.7542003Z ·  ──┬── 2026-10-24T11:06:37.7542131Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7542198Z 3406 │ Layer.effect( 2026-10-24T11:06:37.7542252Z ╰──── 2026-10-24T11:06:37.7542356Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7542358Z 2026-10-24T11:06:37.7542530Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7542652Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T11:06:37.7542758Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T11:06:37.7542828Z 1136 │ Date.now(), 2026-10-24T11:06:37.7542912Z ·  ─────┬──── 2026-10-24T11:06:37.7543050Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7543247Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T11:06:37.7543300Z ╰──── 2026-10-24T11:06:37.7543591Z  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-24T11:06:37.7543895Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7543898Z 2026-10-24T11:06:37.7544198Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T11:06:37.7544430Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T11:06:37.7544483Z 1397 │ 2026-10-24T11:06:37.7544574Z 1398 │ function assertUserMessagesExclude( 2026-10-24T11:06:37.7544682Z ·  ────────────┬──────────── 2026-10-24T11:06:37.7544856Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T11:06:37.7544965Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T11:06:37.7545020Z ╰──── 2026-10-24T11:06:37.7545124Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7545126Z 2026-10-24T11:06:37.7545392Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T11:06:37.7545548Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T11:06:37.7545604Z 1619 │ 2026-10-24T11:06:37.7545818Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T11:06:37.7545941Z ·  ──────────────────┬────────────────── 2026-10-24T11:06:37.7546143Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T11:06:37.7546222Z 1621 │ const meta = response._meta; 2026-10-24T11:06:37.7546276Z ╰──── 2026-10-24T11:06:37.7546382Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7546384Z 2026-10-24T11:06:37.7546646Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7546783Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T11:06:37.7546839Z 407 │ 2026-10-24T11:06:37.7546912Z 408 │ const layer: Layer.Layer< 2026-10-24T11:06:37.7546983Z ·  ──┬── 2026-10-24T11:06:37.7547111Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7547204Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T11:06:37.7547259Z ╰──── 2026-10-24T11:06:37.7547360Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7547362Z 2026-10-24T11:06:37.7547545Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:06:37.7547735Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T11:06:37.7547951Z 115 │ return [...commands]; 2026-10-24T11:06:37.7548119Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T11:06:37.7548238Z ·  ─────────┬───────── 2026-10-24T11:06:37.7548450Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T11:06:37.7548505Z 117 │ 2026-10-24T11:06:37.7548557Z ╰──── 2026-10-24T11:06:37.7548877Z  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-24T11:06:37.7549194Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7549196Z 2026-10-24T11:06:37.7549675Z ⚠ 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-24T11:06:37.7549860Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T11:06:37.7549932Z 222 │ let idlePasses = 0; 2026-10-24T11:06:37.7550081Z 223 │ ╭─▶ for (;;) { 2026-10-24T11:06:37.7550222Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T11:06:37.7550369Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T11:06:37.7550465Z 226 │ │ if (!pending) { 2026-10-24T11:06:37.7550561Z 227 │ │ idlePasses++; 2026-10-24T11:06:37.7550675Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T11:06:37.7550767Z 229 │ │ return; 2026-10-24T11:06:37.7550846Z 230 │ │ } 2026-10-24T11:06:37.7550934Z 231 │ │ continue; 2026-10-24T11:06:37.7551013Z 232 │ │ } 2026-10-24T11:06:37.7551109Z 233 │ │ idlePasses = 0; 2026-10-24T11:06:37.7551226Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T11:06:37.7551445Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T11:06:37.7551524Z 236 │ │ ); 2026-10-24T11:06:37.7551634Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T11:06:37.7551745Z 238 │ │ pending.resolve(exit); 2026-10-24T11:06:37.7551829Z 239 │ │ }); 2026-10-24T11:06:37.7551964Z 240 │ ╰─▶ } 2026-10-24T11:06:37.7552024Z 241 │ }, 2026-10-24T11:06:37.7552077Z ╰──── 2026-10-24T11:06:37.7552082Z 2026-10-24T11:06:37.7552271Z ⚠ react(static-components): Cannot create components during render 2026-10-24T11:06:37.7552438Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T11:06:37.7552528Z 196 │ const { onInput, onResize } = props; 2026-10-24T11:06:37.7552676Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T11:06:37.7552810Z ·  ────────────────┬─────────────── 2026-10-24T11:06:37.7553072Z · ╰── The component is created during render here 2026-10-24T11:06:37.7553240Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T11:06:37.7553296Z 199 │ 2026-10-24T11:06:37.7553363Z 200 │ useEffect(() => { 2026-10-24T11:06:37.7553454Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T11:06:37.7553541Z 202 │ terminalKey: props.terminalKey, 2026-10-24T11:06:37.7553618Z 203 │ native: hasNativeSurface, 2026-10-24T11:06:37.7553752Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T11:06:37.7553839Z 205 │ bufferLen: props.buffer.length, 2026-10-24T11:06:37.7553919Z 206 │ isRunning: props.isRunning, 2026-10-24T11:06:37.7553977Z 207 │ }); 2026-10-24T11:06:37.7554144Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T11:06:37.7554238Z 209 │ const handleNativeInput = useCallback( 2026-10-24T11:06:37.7554355Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T11:06:37.7554452Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T11:06:37.7554517Z 212 │ return; 2026-10-24T11:06:37.7554576Z 213 │ } 2026-10-24T11:06:37.7554669Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T11:06:37.7554821Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T11:06:37.7554879Z 216 │ }); 2026-10-24T11:06:37.7554967Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T11:06:37.7555025Z 218 │ }, 2026-10-24T11:06:37.7555124Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T11:06:37.7555179Z 220 │ ); 2026-10-24T11:06:37.7555277Z 221 │ const handleNativeResize = useCallback( 2026-10-24T11:06:37.7555398Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T11:06:37.7555461Z 223 │ onResize({ 2026-10-24T11:06:37.7555547Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T11:06:37.7555631Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T11:06:37.7555690Z 226 │ }); 2026-10-24T11:06:37.7555744Z 227 │ }, 2026-10-24T11:06:37.7555809Z 228 │ [onResize], 2026-10-24T11:06:37.7555866Z 229 │ ); 2026-10-24T11:06:37.7555920Z 230 │ 2026-10-24T11:06:37.7556004Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T11:06:37.7556066Z 232 │ return ( 2026-10-24T11:06:37.7556146Z 233 │ 2026-10-24T11:06:37.7556226Z 234 │ { 2026-10-24T11:06:37.7561533Z ·  ────┬──── 2026-10-24T11:06:37.7561666Z · ╰── This is the containing effect 2026-10-24T11:06:37.7561766Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T11:06:37.7561864Z 327 │ requestedSection.current = "overview"; 2026-10-24T11:06:37.7562033Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T11:06:37.7562109Z 329 │ setSection("overview"); 2026-10-24T11:06:37.7562186Z ·  ─────┬──── 2026-10-24T11:06:37.7562364Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7562423Z 330 │ } 2026-10-24T11:06:37.7562480Z ╰──── 2026-10-24T11:06:37.7563154Z  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-24T11:06:37.7563517Z  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-24T11:06:37.7563520Z 2026-10-24T11:06:37.7563729Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:06:37.7603124Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:331:6] 2026-10-24T11:06:37.7603329Z 326 │ if (!guidesEnabled && section === "guide") { 2026-10-24T11:06:37.7603434Z 327 │ requestedSection.current = "overview"; 2026-10-24T11:06:37.7603541Z ·  ────────┬─────── 2026-10-24T11:06:37.7604036Z · ╰── 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-24T11:06:37.7604209Z 328 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T11:06:37.7604368Z ·  ─────────┬───────── ──────┬────── 2026-10-24T11:06:37.7604876Z · │ ╰── 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-24T11:06:37.7605335Z · ╰── 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-24T11:06:37.7605415Z 329 │ setSection("overview"); 2026-10-24T11:06:37.7605473Z 330 │ } 2026-10-24T11:06:37.7605569Z 331 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T11:06:37.7605686Z ·  ──────────────────┬───────────────── 2026-10-24T11:06:37.7605884Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7605972Z 332 │ const tabContent = activityContent; 2026-10-24T11:06:37.7606027Z ╰──── 2026-10-24T11:06:37.7606202Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:06:37.7606534Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7606542Z 2026-10-24T11:06:37.7606755Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:06:37.7606934Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:868:6] 2026-10-24T11:06:37.7606995Z 851 │ if ( 2026-10-24T11:06:37.7607113Z 852 │ lastSelection.current.path === route.params.path && 2026-10-24T11:06:37.7607196Z ·  ──────┬────── 2026-10-24T11:06:37.7607787Z · ╰── 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-24T11:06:37.7607968Z 853 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T11:06:37.7608023Z 854 │ ) 2026-10-24T11:06:37.7608087Z 855 │ return; 2026-10-24T11:06:37.7608263Z 856 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T11:06:37.7608428Z 857 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T11:06:37.7608516Z 858 │ setJumpPath(route.params.path); 2026-10-24T11:06:37.7608591Z 859 │ setSelectedRowId(null); 2026-10-24T11:06:37.7608671Z 860 │ jumpStarted.current = false; 2026-10-24T11:06:37.7608821Z 861 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T11:06:37.7608916Z 862 │ if (!file || !nativeView.current) return; 2026-10-24T11:06:37.7609007Z ·  ─────┬──── 2026-10-24T11:06:37.7609457Z · ╰── 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-24T11:06:37.7609589Z 863 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T11:06:37.7609668Z 864 │ jumpStarted.current = true; 2026-10-24T11:06:37.7609807Z 865 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T11:06:37.7609887Z 866 │ jumpStarted.current = false; 2026-10-24T11:06:37.7609945Z 867 │ }); 2026-10-24T11:06:37.7610142Z 868 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T11:06:37.7610358Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T11:06:37.7610585Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7610697Z 869 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T11:06:37.7610751Z ╰──── 2026-10-24T11:06:37.7610919Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:06:37.7611237Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7611240Z 2026-10-24T11:06:37.7611503Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7611738Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T11:06:37.7611823Z 58 │ 2026-10-24T11:06:37.7611889Z 59 │ useEffect(() => { 2026-10-24T11:06:37.7611963Z ·  ────┬──── 2026-10-24T11:06:37.7612094Z · ╰── This is the containing effect 2026-10-24T11:06:37.7612178Z 60 │ setMountedModes((current) => { 2026-10-24T11:06:37.7612258Z ·  ───────┬─────── 2026-10-24T11:06:37.7612428Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7612511Z 61 │ if (current.has(props.mode)) { 2026-10-24T11:06:37.7612564Z ╰──── 2026-10-24T11:06:37.7613180Z  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-24T11:06:37.7613511Z  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-24T11:06:37.7613514Z 2026-10-24T11:06:37.7613992Z ⚠ 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-24T11:06:37.7614127Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T11:06:37.7614227Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T11:06:37.7614468Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T11:06:37.7614597Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T11:06:37.7614746Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T11:06:37.7614880Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T11:06:37.7614982Z 2619 │ │ flush: () => { 2026-10-24T11:06:37.7615108Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T11:06:37.7615257Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T11:06:37.7615341Z 2622 │ │ }, 2026-10-24T11:06:37.7615423Z 2623 │ │ }; 2026-10-24T11:06:37.7615495Z 2624 │ │ 2026-10-24T11:06:37.7615660Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T11:06:37.7615772Z 2626 │ │ let requestChecks = 0; 2026-10-24T11:06:37.7615904Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T11:06:37.7616017Z 2628 │ │ executionMode: "async", 2026-10-24T11:06:37.7616138Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T11:06:37.7616251Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T11:06:37.7616387Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T11:06:37.7616493Z 2632 │ │ requestChecks += 1; 2026-10-24T11:06:37.7616635Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T11:06:37.7616801Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T11:06:37.7616930Z 2635 │ │ return true; 2026-10-24T11:06:37.7617013Z 2636 │ │ }, 2026-10-24T11:06:37.7617093Z 2637 │ │ }; 2026-10-24T11:06:37.7617165Z 2638 │ │ 2026-10-24T11:06:37.7617289Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T11:06:37.7617384Z 2640 │ │ ...WINDOW, 2026-10-24T11:06:37.7617512Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T11:06:37.7617708Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T11:06:37.7617789Z 2643 │ │ }; 2026-10-24T11:06:37.7617907Z 2644 │ │ const first = yield* service 2026-10-24T11:06:37.7618016Z 2645 │ │ .readSummary(input) 2026-10-24T11:06:37.7618105Z 2646 │ │ .pipe( 2026-10-24T11:06:37.7618203Z 2647 │ │ Effect.exit, 2026-10-24T11:06:37.7618386Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T11:06:37.7618491Z 2649 │ │ Effect.forkChild, 2026-10-24T11:06:37.7618574Z 2650 │ │ ); 2026-10-24T11:06:37.7618678Z 2651 │ │ requestFiber = first; 2026-10-24T11:06:37.7618786Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7618888Z 2653 │ │ dispatcher.flush(); 2026-10-24T11:06:37.7618966Z 2654 │ │ 2026-10-24T11:06:37.7619121Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T11:06:37.7619219Z 2656 │ │ Effect.match({ 2026-10-24T11:06:37.7619343Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T11:06:37.7619468Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T11:06:37.7619553Z 2659 │ │ }), 2026-10-24T11:06:37.7619709Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T11:06:37.7619811Z 2661 │ │ Effect.forkChild, 2026-10-24T11:06:37.7619892Z 2662 │ │ ); 2026-10-24T11:06:37.7619998Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7620105Z 2664 │ │ dispatcher.flush(); 2026-10-24T11:06:37.7620236Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T11:06:37.7620354Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T11:06:37.7620469Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T11:06:37.7620581Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T11:06:37.7620669Z 2669 │ │ break; 2026-10-24T11:06:37.7620749Z 2670 │ │ } 2026-10-24T11:06:37.7620868Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T11:06:37.7621026Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T11:06:37.7621182Z 2673 │ │ } 2026-10-24T11:06:37.7621374Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T11:06:37.7621510Z 2675 │ ╰─▶ } 2026-10-24T11:06:37.7621567Z 2676 │ 2026-10-24T11:06:37.7621620Z ╰──── 2026-10-24T11:06:37.7621624Z 2026-10-24T11:06:37.7621827Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7621994Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T11:06:37.7622092Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T11:06:37.7622190Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T11:06:37.7622298Z ·  ──────┬───── 2026-10-24T11:06:37.7622476Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T11:06:37.7622585Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T11:06:37.7622638Z ╰──── 2026-10-24T11:06:37.7622938Z  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-24T11:06:37.7623327Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7623330Z 2026-10-24T11:06:37.7623601Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7623722Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T11:06:37.7623781Z 168 │ 2026-10-24T11:06:37.7623863Z 169 │ const layerTest = Layer.succeed( 2026-10-24T11:06:37.7623940Z ·  ────┬──── 2026-10-24T11:06:37.7624073Z · ╰── 'layerTest' is declared here 2026-10-24T11:06:37.7624138Z 170 │ UsageService, 2026-10-24T11:06:37.7624191Z ╰──── 2026-10-24T11:06:37.7624295Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7624298Z 2026-10-24T11:06:37.7624775Z ⚠ 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-24T11:06:37.7624933Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T11:06:37.7624989Z 27 │ ) { 2026-10-24T11:06:37.7625198Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7625346Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T11:06:37.7625472Z 30 │ │ if (predicate(available)) return available; 2026-10-24T11:06:37.7625573Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7625698Z 32 │ ╰─▶ } 2026-10-24T11:06:37.7625876Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T11:06:37.7625929Z ╰──── 2026-10-24T11:06:37.7625931Z 2026-10-24T11:06:37.7626148Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:06:37.7626407Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T11:06:37.7626530Z 248 │ mountedRef.current = false; 2026-10-24T11:06:37.7626608Z 249 │ flow.setBranchQuery(""); 2026-10-24T11:06:37.7626679Z ·  ──┬─ 2026-10-24T11:06:37.7626807Z · ╰── Missing dependency `flow` 2026-10-24T11:06:37.7626864Z 250 │ }; 2026-10-24T11:06:37.7626938Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T11:06:37.7627026Z ·  ─────────┬───────── 2026-10-24T11:06:37.7627232Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T11:06:37.7627287Z 252 │ 2026-10-24T11:06:37.7627340Z ╰──── 2026-10-24T11:06:37.7627775Z  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-24T11:06:37.7628095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7628098Z 2026-10-24T11:06:37.7628244Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7628425Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T11:06:37.7628488Z 493 │ > 2026-10-24T11:06:37.7628567Z 494 │ {props.children(close)} 2026-10-24T11:06:37.7628660Z ·  ──┬── 2026-10-24T11:06:37.7628820Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7628902Z 495 │ 2026-10-24T11:06:37.7628958Z ╰──── 2026-10-24T11:06:37.7629431Z  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-24T11:06:37.7629727Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7629730Z 2026-10-24T11:06:37.7629980Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T11:06:37.7630095Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T11:06:37.7630148Z 55 │ 2026-10-24T11:06:37.7630252Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T11:06:37.7630371Z ·  ────────────────┬──────────────── 2026-10-24T11:06:37.7630564Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T11:06:37.7630651Z 57 │ selection: TerminalContextSelection, 2026-10-24T11:06:37.7630705Z ╰──── 2026-10-24T11:06:37.7630811Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7630814Z 2026-10-24T11:06:37.7631074Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7631246Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T11:06:37.7631299Z 76 │ 2026-10-24T11:06:37.7631365Z 77 │ useEffect(() => { 2026-10-24T11:06:37.7631496Z ·  ────┬──── 2026-10-24T11:06:37.7631655Z · ╰── This is the containing effect 2026-10-24T11:06:37.7631786Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T11:06:37.7631854Z 79 │ setHostInput(host); 2026-10-24T11:06:37.7631932Z ·  ──────┬───── 2026-10-24T11:06:37.7632099Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7632168Z 80 │ setCodeInput(code); 2026-10-24T11:06:37.7632220Z ╰──── 2026-10-24T11:06:37.7632835Z  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-24T11:06:37.7633162Z  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-24T11:06:37.7633166Z 2026-10-24T11:06:37.7633426Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7633596Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T11:06:37.7633650Z 82 │ 2026-10-24T11:06:37.7633713Z 83 │ useEffect(() => { 2026-10-24T11:06:37.7633783Z ·  ────┬──── 2026-10-24T11:06:37.7633911Z · ╰── This is the containing effect 2026-10-24T11:06:37.7634000Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T11:06:37.7634061Z 85 │ return; 2026-10-24T11:06:37.7634120Z 86 │ } 2026-10-24T11:06:37.7634176Z 87 │ 2026-10-24T11:06:37.7634293Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T11:06:37.7634359Z 89 │ setHostInput(host); 2026-10-24T11:06:37.7634436Z ·  ──────┬───── 2026-10-24T11:06:37.7634605Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7634671Z 90 │ setCodeInput(code); 2026-10-24T11:06:37.7634722Z ╰──── 2026-10-24T11:06:37.7635328Z  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-24T11:06:37.7635707Z  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-24T11:06:37.7635739Z 2026-10-24T11:06:37.7635998Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7636169Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T11:06:37.7636221Z 92 │ 2026-10-24T11:06:37.7636285Z 93 │ useEffect(() => { 2026-10-24T11:06:37.7636356Z ·  ────┬──── 2026-10-24T11:06:37.7636485Z · ╰── This is the containing effect 2026-10-24T11:06:37.7636567Z 94 │ if (pairingConnectionError) { 2026-10-24T11:06:37.7636640Z 95 │ setIsSubmitting(false); 2026-10-24T11:06:37.7636726Z ·  ───────┬─────── 2026-10-24T11:06:37.7636900Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7636954Z 96 │ } 2026-10-24T11:06:37.7637007Z ╰──── 2026-10-24T11:06:37.7637613Z  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-24T11:06:37.7637936Z  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-24T11:06:37.7637939Z 2026-10-24T11:06:37.7638154Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T11:06:37.7638321Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T11:06:37.7638374Z 21 │ 2026-10-24T11:06:37.7638532Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T11:06:37.7638620Z ·  ────────┬─────── 2026-10-24T11:06:37.7638767Z · ╰── 'summarizePayload' is declared here 2026-10-24T11:06:37.7638873Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T11:06:37.7638925Z ╰──── 2026-10-24T11:06:37.7639029Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7639031Z 2026-10-24T11:06:37.7639506Z ⚠ 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-24T11:06:37.7639643Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T11:06:37.7639700Z 93 │ ) { 2026-10-24T11:06:37.7639904Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T11:06:37.7640079Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T11:06:37.7640202Z 96 │ │ if (predicate(project)) return project; 2026-10-24T11:06:37.7640302Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7640426Z 98 │ ╰─▶ } 2026-10-24T11:06:37.7640573Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T11:06:37.7640686Z ╰──── 2026-10-24T11:06:37.7640718Z 2026-10-24T11:06:37.7640876Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7641036Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T11:06:37.7641132Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T11:06:37.7641224Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T11:06:37.7641306Z ·  ──────┬────── 2026-10-24T11:06:37.7641447Z · ╰── `pulseProgress` originates here 2026-10-24T11:06:37.7641500Z 55 │ 2026-10-24T11:06:37.7641563Z 56 │ useEffect(() => { 2026-10-24T11:06:37.7641627Z 57 │ if (pulse) { 2026-10-24T11:06:37.7641715Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T11:06:37.7641801Z ·  ──────┬────── 2026-10-24T11:06:37.7641948Z · ╰── `pulseProgress` cannot be modified 2026-10-24T11:06:37.7642016Z 59 │ withTiming(1, { 2026-10-24T11:06:37.7642068Z ╰──── 2026-10-24T11:06:37.7642335Z  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-24T11:06:37.7642646Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7642649Z 2026-10-24T11:06:37.7642844Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T11:06:37.7642996Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T11:06:37.7643052Z  80 │ 2026-10-24T11:06:37.7643331Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T11:06:37.7643457Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T11:06:37.7643579Z  83 │ │ ): Effect.fn.Return { 2026-10-24T11:06:37.7643748Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T11:06:37.7643882Z  85 │ │ const connections = new Map(); 2026-10-24T11:06:37.7643952Z  86 │ │ 2026-10-24T11:06:37.7644167Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T11:06:37.7644267Z  88 │ │ Effect.suspend(() => { 2026-10-24T11:06:37.7644409Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T11:06:37.7644522Z  90 │ │ return connection === undefined 2026-10-24T11:06:37.7644738Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T11:06:37.7644848Z  92 │ │ : Effect.succeed(connection); 2026-10-24T11:06:37.7644925Z  93 │ │ }); 2026-10-24T11:06:37.7644994Z  94 │ │ 2026-10-24T11:06:37.7645081Z  95 │ │ const send = ( 2026-10-24T11:06:37.7645182Z  96 │ │ connection: Connection, 2026-10-24T11:06:37.7645281Z  97 │ │ message: unknown, 2026-10-24T11:06:37.7645492Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T11:06:37.7645638Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T11:06:37.7645748Z 100 │ │ Effect.gen(function* () { 2026-10-24T11:06:37.7645872Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T11:06:37.7646013Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T11:06:37.7646229Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T11:06:37.7646308Z 104 │ │ } 2026-10-24T11:06:37.7646440Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T11:06:37.7646538Z 106 │ │ try: (signal) => 2026-10-24T11:06:37.7646678Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T11:06:37.7646784Z 108 │ │ method: "POST", 2026-10-24T11:06:37.7646876Z 109 │ │ signal, 2026-10-24T11:06:37.7646973Z 110 │ │ headers: { 2026-10-24T11:06:37.7647102Z 111 │ │ "content-type": "application/json", 2026-10-24T11:06:37.7647246Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T11:06:37.7647379Z 113 │ │ authorization: options.authorization, 2026-10-24T11:06:37.7647505Z 114 │ │ ...(connection.sessionId === null 2026-10-24T11:06:37.7647599Z 115 │ │ ? {} 2026-10-24T11:06:37.7647751Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T11:06:37.7647887Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T11:06:37.7647979Z 118 │ │ ? {} 2026-10-24T11:06:37.7648146Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T11:06:37.7648233Z 120 │ │ }, 2026-10-24T11:06:37.7648343Z 121 │ │ body, 2026-10-24T11:06:37.7648429Z 122 │ │ }), 2026-10-24T11:06:37.7648530Z 123 │ │ catch: bridgeError, 2026-10-24T11:06:37.7648611Z 124 │ │ }); 2026-10-24T11:06:37.7648825Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T11:06:37.7648931Z 126 │ │ if (!response.ok) { 2026-10-24T11:06:37.7649041Z 127 │ │ yield* Effect.promise( 2026-10-24T11:06:37.7649225Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T11:06:37.7649309Z 129 │ │ ); 2026-10-24T11:06:37.7649423Z 130 │ │ return yield* Effect.fail( 2026-10-24T11:06:37.7649632Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T11:06:37.7649714Z 132 │ │ ); 2026-10-24T11:06:37.7649793Z 133 │ │ } 2026-10-24T11:06:37.7650062Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T11:06:37.7650214Z 135 │ │ for (const payload of payloads) { 2026-10-24T11:06:37.7650431Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T11:06:37.7650508Z 137 │ │ } 2026-10-24T11:06:37.7650609Z 138 │ │ return payloads; 2026-10-24T11:06:37.7650731Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T11:06:37.7650806Z 140 │ │ ); 2026-10-24T11:06:37.7650878Z 141 │ │ 2026-10-24T11:06:37.7651054Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T11:06:37.7651180Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T11:06:37.7651374Z 144 │ │ ): Effect.fn.Return { 2026-10-24T11:06:37.7651538Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T11:06:37.7651666Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T11:06:37.7651788Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T11:06:37.7651892Z 148 │ │ if (sessionId !== null) { 2026-10-24T11:06:37.7652023Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T11:06:37.7652120Z 150 │ │ try: (signal) => 2026-10-24T11:06:37.7652249Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T11:06:37.7652351Z 152 │ │ method: "DELETE", 2026-10-24T11:06:37.7652446Z 153 │ │ signal, 2026-10-24T11:06:37.7652543Z 154 │ │ headers: { 2026-10-24T11:06:37.7652673Z 155 │ │ authorization: options.authorization, 2026-10-24T11:06:37.7652791Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T11:06:37.7652924Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T11:06:37.7653015Z 158 │ │ ? {} 2026-10-24T11:06:37.7653180Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T11:06:37.7653263Z 160 │ │ }, 2026-10-24T11:06:37.7653346Z 161 │ │ }), 2026-10-24T11:06:37.7653451Z 162 │ │ catch: bridgeError, 2026-10-24T11:06:37.7653532Z 163 │ │ }); 2026-10-24T11:06:37.7653664Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T11:06:37.7653774Z 165 │ │ return yield* Effect.fail( 2026-10-24T11:06:37.7653884Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T11:06:37.7654068Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T11:06:37.7654148Z 168 │ │ ), 2026-10-24T11:06:37.7654228Z 169 │ │ ); 2026-10-24T11:06:37.7654305Z 170 │ │ } 2026-10-24T11:06:37.7654409Z 171 │ │ yield* Effect.promise( 2026-10-24T11:06:37.7654642Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T11:06:37.7654752Z 173 │ │ ); 2026-10-24T11:06:37.7654826Z 174 │ │ } 2026-10-24T11:06:37.7654910Z 175 │ │ return {}; 2026-10-24T11:06:37.7654982Z 176 │ │ }); 2026-10-24T11:06:37.7655051Z 177 │ │ 2026-10-24T11:06:37.7655130Z 178 │ │ return { 2026-10-24T11:06:37.7655304Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T11:06:37.7655425Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T11:06:37.7655534Z 181 │ │ return yield* Effect.fail( 2026-10-24T11:06:37.7655724Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T11:06:37.7655806Z 183 │ │ ); 2026-10-24T11:06:37.7655881Z 184 │ │ } 2026-10-24T11:06:37.7656009Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T11:06:37.7656223Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T11:06:37.7656298Z 187 │ │ } 2026-10-24T11:06:37.7656453Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T11:06:37.7656569Z 189 │ │ connections.set(connectionId, { 2026-10-24T11:06:37.7656689Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T11:06:37.7656789Z 191 │ │ sessionId: null, 2026-10-24T11:06:37.7656900Z 192 │ │ protocolVersion: null, 2026-10-24T11:06:37.7657003Z 193 │ │ nextRequestId: 0, 2026-10-24T11:06:37.7657082Z 194 │ │ }); 2026-10-24T11:06:37.7657186Z 195 │ │ return { connectionId }; 2026-10-24T11:06:37.7657261Z 196 │ │ }), 2026-10-24T11:06:37.7657432Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T11:06:37.7657594Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T11:06:37.7657719Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T11:06:37.7657845Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T11:06:37.7657943Z 201 │ │ jsonrpc: "2.0", 2026-10-24T11:06:37.7658031Z 202 │ │ id, 2026-10-24T11:06:37.7658137Z 203 │ │ method: request.method, 2026-10-24T11:06:37.7658317Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T11:06:37.7658395Z 205 │ │ }); 2026-10-24T11:06:37.7658582Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T11:06:37.7658705Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T11:06:37.7658808Z 208 │ │ if (envelope === null) { 2026-10-24T11:06:37.7658917Z 209 │ │ return yield* Effect.fail( 2026-10-24T11:06:37.7659166Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T11:06:37.7659277Z 211 │ │ ); 2026-10-24T11:06:37.7659352Z 212 │ │ } 2026-10-24T11:06:37.7659470Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T11:06:37.7659668Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T11:06:37.7659743Z 215 │ │ } 2026-10-24T11:06:37.7659914Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T11:06:37.7659989Z 217 │ │ }), 2026-10-24T11:06:37.7660182Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T11:06:37.7660344Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T11:06:37.7660456Z 220 │ │ yield* send(connection, { 2026-10-24T11:06:37.7660554Z 221 │ │ jsonrpc: "2.0", 2026-10-24T11:06:37.7660657Z 222 │ │ method: request.method, 2026-10-24T11:06:37.7660817Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T11:06:37.7660894Z 224 │ │ }); 2026-10-24T11:06:37.7660968Z 225 │ │ }), 2026-10-24T11:06:37.7661055Z 226 │ │ disconnect, 2026-10-24T11:06:37.7661164Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T11:06:37.7661262Z 228 │ │ Effect.forEach( 2026-10-24T11:06:37.7661366Z 229 │ │ [...connections.keys()], 2026-10-24T11:06:37.7661543Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T11:06:37.7661647Z 231 │ │ { discard: true }, 2026-10-24T11:06:37.7661726Z 232 │ │ ), 2026-10-24T11:06:37.7661800Z 233 │ │ ), 2026-10-24T11:06:37.7661875Z 234 │ │ }; 2026-10-24T11:06:37.7662002Z 235 │ ╰─▶ }); 2026-10-24T11:06:37.7662057Z ╰──── 2026-10-24T11:06:37.7662312Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T11:06:37.7662315Z 2026-10-24T11:06:37.7662577Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7662782Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T11:06:37.7662872Z 61 │ }, []); 2026-10-24T11:06:37.7662938Z 62 │ useEffect(() => { 2026-10-24T11:06:37.7663011Z ·  ────┬──── 2026-10-24T11:06:37.7663192Z · ╰── This is the containing effect 2026-10-24T11:06:37.7663340Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T11:06:37.7663466Z ·  ───────┬────── 2026-10-24T11:06:37.7663677Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7663757Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T11:06:37.7663809Z ╰──── 2026-10-24T11:06:37.7664425Z  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-24T11:06:37.7664756Z  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-24T11:06:37.7664759Z 2026-10-24T11:06:37.7665198Z ⚠ 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-24T11:06:37.7665352Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T11:06:37.7665438Z 262 │ ...(update._meta !== undefined 2026-10-24T11:06:37.7665607Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T11:06:37.7665696Z ·  ───────── 2026-10-24T11:06:37.7665758Z 264 │ : {}), 2026-10-24T11:06:37.7665812Z ╰──── 2026-10-24T11:06:37.7665814Z 2026-10-24T11:06:37.7666076Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7666209Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T11:06:37.7666313Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T11:06:37.7666378Z 67 │ useEffect(() => { 2026-10-24T11:06:37.7666449Z ·  ────┬──── 2026-10-24T11:06:37.7666582Z · ╰── This is the containing effect 2026-10-24T11:06:37.7666650Z 68 │ setUri(null); 2026-10-24T11:06:37.7666720Z ·  ───┬── 2026-10-24T11:06:37.7666886Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7666949Z 69 │ setError(null); 2026-10-24T11:06:37.7667001Z ╰──── 2026-10-24T11:06:37.7667607Z  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-24T11:06:37.7667930Z  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-24T11:06:37.7668006Z 2026-10-24T11:06:37.7668246Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7668413Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T11:06:37.7668470Z 90 │ }; 2026-10-24T11:06:37.7668544Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T11:06:37.7668663Z ·  ──────┬───── ───┬─── 2026-10-24T11:06:37.7668849Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T11:06:37.7668998Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T11:06:37.7669135Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T11:06:37.7669187Z ╰──── 2026-10-24T11:06:37.7669490Z  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-24T11:06:37.7669806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7669809Z 2026-10-24T11:06:37.7670026Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:06:37.7670168Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T11:06:37.7670235Z 212 │ useEffect(() => { 2026-10-24T11:06:37.7670350Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T11:06:37.7670449Z ·  ──┬── 2026-10-24T11:06:37.7670607Z · ╰── Missing dependency `props` 2026-10-24T11:06:37.7670716Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T11:06:37.7670830Z ·  ──────────┬───────── 2026-10-24T11:06:37.7671059Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T11:06:37.7671134Z 215 │ const { source } = props; 2026-10-24T11:06:37.7671187Z ╰──── 2026-10-24T11:06:37.7671610Z  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-24T11:06:37.7671931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7671937Z 2026-10-24T11:06:37.7672097Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7672266Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T11:06:37.7672369Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T11:06:37.7672455Z 66 │ const progress = useSharedValue(0); 2026-10-24T11:06:37.7672532Z ·  ────┬─── 2026-10-24T11:06:37.7672665Z · ╰── `progress` originates here 2026-10-24T11:06:37.7672729Z 67 │ useEffect(() => { 2026-10-24T11:06:37.7672853Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T11:06:37.7672926Z ·  ────┬─── 2026-10-24T11:06:37.7673116Z · ╰── `progress` cannot be modified 2026-10-24T11:06:37.7673223Z 69 │ }, [expanded, progress]); 2026-10-24T11:06:37.7673275Z ╰──── 2026-10-24T11:06:37.7673541Z  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-24T11:06:37.7673848Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7673851Z 2026-10-24T11:06:37.7674056Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T11:06:37.7674181Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T11:06:37.7674282Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T11:06:37.7674449Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T11:06:37.7674583Z 159 │ │ constructor(data: Record) { 2026-10-24T11:06:37.7674699Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T11:06:37.7674774Z 161 │ │ } 2026-10-24T11:06:37.7674901Z 162 │ ╰─▶ }, 2026-10-24T11:06:37.7674966Z 163 │ clipboard: { 2026-10-24T11:06:37.7675017Z ╰──── 2026-10-24T11:06:37.7675187Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T11:06:37.7675190Z 2026-10-24T11:06:37.7675336Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7675503Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T11:06:37.7675591Z 26 │ const latestInput = useRef(input); 2026-10-24T11:06:37.7675669Z 27 │ latestInput.current = input; 2026-10-24T11:06:37.7675782Z ·  ─────┬─────────┬─── 2026-10-24T11:06:37.7675967Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7676080Z · ╰── This value is a ref 2026-10-24T11:06:37.7676157Z 28 │ const mounted = useRef(true); 2026-10-24T11:06:37.7676208Z ╰──── 2026-10-24T11:06:37.7676684Z  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-24T11:06:37.7676984Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7676991Z 2026-10-24T11:06:37.7677146Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7677318Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T11:06:37.7677374Z 90 │ }) { 2026-10-24T11:06:37.7677487Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T11:06:37.7677560Z ·  ────┬─── 2026-10-24T11:06:37.7677692Z · ╰── `rotation` originates here 2026-10-24T11:06:37.7677762Z 92 │ useLayoutEffect(() => { 2026-10-24T11:06:37.7677904Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T11:06:37.7677975Z ·  ────┬─── 2026-10-24T11:06:37.7678165Z · ╰── `rotation` cannot be modified 2026-10-24T11:06:37.7678297Z 94 │ }, [props.hidden, rotation]); 2026-10-24T11:06:37.7678349Z ╰──── 2026-10-24T11:06:37.7678615Z  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-24T11:06:37.7678923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7678926Z 2026-10-24T11:06:37.7679082Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7679254Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T11:06:37.7679347Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T11:06:37.7679485Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T11:06:37.7679576Z ·  ────────┬──────── 2026-10-24T11:06:37.7679725Z · ╰── `loadingVisibility` originates here 2026-10-24T11:06:37.7679793Z 268 │ useLayoutEffect(() => { 2026-10-24T11:06:37.7679952Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T11:06:37.7680035Z ·  ────────┬──────── 2026-10-24T11:06:37.7680184Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T11:06:37.7680274Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T11:06:37.7680327Z ╰──── 2026-10-24T11:06:37.7680595Z  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-24T11:06:37.7680904Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7680907Z 2026-10-24T11:06:37.7681061Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7681229Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T11:06:37.7681285Z 325 │ }) { 2026-10-24T11:06:37.7681446Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T11:06:37.7681537Z ·  ─────────┬───────── 2026-10-24T11:06:37.7681689Z · ╰── `recordingVisibility` originates here 2026-10-24T11:06:37.7681760Z 327 │ useLayoutEffect(() => { 2026-10-24T11:06:37.7681956Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T11:06:37.7682047Z ·  ─────────┬───────── 2026-10-24T11:06:37.7682199Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T11:06:37.7682292Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T11:06:37.7682344Z ╰──── 2026-10-24T11:06:37.7682608Z  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-24T11:06:37.7682914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7682919Z 2026-10-24T11:06:37.7683140Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:06:37.7683322Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T11:06:37.7683376Z 465 │ 2026-10-24T11:06:37.7683483Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T11:06:37.7683555Z ·  ── 2026-10-24T11:06:37.7683610Z 467 │ } 2026-10-24T11:06:37.7683662Z ╰──── 2026-10-24T11:06:37.7683893Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:06:37.7683897Z 2026-10-24T11:06:37.7684041Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7684202Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T11:06:37.7684369Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T11:06:37.7684496Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T11:06:37.7684617Z ·  ───────────┬────────── 2026-10-24T11:06:37.7684794Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7684914Z 123 │ const sessionRef = useRef(null); 2026-10-24T11:06:37.7684967Z ╰──── 2026-10-24T11:06:37.7685439Z  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-24T11:06:37.7685739Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7685744Z 2026-10-24T11:06:37.7685888Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7686047Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T11:06:37.7686101Z 125 │ 2026-10-24T11:06:37.7686209Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:06:37.7686298Z ·  ─────────┬──────── 2026-10-24T11:06:37.7686447Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7686550Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:06:37.7686601Z ╰──── 2026-10-24T11:06:37.7687125Z  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-24T11:06:37.7687448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7687450Z 2026-10-24T11:06:37.7687595Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7687752Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T11:06:37.7687805Z 125 │ 2026-10-24T11:06:37.7687913Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:06:37.7688000Z ·  ─────────┬───────── 2026-10-24T11:06:37.7688147Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7688255Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:06:37.7688357Z ╰──── 2026-10-24T11:06:37.7688827Z  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-24T11:06:37.7689118Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7689121Z 2026-10-24T11:06:37.7689262Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7689421Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T11:06:37.7689475Z 125 │ 2026-10-24T11:06:37.7689585Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:06:37.7689702Z ·  ─────────┬───────── 2026-10-24T11:06:37.7689871Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7689973Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:06:37.7690026Z ╰──── 2026-10-24T11:06:37.7690491Z  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-24T11:06:37.7690781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7690783Z 2026-10-24T11:06:37.7690930Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7691091Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T11:06:37.7691145Z 125 │ 2026-10-24T11:06:37.7691250Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:06:37.7691365Z ·  ──────────┬───────── 2026-10-24T11:06:37.7691533Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7691632Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:06:37.7691683Z ╰──── 2026-10-24T11:06:37.7692202Z  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-24T11:06:37.7692527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7692529Z 2026-10-24T11:06:37.7692672Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7692830Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T11:06:37.7692940Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:06:37.7693135Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:06:37.7693310Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T11:06:37.7693442Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T11:06:37.7693599Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T11:06:37.7693717Z 131 │ │ isFinished: status.isFinished, 2026-10-24T11:06:37.7693895Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T11:06:37.7693999Z 133 │ │ error: status.error, 2026-10-24T11:06:37.7694096Z 134 │ │ url: status.url, 2026-10-24T11:06:37.7694178Z 135 │ │ }); 2026-10-24T11:06:37.7694255Z 136 │ │ }, 2026-10-24T11:06:37.7694454Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T11:06:37.7694568Z 138 │ │ selectInput: (inputs) => { 2026-10-24T11:06:37.7694727Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T11:06:37.7694872Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T11:06:37.7695040Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T11:06:37.7695180Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T11:06:37.7695282Z 143 │ │ if (order !== known) { 2026-10-24T11:06:37.7695421Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T11:06:37.7695537Z 145 │ │ transform: (current) => ({ 2026-10-24T11:06:37.7695748Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T11:06:37.7695835Z 147 │ │ }), 2026-10-24T11:06:37.7695917Z 148 │ │ }); 2026-10-24T11:06:37.7695996Z 149 │ │ } 2026-10-24T11:06:37.7696136Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T11:06:37.7696212Z 151 │ │ }, 2026-10-24T11:06:37.7696346Z 152 │ ├─▶ }); 2026-10-24T11:06:37.7696585Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7696674Z 153 │ recorderRef.current = recorder; 2026-10-24T11:06:37.7696727Z ╰──── 2026-10-24T11:06:37.7697249Z  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-24T11:06:37.7697571Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7697573Z 2026-10-24T11:06:37.7697719Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7697881Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T11:06:37.7697938Z 152 │ }); 2026-10-24T11:06:37.7698019Z 153 │ recorderRef.current = recorder; 2026-10-24T11:06:37.7698134Z ·  ─────┬─────────┬─── 2026-10-24T11:06:37.7698353Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7698474Z · ╰── This value is a ref 2026-10-24T11:06:37.7698580Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:06:37.7698633Z ╰──── 2026-10-24T11:06:37.7699099Z  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-24T11:06:37.7699389Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7699393Z 2026-10-24T11:06:37.7699535Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7699699Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T11:06:37.7699791Z 153 │ recorderRef.current = recorder; 2026-10-24T11:06:37.7699989Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:06:37.7700073Z 155 │ │ recorder, 2026-10-24T11:06:37.7700203Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T11:06:37.7700321Z 157 │ │ requestPermission: async () => { 2026-10-24T11:06:37.7700486Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T11:06:37.7700677Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T11:06:37.7700763Z 160 │ │ }, 2026-10-24T11:06:37.7700909Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T11:06:37.7701045Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T11:06:37.7701179Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T11:06:37.7701293Z 164 │ │ onStateChange: (nextState) => 2026-10-24T11:06:37.7701387Z 165 │ │ setState({ 2026-10-24T11:06:37.7701491Z 166 │ │ state: nextState, 2026-10-24T11:06:37.7701627Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T11:06:37.7701757Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T11:06:37.7701839Z 169 │ │ }), 2026-10-24T11:06:37.7702025Z 170 │ ├─▶ }); 2026-10-24T11:06:37.7702252Z · ╰──── Cannot access ref value during render 2026-10-24T11:06:37.7702310Z 171 │ } 2026-10-24T11:06:37.7702364Z ╰──── 2026-10-24T11:06:37.7702840Z  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-24T11:06:37.7703256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7703259Z 2026-10-24T11:06:37.7703408Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7703571Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T11:06:37.7703655Z 153 │ recorderRef.current = recorder; 2026-10-24T11:06:37.7703759Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:06:37.7703872Z ·  ─────┬────────┬─── 2026-10-24T11:06:37.7704056Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7704173Z · ╰── This value is a ref 2026-10-24T11:06:37.7704238Z 155 │ recorder, 2026-10-24T11:06:37.7704291Z ╰──── 2026-10-24T11:06:37.7704768Z  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-24T11:06:37.7705064Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7705067Z 2026-10-24T11:06:37.7705212Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7705371Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T11:06:37.7705457Z 184 │ return () => subscription.remove(); 2026-10-24T11:06:37.7705524Z 185 │ }, [controller]); 2026-10-24T11:06:37.7705604Z ·  ─────┬──── 2026-10-24T11:06:37.7705750Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7705803Z 186 │ 2026-10-24T11:06:37.7705856Z ╰──── 2026-10-24T11:06:37.7706329Z  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-24T11:06:37.7706623Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7706625Z 2026-10-24T11:06:37.7706768Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7706926Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T11:06:37.7707013Z 184 │ return () => subscription.remove(); 2026-10-24T11:06:37.7707077Z 185 │ }, [controller]); 2026-10-24T11:06:37.7707153Z ·  ──────┬───── 2026-10-24T11:06:37.7707369Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7707470Z 186 │ 2026-10-24T11:06:37.7707522Z ╰──── 2026-10-24T11:06:37.7707990Z  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-24T11:06:37.7708306Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7708308Z 2026-10-24T11:06:37.7708451Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7708609Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T11:06:37.7708670Z 191 │ }, 2026-10-24T11:06:37.7708744Z 192 │ [controller, recorder], 2026-10-24T11:06:37.7708821Z ·  ─────┬──── 2026-10-24T11:06:37.7708965Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7709021Z 193 │ ); 2026-10-24T11:06:37.7709071Z ╰──── 2026-10-24T11:06:37.7709535Z  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-24T11:06:37.7709827Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7709829Z 2026-10-24T11:06:37.7709976Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7710140Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T11:06:37.7710231Z 174 │ const controller = session.controller; 2026-10-24T11:06:37.7710319Z 175 │ const recorder = recorderRef.current; 2026-10-24T11:06:37.7710424Z ·  ─────────┬───────── 2026-10-24T11:06:37.7710584Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7710636Z 176 │ 2026-10-24T11:06:37.7710688Z ╰──── 2026-10-24T11:06:37.7711155Z  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-24T11:06:37.7711453Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7711458Z 2026-10-24T11:06:37.7711600Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7711762Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T11:06:37.7711819Z 191 │ }, 2026-10-24T11:06:37.7711890Z 192 │ [controller, recorder], 2026-10-24T11:06:37.7711979Z ·  ───────────┬────────── 2026-10-24T11:06:37.7712128Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7712184Z 193 │ ); 2026-10-24T11:06:37.7712236Z ╰──── 2026-10-24T11:06:37.7712771Z  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-24T11:06:37.7713101Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7713104Z 2026-10-24T11:06:37.7713245Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7713402Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T11:06:37.7713495Z 245 │ return () => clearInterval(intervalId); 2026-10-24T11:06:37.7713605Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T11:06:37.7713694Z ·  ─────┬──── 2026-10-24T11:06:37.7713854Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7713912Z 247 │ 2026-10-24T11:06:37.7713963Z ╰──── 2026-10-24T11:06:37.7714434Z  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-24T11:06:37.7714726Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7714729Z 2026-10-24T11:06:37.7714871Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7715029Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T11:06:37.7715124Z 245 │ return () => clearInterval(intervalId); 2026-10-24T11:06:37.7715237Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T11:06:37.7715371Z ·  ────────────────────────┬─────────────────────── 2026-10-24T11:06:37.7715532Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7715583Z 247 │ 2026-10-24T11:06:37.7715635Z ╰──── 2026-10-24T11:06:37.7716103Z  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-24T11:06:37.7716394Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7716466Z 2026-10-24T11:06:37.7716648Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7716804Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T11:06:37.7716872Z 260 │ setOwnerFocused, 2026-10-24T11:06:37.7716934Z 261 │ session, 2026-10-24T11:06:37.7717006Z ·  ───┬─── 2026-10-24T11:06:37.7717144Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7717204Z 262 │ stop, 2026-10-24T11:06:37.7717256Z ╰──── 2026-10-24T11:06:37.7717727Z  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-24T11:06:37.7718021Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7718027Z 2026-10-24T11:06:37.7718169Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7718350Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T11:06:37.7718405Z 250 │ 2026-10-24T11:06:37.7718545Z 251 │ ╭─▶ return { 2026-10-24T11:06:37.7718757Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T11:06:37.7718838Z 253 │ │ state, 2026-10-24T11:06:37.7718928Z 254 │ │ audioLevels, 2026-10-24T11:06:37.7719025Z 255 │ │ elapsedSeconds, 2026-10-24T11:06:37.7719159Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T11:06:37.7719240Z 257 │ │ ownerKey, 2026-10-24T11:06:37.7719318Z 258 │ │ label, 2026-10-24T11:06:37.7719409Z 259 │ │ focusedOwners, 2026-10-24T11:06:37.7719504Z 260 │ │ setOwnerFocused, 2026-10-24T11:06:37.7719586Z 261 │ │ session, 2026-10-24T11:06:37.7719664Z 262 │ │ stop, 2026-10-24T11:06:37.7719742Z 263 │ │ cancel, 2026-10-24T11:06:37.7719873Z 264 │ ├─▶ }; 2026-10-24T11:06:37.7720079Z · ╰──── Cannot access ref value during render 2026-10-24T11:06:37.7720138Z 265 │ } 2026-10-24T11:06:37.7720189Z ╰──── 2026-10-24T11:06:37.7720663Z  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-24T11:06:37.7720957Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7720960Z 2026-10-24T11:06:37.7721117Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7721277Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T11:06:37.7721495Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T11:06:37.7721654Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T11:06:37.7721736Z ·  ─────┬───── 2026-10-24T11:06:37.7721873Z · ╰── `audioLevels` originates here 2026-10-24T11:06:37.7721992Z 123 │ const sessionRef = useRef(null); 2026-10-24T11:06:37.7722138Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T11:06:37.7722191Z 125 │ 2026-10-24T11:06:37.7722298Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T11:06:37.7722398Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T11:06:37.7722540Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T11:06:37.7722635Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T11:06:37.7722763Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T11:06:37.7722852Z 131 │ isFinished: status.isFinished, 2026-10-24T11:06:37.7722997Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T11:06:37.7723071Z 133 │ error: status.error, 2026-10-24T11:06:37.7723139Z 134 │ url: status.url, 2026-10-24T11:06:37.7723199Z 135 │ }); 2026-10-24T11:06:37.7723257Z 136 │ }, 2026-10-24T11:06:37.7723424Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T11:06:37.7723504Z 138 │ selectInput: (inputs) => { 2026-10-24T11:06:37.7723627Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T11:06:37.7723739Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T11:06:37.7723877Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T11:06:37.7723988Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T11:06:37.7724060Z 143 │ if (order !== known) { 2026-10-24T11:06:37.7724168Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T11:06:37.7724251Z 145 │ transform: (current) => ({ 2026-10-24T11:06:37.7724425Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T11:06:37.7724487Z 147 │ }), 2026-10-24T11:06:37.7724548Z 148 │ }); 2026-10-24T11:06:37.7724607Z 149 │ } 2026-10-24T11:06:37.7724717Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T11:06:37.7724774Z 151 │ }, 2026-10-24T11:06:37.7724833Z 152 │ }); 2026-10-24T11:06:37.7724916Z 153 │ recorderRef.current = recorder; 2026-10-24T11:06:37.7725024Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T11:06:37.7725088Z 155 │ recorder, 2026-10-24T11:06:37.7725187Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T11:06:37.7725271Z 157 │ requestPermission: async () => { 2026-10-24T11:06:37.7725404Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T11:06:37.7725559Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T11:06:37.7725617Z 160 │ }, 2026-10-24T11:06:37.7725727Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T11:06:37.7725832Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T11:06:37.7725936Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T11:06:37.7726016Z 164 │ onStateChange: (nextState) => 2026-10-24T11:06:37.7726143Z 165 │ setState({ 2026-10-24T11:06:37.7726248Z 166 │ state: nextState, 2026-10-24T11:06:37.7726356Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T11:06:37.7726455Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T11:06:37.7726514Z 169 │ }), 2026-10-24T11:06:37.7726570Z 170 │ }); 2026-10-24T11:06:37.7726624Z 171 │ } 2026-10-24T11:06:37.7726677Z 172 │ 2026-10-24T11:06:37.7726762Z 173 │ const session = sessionRef.current; 2026-10-24T11:06:37.7726849Z 174 │ const controller = session.controller; 2026-10-24T11:06:37.7726934Z 175 │ const recorder = recorderRef.current; 2026-10-24T11:06:37.7726987Z 176 │ 2026-10-24T11:06:37.7727053Z 177 │ useEffect(() => { 2026-10-24T11:06:37.7727200Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T11:06:37.7727348Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T11:06:37.7727491Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T11:06:37.7727596Z 181 │ // calls and route interruptions during capture. 2026-10-24T11:06:37.7727731Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T11:06:37.7727789Z 183 │ }); 2026-10-24T11:06:37.7727878Z 184 │ return () => subscription.remove(); 2026-10-24T11:06:37.7727947Z 185 │ }, [controller]); 2026-10-24T11:06:37.7728000Z 186 │ 2026-10-24T11:06:37.7728064Z 187 │ useEffect( 2026-10-24T11:06:37.7728130Z 188 │ () => () => { 2026-10-24T11:06:37.7728203Z 189 │ controller.dispose(); 2026-10-24T11:06:37.7728297Z 190 │ recorder.release(); 2026-10-24T11:06:37.7728356Z 191 │ }, 2026-10-24T11:06:37.7728436Z 192 │ [controller, recorder], 2026-10-24T11:06:37.7728496Z 193 │ ); 2026-10-24T11:06:37.7728553Z 194 │ 2026-10-24T11:06:37.7728620Z 195 │ useEffect(() => { 2026-10-24T11:06:37.7728720Z 196 │ if (state.phase !== "recording") return; 2026-10-24T11:06:37.7728773Z 197 │ 2026-10-24T11:06:37.7728925Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T11:06:37.7729033Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T11:06:37.7729120Z 200 │ void activation.catch(() => {}); 2026-10-24T11:06:37.7729185Z 201 │ return () => { 2026-10-24T11:06:37.7729339Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T11:06:37.7729482Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T11:06:37.7729541Z 204 │ }; 2026-10-24T11:06:37.7729627Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T11:06:37.7729686Z 206 │ 2026-10-24T11:06:37.7729754Z 207 │ useEffect(() => { 2026-10-24T11:06:37.7729892Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T11:06:37.7729946Z 209 │ 2026-10-24T11:06:37.7730072Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T11:06:37.7730232Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T11:06:37.7730338Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T11:06:37.7730418Z ·  ─────┬───── 2026-10-24T11:06:37.7730566Z · ╰── `audioLevels` cannot be modified 2026-10-24T11:06:37.7730626Z 213 │ } 2026-10-24T11:06:37.7730680Z ╰──── 2026-10-24T11:06:37.7731022Z  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-24T11:06:37.7731375Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7731377Z 2026-10-24T11:06:37.7731583Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:06:37.7731748Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T11:06:37.7731801Z 206 │ 2026-10-24T11:06:37.7731871Z 207 │ useEffect(() => { 2026-10-24T11:06:37.7731955Z ·  ───┬─── 2026-10-24T11:06:37.7732180Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T11:06:37.7732323Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T11:06:37.7732384Z 209 │ 2026-10-24T11:06:37.7732511Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T11:06:37.7732670Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T11:06:37.7732774Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T11:06:37.7732856Z ·  ─────┬───── 2026-10-24T11:06:37.7732997Z · ╰── This modifies `audioLevels` 2026-10-24T11:06:37.7733084Z 213 │ } 2026-10-24T11:06:37.7733153Z ╰──── 2026-10-24T11:06:37.7733565Z  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-24T11:06:37.7733926Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7733932Z 2026-10-24T11:06:37.7734171Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7734350Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T11:06:37.7734432Z 154 │ } 2026-10-24T11:06:37.7734563Z 155 │ }, [wrappedRender]); 2026-10-24T11:06:37.7734682Z ·  ──────┬────── 2026-10-24T11:06:37.7734848Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T11:06:37.7734937Z 156 │ 2026-10-24T11:06:37.7735028Z ╰──── 2026-10-24T11:06:37.7735376Z  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-24T11:06:37.7735724Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7735727Z 2026-10-24T11:06:37.7735987Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:06:37.7736181Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T11:06:37.7736291Z 799 │ > 2026-10-24T11:06:37.7736454Z 800 │ 2026-10-24T11:06:37.7736593Z ·  ──────────────────── 2026-10-24T11:06:37.7736733Z 801 │ 2026-10-24T11:06:37.7736891Z ╰──── 2026-10-24T11:06:37.7737198Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:06:37.7737355Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:06:37.7737376Z 2026-10-24T11:06:37.7737554Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7737742Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T11:06:37.7737849Z 35 │ 2026-10-24T11:06:37.7738022Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T11:06:37.7738127Z ·  ────────┬──────── 2026-10-24T11:06:37.7738334Z · ╰── `inspectorProgress` originates here 2026-10-24T11:06:37.7738476Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T11:06:37.7738653Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T11:06:37.7738721Z 39 │ 2026-10-24T11:06:37.7738843Z 40 │ const onClosed = props.onClosed; 2026-10-24T11:06:37.7738937Z 41 │ useEffect(() => { 2026-10-24T11:06:37.7739080Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T11:06:37.7739179Z ·  ────────┬──────── 2026-10-24T11:06:37.7739364Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T11:06:37.7739582Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T11:06:37.7739673Z ╰──── 2026-10-24T11:06:37.7739966Z  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-24T11:06:37.7740317Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7740324Z 2026-10-24T11:06:37.7740515Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7740701Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T11:06:37.7740845Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T11:06:37.7740994Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T11:06:37.7741123Z ·  ──────────┬───────── 2026-10-24T11:06:37.7741313Z · ╰── `renderedContentWidth` originates here 2026-10-24T11:06:37.7741402Z 39 │ 2026-10-24T11:06:37.7741507Z 40 │ const onClosed = props.onClosed; 2026-10-24T11:06:37.7741616Z 41 │ useEffect(() => { 2026-10-24T11:06:37.7741746Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T11:06:37.7741849Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T11:06:37.7742298Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T11:06:37.7742399Z 45 │ (finished) => { 2026-10-24T11:06:37.7742577Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T11:06:37.7742697Z 47 │ runOnJS(onClosed)(); 2026-10-24T11:06:37.7742769Z 48 │ } 2026-10-24T11:06:37.7742863Z 49 │ }, 2026-10-24T11:06:37.7742944Z 50 │ ); 2026-10-24T11:06:37.7743208Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T11:06:37.7743305Z 52 │ renderedInspectorWidth.set( 2026-10-24T11:06:37.7743486Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T11:06:37.7743655Z 54 │ ); 2026-10-24T11:06:37.7743792Z 55 │ }, [ 2026-10-24T11:06:37.7743885Z 56 │ inspectorProgress, 2026-10-24T11:06:37.7743985Z 57 │ inspectorVisible, 2026-10-24T11:06:37.7744080Z 58 │ inspectorWidth, 2026-10-24T11:06:37.7744163Z 59 │ onClosed, 2026-10-24T11:06:37.7744274Z 60 │ renderedInspectorWidth, 2026-10-24T11:06:37.7744483Z 61 │ resizing, 2026-10-24T11:06:37.7744573Z 62 │ ]); 2026-10-24T11:06:37.7744649Z 63 │ 2026-10-24T11:06:37.7744737Z 64 │ useEffect(() => { 2026-10-24T11:06:37.7744883Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T11:06:37.7745001Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T11:06:37.7745116Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T11:06:37.7745245Z ·  ──────────┬───────── 2026-10-24T11:06:37.7745453Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T11:06:37.7745558Z 68 │ return; 2026-10-24T11:06:37.7745626Z ╰──── 2026-10-24T11:06:37.7745931Z  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-24T11:06:37.7746263Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7746266Z 2026-10-24T11:06:37.7746503Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T11:06:37.7746676Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T11:06:37.7746782Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T11:06:37.7746908Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T11:06:37.7747032Z ·  ──┬── 2026-10-24T11:06:37.7747307Z · ╰── 'Scope' is imported here 2026-10-24T11:06:37.7747416Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T11:06:37.7747501Z ╰──── 2026-10-24T11:06:37.7747635Z  help: Consider removing this import. 2026-10-24T11:06:37.7747638Z 2026-10-24T11:06:37.7747861Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T11:06:37.7747998Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T11:06:37.7748089Z 265 │ 2026-10-24T11:06:37.7748230Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T11:06:37.7748378Z ·  ── 2026-10-24T11:06:37.7748458Z 267 │ } 2026-10-24T11:06:37.7748549Z ╰──── 2026-10-24T11:06:37.7748875Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T11:06:37.7748915Z 2026-10-24T11:06:37.7749172Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T11:06:37.7749346Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T11:06:37.7749416Z 11 │ 2026-10-24T11:06:37.7749545Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T11:06:37.7749683Z ·  ────────────┬──────────── 2026-10-24T11:06:37.7749999Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T11:06:37.7750091Z 13 │ readonly thread: { 2026-10-24T11:06:37.7750179Z ╰──── 2026-10-24T11:06:37.7750317Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7750327Z 2026-10-24T11:06:37.7750566Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7750710Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T11:06:37.7750829Z 28 │ getPendingThreadOrder(); 2026-10-24T11:06:37.7750942Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T11:06:37.7751105Z ·  ────┬──── ───────┬────── 2026-10-24T11:06:37.7751308Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T11:06:37.7751504Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T11:06:37.7751605Z 30 │ return pending; 2026-10-24T11:06:37.7751694Z ╰──── 2026-10-24T11:06:37.7752017Z  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-24T11:06:37.7752379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7752381Z 2026-10-24T11:06:37.7752617Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T11:06:37.7752746Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T11:06:37.7752969Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T11:06:37.7753060Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T11:06:37.7753192Z ·  ──┬── 2026-10-24T11:06:37.7753356Z · ╰── 'Fiber' is imported here 2026-10-24T11:06:37.7753500Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T11:06:37.7753572Z ╰──── 2026-10-24T11:06:37.7753709Z  help: Consider removing this import. 2026-10-24T11:06:37.7753711Z 2026-10-24T11:06:37.7753954Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T11:06:37.7754086Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T11:06:37.7754182Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T11:06:37.7754302Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T11:06:37.7754434Z ·  ────┬─── 2026-10-24T11:06:37.7754602Z · ╰── 'Schedule' is imported here 2026-10-24T11:06:37.7754708Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T11:06:37.7754795Z ╰──── 2026-10-24T11:06:37.7754992Z  help: Consider removing this import. 2026-10-24T11:06:37.7755027Z 2026-10-24T11:06:37.7755376Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7755609Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-24T11:06:37.7755783Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T11:06:37.7756008Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T11:06:37.7756172Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7756377Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T11:06:37.7756565Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T11:06:37.7756658Z ╰──── 2026-10-24T11:06:37.7756806Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7756809Z 2026-10-24T11:06:37.7757100Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T11:06:37.7757244Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-24T11:06:37.7757380Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T11:06:37.7757545Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T11:06:37.7757693Z ·  ─────────────── 2026-10-24T11:06:37.7757783Z 510 │ ) 2026-10-24T11:06:37.7757852Z ╰──── 2026-10-24T11:06:37.7758041Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T11:06:37.7758045Z 2026-10-24T11:06:37.7758385Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7758561Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T11:06:37.7758785Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T11:06:37.7758884Z 84 │ useEffect(() => { 2026-10-24T11:06:37.7758986Z ·  ────┬──── 2026-10-24T11:06:37.7759169Z · ╰── This is the containing effect 2026-10-24T11:06:37.7759273Z 85 │ if (!actionState.isRunning) return; 2026-10-24T11:06:37.7759377Z 86 │ setNowMs(Date.now()); 2026-10-24T11:06:37.7759489Z ·  ────┬─── 2026-10-24T11:06:37.7759692Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7759849Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T11:06:37.7759938Z ╰──── 2026-10-24T11:06:37.7760576Z  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-24T11:06:37.7760936Z  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-24T11:06:37.7760939Z 2026-10-24T11:06:37.7761357Z ⚠ 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-24T11:06:37.7761569Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T11:06:37.7761776Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T11:06:37.7761958Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T11:06:37.7762114Z ·  ─────────────────── 2026-10-24T11:06:37.7762322Z 1787 │ cwd, 2026-10-24T11:06:37.7762397Z ╰──── 2026-10-24T11:06:37.7762400Z 2026-10-24T11:06:37.7762601Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T11:06:37.7762785Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1526:12] 2026-10-24T11:06:37.7762900Z 1525 │ 2026-10-24T11:06:37.7762986Z 1526 │ for (const [] of [ 2026-10-24T11:06:37.7763094Z ·  ── 2026-10-24T11:06:37.7763209Z 1527 │ ["github", "github.com"], 2026-10-24T11:06:37.7763303Z ╰──── 2026-10-24T11:06:37.7763607Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T11:06:37.7763610Z 2026-10-24T11:06:37.7763933Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T11:06:37.7764098Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T11:06:37.7764182Z 284 │ }, 2026-10-24T11:06:37.7764293Z 285 │ (effect, flow, stopSessions) => 2026-10-24T11:06:37.7764436Z ·  ──────┬───── 2026-10-24T11:06:37.7764624Z · ╰── 'stopSessions' is declared here 2026-10-24T11:06:37.7764729Z 286 │ effect.pipe( 2026-10-24T11:06:37.7764792Z ╰──── 2026-10-24T11:06:37.7765061Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7765064Z 2026-10-24T11:06:37.7765242Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7765394Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T11:06:37.7765589Z 53 │ const child = children as ReactElement>; 2026-10-24T11:06:37.7765806Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T11:06:37.7765961Z 55 │ │ onTouchStart: (event) => { 2026-10-24T11:06:37.7766153Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T11:06:37.7766354Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T11:06:37.7766491Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T11:06:37.7766717Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T11:06:37.7766863Z 60 │ │ pendingPress.current = null; 2026-10-24T11:06:37.7767018Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T11:06:37.7767111Z 62 │ │ }, 2026-10-24T11:06:37.7767255Z 63 │ │ onPress: (event) => { 2026-10-24T11:06:37.7767468Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T11:06:37.7767640Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T11:06:37.7767887Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T11:06:37.7768261Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T11:06:37.7768426Z 68 │ │ return; 2026-10-24T11:06:37.7768540Z 69 │ │ } 2026-10-24T11:06:37.7768721Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T11:06:37.7768913Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T11:06:37.7769120Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T11:06:37.7769262Z 73 │ │ event.persist(); 2026-10-24T11:06:37.7769467Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T11:06:37.7769574Z 75 │ │ return; 2026-10-24T11:06:37.7769679Z 76 │ │ } 2026-10-24T11:06:37.7769849Z 77 │ │ child.props.onPress?.(event); 2026-10-24T11:06:37.7769965Z 78 │ │ }, 2026-10-24T11:06:37.7770113Z 79 │ ├─▶ }); 2026-10-24T11:06:37.7770385Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7770528Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T11:06:37.7770625Z ╰──── 2026-10-24T11:06:37.7771145Z  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-24T11:06:37.7771557Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7771560Z 2026-10-24T11:06:37.7771800Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T11:06:37.7771980Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T11:06:37.7772072Z 78 │ 2026-10-24T11:06:37.7772224Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T11:06:37.7772347Z ·  ────────┬─────── 2026-10-24T11:06:37.7772538Z · ╰── 'describeSchedule' is declared here 2026-10-24T11:06:37.7772695Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T11:06:37.7772782Z ╰──── 2026-10-24T11:06:37.7772904Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7772906Z 2026-10-24T11:06:37.7776494Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7776676Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T11:06:37.7776861Z 151 │ 2026-10-24T11:06:37.7776944Z 152 │ {props.children(open)} 2026-10-24T11:06:37.7777037Z ·  ──┬─ 2026-10-24T11:06:37.7777199Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7777347Z 153 │ 2026-10-24T11:06:37.7777445Z ╰──── 2026-10-24T11:06:37.7777919Z  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-24T11:06:37.7778214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7778219Z 2026-10-24T11:06:37.7778457Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T11:06:37.7778612Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T11:06:37.7778695Z 139 │ if (action.id !== undefined) { 2026-10-24T11:06:37.7778780Z 140 │ props.onPressAction?.({ 2026-10-24T11:06:37.7778859Z ·  ──┬── 2026-10-24T11:06:37.7778995Z · ╰── Missing dependency `props` 2026-10-24T11:06:37.7779091Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T11:06:37.7779241Z 142 │ } as Parameters>[0]); 2026-10-24T11:06:37.7779298Z 143 │ } 2026-10-24T11:06:37.7779355Z 144 │ }, 2026-10-24T11:06:37.7779439Z 145 │ [close, props.onPressAction], 2026-10-24T11:06:37.7779534Z ·  ─────────┬───────── 2026-10-24T11:06:37.7779755Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T11:06:37.7779812Z 146 │ ); 2026-10-24T11:06:37.7779865Z ╰──── 2026-10-24T11:06:37.7780362Z  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-24T11:06:37.7780685Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7780688Z 2026-10-24T11:06:37.7781166Z ⚠ 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-24T11:06:37.7781355Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T11:06:37.7781432Z 520 │ })).delivery; 2026-10-24T11:06:37.7781635Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T11:06:37.7781751Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T11:06:37.7781901Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T11:06:37.7782004Z 524 │ │ id: task.id, 2026-10-24T11:06:37.7782123Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T11:06:37.7782222Z 526 │ │ })).delivery; 2026-10-24T11:06:37.7782365Z 527 │ ╰─▶ } 2026-10-24T11:06:37.7782482Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T11:06:37.7782536Z ╰──── 2026-10-24T11:06:37.7782607Z 2026-10-24T11:06:37.7782826Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:06:37.7782991Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T11:06:37.7783098Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T11:06:37.7783369Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T11:06:37.7783518Z ·  ─────┬───── 2026-10-24T11:06:37.7783726Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T11:06:37.7783808Z 101 │ const readEditor = useCallback( 2026-10-24T11:06:37.7783862Z ╰──── 2026-10-24T11:06:37.7784189Z  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-24T11:06:37.7784509Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7784512Z 2026-10-24T11:06:37.7784698Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T11:06:37.7784861Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T11:06:37.7784925Z 120 │ setEditor, 2026-10-24T11:06:37.7784990Z 121 │ startEditor, 2026-10-24T11:06:37.7785070Z ·  ─────┬───── 2026-10-24T11:06:37.7785222Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T11:06:37.7785291Z 122 │ hasChanges, 2026-10-24T11:06:37.7785343Z ╰──── 2026-10-24T11:06:37.7785662Z  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-24T11:06:37.7785975Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7785977Z 2026-10-24T11:06:37.7786201Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:06:37.7786341Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T11:06:37.7786409Z 1021 │ instanceId, 2026-10-24T11:06:37.7786634Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T11:06:37.7786823Z ·  ────────────────────────────────────────────────── 2026-10-24T11:06:37.7786887Z 1023 │ ]), 2026-10-24T11:06:37.7786940Z ╰──── 2026-10-24T11:06:37.7787209Z  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-24T11:06:37.7787212Z 2026-10-24T11:06:37.7787473Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7787665Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T11:06:37.7787719Z 117 │ 2026-10-24T11:06:37.7787785Z 118 │ useEffect(() => { 2026-10-24T11:06:37.7787860Z ·  ────┬──── 2026-10-24T11:06:37.7788001Z · ╰── This is the containing effect 2026-10-24T11:06:37.7788086Z 119 │ void refreshNotifications(); 2026-10-24T11:06:37.7788179Z ·  ──────────┬───────── 2026-10-24T11:06:37.7788401Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7788547Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T11:06:37.7788598Z ╰──── 2026-10-24T11:06:37.7789210Z  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-24T11:06:37.7789543Z  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-24T11:06:37.7789549Z 2026-10-24T11:06:37.7789808Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7789998Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T11:06:37.7790051Z 125 │ 2026-10-24T11:06:37.7790117Z 126 │ useEffect(() => { 2026-10-24T11:06:37.7790191Z ·  ────┬──── 2026-10-24T11:06:37.7790322Z · ╰── This is the containing effect 2026-10-24T11:06:37.7790388Z 127 │ if (!isLoaded) { 2026-10-24T11:06:37.7790481Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T11:06:37.7790577Z ·  ──────────┬────────── 2026-10-24T11:06:37.7790756Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7790818Z 129 │ return; 2026-10-24T11:06:37.7790871Z ╰──── 2026-10-24T11:06:37.7791478Z  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-24T11:06:37.7791806Z  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-24T11:06:37.7791808Z 2026-10-24T11:06:37.7792088Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T11:06:37.7792260Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T11:06:37.7792327Z 20 │ [instanceId]: { 2026-10-24T11:06:37.7792408Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T11:06:37.7792513Z ·  ──────────────────────────── 2026-10-24T11:06:37.7792581Z 22 │ [model]: options, 2026-10-24T11:06:37.7792634Z ╰──── 2026-10-24T11:06:37.7792902Z  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-24T11:06:37.7792905Z 2026-10-24T11:06:37.7793164Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7793305Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T11:06:37.7793363Z 57 │ 2026-10-24T11:06:37.7793426Z 58 │ useEffect(() => { 2026-10-24T11:06:37.7793498Z ·  ────┬──── 2026-10-24T11:06:37.7793626Z · ╰── This is the containing effect 2026-10-24T11:06:37.7793724Z 59 │ const controller = new AbortController(); 2026-10-24T11:06:37.7793798Z 60 │ setLoadState("pending"); 2026-10-24T11:06:37.7793877Z ·  ──────┬───── 2026-10-24T11:06:37.7794045Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7794208Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T11:06:37.7794261Z ╰──── 2026-10-24T11:06:37.7794878Z  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-24T11:06:37.7795205Z  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-24T11:06:37.7795208Z 2026-10-24T11:06:37.7795409Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7795546Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T11:06:37.7795629Z 70 │ return () => controller.abort(); 2026-10-24T11:06:37.7795726Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T11:06:37.7795906Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T11:06:37.7796139Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T11:06:37.7796342Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T11:06:37.7796483Z · ╰── Unnecessary dependency `player_0` 2026-10-24T11:06:37.7796536Z 72 │ 2026-10-24T11:06:37.7796589Z ╰──── 2026-10-24T11:06:37.7796886Z  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-24T11:06:37.7797255Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7797289Z 2026-10-24T11:06:37.7797550Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7797682Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T11:06:37.7797878Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T11:06:37.7797950Z 168 │ useLayoutEffect(() => { 2026-10-24T11:06:37.7798031Z ·  ───────┬─────── 2026-10-24T11:06:37.7798164Z · ╰── This is the containing effect 2026-10-24T11:06:37.7798252Z 169 │ if (faviconRequest === null) return; 2026-10-24T11:06:37.7798334Z 170 │ 2026-10-24T11:06:37.7798467Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T11:06:37.7798569Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T11:06:37.7798665Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7798840Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7798908Z 173 │ return endRequest; 2026-10-24T11:06:37.7798959Z ╰──── 2026-10-24T11:06:37.7799568Z  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-24T11:06:37.7799891Z  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-24T11:06:37.7799898Z 2026-10-24T11:06:37.7800097Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7800247Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-24T11:06:37.7800356Z 266 │ {record.elements?.map((element, index) => ( 2026-10-24T11:06:37.7800524Z 267 │ 2026-10-24T11:06:37.7800684Z ·  ─────────────────────────────────────────────────────── 2026-10-24T11:06:37.7800762Z 268 │ 2026-10-24T11:06:37.7807728Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T11:06:37.7807838Z ·  ────────────────────────── 2026-10-24T11:06:37.7807988Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T11:06:37.7808042Z ╰──── 2026-10-24T11:06:37.7808045Z 2026-10-24T11:06:37.7808252Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T11:06:37.7808442Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T11:06:37.7808531Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T11:06:37.7808651Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T11:06:37.7808734Z ·  ─────┬───── 2026-10-24T11:06:37.7808883Z · ╰── 'HostProcess' is imported here 2026-10-24T11:06:37.7808942Z 26 │ 2026-10-24T11:06:37.7808995Z ╰──── 2026-10-24T11:06:37.7809095Z  help: Consider removing this import. 2026-10-24T11:06:37.7809098Z 2026-10-24T11:06:37.7809373Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7809542Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T11:06:37.7809626Z 123 │ const path = yield* Path.Path; 2026-10-24T11:06:37.7809745Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T11:06:37.7809826Z ·  ──────┬───── 2026-10-24T11:06:37.7809967Z · ╰── 'serverConfig' is declared here 2026-10-24T11:06:37.7810118Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T11:06:37.7810174Z ╰──── 2026-10-24T11:06:37.7810279Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7810282Z 2026-10-24T11:06:37.7810560Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7810726Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T11:06:37.7810842Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T11:06:37.7810982Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T11:06:37.7811069Z ·  ───────┬────── 2026-10-24T11:06:37.7811214Z · ╰── 'serverSettings' is declared here 2026-10-24T11:06:37.7811501Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T11:06:37.7811588Z ╰──── 2026-10-24T11:06:37.7811691Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7811694Z 2026-10-24T11:06:37.7811955Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7812116Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T11:06:37.7812178Z 434 │ : null; 2026-10-24T11:06:37.7812244Z 435 │ useEffect(() => { 2026-10-24T11:06:37.7812318Z ·  ────┬──── 2026-10-24T11:06:37.7812449Z · ╰── This is the containing effect 2026-10-24T11:06:37.7812509Z 436 │ if ( 2026-10-24T11:06:37.7812585Z 437 │ props.active === false || 2026-10-24T11:06:37.7812668Z 438 │ activeDraftKey !== null || 2026-10-24T11:06:37.7812754Z 439 │ editingPendingTask !== null || 2026-10-24T11:06:37.7812830Z 440 │ selectedProject === null 2026-10-24T11:06:37.7812887Z 441 │ ) { 2026-10-24T11:06:37.7812948Z 442 │ return; 2026-10-24T11:06:37.7813004Z 443 │ } 2026-10-24T11:06:37.7813074Z 444 │ setActiveDraftKey( 2026-10-24T11:06:37.7813157Z ·  ────────┬──────── 2026-10-24T11:06:37.7813330Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7813403Z 445 │ createNewTaskDraft({ 2026-10-24T11:06:37.7813455Z ╰──── 2026-10-24T11:06:37.7814070Z  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-24T11:06:37.7814398Z  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-24T11:06:37.7814401Z 2026-10-24T11:06:37.7814647Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T11:06:37.7814813Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T11:06:37.7814919Z 1243 │ 2026-10-24T11:06:37.7815116Z 1244 │ {props.children} 2026-10-24T11:06:37.7815234Z ·  ───────────── 2026-10-24T11:06:37.7815313Z 1245 │ 2026-10-24T11:06:37.7815364Z ╰──── 2026-10-24T11:06:37.7815591Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T11:06:37.7815732Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T11:06:37.7815735Z 2026-10-24T11:06:37.7816184Z ⚠ 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-24T11:06:37.7816312Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T11:06:37.7816483Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T11:06:37.7816726Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T11:06:37.7816878Z ·  ─────────────────── 2026-10-24T11:06:37.7816987Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T11:06:37.7817041Z ╰──── 2026-10-24T11:06:37.7817044Z 2026-10-24T11:06:37.7817492Z ⚠ 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-24T11:06:37.7817614Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T11:06:37.7817799Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T11:06:37.7817912Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T11:06:37.7818031Z ·  ─────────────────── 2026-10-24T11:06:37.7818150Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T11:06:37.7818202Z ╰──── 2026-10-24T11:06:37.7818205Z 2026-10-24T11:06:37.7818427Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T11:06:37.7818570Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T11:06:37.7818706Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T11:06:37.7818821Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T11:06:37.7818893Z ·  ──┬── 2026-10-24T11:06:37.7819021Z · ╰── 'Image' is imported here 2026-10-24T11:06:37.7819081Z 18 │ 2026-10-24T11:06:37.7819136Z ╰──── 2026-10-24T11:06:37.7819236Z  help: Consider removing this import. 2026-10-24T11:06:37.7819238Z 2026-10-24T11:06:37.7819443Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:06:37.7819589Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T11:06:37.7819753Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T11:06:37.7819845Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7819937Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7820416Z · ╰── 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-24T11:06:37.7820493Z 227 │ mostRecentEventCount, 2026-10-24T11:06:37.7820550Z 228 │ ); 2026-10-24T11:06:37.7820671Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T11:06:37.7820819Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T11:06:37.7821022Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7821106Z 230 │ const assumedValue = props.value; 2026-10-24T11:06:37.7821159Z ╰──── 2026-10-24T11:06:37.7821327Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:06:37.7821701Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7821736Z 2026-10-24T11:06:37.7821951Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:06:37.7822094Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T11:06:37.7822238Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T11:06:37.7822329Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7822422Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7822892Z · ╰── 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-24T11:06:37.7822965Z 238 │ controlledEventCount, 2026-10-24T11:06:37.7823036Z 239 │ assumedValue, 2026-10-24T11:06:37.7823095Z 240 │ ); 2026-10-24T11:06:37.7823311Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T11:06:37.7823449Z ·  ───────────┬────────── 2026-10-24T11:06:37.7823660Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T11:06:37.7823751Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T11:06:37.7823803Z ╰──── 2026-10-24T11:06:37.7824227Z  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-24T11:06:37.7824545Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7824550Z 2026-10-24T11:06:37.7824696Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7824842Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T11:06:37.7824966Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:06:37.7825078Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:06:37.7825198Z ·  ─────────────┬──────────── 2026-10-24T11:06:37.7825368Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7825425Z 163 │ }); 2026-10-24T11:06:37.7825477Z ╰──── 2026-10-24T11:06:37.7826018Z  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-24T11:06:37.7826350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7826353Z 2026-10-24T11:06:37.7826499Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7826644Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T11:06:37.7826766Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:06:37.7826877Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:06:37.7826997Z ·  ─────────────┬──────────── 2026-10-24T11:06:37.7827209Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7827265Z 163 │ }); 2026-10-24T11:06:37.7827320Z ╰──── 2026-10-24T11:06:37.7827790Z  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-24T11:06:37.7828083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7828085Z 2026-10-24T11:06:37.7828236Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7828407Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T11:06:37.7828464Z 163 │ }); 2026-10-24T11:06:37.7828554Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T11:06:37.7828680Z ·  ─────────┬────────────┬─── 2026-10-24T11:06:37.7828872Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7828994Z · ╰── This value is a ref 2026-10-24T11:06:37.7829068Z 165 │ return JSON.stringify( 2026-10-24T11:06:37.7829120Z ╰──── 2026-10-24T11:06:37.7829596Z  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-24T11:06:37.7829888Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7829891Z 2026-10-24T11:06:37.7830035Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7830179Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T11:06:37.7830251Z 205 │ mostRecentEventCount, 2026-10-24T11:06:37.7830337Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7830444Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7830635Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7830691Z 207 │ ); 2026-10-24T11:06:37.7830799Z ╰──── 2026-10-24T11:06:37.7831298Z  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-24T11:06:37.7831591Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7831594Z 2026-10-24T11:06:37.7831738Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7831880Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T11:06:37.7831950Z 211 │ mostRecentEventCount, 2026-10-24T11:06:37.7832037Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7832144Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7832335Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7832389Z 213 │ ); 2026-10-24T11:06:37.7832441Z ╰──── 2026-10-24T11:06:37.7832909Z  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-24T11:06:37.7833200Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7833203Z 2026-10-24T11:06:37.7833390Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:06:37.7833536Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T11:06:37.7833664Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:06:37.7833777Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:06:37.7833887Z ·  ─────────┬──────── 2026-10-24T11:06:37.7834355Z · ╰── 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-24T11:06:37.7834413Z 163 │ }); 2026-10-24T11:06:37.7834505Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T11:06:37.7834577Z 165 │ return JSON.stringify( 2026-10-24T11:06:37.7834747Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T11:06:37.7834818Z 167 │ const record = 2026-10-24T11:06:37.7834899Z 168 │ token.type === "context" 2026-10-24T11:06:37.7835064Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T11:06:37.7835129Z 170 │ : undefined; 2026-10-24T11:06:37.7835238Z 171 │ const presentation = contextChipPresentation( 2026-10-24T11:06:37.7835348Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T11:06:37.7835411Z 173 │ record, 2026-10-24T11:06:37.7835469Z 174 │ ); 2026-10-24T11:06:37.7835555Z 175 │ const icon = contextChipIcon( 2026-10-24T11:06:37.7835625Z 176 │ presentation, 2026-10-24T11:06:37.7835769Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T11:06:37.7835885Z 178 │ ); 2026-10-24T11:06:37.7835990Z 179 │ return { 2026-10-24T11:06:37.7836062Z 180 │ type: token.type, 2026-10-24T11:06:37.7836136Z 181 │ source: token.source, 2026-10-24T11:06:37.7836210Z 182 │ start: token.start, 2026-10-24T11:06:37.7836277Z 183 │ end: token.end, 2026-10-24T11:06:37.7836426Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T11:06:37.7836487Z 185 │ label: 2026-10-24T11:06:37.7836567Z 186 │ token.type === "skill" 2026-10-24T11:06:37.7836676Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T11:06:37.7836761Z 188 │ : token.type === "context" 2026-10-24T11:06:37.7836998Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T11:06:37.7837087Z 190 │ : basename(token.value), 2026-10-24T11:06:37.7837234Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T11:06:37.7837327Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T11:06:37.7837414Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T11:06:37.7837473Z 194 │ }; 2026-10-24T11:06:37.7837530Z 195 │ }), 2026-10-24T11:06:37.7837586Z 196 │ ); 2026-10-24T11:06:37.7837720Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T11:06:37.7837876Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T11:06:37.7838084Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7838230Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T11:06:37.7838321Z ╰──── 2026-10-24T11:06:37.7838528Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:06:37.7838844Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7838847Z 2026-10-24T11:06:37.7839035Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:06:37.7839178Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T11:06:37.7839308Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T11:06:37.7839411Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T11:06:37.7839509Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7839978Z · ╰── 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-24T11:06:37.7840069Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T11:06:37.7840131Z 254 │ value, 2026-10-24T11:06:37.7840210Z 255 │ selection: nextSelection, 2026-10-24T11:06:37.7840267Z 256 │ }); 2026-10-24T11:06:37.7840351Z 257 │ return acknowledgedEventCount; 2026-10-24T11:06:37.7840407Z 258 │ }, 2026-10-24T11:06:37.7840462Z 259 │ [], 2026-10-24T11:06:37.7840532Z ·  ─┬ 2026-10-24T11:06:37.7840713Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7840830Z 260 │ ); 2026-10-24T11:06:37.7840915Z ╰──── 2026-10-24T11:06:37.7841122Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:06:37.7841433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7841436Z 2026-10-24T11:06:37.7841697Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7841868Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T11:06:37.7841921Z 638 │ 2026-10-24T11:06:37.7841986Z 639 │ useEffect(() => { 2026-10-24T11:06:37.7842059Z ·  ────┬──── 2026-10-24T11:06:37.7842194Z · ╰── This is the containing effect 2026-10-24T11:06:37.7842307Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T11:06:37.7842368Z 641 │ return; 2026-10-24T11:06:37.7842424Z 642 │ } 2026-10-24T11:06:37.7842499Z 643 │ setPendingLaunchEntry({ 2026-10-24T11:06:37.7842588Z ·  ──────────┬────────── 2026-10-24T11:06:37.7842760Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7842831Z 644 │ key: launchTargetKey, 2026-10-24T11:06:37.7842882Z ╰──── 2026-10-24T11:06:37.7843498Z  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-24T11:06:37.7843826Z  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-24T11:06:37.7843829Z 2026-10-24T11:06:37.7844089Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7844261Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T11:06:37.7844315Z 648 │ 2026-10-24T11:06:37.7844381Z 649 │ useEffect(() => { 2026-10-24T11:06:37.7844452Z ·  ────┬──── 2026-10-24T11:06:37.7844582Z · ╰── This is the containing effect 2026-10-24T11:06:37.7844703Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T11:06:37.7844766Z 651 │ return; 2026-10-24T11:06:37.7844820Z 652 │ } 2026-10-24T11:06:37.7844903Z 653 │ setInitialAttachGridEntry({ 2026-10-24T11:06:37.7844998Z ·  ────────────┬──────────── 2026-10-24T11:06:37.7845174Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7845245Z 654 │ key: launchTargetKey, 2026-10-24T11:06:37.7845298Z ╰──── 2026-10-24T11:06:37.7845903Z  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-24T11:06:37.7846290Z  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-24T11:06:37.7846324Z 2026-10-24T11:06:37.7846582Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7846750Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T11:06:37.7846804Z 743 │ 2026-10-24T11:06:37.7846869Z 744 │ useEffect(() => { 2026-10-24T11:06:37.7846939Z ·  ────┬──── 2026-10-24T11:06:37.7847066Z · ╰── This is the containing effect 2026-10-24T11:06:37.7847169Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T11:06:37.7847238Z 746 │ setLastGridSize({ 2026-10-24T11:06:37.7847326Z ·  ───────┬─────── 2026-10-24T11:06:37.7847498Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7847579Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T11:06:37.7847631Z ╰──── 2026-10-24T11:06:37.7848238Z  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-24T11:06:37.7848591Z  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-24T11:06:37.7848594Z 2026-10-24T11:06:37.7848801Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7848976Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T11:06:37.7849033Z 537 │ }); 2026-10-24T11:06:37.7849156Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T11:06:37.7849268Z ·  ───────────┬────────── 2026-10-24T11:06:37.7849517Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T11:06:37.7849681Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T11:06:37.7849734Z ╰──── 2026-10-24T11:06:37.7850030Z  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-24T11:06:37.7850400Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7850442Z 2026-10-24T11:06:37.7850644Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7850814Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T11:06:37.7850910Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T11:06:37.7850976Z 709 │ }, [terminalKey]); 2026-10-24T11:06:37.7851053Z ·  ─────┬───── 2026-10-24T11:06:37.7851197Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T11:06:37.7851251Z 710 │ 2026-10-24T11:06:37.7851302Z ╰──── 2026-10-24T11:06:37.7851600Z  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-24T11:06:37.7851915Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7851918Z 2026-10-24T11:06:37.7852119Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7852289Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T11:06:37.7852345Z 799 │ }; 2026-10-24T11:06:37.7852527Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T11:06:37.7852712Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T11:06:37.7852948Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T11:06:37.7853159Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T11:06:37.7853213Z 801 │ 2026-10-24T11:06:37.7853264Z ╰──── 2026-10-24T11:06:37.7853559Z  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-24T11:06:37.7853870Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7853872Z 2026-10-24T11:06:37.7854023Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7854196Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T11:06:37.7854253Z 792 │ } 2026-10-24T11:06:37.7854360Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T11:06:37.7854473Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7854635Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7854689Z 794 │ 2026-10-24T11:06:37.7854739Z ╰──── 2026-10-24T11:06:37.7855271Z  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-24T11:06:37.7855591Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7855593Z 2026-10-24T11:06:37.7855854Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7856020Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-24T11:06:37.7856072Z 412 │ 2026-10-24T11:06:37.7856198Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T11:06:37.7856269Z ·  ──┬── 2026-10-24T11:06:37.7856395Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7856446Z ╰──── 2026-10-24T11:06:37.7856557Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7856564Z 2026-10-24T11:06:37.7856832Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7856966Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T11:06:37.7857019Z 339 │ 2026-10-24T11:06:37.7857121Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T11:06:37.7857198Z ·  ────┬──── 2026-10-24T11:06:37.7857330Z · ╰── 'layerTest' is declared here 2026-10-24T11:06:37.7857381Z ╰──── 2026-10-24T11:06:37.7857485Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7857487Z 2026-10-24T11:06:37.7857632Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7857756Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T11:06:37.7857825Z 184 │ "options", 2026-10-24T11:06:37.7857920Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T11:06:37.7858031Z ·  ────────────────┬─────────────── 2026-10-24T11:06:37.7858226Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7858346Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T11:06:37.7858398Z ╰──── 2026-10-24T11:06:37.7858872Z  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-24T11:06:37.7859170Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7859175Z 2026-10-24T11:06:37.7859319Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7859437Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T11:06:37.7859531Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T11:06:37.7859626Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T11:06:37.7859737Z ·  ────────────────┬──────────────── 2026-10-24T11:06:37.7859929Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7860023Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T11:06:37.7860076Z ╰──── 2026-10-24T11:06:37.7860604Z  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-24T11:06:37.7860928Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7860931Z 2026-10-24T11:06:37.7861132Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T11:06:37.7861302Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T11:06:37.7861368Z 1782 │ assert.equal( 2026-10-24T11:06:37.7861516Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T11:06:37.7861618Z ·  ────────────────────────── 2026-10-24T11:06:37.7861704Z 1784 │ stored.attachments[0]?.id, 2026-10-24T11:06:37.7861761Z ╰──── 2026-10-24T11:06:37.7861934Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T11:06:37.7861937Z 2026-10-24T11:06:37.7862196Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7862359Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T11:06:37.7862423Z 259 │ .join("|"); 2026-10-24T11:06:37.7862489Z 260 │ useEffect(() => { 2026-10-24T11:06:37.7862560Z ·  ────┬──── 2026-10-24T11:06:37.7862690Z · ╰── This is the containing effect 2026-10-24T11:06:37.7862751Z 261 │ stop(); 2026-10-24T11:06:37.7862826Z ·  ──┬─ 2026-10-24T11:06:37.7862995Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7863062Z 262 │ }, [orderVersion]); 2026-10-24T11:06:37.7863114Z ╰──── 2026-10-24T11:06:37.7863810Z  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-24T11:06:37.7864134Z  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-24T11:06:37.7864136Z 2026-10-24T11:06:37.7864357Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:06:37.7864522Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T11:06:37.7864586Z 260 │ useEffect(() => { 2026-10-24T11:06:37.7864648Z 261 │ stop(); 2026-10-24T11:06:37.7864715Z ·  ──┬─ 2026-10-24T11:06:37.7864842Z · ╰── Missing dependency `stop` 2026-10-24T11:06:37.7864909Z 262 │ }, [orderVersion]); 2026-10-24T11:06:37.7864990Z ·  ──────┬───── 2026-10-24T11:06:37.7865138Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T11:06:37.7865200Z 263 │ useEffect( 2026-10-24T11:06:37.7865254Z ╰──── 2026-10-24T11:06:37.7865758Z  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-24T11:06:37.7866113Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7866117Z 2026-10-24T11:06:37.7866261Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7866422Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T11:06:37.7866499Z 95 │ const latest = useRef(props); 2026-10-24T11:06:37.7866569Z 96 │ latest.current = props; 2026-10-24T11:06:37.7866674Z ·  ───┬──────┬─── 2026-10-24T11:06:37.7866853Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7866973Z · ╰── This value is a ref 2026-10-24T11:06:37.7867047Z 97 │ const gesture = useMemo( 2026-10-24T11:06:37.7867097Z ╰──── 2026-10-24T11:06:37.7867568Z  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-24T11:06:37.7867861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7867863Z 2026-10-24T11:06:37.7868008Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7868168Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T11:06:37.7868239Z 103 │ .runOnJS(true) 2026-10-24T11:06:37.7868370Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T11:06:37.7868489Z ·  ───────────────┬────────────── 2026-10-24T11:06:37.7868688Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7868824Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7868875Z ╰──── 2026-10-24T11:06:37.7869346Z  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-24T11:06:37.7869690Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7869724Z 2026-10-24T11:06:37.7869867Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7870029Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T11:06:37.7870127Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T11:06:37.7870258Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7870402Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T11:06:37.7870614Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7870741Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7870800Z ╰──── 2026-10-24T11:06:37.7871272Z  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-24T11:06:37.7871561Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7871564Z 2026-10-24T11:06:37.7871707Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7871866Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T11:06:37.7871996Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7872122Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7872267Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T11:06:37.7872474Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7872600Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T11:06:37.7872653Z ╰──── 2026-10-24T11:06:37.7873121Z  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-24T11:06:37.7873413Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7873421Z 2026-10-24T11:06:37.7873567Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7873729Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T11:06:37.7873850Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7873972Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T11:06:37.7874111Z ·  ───────────────────────┬────────────────────── 2026-10-24T11:06:37.7874318Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7874387Z 108 │ [props.disabled], 2026-10-24T11:06:37.7874438Z ╰──── 2026-10-24T11:06:37.7874971Z  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-24T11:06:37.7875292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7875295Z 2026-10-24T11:06:37.7875438Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7875598Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T11:06:37.7875711Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T11:06:37.7875817Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T11:06:37.7875923Z ·  ───┬──────┬─── 2026-10-24T11:06:37.7876108Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7876226Z · ╰── This value is a ref 2026-10-24T11:06:37.7876280Z 250 │ 2026-10-24T11:06:37.7876332Z ╰──── 2026-10-24T11:06:37.7876803Z  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-24T11:06:37.7877094Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7877096Z 2026-10-24T11:06:37.7877239Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7877404Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T11:06:37.7877525Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T11:06:37.7877639Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T11:06:37.7877766Z ·  ──────────────────┬────────────────── 2026-10-24T11:06:37.7877936Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7878048Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T11:06:37.7878100Z ╰──── 2026-10-24T11:06:37.7878597Z  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-24T11:06:37.7878892Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7878894Z 2026-10-24T11:06:37.7879064Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T11:06:37.7879223Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T11:06:37.7879288Z 323 │ update(0); 2026-10-24T11:06:37.7879370Z 324 │ let last = performance.now(); 2026-10-24T11:06:37.7879468Z ·  ────────┬──────── 2026-10-24T11:06:37.7879608Z · ╰── Cannot call impure function 2026-10-24T11:06:37.7879676Z 325 │ const tick = () => { 2026-10-24T11:06:37.7879728Z ╰──── 2026-10-24T11:06:37.7880087Z  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-24T11:06:37.7880420Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T11:06:37.7880423Z 2026-10-24T11:06:37.7880612Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T11:06:37.7880772Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T11:06:37.7880832Z  98 │ () => 2026-10-24T11:06:37.7880898Z  99 │ Gesture.Pan() 2026-10-24T11:06:37.7880975Z ·  ─┬─ 2026-10-24T11:06:37.7881107Z · ╰── `Pan` may be a component 2026-10-24T11:06:37.7881193Z 100 │ .enabled(!props.disabled) 2026-10-24T11:06:37.7881248Z ╰──── 2026-10-24T11:06:37.7881524Z  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-24T11:06:37.7881975Z  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-24T11:06:37.7881978Z 2026-10-24T11:06:37.7882165Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:06:37.7882326Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T11:06:37.7882393Z 103 │ .runOnJS(true) 2026-10-24T11:06:37.7882497Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T11:06:37.7882587Z ·  ───┬── 2026-10-24T11:06:37.7883026Z · ╰── 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-24T11:06:37.7883159Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7883282Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T11:06:37.7883404Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T11:06:37.7883472Z 108 │ [props.disabled], 2026-10-24T11:06:37.7883555Z ·  ────────┬─────── 2026-10-24T11:06:37.7883748Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7883807Z 109 │ ); 2026-10-24T11:06:37.7883860Z ╰──── 2026-10-24T11:06:37.7884067Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:06:37.7884379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7884382Z 2026-10-24T11:06:37.7884538Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7884695Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T11:06:37.7884748Z  86 │ 2026-10-24T11:06:37.7884842Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-24T11:06:37.7884979Z ·  ──────┬───── 2026-10-24T11:06:37.7885248Z · ╰── `cardCoverage` originates here 2026-10-24T11:06:37.7885329Z  88 │ const barHeightRef = useRef(0); 2026-10-24T11:06:37.7885409Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T11:06:37.7885493Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T11:06:37.7885586Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T11:06:37.7885654Z  92 │ if (!cardCoverage) { 2026-10-24T11:06:37.7885716Z  93 │ return; 2026-10-24T11:06:37.7885770Z  94 │ } 2026-10-24T11:06:37.7885924Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T11:06:37.7886012Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T11:06:37.7886071Z  97 │ return; 2026-10-24T11:06:37.7886126Z  98 │ } 2026-10-24T11:06:37.7886214Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:06:37.7886300Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:06:37.7886379Z ·  ──────┬───── 2026-10-24T11:06:37.7886522Z · ╰── `cardCoverage` cannot be modified 2026-10-24T11:06:37.7886583Z 101 │ return; 2026-10-24T11:06:37.7886635Z ╰──── 2026-10-24T11:06:37.7886934Z  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-24T11:06:37.7887239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7887241Z 2026-10-24T11:06:37.7887398Z ⚠ react(immutability): This value cannot be modified 2026-10-24T11:06:37.7887558Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T11:06:37.7887643Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T11:06:37.7887727Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T11:06:37.7887806Z ·  ─────┬──── 2026-10-24T11:06:37.7887940Z · ╰── `cardHeight` originates here 2026-10-24T11:06:37.7888037Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T11:06:37.7888105Z  92 │ if (!cardCoverage) { 2026-10-24T11:06:37.7888167Z  93 │ return; 2026-10-24T11:06:37.7888222Z  94 │ } 2026-10-24T11:06:37.7888396Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T11:06:37.7888484Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T11:06:37.7888543Z  97 │ return; 2026-10-24T11:06:37.7888602Z  98 │ } 2026-10-24T11:06:37.7888686Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:06:37.7888767Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:06:37.7888830Z 101 │ return; 2026-10-24T11:06:37.7888885Z 102 │ } 2026-10-24T11:06:37.7888987Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T11:06:37.7889083Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T11:06:37.7889169Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T11:06:37.7889227Z 106 │ }); 2026-10-24T11:06:37.7889294Z 107 │ }, [cardCoverage]); 2026-10-24T11:06:37.7889380Z 108 │ const handleBarLayout = useCallback( 2026-10-24T11:06:37.7889462Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7889590Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:06:37.7889658Z 111 │ notifyCoverage(); 2026-10-24T11:06:37.7889772Z 112 │ }, 2026-10-24T11:06:37.7889880Z 113 │ [notifyCoverage], 2026-10-24T11:06:37.7889934Z 114 │ ); 2026-10-24T11:06:37.7890020Z 115 │ const handleCardLayout = useCallback( 2026-10-24T11:06:37.7890101Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7890229Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:06:37.7890343Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T11:06:37.7890420Z ·  ─────┬──── 2026-10-24T11:06:37.7890560Z · ╰── `cardHeight` cannot be modified 2026-10-24T11:06:37.7890628Z 119 │ notifyCoverage(); 2026-10-24T11:06:37.7890680Z ╰──── 2026-10-24T11:06:37.7890955Z  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-24T11:06:37.7891268Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7891271Z 2026-10-24T11:06:37.7891474Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:06:37.7891631Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T11:06:37.7891718Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T11:06:37.7891811Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T11:06:37.7891918Z ·  ───┬─── 2026-10-24T11:06:37.7892157Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T11:06:37.7892231Z  92 │ if (!cardCoverage) { 2026-10-24T11:06:37.7892294Z  93 │ return; 2026-10-24T11:06:37.7892349Z  94 │ } 2026-10-24T11:06:37.7892499Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T11:06:37.7892587Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T11:06:37.7892645Z  97 │ return; 2026-10-24T11:06:37.7892700Z  98 │ } 2026-10-24T11:06:37.7892780Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:06:37.7892862Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:06:37.7892943Z ·  ──────┬───── 2026-10-24T11:06:37.7893080Z · ╰── This modifies `cardCoverage` 2026-10-24T11:06:37.7893140Z 101 │ return; 2026-10-24T11:06:37.7893193Z ╰──── 2026-10-24T11:06:37.7893604Z  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-24T11:06:37.7893945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7893948Z 2026-10-24T11:06:37.7894149Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:06:37.7894306Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T11:06:37.7894388Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T11:06:37.7894471Z 100 │ cardCoverage.value = coverage; 2026-10-24T11:06:37.7894549Z ·  ──────┬───── 2026-10-24T11:06:37.7894686Z · ╰── This modifies `cardCoverage` 2026-10-24T11:06:37.7894749Z 101 │ return; 2026-10-24T11:06:37.7894805Z 102 │ } 2026-10-24T11:06:37.7894907Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T11:06:37.7895003Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T11:06:37.7895087Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T11:06:37.7895144Z 106 │ }); 2026-10-24T11:06:37.7895210Z 107 │ }, [cardCoverage]); 2026-10-24T11:06:37.7895296Z 108 │ const handleBarLayout = useCallback( 2026-10-24T11:06:37.7895375Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7895482Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7895707Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T11:06:37.7895839Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:06:37.7895895Z ╰──── 2026-10-24T11:06:37.7896235Z  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-24T11:06:37.7896542Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7896544Z 2026-10-24T11:06:37.7896744Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T11:06:37.7896901Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T11:06:37.7896987Z 115 │ const handleCardLayout = useCallback( 2026-10-24T11:06:37.7897069Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T11:06:37.7897178Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7897398Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T11:06:37.7897524Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T11:06:37.7897639Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T11:06:37.7897715Z ·  ─────┬──── 2026-10-24T11:06:37.7897845Z · ╰── This modifies `cardHeight` 2026-10-24T11:06:37.7897913Z 119 │ notifyCoverage(); 2026-10-24T11:06:37.7897967Z ╰──── 2026-10-24T11:06:37.7898327Z  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-24T11:06:37.7898686Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T11:06:37.7898723Z 2026-10-24T11:06:37.7899189Z ⚠ 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-24T11:06:37.7899317Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T11:06:37.7899371Z 499 │ 2026-10-24T11:06:37.7899487Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T11:06:37.7899607Z ·  ────────────────────────── 2026-10-24T11:06:37.7899716Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T11:06:37.7899769Z ╰──── 2026-10-24T11:06:37.7899778Z 2026-10-24T11:06:37.7900043Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7900167Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T11:06:37.7900220Z 727 │ 2026-10-24T11:06:37.7900302Z 728 │ const layer = layerWithOptions(); 2026-10-24T11:06:37.7900374Z ·  ──┬── 2026-10-24T11:06:37.7900497Z · ╰── 'layer' is declared here 2026-10-24T11:06:37.7900549Z ╰──── 2026-10-24T11:06:37.7900654Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7900656Z 2026-10-24T11:06:37.7900948Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7901079Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T11:06:37.7901136Z 217 │ 2026-10-24T11:06:37.7901288Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T11:06:37.7901379Z ·  ──────────┬────────── 2026-10-24T11:06:37.7901537Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T11:06:37.7901726Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T11:06:37.7901779Z ╰──── 2026-10-24T11:06:37.7901883Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7901886Z 2026-10-24T11:06:37.7902197Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7902326Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T11:06:37.7902382Z 220 │ 2026-10-24T11:06:37.7902516Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T11:06:37.7902619Z ·  ──────────────┬────────────── 2026-10-24T11:06:37.7902795Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T11:06:37.7902957Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T11:06:37.7903009Z ╰──── 2026-10-24T11:06:37.7903113Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7903115Z 2026-10-24T11:06:37.7903431Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7903665Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-24T11:06:37.7903779Z 213 │ }; 2026-10-24T11:06:37.7903847Z 214 │ useEffect(() => { 2026-10-24T11:06:37.7903918Z ·  ────┬──── 2026-10-24T11:06:37.7904049Z · ╰── This is the containing effect 2026-10-24T11:06:37.7904222Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T11:06:37.7904289Z 216 │ if (inserted) { 2026-10-24T11:06:37.7904366Z 217 │ setSelection((current) => 2026-10-24T11:06:37.7904444Z ·  ──────┬───── 2026-10-24T11:06:37.7904616Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7904794Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T11:06:37.7904849Z ╰──── 2026-10-24T11:06:37.7905464Z  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-24T11:06:37.7905790Z  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-24T11:06:37.7905792Z 2026-10-24T11:06:37.7906052Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7906218Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T11:06:37.7906299Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T11:06:37.7906366Z 287 │ useEffect(() => { 2026-10-24T11:06:37.7906439Z ·  ────┬──── 2026-10-24T11:06:37.7906568Z · ╰── This is the containing effect 2026-10-24T11:06:37.7906716Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T11:06:37.7906866Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T11:06:37.7906938Z 290 │ const now = Date.now(); 2026-10-24T11:06:37.7907053Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T11:06:37.7907110Z 292 │ if ( 2026-10-24T11:06:37.7907191Z 293 │ lastRequest?.key === key && 2026-10-24T11:06:37.7907331Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T11:06:37.7907387Z 295 │ ) 2026-10-24T11:06:37.7907454Z 296 │ return; 2026-10-24T11:06:37.7907633Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T11:06:37.7907720Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T11:06:37.7907817Z ·  ────────────┬─────────── 2026-10-24T11:06:37.7907994Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7908056Z 299 │ return; 2026-10-24T11:06:37.7908109Z ╰──── 2026-10-24T11:06:37.7908746Z  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-24T11:06:37.7909128Z  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-24T11:06:37.7909172Z 2026-10-24T11:06:37.7909374Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7909540Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T11:06:37.7909597Z 327 │ }, [ 2026-10-24T11:06:37.7909663Z 328 │ draftMessage, 2026-10-24T11:06:37.7909740Z ·  ──────┬───── 2026-10-24T11:06:37.7909887Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T11:06:37.7909953Z 329 │ environmentId, 2026-10-24T11:06:37.7910007Z ╰──── 2026-10-24T11:06:37.7910310Z  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-24T11:06:37.7910626Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7910629Z 2026-10-24T11:06:37.7910834Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T11:06:37.7911003Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T11:06:37.7911077Z 14 │ } from "@t3tools/contracts"; 2026-10-24T11:06:37.7911167Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T11:06:37.7911239Z ·  ── 2026-10-24T11:06:37.7911422Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-24T11:06:37.7911480Z ╰──── 2026-10-24T11:06:37.7911566Z  help: Remove empty braces 2026-10-24T11:06:37.7911569Z 2026-10-24T11:06:37.7911943Z ⚠ 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-24T11:06:37.7912070Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T11:06:37.7912207Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T11:06:37.7912340Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T11:06:37.7912448Z ·  ──────────────────────── 2026-10-24T11:06:37.7912588Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T11:06:37.7912641Z ╰──── 2026-10-24T11:06:37.7912644Z 2026-10-24T11:06:37.7913067Z ⚠ 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-24T11:06:37.7913227Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T11:06:37.7913328Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T11:06:37.7913482Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T11:06:37.7913596Z ·  ──────────────────────── 2026-10-24T11:06:37.7913656Z 257 │ return [ 2026-10-24T11:06:37.7913708Z ╰──── 2026-10-24T11:06:37.7913711Z 2026-10-24T11:06:37.7913911Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T11:06:37.7914023Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T11:06:37.7914113Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T11:06:37.7914206Z 28 │ import { identity } from "effect/Function"; 2026-10-24T11:06:37.7914282Z ·  ────┬─── 2026-10-24T11:06:37.7914418Z · ╰── 'identity' is imported here 2026-10-24T11:06:37.7914503Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T11:06:37.7914558Z ╰──── 2026-10-24T11:06:37.7914655Z  help: Consider removing this import. 2026-10-24T11:06:37.7914658Z 2026-10-24T11:06:37.7914863Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T11:06:37.7914999Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T11:06:37.7915163Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T11:06:37.7915259Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7915357Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7915827Z · ╰── 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-24T11:06:37.7915901Z 229 │ mostRecentEventCount, 2026-10-24T11:06:37.7915958Z 230 │ ); 2026-10-24T11:06:37.7916081Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T11:06:37.7916217Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T11:06:37.7916421Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7916512Z 232 │ const assumedValue = props.value; 2026-10-24T11:06:37.7916567Z ╰──── 2026-10-24T11:06:37.7916735Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T11:06:37.7917050Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7917053Z 2026-10-24T11:06:37.7917272Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T11:06:37.7917409Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T11:06:37.7917556Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T11:06:37.7917644Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7917790Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7918322Z · ╰── 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-24T11:06:37.7918398Z 240 │ controlledEventCount, 2026-10-24T11:06:37.7918462Z 241 │ assumedValue, 2026-10-24T11:06:37.7918518Z 242 │ ); 2026-10-24T11:06:37.7918675Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T11:06:37.7918815Z ·  ───────────┬────────── 2026-10-24T11:06:37.7919024Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T11:06:37.7919119Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T11:06:37.7919175Z ╰──── 2026-10-24T11:06:37.7919599Z  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-24T11:06:37.7919915Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7919918Z 2026-10-24T11:06:37.7920064Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7920201Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T11:06:37.7920327Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:06:37.7920444Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:06:37.7920564Z ·  ─────────────┬──────────── 2026-10-24T11:06:37.7920733Z · ╰── Cannot access ref value during render 2026-10-24T11:06:37.7920792Z 165 │ }); 2026-10-24T11:06:37.7920845Z ╰──── 2026-10-24T11:06:37.7921319Z  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-24T11:06:37.7921612Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7921615Z 2026-10-24T11:06:37.7921765Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7921908Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T11:06:37.7922031Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:06:37.7922142Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:06:37.7922263Z ·  ─────────────┬──────────── 2026-10-24T11:06:37.7922470Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7922529Z 165 │ }); 2026-10-24T11:06:37.7922580Z ╰──── 2026-10-24T11:06:37.7923104Z  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-24T11:06:37.7923429Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7923431Z 2026-10-24T11:06:37.7923578Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7923715Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T11:06:37.7923771Z 165 │ }); 2026-10-24T11:06:37.7923861Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T11:06:37.7923986Z ·  ─────────┬────────────┬─── 2026-10-24T11:06:37.7924177Z · │ ╰── Cannot update ref value during render 2026-10-24T11:06:37.7924298Z · ╰── This value is a ref 2026-10-24T11:06:37.7924375Z 167 │ return JSON.stringify( 2026-10-24T11:06:37.7924428Z ╰──── 2026-10-24T11:06:37.7924898Z  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-24T11:06:37.7925188Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7925193Z 2026-10-24T11:06:37.7925336Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7925471Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T11:06:37.7925547Z 207 │ mostRecentEventCount, 2026-10-24T11:06:37.7925637Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7925741Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7925930Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7925986Z 209 │ ); 2026-10-24T11:06:37.7926038Z ╰──── 2026-10-24T11:06:37.7926512Z  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-24T11:06:37.7926807Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7926809Z 2026-10-24T11:06:37.7926957Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7927095Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T11:06:37.7927165Z 213 │ mostRecentEventCount, 2026-10-24T11:06:37.7927252Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T11:06:37.7927356Z ·  ───────────────┬─────────────── 2026-10-24T11:06:37.7927544Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7927598Z 215 │ ); 2026-10-24T11:06:37.7927651Z ╰──── 2026-10-24T11:06:37.7928120Z  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-24T11:06:37.7928495Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7928529Z 2026-10-24T11:06:37.7928717Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:06:37.7928852Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T11:06:37.7928976Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T11:06:37.7929086Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T11:06:37.7929196Z ·  ─────────┬──────── 2026-10-24T11:06:37.7929671Z · ╰── 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-24T11:06:37.7929732Z 165 │ }); 2026-10-24T11:06:37.7929823Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T11:06:37.7929895Z 167 │ return JSON.stringify( 2026-10-24T11:06:37.7930061Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T11:06:37.7930128Z 169 │ const record = 2026-10-24T11:06:37.7930209Z 170 │ token.type === "context" 2026-10-24T11:06:37.7930375Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T11:06:37.7930441Z 172 │ : undefined; 2026-10-24T11:06:37.7930552Z 173 │ const presentation = contextChipPresentation( 2026-10-24T11:06:37.7930663Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T11:06:37.7930732Z 175 │ record, 2026-10-24T11:06:37.7930792Z 176 │ ); 2026-10-24T11:06:37.7930880Z 177 │ const icon = contextChipIcon( 2026-10-24T11:06:37.7930948Z 178 │ presentation, 2026-10-24T11:06:37.7931094Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T11:06:37.7931151Z 180 │ ); 2026-10-24T11:06:37.7931214Z 181 │ return { 2026-10-24T11:06:37.7931286Z 182 │ type: token.type, 2026-10-24T11:06:37.7931363Z 183 │ source: token.source, 2026-10-24T11:06:37.7931436Z 184 │ start: token.start, 2026-10-24T11:06:37.7931504Z 185 │ end: token.end, 2026-10-24T11:06:37.7931653Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T11:06:37.7931715Z 187 │ label: 2026-10-24T11:06:37.7931799Z 188 │ token.type === "skill" 2026-10-24T11:06:37.7931910Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T11:06:37.7931994Z 190 │ : token.type === "context" 2026-10-24T11:06:37.7932230Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T11:06:37.7932313Z 192 │ : basename(token.value), 2026-10-24T11:06:37.7932460Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T11:06:37.7932555Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T11:06:37.7932643Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T11:06:37.7932701Z 196 │ }; 2026-10-24T11:06:37.7932760Z 197 │ }), 2026-10-24T11:06:37.7932816Z 198 │ ); 2026-10-24T11:06:37.7933007Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T11:06:37.7933196Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T11:06:37.7933403Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7933544Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T11:06:37.7933597Z ╰──── 2026-10-24T11:06:37.7933803Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:06:37.7934119Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7934122Z 2026-10-24T11:06:37.7934317Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T11:06:37.7934461Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T11:06:37.7934593Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T11:06:37.7934694Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T11:06:37.7934787Z ·  ───────────┬─────────── 2026-10-24T11:06:37.7935251Z · ╰── 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-24T11:06:37.7935344Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T11:06:37.7935406Z 256 │ value, 2026-10-24T11:06:37.7935485Z 257 │ selection: nextSelection, 2026-10-24T11:06:37.7935549Z 258 │ }); 2026-10-24T11:06:37.7935638Z 259 │ return acknowledgedEventCount; 2026-10-24T11:06:37.7935692Z 260 │ }, 2026-10-24T11:06:37.7935748Z 261 │ [], 2026-10-24T11:06:37.7935818Z ·  ─┬ 2026-10-24T11:06:37.7935999Z · ╰── This dependency list is missing values used by the callback 2026-10-24T11:06:37.7936055Z 262 │ ); 2026-10-24T11:06:37.7936107Z ╰──── 2026-10-24T11:06:37.7936314Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T11:06:37.7936627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7936630Z 2026-10-24T11:06:37.7936940Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7937151Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T11:06:37.7937205Z 118 │ 2026-10-24T11:06:37.7937270Z 119 │ useEffect(() => { 2026-10-24T11:06:37.7937342Z ·  ────┬──── 2026-10-24T11:06:37.7937474Z · ╰── This is the containing effect 2026-10-24T11:06:37.7937559Z 120 │ if (orientationSettled) return; 2026-10-24T11:06:37.7937672Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T11:06:37.7937747Z 122 │ if (orientation === null) { 2026-10-24T11:06:37.7937829Z 123 │ setOrientationSettled(true); 2026-10-24T11:06:37.7937919Z ·  ──────────┬────────── 2026-10-24T11:06:37.7938101Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7938167Z 124 │ return; 2026-10-24T11:06:37.7938220Z ╰──── 2026-10-24T11:06:37.7938851Z  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-24T11:06:37.7939176Z  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-24T11:06:37.7939179Z 2026-10-24T11:06:37.7939437Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7939613Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T11:06:37.7939671Z 292 │ 2026-10-24T11:06:37.7939737Z 293 │ useEffect(() => { 2026-10-24T11:06:37.7939810Z ·  ────┬──── 2026-10-24T11:06:37.7939938Z · ╰── This is the containing effect 2026-10-24T11:06:37.7939999Z 294 │ if ( 2026-10-24T11:06:37.7940066Z 295 │ scene === null || 2026-10-24T11:06:37.7940145Z 296 │ requestedScene === null || 2026-10-24T11:06:37.7940222Z 297 │ scene !== requestedScene || 2026-10-24T11:06:37.7940287Z 298 │ !hasFixture || 2026-10-24T11:06:37.7940362Z 299 │ !orientationSettled || 2026-10-24T11:06:37.7940429Z 300 │ !themeApplied || 2026-10-24T11:06:37.7940545Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T11:06:37.7940686Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T11:06:37.7940745Z 303 │ ) { 2026-10-24T11:06:37.7940814Z 304 │ setReadyScene(null); 2026-10-24T11:06:37.7940895Z ·  ──────┬────── 2026-10-24T11:06:37.7941067Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7941130Z 305 │ return; 2026-10-24T11:06:37.7941181Z ╰──── 2026-10-24T11:06:37.7941786Z  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-24T11:06:37.7942168Z  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-24T11:06:37.7942204Z 2026-10-24T11:06:37.7942479Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T11:06:37.7942652Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T11:06:37.7942721Z 127 │ let cancelled = false; 2026-10-24T11:06:37.7942812Z 128 │ let lastOutcome: string | null = null; 2026-10-24T11:06:37.7942893Z ·  ─────┬───── 2026-10-24T11:06:37.7943031Z · ╰── 'lastOutcome' is declared here 2026-10-24T11:06:37.7943398Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T11:06:37.7943451Z ╰──── 2026-10-24T11:06:37.7943563Z  help: Consider removing this declaration. 2026-10-24T11:06:37.7943571Z 2026-10-24T11:06:37.7943757Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7943895Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T11:06:37.7944057Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T11:06:37.7944145Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T11:06:37.7944231Z ·  ┬ 2026-10-24T11:06:37.7944362Z · ╰── '_' is declared here 2026-10-24T11:06:37.7944463Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T11:06:37.7944517Z ╰──── 2026-10-24T11:06:37.7944620Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7944629Z 2026-10-24T11:06:37.7944818Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7944954Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T11:06:37.7945010Z 133 │ ); 2026-10-24T11:06:37.7945117Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T11:06:37.7945215Z ·  ┬ 2026-10-24T11:06:37.7945355Z · ╰── '_' is declared here 2026-10-24T11:06:37.7945423Z 135 │ Effect.succeed( 2026-10-24T11:06:37.7945476Z ╰──── 2026-10-24T11:06:37.7945577Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7945580Z 2026-10-24T11:06:37.7945766Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7945904Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T11:06:37.7945961Z 177 │ }); 2026-10-24T11:06:37.7946060Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T11:06:37.7946147Z ·  ┬ 2026-10-24T11:06:37.7946281Z · ╰── '_' is declared here 2026-10-24T11:06:37.7946381Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T11:06:37.7946433Z ╰──── 2026-10-24T11:06:37.7946531Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7946534Z 2026-10-24T11:06:37.7946718Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7946852Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T11:06:37.7946983Z 202 │ ); 2026-10-24T11:06:37.7947123Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T11:06:37.7947214Z ·  ┬ 2026-10-24T11:06:37.7947351Z · ╰── '_' is declared here 2026-10-24T11:06:37.7947433Z 204 │ options.removeWorktreeFails 2026-10-24T11:06:37.7947484Z ╰──── 2026-10-24T11:06:37.7947584Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7947587Z 2026-10-24T11:06:37.7948949Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7949098Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T11:06:37.7949155Z 207 │ ); 2026-10-24T11:06:37.7949259Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T11:06:37.7949363Z ·  ┬ 2026-10-24T11:06:37.7949512Z · ╰── '_' is declared here 2026-10-24T11:06:37.7949597Z 209 │ options.deleteLocalBranchFails 2026-10-24T11:06:37.7949650Z ╰──── 2026-10-24T11:06:37.7949749Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7949752Z 2026-10-24T11:06:37.7949935Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7950069Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T11:06:37.7950126Z 212 │ ); 2026-10-24T11:06:37.7950239Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T11:06:37.7950340Z ·  ┬ 2026-10-24T11:06:37.7950488Z · ╰── '_' is declared here 2026-10-24T11:06:37.7950576Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T11:06:37.7950629Z ╰──── 2026-10-24T11:06:37.7950728Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7950730Z 2026-10-24T11:06:37.7950910Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7951046Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T11:06:37.7951102Z 253 │ ); 2026-10-24T11:06:37.7951193Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T11:06:37.7951280Z ·  ┬ 2026-10-24T11:06:37.7951414Z · ╰── '_' is declared here 2026-10-24T11:06:37.7951488Z 255 │ Effect.succeed({ 2026-10-24T11:06:37.7951543Z ╰──── 2026-10-24T11:06:37.7951642Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7951644Z 2026-10-24T11:06:37.7951824Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T11:06:37.7951959Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T11:06:37.7952014Z 263 │ ); 2026-10-24T11:06:37.7952163Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T11:06:37.7952253Z ·  ┬ 2026-10-24T11:06:37.7952388Z · ╰── '_' is declared here 2026-10-24T11:06:37.7952536Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T11:06:37.7952588Z ╰──── 2026-10-24T11:06:37.7952756Z  help: Consider removing this parameter. 2026-10-24T11:06:37.7952795Z 2026-10-24T11:06:37.7952962Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T11:06:37.7953159Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T11:06:37.7953299Z 219 │ 2026-10-24T11:06:37.7953441Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T11:06:37.7953550Z ·  ──┬─ 2026-10-24T11:06:37.7953717Z · ╰── 'U+001B' is a control character. 2026-10-24T11:06:37.7953783Z 221 │ 2026-10-24T11:06:37.7953834Z ╰──── 2026-10-24T11:06:37.7954073Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T11:06:37.7954081Z 2026-10-24T11:06:37.7954237Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T11:06:37.7954363Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T11:06:37.7954475Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T11:06:37.7954571Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T11:06:37.7954668Z ·  ───────────────────────────── 2026-10-24T11:06:37.7954796Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T11:06:37.7954847Z ╰──── 2026-10-24T11:06:37.7955006Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T11:06:37.7955009Z 2026-10-24T11:06:37.7955162Z ⚠ react(refs): Cannot access refs during render 2026-10-24T11:06:37.7955326Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T11:06:37.7955380Z 276 │ 2026-10-24T11:06:37.7955562Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T11:06:37.7955655Z 278 │ │ ...nativeProps, 2026-10-24T11:06:37.7955802Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T11:06:37.7955892Z 280 │ │ ref: nativeRef, 2026-10-24T11:06:37.7956023Z 281 │ ├─▶ }); 2026-10-24T11:06:37.7956270Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T11:06:37.7956330Z 282 │ } 2026-10-24T11:06:37.7956381Z ╰──── 2026-10-24T11:06:37.7956853Z  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-24T11:06:37.7957149Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T11:06:37.7957152Z 2026-10-24T11:06:37.7957353Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7957488Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T11:06:37.7957626Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T11:06:37.7957769Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T11:06:37.7957914Z ·  ──────┬────── ────┬─── 2026-10-24T11:06:37.7958114Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T11:06:37.7958264Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T11:06:37.7958359Z 455 │ const { 2026-10-24T11:06:37.7958411Z ╰──── 2026-10-24T11:06:37.7958706Z  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-24T11:06:37.7959025Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7959031Z 2026-10-24T11:06:37.7959217Z ⚠ react(static-components): Cannot create components during render 2026-10-24T11:06:37.7959353Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T11:06:37.7959417Z 492 │ // same check. 2026-10-24T11:06:37.7959543Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T11:06:37.7959664Z ·  ─────────────┬───────────── 2026-10-24T11:06:37.7959847Z · ╰── The component is created during render here 2026-10-24T11:06:37.7959998Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T11:06:37.7960125Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T11:06:37.7960258Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T11:06:37.7960351Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T11:06:37.7960429Z 498 │ setIsPullRefreshing(true); 2026-10-24T11:06:37.7960512Z 499 │ await refreshSelectedSection(); 2026-10-24T11:06:37.7960587Z 500 │ setIsPullRefreshing(false); 2026-10-24T11:06:37.7960642Z 501 │ }; 2026-10-24T11:06:37.7960785Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T11:06:37.7960927Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T11:06:37.7961032Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T11:06:37.7961118Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T11:06:37.7961207Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T11:06:37.7961428Z 507 │ files: reviewFiles, 2026-10-24T11:06:37.7961580Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T11:06:37.7961712Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T11:06:37.7961776Z 510 │ : undefined, 2026-10-24T11:06:37.7961872Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T11:06:37.7961995Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T11:06:37.7962059Z 513 │ : undefined, 2026-10-24T11:06:37.7962115Z 514 │ }); 2026-10-24T11:06:37.7962306Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T11:06:37.7962436Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T11:06:37.7962499Z 517 │ environmentId, 2026-10-24T11:06:37.7962562Z 518 │ threadId, 2026-10-24T11:06:37.7962634Z 519 │ selectedSection, 2026-10-24T11:06:37.7962708Z 520 │ nativeReviewDiffData, 2026-10-24T11:06:37.7962762Z 521 │ }); 2026-10-24T11:06:37.7962867Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T11:06:37.7962953Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T11:06:37.7963041Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T11:06:37.7963117Z 525 │ diff: selectedSection?.diff, 2026-10-24T11:06:37.7963193Z 526 │ data: nativeReviewDiffData, 2026-10-24T11:06:37.7963260Z 527 │ collapsedFileIds, 2026-10-24T11:06:37.7963323Z 528 │ viewedFileIds, 2026-10-24T11:06:37.7963434Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T11:06:37.7963530Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T11:06:37.7963583Z 531 │ }); 2026-10-24T11:06:37.7963657Z 532 │ const showcaseReviewKey = 2026-10-24T11:06:37.7963795Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T11:06:37.7964007Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T11:06:37.7964068Z 535 │ : null; 2026-10-24T11:06:37.7964235Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T11:06:37.7964314Z 537 │ nativeBridge.onDebug(event); 2026-10-24T11:06:37.7964371Z 538 │ if ( 2026-10-24T11:06:37.7964450Z 539 │ showcaseReviewKey === null || 2026-10-24T11:06:37.7964572Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T11:06:37.7964681Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T11:06:37.7964738Z 542 │ ) { 2026-10-24T11:06:37.7964797Z 543 │ return; 2026-10-24T11:06:37.7964852Z 544 │ } 2026-10-24T11:06:37.7964969Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T11:06:37.7965134Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T11:06:37.7965188Z 547 │ }; 2026-10-24T11:06:37.7965241Z 548 │ 2026-10-24T11:06:37.7965358Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T11:06:37.7965438Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T11:06:37.7965525Z 551 │ commentSelection.clearSelection(); 2026-10-24T11:06:37.7965646Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T11:06:37.7965726Z 553 │ toggleExpandedFile(fileId); 2026-10-24T11:06:37.7965780Z 554 │ } 2026-10-24T11:06:37.7965891Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T11:06:37.7965962Z 556 │ if (!nativeView) return; 2026-10-24T11:06:37.7966111Z 557 │ const result = await settlePromise(() => 2026-10-24T11:06:37.7966322Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T11:06:37.7966376Z 559 │ ); 2026-10-24T11:06:37.7966465Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T11:06:37.7966646Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T11:06:37.7966699Z 562 │ } 2026-10-24T11:06:37.7966754Z 563 │ }; 2026-10-24T11:06:37.7966837Z 564 │ const handleVisibleFileChange = ( 2026-10-24T11:06:37.7966969Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T11:06:37.7967025Z 566 │ ) => { 2026-10-24T11:06:37.7967134Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T11:06:37.7967309Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T11:06:37.7967367Z 569 │ }; 2026-10-24T11:06:37.7967445Z 570 │ const renderInspector = () => ( 2026-10-24T11:06:37.7967515Z 571 │ void handleSelectFile(fileId)} 2026-10-24T11:06:37.7968027Z 577 │ /> 2026-10-24T11:06:37.7968079Z 578 │ ); 2026-10-24T11:06:37.7968132Z 579 │ 2026-10-24T11:06:37.7968347Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T11:06:37.7968434Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T11:06:37.7968501Z 582 │ if (fileId) { 2026-10-24T11:06:37.7968586Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T11:06:37.7968665Z 584 │ toggleExpandedFile(fileId); 2026-10-24T11:06:37.7968720Z 585 │ } 2026-10-24T11:06:37.7968773Z 586 │ }; 2026-10-24T11:06:37.7968825Z 587 │ 2026-10-24T11:06:37.7968914Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T11:06:37.7969032Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T11:06:37.7969088Z 590 │ ) => { 2026-10-24T11:06:37.7969176Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T11:06:37.7969239Z 592 │ if (fileId) { 2026-10-24T11:06:37.7969314Z 593 │ toggleViewedFile(fileId); 2026-10-24T11:06:37.7969368Z 594 │ } 2026-10-24T11:06:37.7969422Z 595 │ }; 2026-10-24T11:06:37.7969474Z 596 │ 2026-10-24T11:06:37.7969552Z 597 │ const parsedDiffNotice = 2026-10-24T11:06:37.7969717Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T11:06:37.7969839Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T11:06:37.7969996Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T11:06:37.7970115Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T11:06:37.7970274Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T11:06:37.7970384Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T11:06:37.7970484Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T11:06:37.7970554Z 605 │ hasCachedSelectedDiff, 2026-10-24T11:06:37.7970621Z 606 │ hasAnyCachedDiff, 2026-10-24T11:06:37.7970676Z 607 │ }); 2026-10-24T11:06:37.7970818Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T11:06:37.7970942Z 609 │ void retryEnvironment(environmentId); 2026-10-24T11:06:37.7970996Z 610 │ }; 2026-10-24T11:06:37.7971080Z 611 │ const handleReturnToThread = () => { 2026-10-24T11:06:37.7971159Z 612 │ if (navigation.canGoBack()) { 2026-10-24T11:06:37.7971228Z 613 │ navigation.goBack(); 2026-10-24T11:06:37.7971290Z 614 │ return; 2026-10-24T11:06:37.7971344Z 615 │ } 2026-10-24T11:06:37.7971424Z 616 │ navigation.navigate("Thread", { 2026-10-24T11:06:37.7971514Z 617 │ environmentId: String(environmentId), 2026-10-24T11:06:37.7971591Z 618 │ threadId: String(threadId), 2026-10-24T11:06:37.7971647Z 619 │ }); 2026-10-24T11:06:37.7971699Z 620 │ }; 2026-10-24T11:06:37.7971778Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T11:06:37.7971856Z 622 │ selectedSection?.title, 2026-10-24T11:06:37.7971938Z 623 │ headerDiffSummary.additions, 2026-10-24T11:06:37.7972016Z 624 │ headerDiffSummary.deletions, 2026-10-24T11:06:37.7972070Z 625 │ ] 2026-10-24T11:06:37.7972176Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T11:06:37.7972239Z 627 │ .join(" · "); 2026-10-24T11:06:37.7972291Z 628 │ 2026-10-24T11:06:37.7972369Z 629 │ const showChangedFilesPane = 2026-10-24T11:06:37.7972442Z 630 │ !showConnectionNotice && 2026-10-24T11:06:37.7972517Z 631 │ selectedSection !== null && 2026-10-24T11:06:37.7972596Z 632 │ parsedDiff.kind === "files" && 2026-10-24T11:06:37.7972675Z 633 │ NativeReviewDiffView !== null; 2026-10-24T11:06:37.7972847Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T11:06:37.7973023Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T11:06:37.7973080Z 636 │ 2026-10-24T11:06:37.7973153Z 637 │ const listHeader = (() => { 2026-10-24T11:06:37.7973238Z 638 │ const children: ReactElement[] = []; 2026-10-24T11:06:37.7973290Z 639 │ 2026-10-24T11:06:37.7973353Z 640 │ if (error) { 2026-10-24T11:06:37.7973421Z 641 │ children.push( 2026-10-24T11:06:37.7973482Z 642 │ 2026-10-24T11:06:37.7974137Z 649 │ Review unavailable 2026-10-24T11:06:37.7974298Z 650 │ {error} 2026-10-24T11:06:37.7974358Z 651 │ , 2026-10-24T11:06:37.7974415Z 652 │ ); 2026-10-24T11:06:37.7974469Z 653 │ } 2026-10-24T11:06:37.7974520Z 654 │ 2026-10-24T11:06:37.7974591Z 655 │ if (parsedDiffNotice) { 2026-10-24T11:06:37.7974752Z 656 │ children.push(); 2026-10-24T11:06:37.7974806Z 657 │ } 2026-10-24T11:06:37.7974857Z 658 │ 2026-10-24T11:06:37.7974934Z 659 │ if (children.length === 0) { 2026-10-24T11:06:37.7974998Z 660 │ return null; 2026-10-24T11:06:37.7975052Z 661 │ } 2026-10-24T11:06:37.7975103Z 662 │ 2026-10-24T11:06:37.7975175Z 663 │ return <>{children}; 2026-10-24T11:06:37.7975292Z 664 │ })(); 2026-10-24T11:06:37.7975422Z 665 │ const headerSubtitle = [ 2026-10-24T11:06:37.7975501Z 666 │ headerDiffSummary.additions, 2026-10-24T11:06:37.7975578Z 667 │ headerDiffSummary.deletions, 2026-10-24T11:06:37.7975659Z 668 │ pendingReviewCommentCount > 0 2026-10-24T11:06:37.7975833Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T11:06:37.7975893Z 670 │ : null, 2026-10-24T11:06:37.7975947Z 671 │ ] 2026-10-24T11:06:37.7976012Z 672 │ .filter(Boolean) 2026-10-24T11:06:37.7976075Z 673 │ .join(" · "); 2026-10-24T11:06:37.7976210Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T11:06:37.7976262Z 675 │ 2026-10-24T11:06:37.7976321Z 676 │ return ( 2026-10-24T11:06:37.7976376Z 677 │ <> 2026-10-24T11:06:37.7976441Z 678 │ 2026-10-24T11:06:37.7977773Z 694 │ 2026-10-24T11:06:37.7977839Z 695 │ 2026-10-24T11:06:37.7977961Z 696 │ 2026-10-24T11:06:37.7978041Z 697 │ {showConnectionNotice ? ( 2026-10-24T11:06:37.7978180Z 698 │ 2026-10-24T11:06:37.7978270Z 699 │ 2026-10-24T11:06:37.7979317Z 711 │ 2026-10-24T11:06:37.7979473Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T11:06:37.7979535Z 713 │ 2026-10-24T11:06:37.7980069Z 719 │ 2026-10-24T11:06:37.7980425Z 723 │ {listHeader} 2026-10-24T11:06:37.7980544Z 724 │ 2026-10-24T11:06:37.7980627Z 725 │ { 2026-10-24T11:06:37.7982226Z ·  ────┬──── 2026-10-24T11:06:37.7982361Z · ╰── This is the containing effect 2026-10-24T11:06:37.7982445Z 152 │ if (!controlledSelectedPath) { 2026-10-24T11:06:37.7982506Z 153 │ return; 2026-10-24T11:06:37.7982559Z 154 │ } 2026-10-24T11:06:37.7982642Z 155 │ setExpandedPaths((current) => { 2026-10-24T11:06:37.7982723Z ·  ────────┬─────── 2026-10-24T11:06:37.7982895Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7983017Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T11:06:37.7983070Z ╰──── 2026-10-24T11:06:37.7983786Z  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-24T11:06:37.7984115Z  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-24T11:06:37.7984118Z 2026-10-24T11:06:37.7984323Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7984470Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T11:06:37.7984568Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T11:06:37.7984647Z 257 │ }, [props.path, targetIndex]); 2026-10-24T11:06:37.7984723Z ·  ─────┬──── 2026-10-24T11:06:37.7984945Z · ╰── Unnecessary dependency `props.path` 2026-10-24T11:06:37.7985040Z 258 │ 2026-10-24T11:06:37.7985093Z ╰──── 2026-10-24T11:06:37.7985390Z  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-24T11:06:37.7985703Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7985707Z 2026-10-24T11:06:37.7985901Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7986051Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T11:06:37.7986124Z 292 │ 2026-10-24T11:06:37.7987220Z ·  ─────────── 2026-10-24T11:06:37.7987286Z 310 │ {body} 2026-10-24T11:06:37.7987338Z ╰──── 2026-10-24T11:06:37.7987491Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T11:06:37.7987497Z 2026-10-24T11:06:37.7987683Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T11:06:37.7987801Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T11:06:37.7987859Z 7 │ () => 2026-10-24T11:06:37.7987925Z 8 │ Gesture.Hover() 2026-10-24T11:06:37.7988001Z ·  ──┬── 2026-10-24T11:06:37.7988136Z · ╰── `Hover` may be a component 2026-10-24T11:06:37.7988211Z 9 │ .manualActivation(true) 2026-10-24T11:06:37.7988264Z ╰──── 2026-10-24T11:06:37.7988582Z  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-24T11:06:37.7989037Z  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-24T11:06:37.7989040Z 2026-10-24T11:06:37.7989299Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7989489Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T11:06:37.7989542Z 104 │ 2026-10-24T11:06:37.7989606Z 105 │ useEffect(() => { 2026-10-24T11:06:37.7989680Z ·  ────┬──── 2026-10-24T11:06:37.7989810Z · ╰── This is the containing effect 2026-10-24T11:06:37.7989942Z 106 │ clearReviewCommentTarget(); 2026-10-24T11:06:37.7990075Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T11:06:37.7990181Z ·  ────────────────┬─────────────── 2026-10-24T11:06:37.7990360Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7990433Z 108 │ }, [selectedSection?.id]); 2026-10-24T11:06:37.7990485Z ╰──── 2026-10-24T11:06:37.7991092Z  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-24T11:06:37.7991423Z  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-24T11:06:37.7991429Z 2026-10-24T11:06:37.7991686Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.7991874Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T11:06:37.7991927Z 109 │ 2026-10-24T11:06:37.7991992Z 110 │ useEffect(() => { 2026-10-24T11:06:37.7992065Z ·  ────┬──── 2026-10-24T11:06:37.7992193Z · ╰── This is the containing effect 2026-10-24T11:06:37.7992281Z 111 │ if (activeCommentTarget === null) { 2026-10-24T11:06:37.7992382Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T11:06:37.7992490Z ·  ────────────────┬─────────────── 2026-10-24T11:06:37.7992674Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.7992734Z 113 │ } 2026-10-24T11:06:37.7992786Z ╰──── 2026-10-24T11:06:37.7993395Z  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-24T11:06:37.7993719Z  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-24T11:06:37.7993721Z 2026-10-24T11:06:37.7993922Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.7994161Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T11:06:37.7994292Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T11:06:37.7994365Z 108 │ }, [selectedSection?.id]); 2026-10-24T11:06:37.7994452Z ·  ─────────┬───────── 2026-10-24T11:06:37.7994615Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T11:06:37.7994668Z 109 │ 2026-10-24T11:06:37.7994720Z ╰──── 2026-10-24T11:06:37.7995014Z  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-24T11:06:37.7995328Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.7995336Z 2026-10-24T11:06:37.7995533Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7995684Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T11:06:37.7995792Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T11:06:37.7995886Z 223 │ 2026-10-24T11:06:37.7995996Z ·  ─────────────── 2026-10-24T11:06:37.7996088Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T11:06:37.7996141Z ╰──── 2026-10-24T11:06:37.7996286Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T11:06:37.7996289Z 2026-10-24T11:06:37.7996491Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T11:06:37.7996645Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T11:06:37.7996722Z 226 │ ` or list indent), 2026-10-24T11:06:37.8000332Z ╰──── 2026-10-24T11:06:37.8000593Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T11:06:37.8000596Z 2026-10-24T11:06:37.8000854Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.8001029Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T11:06:37.8001084Z 55 │ 2026-10-24T11:06:37.8001150Z 56 │ useEffect(() => { 2026-10-24T11:06:37.8001223Z ·  ────┬──── 2026-10-24T11:06:37.8001352Z · ╰── This is the containing effect 2026-10-24T11:06:37.8001425Z 57 │ scheduler.reset(); 2026-10-24T11:06:37.8001530Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T11:06:37.8001616Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T11:06:37.8001734Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T11:06:37.8001814Z ·  ───────┬─────── 2026-10-24T11:06:37.8001985Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.8002098Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T11:06:37.8002151Z ╰──── 2026-10-24T11:06:37.8002765Z  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-24T11:06:37.8003091Z  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-24T11:06:37.8003094Z 2026-10-24T11:06:37.8003297Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T11:06:37.8003473Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T11:06:37.8003556Z 62 │ return () => scheduler.cancel(); 2026-10-24T11:06:37.8003657Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T11:06:37.8003785Z ·  ───┬─── ─────┬───── 2026-10-24T11:06:37.8004032Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T11:06:37.8004205Z · ╰── Unnecessary dependency `enabled` 2026-10-24T11:06:37.8004259Z 64 │ 2026-10-24T11:06:37.8004313Z ╰──── 2026-10-24T11:06:37.8004607Z  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-24T11:06:37.8004919Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T11:06:37.8004922Z 2026-10-24T11:06:37.8005182Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T11:06:37.8005352Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T11:06:37.8005411Z 100 │ 2026-10-24T11:06:37.8005478Z 101 │ useEffect(() => { 2026-10-24T11:06:37.8005550Z ·  ────┬──── 2026-10-24T11:06:37.8005681Z · ╰── This is the containing effect 2026-10-24T11:06:37.8005784Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T11:06:37.8005867Z 103 │ setHighlightedLinesById({}); 2026-10-24T11:06:37.8005960Z ·  ───────────┬─────────── 2026-10-24T11:06:37.8006136Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T11:06:37.8006199Z 104 │ return; 2026-10-24T11:06:37.8006250Z ╰──── 2026-10-24T11:06:37.8006863Z  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-24T11:06:37.8007190Z  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-24T11:06:37.8007192Z 2026-10-24T11:06:37.8007403Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T11:06:37.8007507Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T11:06:37.8007649Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T11:06:37.8007766Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T11:06:37.8007853Z ·  ──────┬────── 2026-10-24T11:06:37.8008003Z · ╰── 'HookForwarder' is imported here 2026-10-24T11:06:37.8008108Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T11:06:37.8008161Z ╰──── 2026-10-24T11:06:37.8008259Z  help: Consider removing this import. 2026-10-24T11:06:37.8008261Z 2026-10-24T11:06:37.8008381Z Found 0 errors and 367 warnings in 5430 files (5.2s, 8 threads) 2026-10-24T11:06:37.8477764Z Post job cleanup. 2026-10-24T11:06:37.9128685Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T11:06:37.9205322Z Post job cleanup. 2026-10-24T11:06:37.9218920Z ##[start-action display=Cache full pnpm store;id=__73693574-1795-4b11-8fc9-9394aed66614.__actions_cache] 2026-10-24T11:06:37.9721208Z Post job cleanup. 2026-10-24T11:06:38.0370305Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d, not saving cache. 2026-10-24T11:06:38.0410846Z ##[end-action id=__73693574-1795-4b11-8fc9-9394aed66614.__actions_cache;outcome=success;conclusion=success;duration_ms=119] 2026-10-24T11:06:38.0412667Z ##[start-action display=Cache Vite+;id=__73693574-1795-4b11-8fc9-9394aed66614.vp_cache] 2026-10-24T11:06:38.0440410Z Post job cleanup. 2026-10-24T11:06:38.1075850Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-24T11:06:38.1111209Z ##[end-action id=__73693574-1795-4b11-8fc9-9394aed66614.vp_cache;outcome=success;conclusion=success;duration_ms=69] 2026-10-24T11:06:38.1155288Z Post job cleanup. 2026-10-24T11:06:38.1621102Z [command]/usr/local/bin/git version 2026-10-24T11:06:38.1651110Z git version 2.55.0 2026-10-24T11:06:38.1671199Z Temporarily overriding HOME='/home/runner/_work/_temp/81b43f6e-e4e1-49b0-9348-2813b2fdd40f' before making global git config changes 2026-10-24T11:06:38.1671826Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T11:06:38.1674888Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T11:06:38.1705415Z Removing SSH command configuration 2026-10-24T11:06:38.1708952Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T11:06:38.1735207Z [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-24T11:06:38.1862920Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T11:06:38.1916032Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T11:06:38.1959985Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T11:06:38.1983032Z ##[group]Run '/job_completed.sh' 2026-10-24T11:06:38.1994905Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T11:06:38.1995094Z env: 2026-10-24T11:06:38.1995215Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 152 2026-10-24T11:06:38.1995368Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 359 2026-10-24T11:06:38.1995511Z BLACKSMITH_CHECK_RUN_ID: 120856234521 2026-10-24T11:06:38.1995659Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T11:06:38.1995803Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T11:06:38.1995943Z ##[endgroup] 2026-10-24T11:06:38.2079958Z Docker container cache not activated, skipping hash computation. 2026-10-24T11:06:38.2393159Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T11:06:38.2437033Z Cleaning up orphan processes