2026-10-25T02:19:26.3379475Z Current runner version: '2.338.1' 2026-10-25T02:19:26.3382714Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-x2z7r2rf76iohi6h' 2026-10-25T02:19:26.3383364Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-25T02:19:26.3384082Z Machine name: 'ip-172-31-73-130' 2026-10-25T02:19:26.3385581Z ##[group]GITHUB_TOKEN Permissions 2026-10-25T02:19:26.3386886Z Contents: read 2026-10-25T02:19:26.3387256Z Metadata: read 2026-10-25T02:19:26.3387692Z ##[endgroup] 2026-10-25T02:19:26.3388960Z Secret source: Actions 2026-10-25T02:19:26.3389605Z Cache mode: write 2026-10-25T02:19:26.3390126Z Prepare workflow directory 2026-10-25T02:19:26.3574426Z Prepare all required actions 2026-10-25T02:19:26.3599322Z Getting action download info 2026-10-25T02:19:26.4696247Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-25T02:19:26.4973409Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-25T02:19:26.6080376Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-25T02:19:26.6116432Z Complete job name: Lint 2026-10-25T02:19:26.6469759Z A job started hook has been configured by the self-hosted runner administrator 2026-10-25T02:19:26.6526564Z ##[group]Run '/setup.sh' 2026-10-25T02:19:26.6535190Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:19:26.6535787Z env: 2026-10-25T02:19:26.6536120Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:26.6536418Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:26.6536687Z BLACKSMITH_CHECK_RUN_ID: 121051323923 2026-10-25T02:19:26.6536954Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T02:19:26.6537215Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T02:19:26.6537467Z ##[endgroup] 2026-10-25T02:19:26.6744230Z Logging daemon started (blacksmithd for logs) 2026-10-25T02:19:26.6825783Z Results daemon started (blacksmithd for results) 2026-10-25T02:19:26.6946077Z Background adoption and SSH setup started (PID: 3168) 2026-10-25T02:19:26.6947096Z 2026-10-25T02:19:26.6947311Z ---------------------------------------- 2026-10-25T02:19:26.6947802Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40154004345/jobs/121051323923 2026-10-25T02:19:26.6948235Z SSH Access (using your GitHub SSH key): 2026-10-25T02:19:26.6948651Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-x2z7r2rf76iohi6h.vm.blacksmith.sh 2026-10-25T02:19:26.6948949Z 2026-10-25T02:19:26.6949055Z No GitHub SSH key? Add one at: 2026-10-25T02:19:26.6949522Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-25T02:19:26.6949991Z 2026-10-25T02:19:26.6950148Z ---------------------------------------- 2026-10-25T02:19:26.6950416Z 2026-10-25T02:19:26.6950623Z VM ID: blacksmith-8vcpu-ubuntu-2404-x2z7r2rf76iohi6h 2026-10-25T02:19:26.6951119Z Host: production-152.236.31.55-x8664 2026-10-25T02:19:26.6951532Z Host Agent PID: 256442 2026-10-25T02:19:26.6951941Z Host Agent Git SHA: 1637818df 2026-10-25T02:19:26.6952351Z Host CPU Manufacturer: AuthenticAMD 2026-10-25T02:19:26.6952783Z Blacksmith Host Generation: gen 2 2026-10-25T02:19:26.6953210Z Petname: production-meet-hare-9a71ea6d 2026-10-25T02:19:26.6953639Z Region: us-east 2026-10-25T02:19:26.6954000Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-25T02:19:26.6956471Z OS Version: Ubuntu 24.04.4 LTS 2026-10-25T02:19:26.6957207Z 2026-10-25T02:19:26.6957316Z Enabling Blacksmith transparent cache 2026-10-25T02:19:26.7158664Z ##[group]Run actions/checkout@v6 2026-10-25T02:19:26.7158948Z with: 2026-10-25T02:19:26.7159262Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-25T02:19:26.7159643Z sparse-checkout-cone-mode: false 2026-10-25T02:19:26.7159910Z repository: pingdotgg/t3code 2026-10-25T02:19:26.7162031Z token: *** 2026-10-25T02:19:26.7162236Z ssh-strict: true 2026-10-25T02:19:26.7162450Z ssh-user: git 2026-10-25T02:19:26.7162664Z persist-credentials: true 2026-10-25T02:19:26.7163047Z clean: true 2026-10-25T02:19:26.7163254Z fetch-depth: 1 2026-10-25T02:19:26.7163463Z fetch-tags: false 2026-10-25T02:19:26.7163679Z show-progress: true 2026-10-25T02:19:26.7163894Z lfs: false 2026-10-25T02:19:26.7164092Z submodules: false 2026-10-25T02:19:26.7164307Z set-safe-directory: true 2026-10-25T02:19:26.7164551Z allow-unsafe-pr-checkout: false 2026-10-25T02:19:26.7164796Z env: 2026-10-25T02:19:26.7165027Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:26.7165303Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:26.7165571Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:26.7165824Z ##[endgroup] 2026-10-25T02:19:26.8114042Z Syncing repository: pingdotgg/t3code 2026-10-25T02:19:26.8114941Z ##[group]Getting Git version info 2026-10-25T02:19:26.8115288Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-25T02:19:26.8115759Z [command]/usr/local/bin/git version 2026-10-25T02:19:26.8133596Z git version 2.55.0 2026-10-25T02:19:26.8144823Z ##[endgroup] 2026-10-25T02:19:26.8151803Z Temporarily overriding HOME='/home/runner/_work/_temp/9ea682cc-ee58-45e5-ad96-20a24b825ab3' before making global git config changes 2026-10-25T02:19:26.8152512Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T02:19:26.8155249Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T02:19:26.8182545Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-25T02:19:26.8184317Z ##[group]Determining repository object format 2026-10-25T02:19:26.8185394Z ##[endgroup] 2026-10-25T02:19:26.8185745Z ##[group]Initializing the repository 2026-10-25T02:19:26.8187672Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-25T02:19:26.8219056Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-25T02:19:26.8219821Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-25T02:19:26.8220565Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-25T02:19:26.8221016Z hint: call: 2026-10-25T02:19:26.8221217Z hint: 2026-10-25T02:19:26.8221469Z hint: git config --global init.defaultBranch 2026-10-25T02:19:26.8221761Z hint: 2026-10-25T02:19:26.8222099Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-25T02:19:26.8222539Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-25T02:19:26.8222890Z hint: 2026-10-25T02:19:26.8223094Z hint: git branch -m 2026-10-25T02:19:26.8223326Z hint: 2026-10-25T02:19:26.8223623Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-25T02:19:26.8224149Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-25T02:19:26.8224938Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-25T02:19:26.8247463Z ##[endgroup] 2026-10-25T02:19:26.8247844Z ##[group]Disabling automatic garbage collection 2026-10-25T02:19:26.8249435Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-25T02:19:26.8266861Z ##[endgroup] 2026-10-25T02:19:26.8267206Z ##[group]Setting up auth 2026-10-25T02:19:26.8267461Z Removing SSH command configuration 2026-10-25T02:19:26.8270671Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T02:19:26.8290982Z [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-25T02:19:26.8405778Z Removing HTTP extra header 2026-10-25T02:19:26.8408576Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-25T02:19:26.8431514Z [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-25T02:19:26.8526108Z Removing includeIf entries pointing to credentials config files 2026-10-25T02:19:26.8529433Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-25T02:19:26.8549900Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-25T02:19:26.8642012Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-5af50a5e-6568-4459-9d27-4ec343030137.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-25T02:19:26.8687299Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-5af50a5e-6568-4459-9d27-4ec343030137.config 2026-10-25T02:19:26.8705726Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-5af50a5e-6568-4459-9d27-4ec343030137.config 2026-10-25T02:19:26.8724704Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-5af50a5e-6568-4459-9d27-4ec343030137.config 2026-10-25T02:19:26.8744025Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-5af50a5e-6568-4459-9d27-4ec343030137.config 2026-10-25T02:19:26.8759590Z ##[endgroup] 2026-10-25T02:19:26.8759941Z ##[group]Fetching the repository 2026-10-25T02:19:26.8763847Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +8f26ed7e279d6d290ab7200e88055b7a58982b7d:refs/remotes/origin/main 2026-10-25T02:19:27.1308708Z From https://github.com/pingdotgg/t3code 2026-10-25T02:19:27.1309584Z * [new ref] 8f26ed7e279d6d290ab7200e88055b7a58982b7d -> origin/main 2026-10-25T02:19:27.1332381Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-25T02:19:27.1351081Z origin/main 2026-10-25T02:19:27.1355957Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-25T02:19:27.1371327Z 8f26ed7e279d6d290ab7200e88055b7a58982b7d 2026-10-25T02:19:27.1373386Z ##[endgroup] 2026-10-25T02:19:27.1374100Z ##[group]Determining the checkout info 2026-10-25T02:19:27.1374925Z ##[endgroup] 2026-10-25T02:19:27.1375663Z ##[group]Setting up sparse checkout 2026-10-25T02:19:27.1376375Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-25T02:19:27.1395775Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-25T02:19:27.1410626Z .git/info/sparse-checkout 2026-10-25T02:19:27.1413684Z ##[endgroup] 2026-10-25T02:19:27.1414650Z ##[group]Checking out the ref 2026-10-25T02:19:27.1415953Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-25T02:19:33.9331347Z Updating files: 0% (1/6499) 2026-10-25T02:19:33.9359601Z Updating files: 1% (65/6499) 2026-10-25T02:19:33.9375925Z Updating files: 2% (130/6499) 2026-10-25T02:19:33.9396722Z Updating files: 3% (195/6499) 2026-10-25T02:19:33.9417590Z Updating files: 4% (260/6499) 2026-10-25T02:19:33.9447670Z Updating files: 5% (325/6499) 2026-10-25T02:19:33.9468967Z Updating files: 6% (390/6499) 2026-10-25T02:19:33.9519280Z Updating files: 7% (455/6499) 2026-10-25T02:19:33.9554287Z Updating files: 8% (520/6499) 2026-10-25T02:19:33.9637468Z Updating files: 9% (585/6499) 2026-10-25T02:19:33.9786683Z Updating files: 10% (650/6499) 2026-10-25T02:19:33.9935033Z Updating files: 11% (715/6499) 2026-10-25T02:19:33.9946978Z Updating files: 12% (780/6499) 2026-10-25T02:19:33.9958112Z Updating files: 13% (845/6499) 2026-10-25T02:19:33.9975326Z Updating files: 14% (910/6499) 2026-10-25T02:19:33.9992222Z Updating files: 15% (975/6499) 2026-10-25T02:19:34.0008677Z Updating files: 16% (1040/6499) 2026-10-25T02:19:34.0025429Z Updating files: 17% (1105/6499) 2026-10-25T02:19:34.0041661Z Updating files: 18% (1170/6499) 2026-10-25T02:19:34.0058303Z Updating files: 19% (1235/6499) 2026-10-25T02:19:34.0072791Z Updating files: 20% (1300/6499) 2026-10-25T02:19:34.0099160Z Updating files: 21% (1365/6499) 2026-10-25T02:19:34.0115506Z Updating files: 22% (1430/6499) 2026-10-25T02:19:34.0131008Z Updating files: 23% (1495/6499) 2026-10-25T02:19:34.0145744Z Updating files: 24% (1560/6499) 2026-10-25T02:19:34.0158259Z Updating files: 25% (1625/6499) 2026-10-25T02:19:34.0174615Z Updating files: 26% (1690/6499) 2026-10-25T02:19:34.0188175Z Updating files: 27% (1755/6499) 2026-10-25T02:19:34.0207600Z Updating files: 28% (1820/6499) 2026-10-25T02:19:34.0233053Z Updating files: 29% (1885/6499) 2026-10-25T02:19:34.0254766Z Updating files: 30% (1950/6499) 2026-10-25T02:19:34.0279461Z Updating files: 31% (2015/6499) 2026-10-25T02:19:34.0301824Z Updating files: 32% (2080/6499) 2026-10-25T02:19:34.0334561Z Updating files: 33% (2145/6499) 2026-10-25T02:19:34.0396841Z Updating files: 34% (2210/6499) 2026-10-25T02:19:34.0446723Z Updating files: 35% (2275/6499) 2026-10-25T02:19:34.0485813Z Updating files: 36% (2340/6499) 2026-10-25T02:19:34.0521887Z Updating files: 37% (2405/6499) 2026-10-25T02:19:34.0559402Z Updating files: 38% (2470/6499) 2026-10-25T02:19:34.0591550Z Updating files: 39% (2535/6499) 2026-10-25T02:19:34.0620812Z Updating files: 40% (2600/6499) 2026-10-25T02:19:34.0649058Z Updating files: 41% (2665/6499) 2026-10-25T02:19:34.0666221Z Updating files: 42% (2730/6499) 2026-10-25T02:19:34.0677998Z Updating files: 43% (2795/6499) 2026-10-25T02:19:34.0691200Z Updating files: 44% (2860/6499) 2026-10-25T02:19:34.0722369Z Updating files: 45% (2925/6499) 2026-10-25T02:19:34.0746141Z Updating files: 46% (2990/6499) 2026-10-25T02:19:34.0768640Z Updating files: 47% (3055/6499) 2026-10-25T02:19:34.0796884Z Updating files: 48% (3120/6499) 2026-10-25T02:19:34.0828499Z Updating files: 49% (3185/6499) 2026-10-25T02:19:34.0864831Z Updating files: 50% (3250/6499) 2026-10-25T02:19:34.0880530Z Updating files: 51% (3315/6499) 2026-10-25T02:19:34.0912815Z Updating files: 52% (3380/6499) 2026-10-25T02:19:34.0939384Z Updating files: 53% (3445/6499) 2026-10-25T02:19:34.0958783Z Updating files: 54% (3510/6499) 2026-10-25T02:19:34.0982741Z Updating files: 55% (3575/6499) 2026-10-25T02:19:34.1000560Z Updating files: 56% (3640/6499) 2026-10-25T02:19:34.1015418Z Updating files: 57% (3705/6499) 2026-10-25T02:19:34.1034739Z Updating files: 58% (3770/6499) 2026-10-25T02:19:34.1377040Z Updating files: 59% (3835/6499) 2026-10-25T02:19:34.1394385Z Updating files: 60% (3900/6499) 2026-10-25T02:19:34.1412539Z Updating files: 61% (3965/6499) 2026-10-25T02:19:34.1433126Z Updating files: 62% (4030/6499) 2026-10-25T02:19:34.1457402Z Updating files: 63% (4095/6499) 2026-10-25T02:19:34.1484880Z Updating files: 64% (4160/6499) 2026-10-25T02:19:34.1504522Z Updating files: 65% (4225/6499) 2026-10-25T02:19:34.1522317Z Updating files: 66% (4290/6499) 2026-10-25T02:19:34.1545874Z Updating files: 67% (4355/6499) 2026-10-25T02:19:34.1558440Z Updating files: 68% (4420/6499) 2026-10-25T02:19:34.1576669Z Updating files: 69% (4485/6499) 2026-10-25T02:19:34.1588499Z Updating files: 70% (4550/6499) 2026-10-25T02:19:34.1606183Z Updating files: 71% (4615/6499) 2026-10-25T02:19:34.1616511Z Updating files: 72% (4680/6499) 2026-10-25T02:19:34.1620159Z Updating files: 72% (4724/6499) 2026-10-25T02:19:34.1663050Z Updating files: 73% (4745/6499) 2026-10-25T02:19:34.2047143Z Updating files: 74% (4810/6499) 2026-10-25T02:19:34.2071610Z Updating files: 75% (4875/6499) 2026-10-25T02:19:34.2093247Z Updating files: 76% (4940/6499) 2026-10-25T02:19:34.2115190Z Updating files: 77% (5005/6499) 2026-10-25T02:19:34.2138183Z Updating files: 78% (5070/6499) 2026-10-25T02:19:34.2154767Z Updating files: 79% (5135/6499) 2026-10-25T02:19:34.2175958Z Updating files: 80% (5200/6499) 2026-10-25T02:19:34.2191863Z Updating files: 81% (5265/6499) 2026-10-25T02:19:34.2210144Z Updating files: 82% (5330/6499) 2026-10-25T02:19:34.2232472Z Updating files: 83% (5395/6499) 2026-10-25T02:19:34.2252380Z Updating files: 84% (5460/6499) 2026-10-25T02:19:34.2269686Z Updating files: 85% (5525/6499) 2026-10-25T02:19:34.2295279Z Updating files: 86% (5590/6499) 2026-10-25T02:19:34.2362549Z Updating files: 87% (5655/6499) 2026-10-25T02:19:34.2391044Z Updating files: 88% (5720/6499) 2026-10-25T02:19:34.2410667Z Updating files: 89% (5785/6499) 2026-10-25T02:19:34.2435195Z Updating files: 90% (5850/6499) 2026-10-25T02:19:34.2464865Z Updating files: 91% (5915/6499) 2026-10-25T02:19:34.2479230Z Updating files: 92% (5980/6499) 2026-10-25T02:19:34.2499976Z Updating files: 93% (6045/6499) 2026-10-25T02:19:34.2519089Z Updating files: 94% (6110/6499) 2026-10-25T02:19:34.2543518Z Updating files: 95% (6175/6499) 2026-10-25T02:19:34.2598591Z Updating files: 96% (6240/6499) 2026-10-25T02:19:34.2620623Z Updating files: 97% (6305/6499) 2026-10-25T02:19:34.2665590Z Updating files: 98% (6370/6499) 2026-10-25T02:19:34.2684558Z Updating files: 99% (6435/6499) 2026-10-25T02:19:34.2684936Z Updating files: 100% (6499/6499) 2026-10-25T02:19:34.2685132Z Updating files: 100% (6499/6499), done. 2026-10-25T02:19:34.2832871Z Switched to a new branch 'main' 2026-10-25T02:19:34.2833727Z branch 'main' set up to track 'origin/main'. 2026-10-25T02:19:34.2845995Z ##[endgroup] 2026-10-25T02:19:34.2876877Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-25T02:19:34.2894092Z 8f26ed7e279d6d290ab7200e88055b7a58982b7d 2026-10-25T02:19:34.2963296Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-25T02:19:34.2963525Z files="$(git ls-files .github/pr-assets)" 2026-10-25T02:19:34.2963708Z if test -n "$files"; then 2026-10-25T02:19:34.2963930Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-25T02:19:34.2964137Z  exit 1 2026-10-25T02:19:34.2964240Z fi 2026-10-25T02:19:34.2973284Z shell: /usr/bin/bash -e {0} 2026-10-25T02:19:34.2973410Z env: 2026-10-25T02:19:34.2973531Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:34.2973673Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:34.2973809Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:34.2973939Z ##[endgroup] 2026-10-25T02:19:34.3126241Z Prepare all required actions 2026-10-25T02:19:34.3126595Z Getting action download info 2026-10-25T02:19:34.3991895Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-25T02:19:34.4833423Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-25T02:19:34.4833581Z env: 2026-10-25T02:19:34.4833692Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:34.4833838Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:34.4833978Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:34.4834113Z ##[endgroup] 2026-10-25T02:19:34.4907971Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-25T02:19:34.4920828Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T02:19:34.4921182Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T02:19:34.4921515Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T02:19:34.4921909Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T02:19:34.4932419Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:19:34.4932671Z env: 2026-10-25T02:19:34.4932846Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:34.4933076Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:34.4933304Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:34.4933520Z ##[endgroup] 2026-10-25T02:19:34.4997382Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=8] 2026-10-25T02:19:34.4998614Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-25T02:19:34.5035988Z ##[group]Run actions/cache@v6 2026-10-25T02:19:34.5036250Z with: 2026-10-25T02:19:34.5036353Z path: ~/.vite-plus 2026-10-25T02:19:34.5036516Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:19:34.5036707Z enableCrossOsArchive: false 2026-10-25T02:19:34.5036836Z fail-on-cache-miss: false 2026-10-25T02:19:34.5036958Z lookup-only: false 2026-10-25T02:19:34.5037066Z save-always: false 2026-10-25T02:19:34.5037172Z env: 2026-10-25T02:19:34.5037279Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:34.5037424Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:34.5037563Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:34.5037692Z ##[endgroup] 2026-10-25T02:19:35.2890647Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:19:35.6416480Z Received 170349591 of 170349591 (100.0%), 489.3 MBs/sec 2026-10-25T02:19:35.6417784Z Cache Size: ~162 MB (170349591 B) 2026-10-25T02:19:35.6475838Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/953e4650-23e3-4d1b-9d83-8df5b897091b/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:19:36.2703005Z Cache restored successfully 2026-10-25T02:19:36.2830526Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T02:19:36.2904863Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1790] 2026-10-25T02:19:36.2907058Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-25T02:19:36.2924473Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T02:19:36.2924689Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T02:19:36.2924862Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-25T02:19:36.2934867Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:19:36.2935027Z env: 2026-10-25T02:19:36.2935144Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:36.2935286Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:36.2935426Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:36.2935567Z ##[endgroup] 2026-10-25T02:19:36.2969791Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-25T02:19:36.2976660Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=6] 2026-10-25T02:19:36.2977931Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-25T02:19:36.2981488Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T02:19:36.2982547Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-25T02:19:36.2991177Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-25T02:19:36.2991349Z store_path="$(vp pm cache dir)" 2026-10-25T02:19:36.2991514Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-25T02:19:36.3000939Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:19:36.3001111Z env: 2026-10-25T02:19:36.3001221Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:36.3001377Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:36.3001515Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:36.3001644Z ##[endgroup] 2026-10-25T02:19:36.3121826Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=13] 2026-10-25T02:19:36.3122990Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-25T02:19:36.3445500Z ##[group]Run actions/cache@v6 2026-10-25T02:19:36.3445633Z with: 2026-10-25T02:19:36.3445760Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-25T02:19:36.3446087Z key: pnpm-full-v1-Linux-X64-67727b77004e0e6799b7f8587a750813c0ad4460c623edf0becc280ccb581251 2026-10-25T02:19:36.3446363Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-25T02:19:36.3446608Z enableCrossOsArchive: false 2026-10-25T02:19:36.3446790Z fail-on-cache-miss: false 2026-10-25T02:19:36.3446946Z lookup-only: false 2026-10-25T02:19:36.3447126Z save-always: false 2026-10-25T02:19:36.3447269Z env: 2026-10-25T02:19:36.3447423Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:36.3447754Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:36.3447932Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:36.3448129Z ##[endgroup] 2026-10-25T02:19:36.5320461Z Cache hit for restore-key: pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d 2026-10-25T02:19:37.5528009Z Received 671088640 of 998158458 (67.2%), 640.0 MBs/sec 2026-10-25T02:19:37.9699223Z Received 998158458 of 998158458 (100.0%), 671.8 MBs/sec 2026-10-25T02:19:37.9700121Z Cache Size: ~952 MB (998158458 B) 2026-10-25T02:19:37.9732857Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/b8704d7b-3447-4de4-ad97-a0a4cb396120/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:19:42.9199537Z Cache restored successfully 2026-10-25T02:19:42.9638804Z Cache restored from key: pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d 2026-10-25T02:19:42.9700867Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6657] 2026-10-25T02:19:42.9703077Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-25T02:19:42.9712165Z ##[group]Run vp install 2026-10-25T02:19:42.9712304Z vp install 2026-10-25T02:19:42.9721478Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T02:19:42.9721678Z env: 2026-10-25T02:19:42.9721790Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:42.9721932Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:42.9722074Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:42.9722201Z ##[endgroup] 2026-10-25T02:19:43.0041652Z Scope: all 34 workspace projects 2026-10-25T02:19:43.1018110Z ? Verifying lockfile against supply-chain policies (2087 entries)... 2026-10-25T02:19:43.3439561Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-25T02:19:43.3440041Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-25T02:19:43.3441779Z Virtual store is at: node_modules/.pnpm 2026-10-25T02:19:45.3385523Z ✓ Lockfile passes supply-chain policies (2087 entries in 2.2s) 2026-10-25T02:19:45.3385768Z Lockfile is up to date, resolution step is skipped 2026-10-25T02:19:45.3543416Z Packages: +1720 2026-10-25T02:19:45.3543637Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-25T02:19:45.3829775Z Progress: resolved 1720, reused 1716, downloaded 0, added 1720, done 2026-10-25T02:19:46.2209151Z . prepare$ vp config --no-agent 2026-10-25T02:19:46.3172619Z . prepare: Done 2026-10-25T02:19:46.3186440Z 2026-10-25T02:19:46.3186732Z devDependencies: 2026-10-25T02:19:46.3186940Z + @coderabbitai/config 1.1.0 2026-10-25T02:19:46.3187161Z + @shadcn/lint 0.1.5 2026-10-25T02:19:46.3187420Z + @types/node 24.12.4 2026-10-25T02:19:46.3187605Z + knip 6.34.0 2026-10-25T02:19:46.3187835Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-25T02:19:46.3188065Z + vite-plus 1.3.0 2026-10-25T02:19:46.3188172Z 2026-10-25T02:19:46.3203549Z Done in 3.3s using pnpm v12.14.0 2026-10-25T02:19:46.3358853Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3365] 2026-10-25T02:19:46.3907131Z ##[group]Run actions/cache@v6 2026-10-25T02:19:46.3907401Z with: 2026-10-25T02:19:46.3907600Z path: ~/.cache/electron 2026-10-25T02:19:46.3907975Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:19:46.3908367Z enableCrossOsArchive: false 2026-10-25T02:19:46.3908615Z fail-on-cache-miss: false 2026-10-25T02:19:46.3908807Z lookup-only: false 2026-10-25T02:19:46.3909038Z save-always: false 2026-10-25T02:19:46.3909211Z env: 2026-10-25T02:19:46.3909426Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:46.3909672Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:46.3909922Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:46.3910203Z ##[endgroup] 2026-10-25T02:19:46.5968436Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:19:46.7492678Z Received 122906203 of 122906203 (100.0%), 849.4 MBs/sec 2026-10-25T02:19:46.7493054Z Cache Size: ~117 MB (122906203 B) 2026-10-25T02:19:46.7533537Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/83b286fd-64e5-486f-bd53-f8872fe5205a/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T02:19:46.8105747Z Cache restored successfully 2026-10-25T02:19:46.8239730Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T02:19:46.8349121Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-25T02:19:46.8349410Z vp run --filter @t3tools/desktop ensure:electron 2026-10-25T02:19:46.8359346Z shell: /usr/bin/bash -e {0} 2026-10-25T02:19:46.8359475Z env: 2026-10-25T02:19:46.8359757Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:46.8359907Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:46.8360047Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:46.8360185Z ##[endgroup] 2026-10-25T02:19:46.9813212Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-25T02:19:47.5224604Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-25T02:19:47.5246197Z 2026-10-25T02:19:47.5345092Z ##[group]Run vp run knip:check 2026-10-25T02:19:47.5345415Z vp run knip:check 2026-10-25T02:19:47.5357820Z shell: /usr/bin/bash -e {0} 2026-10-25T02:19:47.5357997Z env: 2026-10-25T02:19:47.5358114Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:47.5358268Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:47.5358419Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:47.5358552Z ##[endgroup] 2026-10-25T02:19:47.6784469Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-25T02:19:51.2547412Z 2026-10-25T02:19:51.2550742Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-25T02:19:59.0626472Z 2026-10-25T02:19:59.0627537Z --- 2026-10-25T02:19:59.0627817Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-25T02:19:59.0710196Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-25T02:19:59.0710498Z vp run --filter @t3tools/source-control-github generate --check 2026-10-25T02:19:59.0720090Z shell: /usr/bin/bash -e {0} 2026-10-25T02:19:59.0720266Z env: 2026-10-25T02:19:59.0720374Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:59.0720526Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:59.0720781Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:59.0720992Z ##[endgroup] 2026-10-25T02:19:59.2132226Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-25T02:19:59.3899172Z 2026-10-25T02:19:59.3980174Z ##[group]Run vp run --filter t3 generate --check 2026-10-25T02:19:59.3980443Z vp run --filter t3 generate --check 2026-10-25T02:19:59.3989799Z shell: /usr/bin/bash -e {0} 2026-10-25T02:19:59.3989927Z env: 2026-10-25T02:19:59.3990050Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:59.3990193Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:59.3990329Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:59.3990463Z ##[endgroup] 2026-10-25T02:19:59.5431725Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-25T02:19:59.6894250Z 2026-10-25T02:19:59.6965017Z ##[group]Run vp check 2026-10-25T02:19:59.6965182Z vp check 2026-10-25T02:19:59.6974861Z shell: /usr/bin/bash -e {0} 2026-10-25T02:19:59.6974991Z env: 2026-10-25T02:19:59.6975103Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149 2026-10-25T02:19:59.6975250Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376 2026-10-25T02:19:59.6975392Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T02:19:59.6975526Z ##[endgroup] 2026-10-25T02:20:00.2547903Z pass: All 5815 files are correctly formatted (425ms, 8 threads) 2026-10-25T02:20:05.7413822Z error: Lint issues found 2026-10-25T02:20:05.7415160Z ⚠ 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-25T02:20:05.7415647Z ╭─[apps/server/src/auth/RpcAuthorization.ts:238:17] 2026-10-25T02:20:05.7415942Z 237 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-25T02:20:05.7416225Z 238 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-25T02:20:05.7416495Z ·  ──────────────────────── 2026-10-25T02:20:05.7416746Z 239 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-25T02:20:05.7416952Z ╰──── 2026-10-25T02:20:05.7417020Z 2026-10-25T02:20:05.7417389Z ⚠ 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-25T02:20:05.7417841Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-25T02:20:05.7418074Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-25T02:20:05.7418348Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-25T02:20:05.7418618Z ·  ──────────────────────── 2026-10-25T02:20:05.7418798Z 257 │ return [ 2026-10-25T02:20:05.7418926Z ╰──── 2026-10-25T02:20:05.7418986Z 2026-10-25T02:20:05.7419426Z ⚠ 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-25T02:20:05.7419995Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-25T02:20:05.7420275Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-25T02:20:05.7420614Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-25T02:20:05.7420901Z ·  ──────────────────────── 2026-10-25T02:20:05.7421078Z 182 │ version: 1, 2026-10-25T02:20:05.7421211Z ╰──── 2026-10-25T02:20:05.7421265Z 2026-10-25T02:20:05.7421503Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-25T02:20:05.7421850Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:498:11] 2026-10-25T02:20:05.7422193Z 497 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-25T02:20:05.7422448Z 498 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-25T02:20:05.7422675Z ·  ─────────────── 2026-10-25T02:20:05.7422833Z 499 │ ) 2026-10-25T02:20:05.7422952Z ╰──── 2026-10-25T02:20:05.7423153Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-25T02:20:05.7423317Z 2026-10-25T02:20:05.7423662Z ⚠ 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-25T02:20:05.7424104Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-25T02:20:05.7424372Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-25T02:20:05.7424664Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-25T02:20:05.7425053Z ·  ─────────────────── 2026-10-25T02:20:05.7425308Z 1787 │ cwd, 2026-10-25T02:20:05.7425438Z ╰──── 2026-10-25T02:20:05.7425497Z 2026-10-25T02:20:05.7425690Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7426037Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:156:7] 2026-10-25T02:20:05.7426251Z 155 │ } 2026-10-25T02:20:05.7426386Z 156 │ }, [wrappedRender]); 2026-10-25T02:20:05.7426550Z ·  ──────┬────── 2026-10-25T02:20:05.7426794Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-25T02:20:05.7426991Z 157 │ 2026-10-25T02:20:05.7427101Z ╰──── 2026-10-25T02:20:05.7427450Z  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-25T02:20:05.7428043Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7428329Z 2026-10-25T02:20:05.7428561Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:20:05.7428942Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:825:42] 2026-10-25T02:20:05.7429157Z 824 │ > 2026-10-25T02:20:05.7429358Z 825 │ 2026-10-25T02:20:05.7429617Z ·  ──────────────────── 2026-10-25T02:20:05.7429839Z 826 │ 2026-10-25T02:20:05.7430002Z ╰──── 2026-10-25T02:20:05.7430280Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:20:05.7430624Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:20:05.7430795Z 2026-10-25T02:20:05.7430959Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.7431259Z ╭─[apps/server/src/process/externalLauncher.test.ts:183:12] 2026-10-25T02:20:05.7431453Z 182 │ 2026-10-25T02:20:05.7431607Z 183 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-25T02:20:05.7431791Z ·  ── 2026-10-25T02:20:05.7431927Z 184 │ } 2026-10-25T02:20:05.7432034Z ╰──── 2026-10-25T02:20:05.7432315Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.7432535Z 2026-10-25T02:20:05.7432694Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.7433106Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-25T02:20:05.7433336Z 185 │ 2026-10-25T02:20:05.7433460Z 186 │ for (const {} of [ 2026-10-25T02:20:05.7433605Z ·  ── 2026-10-25T02:20:05.7433783Z 187 │ { kind: "browser", folderVerb: "none" }, 2026-10-25T02:20:05.7433957Z ╰──── 2026-10-25T02:20:05.7434229Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.7434445Z 2026-10-25T02:20:05.7434600Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.7434943Z ╭─[apps/server/src/process/externalLauncher.test.ts:308:12] 2026-10-25T02:20:05.7435197Z 307 │ 2026-10-25T02:20:05.7435386Z 308 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-25T02:20:05.7435587Z ·  ── 2026-10-25T02:20:05.7435729Z 309 │ } 2026-10-25T02:20:05.7435838Z ╰──── 2026-10-25T02:20:05.7436112Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.7436346Z 2026-10-25T02:20:05.7436505Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.7436797Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-25T02:20:05.7436987Z 310 │ 2026-10-25T02:20:05.7437107Z 311 │ for (const {} of [ 2026-10-25T02:20:05.7437255Z ·  ── 2026-10-25T02:20:05.7437393Z 312 │ { 2026-10-25T02:20:05.7437507Z ╰──── 2026-10-25T02:20:05.7437773Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.7437986Z 2026-10-25T02:20:05.7438138Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7438448Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:39:5] 2026-10-25T02:20:05.7438665Z 32 │ 2026-10-25T02:20:05.7438858Z 33 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-25T02:20:05.7439092Z ·  ────────┬──────── 2026-10-25T02:20:05.7439332Z · ╰── `inspectorProgress` originates here 2026-10-25T02:20:05.7439564Z 34 │ const { renderedInspectorWidth } = props; 2026-10-25T02:20:05.7439805Z 35 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T02:20:05.7440004Z 36 │ 2026-10-25T02:20:05.7440142Z 37 │ const onClosed = props.onClosed; 2026-10-25T02:20:05.7440299Z 38 │ useEffect(() => { 2026-10-25T02:20:05.7440472Z 39 │ inspectorProgress.value = withTiming( 2026-10-25T02:20:05.7440749Z ·  ────────┬──────── 2026-10-25T02:20:05.7440989Z · ╰── `inspectorProgress` cannot be modified 2026-10-25T02:20:05.7441210Z 40 │ inspectorVisible ? 1 : 0, 2026-10-25T02:20:05.7441357Z ╰──── 2026-10-25T02:20:05.7441670Z  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-25T02:20:05.7442217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7442500Z 2026-10-25T02:20:05.7442654Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7442964Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:64:7] 2026-10-25T02:20:05.7443216Z 34 │ const { renderedInspectorWidth } = props; 2026-10-25T02:20:05.7443456Z 35 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T02:20:05.7443687Z ·  ──────────┬───────── 2026-10-25T02:20:05.7443937Z · ╰── `renderedContentWidth` originates here 2026-10-25T02:20:05.7444138Z 36 │ 2026-10-25T02:20:05.7444277Z 37 │ const onClosed = props.onClosed; 2026-10-25T02:20:05.7444444Z 38 │ useEffect(() => { 2026-10-25T02:20:05.7444725Z 39 │ inspectorProgress.value = withTiming( 2026-10-25T02:20:05.7444964Z 40 │ inspectorVisible ? 1 : 0, 2026-10-25T02:20:05.7445139Z 41 │ WORKSPACE_PANE_TIMING, 2026-10-25T02:20:05.7445323Z 42 │ (finished) => { 2026-10-25T02:20:05.7445539Z 43 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-25T02:20:05.7445755Z 44 │ runOnJS(onClosed)(); 2026-10-25T02:20:05.7445907Z 45 │ } 2026-10-25T02:20:05.7446029Z 46 │ }, 2026-10-25T02:20:05.7446153Z 47 │ ); 2026-10-25T02:20:05.7446344Z 48 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-25T02:20:05.7446562Z 49 │ renderedInspectorWidth.set( 2026-10-25T02:20:05.7446796Z 50 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-25T02:20:05.7447003Z 51 │ ); 2026-10-25T02:20:05.7447120Z 52 │ }, [ 2026-10-25T02:20:05.7447256Z 53 │ inspectorProgress, 2026-10-25T02:20:05.7447408Z 54 │ inspectorVisible, 2026-10-25T02:20:05.7447555Z 55 │ inspectorWidth, 2026-10-25T02:20:05.7447699Z 56 │ onClosed, 2026-10-25T02:20:05.7447843Z 57 │ renderedInspectorWidth, 2026-10-25T02:20:05.7447995Z 58 │ resizing, 2026-10-25T02:20:05.7448118Z 59 │ ]); 2026-10-25T02:20:05.7448232Z 60 │ 2026-10-25T02:20:05.7448351Z 61 │ useEffect(() => { 2026-10-25T02:20:05.7448522Z 62 │ const targetWidth = inspectorWidth ?? 0; 2026-10-25T02:20:05.7448715Z 63 │ if (!inspectorVisible || resizing) { 2026-10-25T02:20:05.7448914Z 64 │ renderedContentWidth.value = targetWidth; 2026-10-25T02:20:05.7449115Z ·  ──────────┬───────── 2026-10-25T02:20:05.7449364Z · ╰── `renderedContentWidth` cannot be modified 2026-10-25T02:20:05.7449580Z 65 │ return; 2026-10-25T02:20:05.7449707Z ╰──── 2026-10-25T02:20:05.7450023Z  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-25T02:20:05.7450567Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7450854Z 2026-10-25T02:20:05.7451054Z ⚠ eslint(no-unused-vars): Identifier 'FormSheet' is imported but never used. 2026-10-25T02:20:05.7451389Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:26:10] 2026-10-25T02:20:05.7451647Z 25 │ import { StyleSheet, View } from "react-native"; 2026-10-25T02:20:05.7451876Z 26 │ import { FormSheet, Stack } from "react-native-screens"; 2026-10-25T02:20:05.7452089Z ·  ────┬──── 2026-10-25T02:20:05.7452312Z · ╰── 'FormSheet' is imported here 2026-10-25T02:20:05.7452595Z 27 │ import { NativeScrollEdgeEffectsContext } from "./NativeScrollViewMarker"; 2026-10-25T02:20:05.7452805Z ╰──── 2026-10-25T02:20:05.7452954Z  help: Consider removing this import. 2026-10-25T02:20:05.7453067Z 2026-10-25T02:20:05.7453293Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopAction' is imported but never used. 2026-10-25T02:20:05.7453649Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:33:3] 2026-10-25T02:20:05.7453872Z 32 │ nativeStackPopAction, 2026-10-25T02:20:05.7454029Z 33 │ nativeWorkspacePopAction, 2026-10-25T02:20:05.7454212Z ·  ────────────┬─────────── 2026-10-25T02:20:05.7454523Z · ╰── 'nativeWorkspacePopAction' is imported here 2026-10-25T02:20:05.7454783Z 34 │ nativeWorkspacePopCount, 2026-10-25T02:20:05.7454921Z ╰──── 2026-10-25T02:20:05.7455085Z  help: Consider removing this import. 2026-10-25T02:20:05.7455223Z 2026-10-25T02:20:05.7455449Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopCount' is imported but never used. 2026-10-25T02:20:05.7455805Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:34:3] 2026-10-25T02:20:05.7456028Z 33 │ nativeWorkspacePopAction, 2026-10-25T02:20:05.7456194Z 34 │ nativeWorkspacePopCount, 2026-10-25T02:20:05.7456370Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7456618Z · ╰── 'nativeWorkspacePopCount' is imported here 2026-10-25T02:20:05.7456851Z 35 │ partitionStackPresentations, 2026-10-25T02:20:05.7457006Z ╰──── 2026-10-25T02:20:05.7457157Z  help: Consider removing this import. 2026-10-25T02:20:05.7457268Z 2026-10-25T02:20:05.7457409Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7457675Z ╭─[apps/mobile/src/native/StackHeader.tsx:202:9] 2026-10-25T02:20:05.7457866Z 201 │ "options", 2026-10-25T02:20:05.7458041Z 202 │ latestOptionFunctionsRef.current, 2026-10-25T02:20:05.7458255Z ·  ────────────────┬─────────────── 2026-10-25T02:20:05.7458557Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7458829Z 203 │ optionFunctionWrappersRef.current, 2026-10-25T02:20:05.7458995Z ╰──── 2026-10-25T02:20:05.7459512Z  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-25T02:20:05.7460225Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7460497Z 2026-10-25T02:20:05.7460639Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7460905Z ╭─[apps/mobile/src/native/StackHeader.tsx:203:9] 2026-10-25T02:20:05.7461121Z 202 │ latestOptionFunctionsRef.current, 2026-10-25T02:20:05.7461322Z 203 │ optionFunctionWrappersRef.current, 2026-10-25T02:20:05.7461541Z ·  ────────────────┬──────────────── 2026-10-25T02:20:05.7461906Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7462205Z 204 │ ) as NativeStackNavigationOptions) 2026-10-25T02:20:05.7462365Z ╰──── 2026-10-25T02:20:05.7462867Z  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-25T02:20:05.7463575Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7463850Z 2026-10-25T02:20:05.7464213Z ⚠ 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-25T02:20:05.7464654Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-25T02:20:05.7464941Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-25T02:20:05.7465299Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-25T02:20:05.7465570Z ·  ──────────────────────── 2026-10-25T02:20:05.7465745Z 18 │ "review:write", 2026-10-25T02:20:05.7465879Z ╰──── 2026-10-25T02:20:05.7465932Z 2026-10-25T02:20:05.7466284Z ⚠ 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-25T02:20:05.7466716Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-25T02:20:05.7466896Z 19 │ ]); 2026-10-25T02:20:05.7467127Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-25T02:20:05.7467396Z ·  ──────────────────────── 2026-10-25T02:20:05.7467634Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-25T02:20:05.7467827Z ╰──── 2026-10-25T02:20:05.7467883Z 2026-10-25T02:20:05.7468226Z ⚠ 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-25T02:20:05.7468652Z ╭─[packages/contracts/src/auth.test.ts:57:21] 2026-10-25T02:20:05.7468933Z 56 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-25T02:20:05.7469229Z 57 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-25T02:20:05.7469470Z ·  ──────────────────────── 2026-10-25T02:20:05.7469659Z 58 │ authenticated: true, 2026-10-25T02:20:05.7469795Z ╰──── 2026-10-25T02:20:05.7469852Z 2026-10-25T02:20:05.7470105Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7470470Z ╭─[packages/provider-pi/src/server/adapter.ts:3337:7] 2026-10-25T02:20:05.7470669Z 3336 │ 2026-10-25T02:20:05.7470921Z 3337 │ const layer: Layer.Layer = 2026-10-25T02:20:05.7471225Z ·  ──┬── 2026-10-25T02:20:05.7471433Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.7471630Z 3338 │ Layer.effect( 2026-10-25T02:20:05.7471760Z ╰──── 2026-10-25T02:20:05.7471979Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7472147Z 2026-10-25T02:20:05.7472339Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-25T02:20:05.7472661Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-25T02:20:05.7472943Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-25T02:20:05.7473197Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-25T02:20:05.7473400Z ·  ──┬── 2026-10-25T02:20:05.7473607Z · ╰── 'Image' is imported here 2026-10-25T02:20:05.7473793Z 18 │ 2026-10-25T02:20:05.7473904Z ╰──── 2026-10-25T02:20:05.7474056Z  help: Consider removing this import. 2026-10-25T02:20:05.7474167Z 2026-10-25T02:20:05.7474373Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:20:05.7474713Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-25T02:20:05.7475018Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T02:20:05.7475309Z 224 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.7475503Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7476053Z · ╰── 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-25T02:20:05.7476523Z 225 │ mostRecentEventCount, 2026-10-25T02:20:05.7476673Z 226 │ ); 2026-10-25T02:20:05.7476864Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T02:20:05.7477133Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T02:20:05.7477462Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.7477727Z 228 │ const assumedValue = props.value; 2026-10-25T02:20:05.7477887Z ╰──── 2026-10-25T02:20:05.7478105Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:20:05.7478582Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7478873Z 2026-10-25T02:20:05.7479077Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.7479432Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:233:7] 2026-10-25T02:20:05.7479720Z 232 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T02:20:05.7479961Z 233 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.7480155Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7480776Z · ╰── 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-25T02:20:05.7481252Z 234 │ controlledEventCount, 2026-10-25T02:20:05.7481411Z 235 │ assumedValue, 2026-10-25T02:20:05.7481548Z 236 │ ); 2026-10-25T02:20:05.7481768Z 237 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T02:20:05.7482134Z ·  ───────────┬────────── 2026-10-25T02:20:05.7482515Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T02:20:05.7482787Z 238 │ const acceptNativeEvent = useCallback( 2026-10-25T02:20:05.7482947Z ╰──── 2026-10-25T02:20:05.7483409Z  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-25T02:20:05.7484080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7484368Z 2026-10-25T02:20:05.7484513Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7484808Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-25T02:20:05.7485128Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:20:05.7485375Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:20:05.7485614Z ·  ─────────────┬──────────── 2026-10-25T02:20:05.7485899Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7486111Z 161 │ }); 2026-10-25T02:20:05.7486229Z ╰──── 2026-10-25T02:20:05.7486739Z  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-25T02:20:05.7487432Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7487702Z 2026-10-25T02:20:05.7487841Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7488130Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-25T02:20:05.7488395Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:20:05.7488641Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:20:05.7488879Z ·  ─────────────┬──────────── 2026-10-25T02:20:05.7489199Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7489443Z 161 │ }); 2026-10-25T02:20:05.7489561Z ╰──── 2026-10-25T02:20:05.7490065Z  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-25T02:20:05.7490754Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7491021Z 2026-10-25T02:20:05.7491162Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7491448Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-25T02:20:05.7491651Z 161 │ }); 2026-10-25T02:20:05.7491858Z 162 │ confirmedTokensRef.current = tokens; 2026-10-25T02:20:05.7492119Z ·  ─────────┬────────────┬─── 2026-10-25T02:20:05.7492428Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.7492713Z · ╰── This value is a ref 2026-10-25T02:20:05.7492909Z 163 │ return JSON.stringify( 2026-10-25T02:20:05.7493048Z ╰──── 2026-10-25T02:20:05.7493557Z  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-25T02:20:05.7494252Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7494526Z 2026-10-25T02:20:05.7494671Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7494957Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-25T02:20:05.7495215Z 203 │ mostRecentEventCount, 2026-10-25T02:20:05.7495391Z 204 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.7495599Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.7495894Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7496123Z 205 │ ); 2026-10-25T02:20:05.7496238Z ╰──── 2026-10-25T02:20:05.7496740Z  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-25T02:20:05.7497431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7497709Z 2026-10-25T02:20:05.7497847Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7498132Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-25T02:20:05.7498345Z 209 │ mostRecentEventCount, 2026-10-25T02:20:05.7498523Z 210 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.7498730Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.7499033Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7499317Z 211 │ ); 2026-10-25T02:20:05.7499483Z ╰──── 2026-10-25T02:20:05.7499987Z  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-25T02:20:05.7500679Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7500946Z 2026-10-25T02:20:05.7501130Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:20:05.7501454Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-25T02:20:05.7501724Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:20:05.7501981Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:20:05.7502217Z ·  ─────────┬──────── 2026-10-25T02:20:05.7502793Z · ╰── 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-25T02:20:05.7503245Z 161 │ }); 2026-10-25T02:20:05.7503401Z 162 │ confirmedTokensRef.current = tokens; 2026-10-25T02:20:05.7503576Z 163 │ return JSON.stringify( 2026-10-25T02:20:05.7503827Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T02:20:05.7504060Z 165 │ const record = 2026-10-25T02:20:05.7504222Z 166 │ token.type === "context" 2026-10-25T02:20:05.7504487Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T02:20:05.7504721Z 168 │ : undefined; 2026-10-25T02:20:05.7504912Z 169 │ const presentation = contextChipPresentation( 2026-10-25T02:20:05.7505168Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-25T02:20:05.7505355Z 171 │ record, 2026-10-25T02:20:05.7505491Z 172 │ ); 2026-10-25T02:20:05.7505648Z 173 │ const icon = contextChipIcon( 2026-10-25T02:20:05.7505816Z 174 │ presentation, 2026-10-25T02:20:05.7506045Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T02:20:05.7506251Z 176 │ ); 2026-10-25T02:20:05.7506385Z 177 │ return { 2026-10-25T02:20:05.7506532Z 178 │ type: token.type, 2026-10-25T02:20:05.7506691Z 179 │ source: token.source, 2026-10-25T02:20:05.7506865Z 180 │ start: token.start, 2026-10-25T02:20:05.7507023Z 181 │ end: token.end, 2026-10-25T02:20:05.7507259Z 182 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T02:20:05.7507474Z 183 │ label: 2026-10-25T02:20:05.7507629Z 184 │ token.type === "skill" 2026-10-25T02:20:05.7507832Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T02:20:05.7508037Z 186 │ : token.type === "context" 2026-10-25T02:20:05.7508367Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T02:20:05.7508669Z 188 │ : basename(token.value), 2026-10-25T02:20:05.7508912Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T02:20:05.7509286Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-25T02:20:05.7509516Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-25T02:20:05.7509676Z 192 │ }; 2026-10-25T02:20:05.7509808Z 193 │ }), 2026-10-25T02:20:05.7509928Z 194 │ ); 2026-10-25T02:20:05.7510128Z 195 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T02:20:05.7510435Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T02:20:05.7510792Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.7511116Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T02:20:05.7511318Z ╰──── 2026-10-25T02:20:05.7511581Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:20:05.7512086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7512374Z 2026-10-25T02:20:05.7512566Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:20:05.7512892Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:255:5] 2026-10-25T02:20:05.7513168Z 247 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T02:20:05.7513411Z 248 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T02:20:05.7513621Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7514180Z · ╰── 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-25T02:20:05.7514675Z 249 │ eventCount: acknowledgedEventCount, 2026-10-25T02:20:05.7514852Z 250 │ value, 2026-10-25T02:20:05.7515005Z 251 │ selection: nextSelection, 2026-10-25T02:20:05.7515198Z 252 │ }); 2026-10-25T02:20:05.7515352Z 253 │ return acknowledgedEventCount; 2026-10-25T02:20:05.7515509Z 254 │ }, 2026-10-25T02:20:05.7515636Z 255 │ [], 2026-10-25T02:20:05.7515768Z ·  ─┬ 2026-10-25T02:20:05.7516029Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.7516262Z 256 │ ); 2026-10-25T02:20:05.7516382Z ╰──── 2026-10-25T02:20:05.7516642Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:20:05.7517148Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7517435Z 2026-10-25T02:20:05.7517632Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-25T02:20:05.7517960Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-25T02:20:05.7518196Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-25T02:20:05.7518400Z 24 │ import * as Duration from "effect/Duration"; 2026-10-25T02:20:05.7548269Z ·  ────┬─── 2026-10-25T02:20:05.7548543Z · ╰── 'Duration' is imported here 2026-10-25T02:20:05.7548776Z 25 │ import * as Effect from "effect/Effect"; 2026-10-25T02:20:05.7549058Z ╰──── 2026-10-25T02:20:05.7549252Z  help: Consider removing this import. 2026-10-25T02:20:05.7549366Z 2026-10-25T02:20:05.7549632Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-25T02:20:05.7550013Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-25T02:20:05.7550308Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-25T02:20:05.7550537Z 12 │ this.onmessage = listener; 2026-10-25T02:20:05.7550711Z ·  ───────── 2026-10-25T02:20:05.7550856Z 13 │ } 2026-10-25T02:20:05.7550969Z ╰──── 2026-10-25T02:20:05.7551330Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-25T02:20:05.7551610Z 2026-10-25T02:20:05.7551808Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T02:20:05.7552131Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-25T02:20:05.7552337Z 15 │ constructor() { 2026-10-25T02:20:05.7552476Z 16 │ source = this; 2026-10-25T02:20:05.7552625Z ·  ────── 2026-10-25T02:20:05.7552756Z 17 │ } 2026-10-25T02:20:05.7552865Z ╰──── 2026-10-25T02:20:05.7553178Z  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-25T02:20:05.7553428Z 2026-10-25T02:20:05.7553604Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:20:05.7553966Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:121:34] 2026-10-25T02:20:05.7554215Z 120 │ return [...commands]; 2026-10-25T02:20:05.7554434Z 121 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-25T02:20:05.7554688Z ·  ─────────┬───────── 2026-10-25T02:20:05.7554989Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-25T02:20:05.7555242Z 122 │ 2026-10-25T02:20:05.7555352Z ╰──── 2026-10-25T02:20:05.7555704Z  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-25T02:20:05.7556299Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7556589Z 2026-10-25T02:20:05.7556768Z ⚠ react(static-components): Cannot create components during render 2026-10-25T02:20:05.7557101Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-25T02:20:05.7557346Z 196 │ const { onInput, onResize } = props; 2026-10-25T02:20:05.7557592Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-25T02:20:05.7557873Z ·  ────────────────┬─────────────── 2026-10-25T02:20:05.7558184Z · ╰── The component is created during render here 2026-10-25T02:20:05.7558483Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-25T02:20:05.7558728Z 199 │ 2026-10-25T02:20:05.7558883Z 200 │ useEffect(() => { 2026-10-25T02:20:05.7559053Z 201 │ terminalDebugLog("native:surface", { 2026-10-25T02:20:05.7559241Z 202 │ terminalKey: props.terminalKey, 2026-10-25T02:20:05.7559417Z 203 │ native: hasNativeSurface, 2026-10-25T02:20:05.7559647Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-25T02:20:05.7559871Z 205 │ bufferLen: props.buffer.length, 2026-10-25T02:20:05.7560047Z 206 │ isRunning: props.isRunning, 2026-10-25T02:20:05.7560196Z 207 │ }); 2026-10-25T02:20:05.7560422Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-25T02:20:05.7560732Z 209 │ const handleNativeInput = useCallback( 2026-10-25T02:20:05.7560951Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-25T02:20:05.7561178Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-25T02:20:05.7561354Z 212 │ return; 2026-10-25T02:20:05.7561482Z 213 │ } 2026-10-25T02:20:05.7561634Z 214 │ terminalDebugLog("native:onInput", { 2026-10-25T02:20:05.7561887Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-25T02:20:05.7562096Z 216 │ }); 2026-10-25T02:20:05.7562248Z 217 │ onInput(event.nativeEvent.data); 2026-10-25T02:20:05.7562404Z 218 │ }, 2026-10-25T02:20:05.7562562Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-25T02:20:05.7562728Z 220 │ ); 2026-10-25T02:20:05.7562877Z 221 │ const handleNativeResize = useCallback( 2026-10-25T02:20:05.7563089Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-25T02:20:05.7563280Z 223 │ onResize({ 2026-10-25T02:20:05.7563441Z 224 │ cols: event.nativeEvent.cols, 2026-10-25T02:20:05.7563662Z 225 │ rows: event.nativeEvent.rows, 2026-10-25T02:20:05.7563820Z 226 │ }); 2026-10-25T02:20:05.7563938Z 227 │ }, 2026-10-25T02:20:05.7564061Z 228 │ [onResize], 2026-10-25T02:20:05.7564187Z 229 │ ); 2026-10-25T02:20:05.7564300Z 230 │ 2026-10-25T02:20:05.7564437Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-25T02:20:05.7564595Z 232 │ return ( 2026-10-25T02:20:05.7564743Z 233 │ 2026-10-25T02:20:05.7564918Z 234 │ { 2026-10-25T02:20:05.7569983Z ·  ────┬──── 2026-10-25T02:20:05.7570199Z · ╰── This is the containing effect 2026-10-25T02:20:05.7570443Z 638 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-25T02:20:05.7570632Z 639 │ return; 2026-10-25T02:20:05.7570758Z 640 │ } 2026-10-25T02:20:05.7570898Z 641 │ setPendingLaunchEntry({ 2026-10-25T02:20:05.7571079Z ·  ──────────┬────────── 2026-10-25T02:20:05.7571342Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7571577Z 642 │ key: launchTargetKey, 2026-10-25T02:20:05.7571714Z ╰──── 2026-10-25T02:20:05.7572349Z  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-25T02:20:05.7573177Z  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-25T02:20:05.7573475Z 2026-10-25T02:20:05.7573734Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7574141Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:651:5] 2026-10-25T02:20:05.7574360Z 646 │ 2026-10-25T02:20:05.7574480Z 647 │ useEffect(() => { 2026-10-25T02:20:05.7574633Z ·  ────┬──── 2026-10-25T02:20:05.7574841Z · ╰── This is the containing effect 2026-10-25T02:20:05.7575101Z 648 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-25T02:20:05.7575316Z 649 │ return; 2026-10-25T02:20:05.7575449Z 650 │ } 2026-10-25T02:20:05.7575593Z 651 │ setInitialAttachGridEntry({ 2026-10-25T02:20:05.7575788Z ·  ────────────┬──────────── 2026-10-25T02:20:05.7576115Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7576390Z 652 │ key: launchTargetKey, 2026-10-25T02:20:05.7576528Z ╰──── 2026-10-25T02:20:05.7577158Z  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-25T02:20:05.7577988Z  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-25T02:20:05.7578283Z 2026-10-25T02:20:05.7578533Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7578933Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:744:7] 2026-10-25T02:20:05.7579156Z 741 │ 2026-10-25T02:20:05.7579277Z 742 │ useEffect(() => { 2026-10-25T02:20:05.7579431Z ·  ────┬──── 2026-10-25T02:20:05.7579643Z · ╰── This is the containing effect 2026-10-25T02:20:05.7579875Z 743 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-25T02:20:05.7580060Z 744 │ setLastGridSize({ 2026-10-25T02:20:05.7580228Z ·  ───────┬─────── 2026-10-25T02:20:05.7580487Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7580728Z 745 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-25T02:20:05.7580876Z ╰──── 2026-10-25T02:20:05.7581515Z  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-25T02:20:05.7582345Z  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-25T02:20:05.7582642Z 2026-10-25T02:20:05.7582837Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7583199Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:536:24] 2026-10-25T02:20:05.7583421Z 535 │ }); 2026-10-25T02:20:05.7583612Z 536 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-25T02:20:05.7583858Z ·  ───────────┬────────── 2026-10-25T02:20:05.7584220Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-25T02:20:05.7584599Z 537 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-25T02:20:05.7584818Z ╰──── 2026-10-25T02:20:05.7585196Z  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-25T02:20:05.7585772Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7586067Z 2026-10-25T02:20:05.7586313Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7586712Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:707:7] 2026-10-25T02:20:05.7586978Z 706 │ sentInitialInputKeyRef.current = null; 2026-10-25T02:20:05.7587161Z 707 │ }, [terminalKey]); 2026-10-25T02:20:05.7587318Z ·  ─────┬───── 2026-10-25T02:20:05.7587553Z · ╰── Unnecessary dependency `terminalKey` 2026-10-25T02:20:05.7587749Z 708 │ 2026-10-25T02:20:05.7587862Z ╰──── 2026-10-25T02:20:05.7588195Z  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-25T02:20:05.7588768Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7589058Z 2026-10-25T02:20:05.7589251Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7589611Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:798:52] 2026-10-25T02:20:05.7589834Z 797 │ }; 2026-10-25T02:20:05.7590075Z 798 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-25T02:20:05.7590438Z ·  ────────────┬──────────── ─────┬───── 2026-10-25T02:20:05.7590828Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-25T02:20:05.7591238Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-25T02:20:05.7591488Z 799 │ 2026-10-25T02:20:05.7591596Z ╰──── 2026-10-25T02:20:05.7591933Z  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-25T02:20:05.7592497Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7592786Z 2026-10-25T02:20:05.7592931Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7593245Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:791:24] 2026-10-25T02:20:05.7593470Z 790 │ } 2026-10-25T02:20:05.7593638Z 791 │ const pasteSession = pasteSessionRef.current; 2026-10-25T02:20:05.7593876Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7594152Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7594362Z 792 │ 2026-10-25T02:20:05.7594469Z ╰──── 2026-10-25T02:20:05.7594981Z  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-25T02:20:05.7595707Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7595978Z 2026-10-25T02:20:05.7596196Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.7596513Z ╭─[apps/web/src/hooks/useThreadActions.ts:839:56] 2026-10-25T02:20:05.7596748Z 838 │ const resolved = resolveThreadTarget(target); 2026-10-25T02:20:05.7597019Z 839 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-25T02:20:05.7597302Z ·  ─────┬──── 2026-10-25T02:20:05.7597589Z · ╰── Cannot call impure function 2026-10-25T02:20:05.7597826Z 840 │ return AsyncResult.failure( 2026-10-25T02:20:05.7597975Z ╰──── 2026-10-25T02:20:05.7598306Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.7598861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.7599138Z 2026-10-25T02:20:05.7599302Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.7599585Z ╭─[apps/web/src/hooks/useThreadActions.ts:727:46] 2026-10-25T02:20:05.7599783Z 726 │ const wokeAt = resolved 2026-10-25T02:20:05.7600009Z 727 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-25T02:20:05.7600268Z ·  ─────┬──── 2026-10-25T02:20:05.7600547Z · ╰── Cannot call impure function 2026-10-25T02:20:05.7600825Z 728 │ : null; 2026-10-25T02:20:05.7600950Z ╰──── 2026-10-25T02:20:05.7601276Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.7601816Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.7602092Z 2026-10-25T02:20:05.7602342Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7602737Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-25T02:20:05.7603061Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-25T02:20:05.7603296Z 113 │ useEffect(() => { 2026-10-25T02:20:05.7603447Z ·  ────┬──── 2026-10-25T02:20:05.7603669Z · ╰── This is the containing effect 2026-10-25T02:20:05.7603966Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-25T02:20:05.7604189Z 115 │ return; 2026-10-25T02:20:05.7604315Z 116 │ } 2026-10-25T02:20:05.7604498Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-25T02:20:05.7604698Z ·  ────┬─── 2026-10-25T02:20:05.7604948Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7605263Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-25T02:20:05.7605444Z ╰──── 2026-10-25T02:20:05.7606153Z  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-25T02:20:05.7607028Z  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-25T02:20:05.7607326Z 2026-10-25T02:20:05.7607661Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.7608106Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-25T02:20:05.7608412Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-25T02:20:05.7608748Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T02:20:05.7609008Z ·  ───────── 2026-10-25T02:20:05.7609285Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T02:20:05.7609515Z ╰──── 2026-10-25T02:20:05.7609570Z 2026-10-25T02:20:05.7609891Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.7610328Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-25T02:20:05.7610643Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T02:20:05.7610984Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T02:20:05.7611248Z ·  ───────── 2026-10-25T02:20:05.7611403Z 52 │ } 2026-10-25T02:20:05.7611519Z ╰──── 2026-10-25T02:20:05.7611575Z 2026-10-25T02:20:05.7611895Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.7612327Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-25T02:20:05.7612546Z 54 │ assert.equal( 2026-10-25T02:20:05.7612791Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T02:20:05.7613037Z ·  ───────── 2026-10-25T02:20:05.7613178Z 56 │ true, 2026-10-25T02:20:05.7613299Z ╰──── 2026-10-25T02:20:05.7613350Z 2026-10-25T02:20:05.7613676Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.7614113Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-25T02:20:05.7614322Z 58 │ assert.equal( 2026-10-25T02:20:05.7614578Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T02:20:05.7614827Z ·  ───────── 2026-10-25T02:20:05.7614968Z 60 │ true, 2026-10-25T02:20:05.7615112Z ╰──── 2026-10-25T02:20:05.7615168Z 2026-10-25T02:20:05.7615490Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.7615930Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-25T02:20:05.7616136Z 102 │ 2026-10-25T02:20:05.7616405Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-25T02:20:05.7616696Z ·  ───────── 2026-10-25T02:20:05.7616848Z 104 │ }); 2026-10-25T02:20:05.7616957Z ╰──── 2026-10-25T02:20:05.7617015Z 2026-10-25T02:20:05.7617280Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7617687Z ╭─[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9] 2026-10-25T02:20:05.7617998Z 31 │ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const]; 2026-10-25T02:20:05.7618229Z 32 │ const navigation = useNavigation(); 2026-10-25T02:20:05.7618405Z ·  ─────┬──── 2026-10-25T02:20:05.7618632Z · ╰── 'navigation' is declared here 2026-10-25T02:20:05.7618872Z 33 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T02:20:05.7619036Z ╰──── 2026-10-25T02:20:05.7619197Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7619314Z 2026-10-25T02:20:05.7619496Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.7619846Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-25T02:20:05.7620097Z 554 │ assert.deepStrictEqual( 2026-10-25T02:20:05.7620365Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T02:20:05.7620650Z ·  ┬ 2026-10-25T02:20:05.7620941Z · ╰── '_' is declared here 2026-10-25T02:20:05.7621159Z 556 │ [ 2026-10-25T02:20:05.7621283Z ╰──── 2026-10-25T02:20:05.7621440Z  help: Consider removing this parameter. 2026-10-25T02:20:05.7621555Z 2026-10-25T02:20:05.7621733Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.7622083Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1154:70] 2026-10-25T02:20:05.7622334Z 1153 │ assert.deepStrictEqual( 2026-10-25T02:20:05.7622597Z 1154 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T02:20:05.7622879Z ·  ┬ 2026-10-25T02:20:05.7623228Z · ╰── '_' is declared here 2026-10-25T02:20:05.7623472Z 1155 │ [ 2026-10-25T02:20:05.7623602Z ╰──── 2026-10-25T02:20:05.7623756Z  help: Consider removing this parameter. 2026-10-25T02:20:05.7623871Z 2026-10-25T02:20:05.7624073Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-25T02:20:05.7624412Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-25T02:20:05.7624617Z 236 │ 2026-10-25T02:20:05.7624791Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-25T02:20:05.7625005Z ·  ───────┬────── 2026-10-25T02:20:05.7625276Z · ╰── 'nonEmptyString' is declared here 2026-10-25T02:20:05.7625555Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-25T02:20:05.7625765Z ╰──── 2026-10-25T02:20:05.7625924Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7626040Z 2026-10-25T02:20:05.7626301Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7626703Z ╭─[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9] 2026-10-25T02:20:05.7626962Z 22 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T02:20:05.7627154Z 23 │ const navigation = useNavigation(); 2026-10-25T02:20:05.7627334Z ·  ─────┬──── 2026-10-25T02:20:05.7627557Z · ╰── 'navigation' is declared here 2026-10-25T02:20:05.7627781Z 24 │ const selected = selectedNavigationTab( 2026-10-25T02:20:05.7627938Z ╰──── 2026-10-25T02:20:05.7628101Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7628218Z 2026-10-25T02:20:05.7628371Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7628668Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-25T02:20:05.7628962Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-25T02:20:05.7629250Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-25T02:20:05.7629472Z ·  ────┬─── 2026-10-25T02:20:05.7629697Z · ╰── `rotation` originates here 2026-10-25T02:20:05.7629886Z 172 │ 2026-10-25T02:20:05.7630014Z 173 │ useLayoutEffect(() => { 2026-10-25T02:20:05.7630240Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-25T02:20:05.7630463Z ·  ────┬─── 2026-10-25T02:20:05.7630685Z · ╰── `rotation` cannot be modified 2026-10-25T02:20:05.7630919Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-25T02:20:05.7631089Z ╰──── 2026-10-25T02:20:05.7631404Z  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-25T02:20:05.7631953Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7632236Z 2026-10-25T02:20:05.7632430Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.7632763Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1238:23] 2026-10-25T02:20:05.7633037Z 1237 │ cancelAnimationFrame(frame); 2026-10-25T02:20:05.7641033Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-25T02:20:05.7641257Z ·  ──────┬───── 2026-10-25T02:20:05.7641539Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-25T02:20:05.7641805Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-25T02:20:05.7641974Z ╰──── 2026-10-25T02:20:05.7642317Z  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-25T02:20:05.7642957Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7643291Z 2026-10-25T02:20:05.7643528Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:20:05.7643904Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:287:50] 2026-10-25T02:20:05.7644128Z 286 │ return ( 2026-10-25T02:20:05.7644331Z 287 │ 2026-10-25T02:20:05.7644595Z ·  ───────────── 2026-10-25T02:20:05.7644783Z 288 │ {props.children} 2026-10-25T02:20:05.7644925Z ╰──── 2026-10-25T02:20:05.7645260Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:20:05.7645617Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:20:05.7645792Z 2026-10-25T02:20:05.7646030Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:20:05.7646409Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:651:44] 2026-10-25T02:20:05.7646627Z 650 │ return ( 2026-10-25T02:20:05.7646815Z 651 │ 2026-10-25T02:20:05.7647060Z ·  ───────────── 2026-10-25T02:20:05.7647246Z 652 │ {props.children} 2026-10-25T02:20:05.7647384Z ╰──── 2026-10-25T02:20:05.7647650Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:20:05.7647997Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:20:05.7648174Z 2026-10-25T02:20:05.7648403Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:20:05.7648779Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1459:55] 2026-10-25T02:20:05.7649000Z 1458 │ return ( 2026-10-25T02:20:05.7649231Z 1459 │ 2026-10-25T02:20:05.7649529Z ·  ──────────────────── 2026-10-25T02:20:05.7649757Z 1460 │ approval.requestId, 2026-10-25T02:20:05.7652606Z 987 │ ╰─▶ ); 2026-10-25T02:20:05.7652918Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-25T02:20:05.7653118Z ╰──── 2026-10-25T02:20:05.7653253Z  help: Switch to `Set` 2026-10-25T02:20:05.7653346Z 2026-10-25T02:20:05.7653804Z ⚠ 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-25T02:20:05.7654381Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-25T02:20:05.7654650Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-25T02:20:05.7654959Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-25T02:20:05.7655394Z 567 │ │ const nextEvent = { 2026-10-25T02:20:05.7655667Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-25T02:20:05.7655957Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-25T02:20:05.7656192Z 570 │ │ threadId, 2026-10-25T02:20:05.7656401Z 571 │ │ providerInstanceId, 2026-10-25T02:20:05.7656617Z 572 │ │ occurredAt: now, 2026-10-25T02:20:05.7656874Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-25T02:20:05.7657148Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-25T02:20:05.7657401Z 575 │ │ const reader = yield* eventSink 2026-10-25T02:20:05.7657649Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-25T02:20:05.7657913Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-25T02:20:05.7658153Z 578 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7658434Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-25T02:20:05.7658723Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-25T02:20:05.7658978Z 581 │ │ if (Option.isNone(received)) { 2026-10-25T02:20:05.7659296Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-25T02:20:05.7659573Z 583 │ │ } 2026-10-25T02:20:05.7659834Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-25T02:20:05.7660142Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-25T02:20:05.7660416Z 586 │ │ afterSequence = received.value.sequence; 2026-10-25T02:20:05.7660684Z 587 │ ╰─▶ } 2026-10-25T02:20:05.7660878Z 588 │ }), 2026-10-25T02:20:05.7661004Z ╰──── 2026-10-25T02:20:05.7661060Z 2026-10-25T02:20:05.7661514Z ⚠ 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-25T02:20:05.7662090Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2324:9] 2026-10-25T02:20:05.7662397Z 2323 │ let settled = false; 2026-10-25T02:20:05.7662689Z 2324 │ ╭─▶ while (!settled) { 2026-10-25T02:20:05.7663003Z 2325 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-25T02:20:05.7663297Z 2326 │ │ (effect) => effect.status === "succeeded", 2026-10-25T02:20:05.7663517Z 2327 │ │ ); 2026-10-25T02:20:05.7663741Z 2328 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-25T02:20:05.7664007Z 2329 │ ╰─▶ } 2026-10-25T02:20:05.7664262Z 2330 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-25T02:20:05.7664443Z ╰──── 2026-10-25T02:20:05.7664500Z 2026-10-25T02:20:05.7664743Z × t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background. 2026-10-25T02:20:05.7665136Z ╭─[apps/server/src/orchestration-v2/WireProjection.ts:259:1] 2026-10-25T02:20:05.7665334Z 258 │ 2026-10-25T02:20:05.7665527Z 259 │ ╭─▶ /** 2026-10-25T02:20:05.7665858Z 260 │ │ * One per subscription, applied after coalescing so it only remembers records the client 2026-10-25T02:20:05.7666258Z 261 │ │ * received, in the snapshot or in events. A record event comes before the turn item that repeats 2026-10-25T02:20:05.7666659Z 262 │ │ * its body (adapters and the orchestrator emit them in that order), so the item can ship blank 2026-10-25T02:20:05.7667060Z 263 │ │ * and marked; so can a repeated subagent record. Emitting in the other order, or forgetting a 2026-10-25T02:20:05.7667391Z 264 │ │ * record, only costs bytes: the repeat ships whole. 2026-10-25T02:20:05.7667659Z 265 │ ╰─▶ */ 2026-10-25T02:20:05.7667882Z 266 │ export function makeLiveBodyDeduper(): ( 2026-10-25T02:20:05.7668051Z ╰──── 2026-10-25T02:20:05.7668109Z 2026-10-25T02:20:05.7668361Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7668762Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:405:7] 2026-10-25T02:20:05.7668983Z 404 │ 2026-10-25T02:20:05.7669168Z 405 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-25T02:20:05.7669377Z ·  ──┬── 2026-10-25T02:20:05.7669641Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.7669850Z ╰──── 2026-10-25T02:20:05.7670011Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7670126Z 2026-10-25T02:20:05.7670380Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7670771Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:358:7] 2026-10-25T02:20:05.7671061Z 352 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-25T02:20:05.7671273Z 353 │ useEffect(() => { 2026-10-25T02:20:05.7671429Z ·  ────┬──── 2026-10-25T02:20:05.7671644Z · ╰── This is the containing effect 2026-10-25T02:20:05.7671871Z 354 │ if (!isReturningToProjectPicker) { 2026-10-25T02:20:05.7672043Z 355 │ return; 2026-10-25T02:20:05.7672179Z 356 │ } 2026-10-25T02:20:05.7672342Z 357 │ if (requestedInitialProjectAvailable) { 2026-10-25T02:20:05.7672552Z 358 │ setIsReturningToProjectPicker(false); 2026-10-25T02:20:05.7672766Z ·  ──────────────┬────────────── 2026-10-25T02:20:05.7673053Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7673282Z 359 │ return; 2026-10-25T02:20:05.7673410Z ╰──── 2026-10-25T02:20:05.7674050Z  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-25T02:20:05.7674903Z  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-25T02:20:05.7675243Z 2026-10-25T02:20:05.7675498Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7675886Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:496:9] 2026-10-25T02:20:05.7676097Z 441 │ 2026-10-25T02:20:05.7676223Z 442 │ useEffect(() => { 2026-10-25T02:20:05.7676374Z ·  ────┬──── 2026-10-25T02:20:05.7676582Z · ╰── This is the containing effect 2026-10-25T02:20:05.7676814Z 443 │ if (props.pendingTaskId || props.draftId) { 2026-10-25T02:20:05.7676987Z 444 │ return; 2026-10-25T02:20:05.7677114Z 445 │ } 2026-10-25T02:20:05.7677320Z 446 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-25T02:20:05.7677606Z 447 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-25T02:20:05.7677849Z 448 │ appliedInitialProjectKeyRef.current = null; 2026-10-25T02:20:05.7678021Z 449 │ } 2026-10-25T02:20:05.7678221Z 450 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T02:20:05.7678495Z 451 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T02:20:05.7678730Z 452 │ if (initialEnvironmentId && initialProjectId) { 2026-10-25T02:20:05.7678916Z 453 │ const directProject = 2026-10-25T02:20:05.7679075Z 454 │ projects.find( 2026-10-25T02:20:05.7679221Z 455 │ (project) => 2026-10-25T02:20:05.7679475Z 456 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-25T02:20:05.7679762Z 457 │ ) ?? null; 2026-10-25T02:20:05.7679931Z 458 │ 2026-10-25T02:20:05.7680062Z 459 │ if (directProject) { 2026-10-25T02:20:05.7680297Z 460 │ // Apply the route project once or picker changes would immediately revert. 2026-10-25T02:20:05.7680609Z 461 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-25T02:20:05.7680982Z 462 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-25T02:20:05.7681189Z 463 │ return; 2026-10-25T02:20:05.7681330Z 464 │ } 2026-10-25T02:20:05.7681498Z 465 │ if (props.initialProjectRef?.branch) { 2026-10-25T02:20:05.7681670Z 466 │ if ( 2026-10-25T02:20:05.7681885Z 467 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-25T02:20:05.7682139Z 468 │ selectedProject.id !== directProject.id 2026-10-25T02:20:05.7682320Z 469 │ ) { 2026-10-25T02:20:05.7682475Z 470 │ setProject(directProject); 2026-10-25T02:20:05.7682638Z 471 │ return; 2026-10-25T02:20:05.7682769Z 472 │ } 2026-10-25T02:20:05.7682918Z 473 │ if (!flow.draftKey) return; 2026-10-25T02:20:05.7683202Z 474 │ // Checkout completed before mount; local mode reuses it while worktree mode would create another. 2026-10-25T02:20:05.7683492Z 475 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-25T02:20:05.7683692Z 476 │ workspaceSelection: { 2026-10-25T02:20:05.7683855Z 477 │ mode: "local", 2026-10-25T02:20:05.7684048Z 478 │ branch: props.initialProjectRef.branch, 2026-10-25T02:20:05.7684295Z 479 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-25T02:20:05.7684530Z 480 │ startFromOrigin: false, 2026-10-25T02:20:05.7684691Z 481 │ }, 2026-10-25T02:20:05.7684823Z 482 │ }); 2026-10-25T02:20:05.7684945Z 483 │ } 2026-10-25T02:20:05.7685167Z 484 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-25T02:20:05.7685359Z 485 │ if ( 2026-10-25T02:20:05.7685566Z 486 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-25T02:20:05.7685813Z 487 │ selectedProject.id === directProject.id 2026-10-25T02:20:05.7685980Z 488 │ ) { 2026-10-25T02:20:05.7686109Z 489 │ return; 2026-10-25T02:20:05.7686241Z 490 │ } 2026-10-25T02:20:05.7686385Z 491 │ setProject(directProject); 2026-10-25T02:20:05.7686544Z 492 │ return; 2026-10-25T02:20:05.7686669Z 493 │ } 2026-10-25T02:20:05.7686784Z 494 │ 2026-10-25T02:20:05.7686918Z 495 │ if (projects.length > 0) { 2026-10-25T02:20:05.7687113Z 496 │ setIsReturningToProjectPicker(true); 2026-10-25T02:20:05.7687326Z ·  ──────────────┬────────────── 2026-10-25T02:20:05.7687611Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7687831Z 497 │ } 2026-10-25T02:20:05.7687945Z ╰──── 2026-10-25T02:20:05.7688572Z  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-25T02:20:05.7689474Z  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-25T02:20:05.7689812Z 2026-10-25T02:20:05.7690061Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7690449Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:596:5] 2026-10-25T02:20:05.7690653Z 537 │ 2026-10-25T02:20:05.7690776Z 538 │ useEffect(() => { 2026-10-25T02:20:05.7690931Z ·  ────┬──── 2026-10-25T02:20:05.7691143Z · ╰── This is the containing effect 2026-10-25T02:20:05.7691368Z 539 │ const shareId = props.incomingShareId; 2026-10-25T02:20:05.7691556Z 540 │ const draftKey = flow.draftKey; 2026-10-25T02:20:05.7691748Z 541 │ const destinationProject = selectedProject; 2026-10-25T02:20:05.7692005Z 542 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T02:20:05.7692280Z 543 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T02:20:05.7692500Z 544 │ const selectedProjectMatchesRoute = 2026-10-25T02:20:05.7692683Z 545 │ !initialEnvironmentId || 2026-10-25T02:20:05.7692843Z 546 │ !initialProjectId || 2026-10-25T02:20:05.7693064Z 547 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-25T02:20:05.7693307Z 548 │ destinationProject.id === initialProjectId); 2026-10-25T02:20:05.7693480Z 549 │ if ( 2026-10-25T02:20:05.7693610Z 550 │ !shareId || 2026-10-25T02:20:05.7693748Z 551 │ !draftKey || 2026-10-25T02:20:05.7693897Z 552 │ !destinationProject || 2026-10-25T02:20:05.7694075Z 553 │ !selectedProjectMatchesRoute || 2026-10-25T02:20:05.7694273Z 554 │ cancelledIncomingShareId === shareId 2026-10-25T02:20:05.7694431Z 555 │ ) { 2026-10-25T02:20:05.7694553Z 556 │ return; 2026-10-25T02:20:05.7694678Z 557 │ } 2026-10-25T02:20:05.7694832Z 558 │ const importKey = `${shareId}:${draftKey}`; 2026-10-25T02:20:05.7694997Z 559 │ if ( 2026-10-25T02:20:05.7695198Z 560 │ startedShareImportKeyRef.current === importKey || 2026-10-25T02:20:05.7695430Z 561 │ cancellingShareImportKeyRef.current === importKey 2026-10-25T02:20:05.7695609Z 562 │ ) { 2026-10-25T02:20:05.7695734Z 563 │ return; 2026-10-25T02:20:05.7695856Z 564 │ } 2026-10-25T02:20:05.7695971Z 565 │ 2026-10-25T02:20:05.7696091Z 566 │ if (!incomingShare) { 2026-10-25T02:20:05.7696368Z 567 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-25T02:20:05.7696693Z 568 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-25T02:20:05.7696896Z 569 │ Dialog.alert( 2026-10-25T02:20:05.7697059Z 570 │ "Shared content unavailable", 2026-10-25T02:20:05.7697330Z 571 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-25T02:20:05.7697553Z 572 │ ); 2026-10-25T02:20:05.7697670Z 573 │ } 2026-10-25T02:20:05.7697795Z 574 │ return; 2026-10-25T02:20:05.7697915Z 575 │ } 2026-10-25T02:20:05.7698027Z 576 │ 2026-10-25T02:20:05.7698136Z 577 │ if ( 2026-10-25T02:20:05.7698357Z 578 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-25T02:20:05.7698615Z 579 │ selectedEnvironmentServerConfig === null 2026-10-25T02:20:05.7698781Z 580 │ ) { 2026-10-25T02:20:05.7698901Z 581 │ return; 2026-10-25T02:20:05.7699025Z 582 │ } 2026-10-25T02:20:05.7699200Z 583 │ 2026-10-25T02:20:05.7699422Z 584 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-25T02:20:05.7699690Z 585 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-25T02:20:05.7699878Z 586 │ } 2026-10-25T02:20:05.7700114Z 587 │ startedShareImportKeyRef.current = importKey; 2026-10-25T02:20:05.7700297Z 588 │ const draftBackup = 2026-10-25T02:20:05.7700562Z 589 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-25T02:20:05.7700881Z 590 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-25T02:20:05.7701110Z 591 │ const importToken = Symbol(importKey); 2026-10-25T02:20:05.7701291Z 592 │ let didReserveShare = false; 2026-10-25T02:20:05.7701463Z 593 │ let didConsumeShare = false; 2026-10-25T02:20:05.7701639Z 594 │ let needsDraftRestore = false; 2026-10-25T02:20:05.7701851Z 595 │ activeShareImportTokenRef.current = importToken; 2026-10-25T02:20:05.7702063Z 596 │ setImportingShareKey(importKey); 2026-10-25T02:20:05.7707141Z ·  ──────────┬───────── 2026-10-25T02:20:05.7707454Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7707686Z 597 │ void (async () => { 2026-10-25T02:20:05.7707821Z ╰──── 2026-10-25T02:20:05.7708456Z  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-25T02:20:05.7709298Z  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-25T02:20:05.7709598Z 2026-10-25T02:20:05.7709797Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7710139Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:516:5] 2026-10-25T02:20:05.7710367Z 515 │ props.initialProjectRef, 2026-10-25T02:20:05.7710526Z 516 │ props.incomingShareId, 2026-10-25T02:20:05.7710699Z ·  ──────────┬────────── 2026-10-25T02:20:05.7710957Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-25T02:20:05.7711183Z 517 │ props.pendingTaskId, 2026-10-25T02:20:05.7711316Z ╰──── 2026-10-25T02:20:05.7711660Z  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-25T02:20:05.7712227Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7712513Z 2026-10-25T02:20:05.7712721Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.7713067Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:535:5] 2026-10-25T02:20:05.7713331Z 534 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-25T02:20:05.7713523Z 535 │ flow.loadBranches(); 2026-10-25T02:20:05.7713677Z ·  ──┬─ 2026-10-25T02:20:05.7713881Z · ╰── Missing dependency `flow` 2026-10-25T02:20:05.7714182Z 536 │ }, [flow.loadBranches, selectedProject]); 2026-10-25T02:20:05.7714413Z ·  ────────┬──────── 2026-10-25T02:20:05.7714702Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-25T02:20:05.7714942Z 537 │ 2026-10-25T02:20:05.7715052Z ╰──── 2026-10-25T02:20:05.7715560Z  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-25T02:20:05.7716235Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7716521Z 2026-10-25T02:20:05.7716720Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7717062Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:748:5] 2026-10-25T02:20:05.7717278Z 747 │ flow.draftKey, 2026-10-25T02:20:05.7717437Z 748 │ hasImportedIncomingShare, 2026-10-25T02:20:05.7717623Z ·  ────────────┬─────────── 2026-10-25T02:20:05.7717893Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-25T02:20:05.7718121Z 749 │ incomingShare, 2026-10-25T02:20:05.7718279Z 750 │ isIncomingShareInboxLoading, 2026-10-25T02:20:05.7718470Z ·  ─────────────┬───────────── 2026-10-25T02:20:05.7718749Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-25T02:20:05.7719000Z 751 │ isIncomingShareUnavailable, 2026-10-25T02:20:05.7719172Z 752 │ props.incomingShareId, 2026-10-25T02:20:05.7719360Z 753 │ props.initialProjectRef?.environmentId, 2026-10-25T02:20:05.7719553Z 754 │ props.initialProjectRef?.projectId, 2026-10-25T02:20:05.7719728Z 755 │ releaseShareReservation, 2026-10-25T02:20:05.7719879Z 756 │ reserveShare, 2026-10-25T02:20:05.7720042Z 757 │ selectedEnvironmentServerConfig, 2026-10-25T02:20:05.7720210Z 758 │ selectedProject, 2026-10-25T02:20:05.7720361Z 759 │ shareImportAttempt, 2026-10-25T02:20:05.7720528Z ·  ─────────┬──────── 2026-10-25T02:20:05.7720859Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-25T02:20:05.7721072Z 760 │ ]); 2026-10-25T02:20:05.7721185Z ╰──── 2026-10-25T02:20:05.7721534Z  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-25T02:20:05.7722103Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7722107Z 2026-10-25T02:20:05.7722359Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7722525Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10517:7] 2026-10-25T02:20:05.7722579Z 10516 │ 2026-10-25T02:20:05.7722650Z 10517 │ const layer: Layer.Layer< 2026-10-25T02:20:05.7722720Z ·  ──┬── 2026-10-25T02:20:05.7722846Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.7722940Z 10518 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:20:05.7723059Z ╰──── 2026-10-25T02:20:05.7723210Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7723212Z 2026-10-25T02:20:05.7723465Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7723632Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:81:5] 2026-10-25T02:20:05.7723684Z 78 │ 2026-10-25T02:20:05.7723750Z 79 │ useEffect(() => { 2026-10-25T02:20:05.7723822Z ·  ────┬──── 2026-10-25T02:20:05.7723952Z · ╰── This is the containing effect 2026-10-25T02:20:05.7724077Z 80 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-25T02:20:05.7724144Z 81 │ setHostInput(host); 2026-10-25T02:20:05.7724216Z ·  ──────┬───── 2026-10-25T02:20:05.7724388Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7724455Z 82 │ setCodeInput(code); 2026-10-25T02:20:05.7724508Z ╰──── 2026-10-25T02:20:05.7725102Z  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-25T02:20:05.7725445Z  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-25T02:20:05.7725449Z 2026-10-25T02:20:05.7725702Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7725867Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:91:5] 2026-10-25T02:20:05.7725920Z 84 │ 2026-10-25T02:20:05.7725983Z 85 │ useEffect(() => { 2026-10-25T02:20:05.7726053Z ·  ────┬──── 2026-10-25T02:20:05.7726177Z · ╰── This is the containing effect 2026-10-25T02:20:05.7726267Z 86 │ if (routePairingUrl.length === 0) { 2026-10-25T02:20:05.7726327Z 87 │ return; 2026-10-25T02:20:05.7726380Z 88 │ } 2026-10-25T02:20:05.7726430Z 89 │ 2026-10-25T02:20:05.7726546Z 90 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-25T02:20:05.7726611Z 91 │ setHostInput(host); 2026-10-25T02:20:05.7726688Z ·  ──────┬───── 2026-10-25T02:20:05.7726896Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7726990Z 92 │ setCodeInput(code); 2026-10-25T02:20:05.7727042Z ╰──── 2026-10-25T02:20:05.7727620Z  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-25T02:20:05.7727928Z  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-25T02:20:05.7727934Z 2026-10-25T02:20:05.7728178Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7728346Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:97:7] 2026-10-25T02:20:05.7728401Z 94 │ 2026-10-25T02:20:05.7728464Z 95 │ useEffect(() => { 2026-10-25T02:20:05.7728531Z ·  ────┬──── 2026-10-25T02:20:05.7728657Z · ╰── This is the containing effect 2026-10-25T02:20:05.7728737Z 96 │ if (pairingConnectionError) { 2026-10-25T02:20:05.7728809Z 97 │ setIsSubmitting(false); 2026-10-25T02:20:05.7728886Z ·  ───────┬─────── 2026-10-25T02:20:05.7729052Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7729107Z 98 │ } 2026-10-25T02:20:05.7729157Z ╰──── 2026-10-25T02:20:05.7729731Z  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-25T02:20:05.7730044Z  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-25T02:20:05.7730047Z 2026-10-25T02:20:05.7730250Z ⚠ eslint(no-unused-vars): Identifier 'openSettings' is imported but never used. 2026-10-25T02:20:05.7730417Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10] 2026-10-25T02:20:05.7730548Z 34 │ import { splitEnvironmentSections } from "./environmentSections"; 2026-10-25T02:20:05.7730669Z 35 │ import { openSettings } from "../settings/settings-navigation"; 2026-10-25T02:20:05.7730753Z ·  ──────┬───── 2026-10-25T02:20:05.7730893Z · ╰── 'openSettings' is imported here 2026-10-25T02:20:05.7731024Z 36 │ import { leaveSettingsPage } from "../settings/settings-navigation"; 2026-10-25T02:20:05.7731074Z ╰──── 2026-10-25T02:20:05.7731171Z  help: Consider removing this import. 2026-10-25T02:20:05.7731173Z 2026-10-25T02:20:05.7731435Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7731570Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:920:7] 2026-10-25T02:20:05.7731621Z 919 │ 2026-10-25T02:20:05.7731803Z 920 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-25T02:20:05.7731879Z ·  ─────┬───── 2026-10-25T02:20:05.7732057Z · ╰── 'layerDaemon' is declared here 2026-10-25T02:20:05.7732169Z 921 │ runDaemon.pipe(Effect.forkScoped), 2026-10-25T02:20:05.7732222Z ╰──── 2026-10-25T02:20:05.7732323Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7732325Z 2026-10-25T02:20:05.7732572Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7732718Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:52:5] 2026-10-25T02:20:05.7732771Z 50 │ 2026-10-25T02:20:05.7732835Z 51 │ useEffect(() => { 2026-10-25T02:20:05.7732904Z ·  ────┬──── 2026-10-25T02:20:05.7733028Z · ╰── This is the containing effect 2026-10-25T02:20:05.7733100Z 52 │ setDecodedSize(null); 2026-10-25T02:20:05.7733179Z ·  ───────┬────── 2026-10-25T02:20:05.7733342Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7733408Z 53 │ }, [props.sourceKey]); 2026-10-25T02:20:05.7733459Z ╰──── 2026-10-25T02:20:05.7734036Z  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-25T02:20:05.7734346Z  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-25T02:20:05.7734349Z 2026-10-25T02:20:05.7734601Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7734748Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:56:5] 2026-10-25T02:20:05.7734802Z 54 │ 2026-10-25T02:20:05.7734871Z 55 │ useEffect(() => { 2026-10-25T02:20:05.7734940Z ·  ────┬──── 2026-10-25T02:20:05.7735063Z · ╰── This is the containing effect 2026-10-25T02:20:05.7735140Z 56 │ setFailedUri(null); 2026-10-25T02:20:05.7735239Z ·  ──────┬───── 2026-10-25T02:20:05.7735400Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7735463Z 57 │ }, [props.uri]); 2026-10-25T02:20:05.7735514Z ╰──── 2026-10-25T02:20:05.7736092Z  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-25T02:20:05.7736404Z  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-25T02:20:05.7736407Z 2026-10-25T02:20:05.7736616Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T02:20:05.7736759Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-25T02:20:05.7736882Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-25T02:20:05.7737100Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-25T02:20:05.7737214Z ·  ────────┬──────── 2026-10-25T02:20:05.7737359Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T02:20:05.7737411Z 8 │ 2026-10-25T02:20:05.7737463Z ╰──── 2026-10-25T02:20:05.7737560Z  help: Consider removing this import. 2026-10-25T02:20:05.7737563Z 2026-10-25T02:20:05.7737754Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7737901Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:53:7] 2026-10-25T02:20:05.7737970Z 52 │ setDecodedSize(null); 2026-10-25T02:20:05.7738036Z 53 │ }, [props.sourceKey]); 2026-10-25T02:20:05.7738114Z ·  ───────┬─────── 2026-10-25T02:20:05.7738272Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-25T02:20:05.7738327Z 54 │ 2026-10-25T02:20:05.7738379Z ╰──── 2026-10-25T02:20:05.7738661Z  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-25T02:20:05.7738962Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7738965Z 2026-10-25T02:20:05.7739157Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7739301Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:7] 2026-10-25T02:20:05.7739368Z 56 │ setFailedUri(null); 2026-10-25T02:20:05.7739434Z 57 │ }, [props.uri]); 2026-10-25T02:20:05.7739508Z ·  ────┬──── 2026-10-25T02:20:05.7739646Z · ╰── Unnecessary dependency `props.uri` 2026-10-25T02:20:05.7739696Z 58 │ 2026-10-25T02:20:05.7739747Z ╰──── 2026-10-25T02:20:05.7740029Z  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-25T02:20:05.7740327Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7740330Z 2026-10-25T02:20:05.7740573Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-25T02:20:05.7740752Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:956:10] 2026-10-25T02:20:05.7740808Z 955 │ 2026-10-25T02:20:05.7740915Z 956 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-25T02:20:05.7741030Z ·  ──────────────────┬───────────────── 2026-10-25T02:20:05.7741221Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-25T02:20:05.7741324Z 957 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-25T02:20:05.7741379Z ╰──── 2026-10-25T02:20:05.7741481Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7741484Z 2026-10-25T02:20:05.7741805Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7742014Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1424:7] 2026-10-25T02:20:05.7742102Z 1423 │ 2026-10-25T02:20:05.7742218Z 1424 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-25T02:20:05.7742334Z ·  ───────────────────┬─────────────────── 2026-10-25T02:20:05.7742535Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-25T02:20:05.7742656Z 1425 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-25T02:20:05.7742709Z ╰──── 2026-10-25T02:20:05.7742807Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7742811Z 2026-10-25T02:20:05.7743056Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7743219Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1660:7] 2026-10-25T02:20:05.7743276Z 1659 │ 2026-10-25T02:20:05.7743346Z 1660 │ const layer: Layer.Layer< 2026-10-25T02:20:05.7743413Z ·  ──┬── 2026-10-25T02:20:05.7743536Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.7743636Z 1661 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:20:05.7743688Z ╰──── 2026-10-25T02:20:05.7743787Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7743789Z 2026-10-25T02:20:05.7743944Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7744097Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-25T02:20:05.7744192Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-25T02:20:05.7744286Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-25T02:20:05.7744370Z ·  ──────┬────── 2026-10-25T02:20:05.7744507Z · ╰── `pulseProgress` originates here 2026-10-25T02:20:05.7744559Z 55 │ 2026-10-25T02:20:05.7744621Z 56 │ useEffect(() => { 2026-10-25T02:20:05.7744685Z 57 │ if (pulse) { 2026-10-25T02:20:05.7744770Z 58 │ pulseProgress.value = withRepeat( 2026-10-25T02:20:05.7744849Z ·  ──────┬────── 2026-10-25T02:20:05.7744985Z · ╰── `pulseProgress` cannot be modified 2026-10-25T02:20:05.7745053Z 59 │ withTiming(1, { 2026-10-25T02:20:05.7745115Z ╰──── 2026-10-25T02:20:05.7745401Z  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-25T02:20:05.7745744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7745775Z 2026-10-25T02:20:05.7745926Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7746089Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-25T02:20:05.7746189Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-25T02:20:05.7746270Z 66 │ const progress = useSharedValue(0); 2026-10-25T02:20:05.7746345Z ·  ────┬─── 2026-10-25T02:20:05.7746473Z · ╰── `progress` originates here 2026-10-25T02:20:05.7746536Z 67 │ useEffect(() => { 2026-10-25T02:20:05.7746657Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-25T02:20:05.7746733Z ·  ────┬─── 2026-10-25T02:20:05.7746865Z · ╰── `progress` cannot be modified 2026-10-25T02:20:05.7746933Z 69 │ }, [expanded, progress]); 2026-10-25T02:20:05.7746985Z ╰──── 2026-10-25T02:20:05.7747237Z  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-25T02:20:05.7747532Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7747534Z 2026-10-25T02:20:05.7747783Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7747940Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:264:5] 2026-10-25T02:20:05.7748060Z 262 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-25T02:20:05.7748128Z 263 │ useEffect(() => { 2026-10-25T02:20:05.7748200Z ·  ────┬──── 2026-10-25T02:20:05.7748329Z · ╰── This is the containing effect 2026-10-25T02:20:05.7748411Z 264 │ setNow(new Date().toISOString()); 2026-10-25T02:20:05.7748480Z ·  ───┬── 2026-10-25T02:20:05.7748641Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7748777Z 265 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-25T02:20:05.7748827Z ╰──── 2026-10-25T02:20:05.7749409Z  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-25T02:20:05.7749721Z  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-25T02:20:05.7749724Z 2026-10-25T02:20:05.7749944Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T02:20:05.7750097Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:12:8] 2026-10-25T02:20:05.7750163Z 11 │ threadSearchMatchKey, 2026-10-25T02:20:05.7750248Z 12 │ type EnvironmentThreadSearchMatch, 2026-10-25T02:20:05.7750350Z ·  ──────────────┬───────────── 2026-10-25T02:20:05.7750568Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T02:20:05.7750705Z 13 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T02:20:05.7750755Z ╰──── 2026-10-25T02:20:05.7750851Z  help: Consider removing this import. 2026-10-25T02:20:05.7750853Z 2026-10-25T02:20:05.7751050Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7751210Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:320:25] 2026-10-25T02:20:05.7751412Z 319 │ // snoozeWakeTick re-arms clamped timers even when the wake date exceeds 32-bit setTimeout and stays unchanged. 2026-10-25T02:20:05.7751502Z 320 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T02:20:05.7751603Z ·  ───────┬────── 2026-10-25T02:20:05.7751773Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:20:05.7751873Z 321 │ const listItems: readonly SidebarListItem[] = 2026-10-25T02:20:05.7751925Z ╰──── 2026-10-25T02:20:05.7752211Z  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-25T02:20:05.7752511Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7752514Z 2026-10-25T02:20:05.7752654Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7752809Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:120:38] 2026-10-25T02:20:05.7752970Z 119 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T02:20:05.7753096Z 120 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T02:20:05.7753215Z ·  ───────────┬────────── 2026-10-25T02:20:05.7753382Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7753498Z 121 │ const sessionRef = useRef(null); 2026-10-25T02:20:05.7753548Z ╰──── 2026-10-25T02:20:05.7754003Z  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-25T02:20:05.7754287Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7754292Z 2026-10-25T02:20:05.7754432Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7754583Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:8] 2026-10-25T02:20:05.7754636Z 123 │ 2026-10-25T02:20:05.7754741Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:20:05.7754826Z ·  ─────────┬──────── 2026-10-25T02:20:05.7754970Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7755081Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:20:05.7755129Z ╰──── 2026-10-25T02:20:05.7755658Z  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-25T02:20:05.7755969Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7755971Z 2026-10-25T02:20:05.7756109Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7756259Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:7] 2026-10-25T02:20:05.7756310Z 123 │ 2026-10-25T02:20:05.7756413Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:20:05.7756498Z ·  ─────────┬───────── 2026-10-25T02:20:05.7756641Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7756740Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:20:05.7756794Z ╰──── 2026-10-25T02:20:05.7757244Z  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-25T02:20:05.7757524Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7757526Z 2026-10-25T02:20:05.7757664Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7757814Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:31] 2026-10-25T02:20:05.7757866Z 123 │ 2026-10-25T02:20:05.7757970Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:20:05.7758086Z ·  ─────────┬───────── 2026-10-25T02:20:05.7758247Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7758344Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:20:05.7758396Z ╰──── 2026-10-25T02:20:05.7758844Z  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-25T02:20:05.7759120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7759124Z 2026-10-25T02:20:05.7759265Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7759419Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:124:30] 2026-10-25T02:20:05.7759471Z 123 │ 2026-10-25T02:20:05.7759573Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:20:05.7759682Z ·  ──────────┬───────── 2026-10-25T02:20:05.7759841Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7759939Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:20:05.7759989Z ╰──── 2026-10-25T02:20:05.7760484Z  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-25T02:20:05.7760852Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7760855Z 2026-10-25T02:20:05.7760992Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7761142Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:125:46] 2026-10-25T02:20:05.7761252Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:20:05.7761440Z 125 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:20:05.7761609Z 126 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T02:20:05.7761738Z 127 │ │ onStatus: (status: RecordingStatus) => { 2026-10-25T02:20:05.7761890Z 128 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T02:20:05.7762006Z 129 │ │ isFinished: status.isFinished, 2026-10-25T02:20:05.7762178Z 130 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T02:20:05.7762281Z 131 │ │ error: status.error, 2026-10-25T02:20:05.7762377Z 132 │ │ url: status.url, 2026-10-25T02:20:05.7762455Z 133 │ │ }); 2026-10-25T02:20:05.7762531Z 134 │ │ }, 2026-10-25T02:20:05.7762722Z 135 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T02:20:05.7762832Z 136 │ │ selectInput: (inputs) => { 2026-10-25T02:20:05.7762983Z 137 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T02:20:05.7763121Z 138 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T02:20:05.7763283Z 139 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T02:20:05.7763417Z 140 │ │ const order = rememberMicrophones(known, inputs); 2026-10-25T02:20:05.7763799Z 141 │ │ if (order !== known) { 2026-10-25T02:20:05.7763933Z 142 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T02:20:05.7764045Z 143 │ │ transform: (current) => ({ 2026-10-25T02:20:05.7764246Z 144 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T02:20:05.7764331Z 145 │ │ }), 2026-10-25T02:20:05.7764409Z 146 │ │ }); 2026-10-25T02:20:05.7764486Z 147 │ │ } 2026-10-25T02:20:05.7764622Z 148 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-25T02:20:05.7764696Z 149 │ │ }, 2026-10-25T02:20:05.7764822Z 150 │ ├─▶ }); 2026-10-25T02:20:05.7765054Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7765150Z 151 │ recorderRef.current = recorder; 2026-10-25T02:20:05.7765225Z ╰──── 2026-10-25T02:20:05.7765739Z  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-25T02:20:05.7766056Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7766059Z 2026-10-25T02:20:05.7766199Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7766351Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:151:16] 2026-10-25T02:20:05.7766407Z 150 │ }); 2026-10-25T02:20:05.7766485Z 151 │ recorderRef.current = recorder; 2026-10-25T02:20:05.7766596Z ·  ─────┬─────────┬─── 2026-10-25T02:20:05.7766778Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.7766894Z · ╰── This value is a ref 2026-10-25T02:20:05.7766994Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:20:05.7767045Z ╰──── 2026-10-25T02:20:05.7767491Z  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-25T02:20:05.7767771Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7767773Z 2026-10-25T02:20:05.7767918Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7768069Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:152:48] 2026-10-25T02:20:05.7768153Z 151 │ recorderRef.current = recorder; 2026-10-25T02:20:05.7768342Z 152 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:20:05.7768425Z 153 │ │ recorder, 2026-10-25T02:20:05.7768548Z 154 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T02:20:05.7768660Z 155 │ │ requestPermission: async () => { 2026-10-25T02:20:05.7768821Z 156 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T02:20:05.7769007Z 157 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T02:20:05.7769085Z 158 │ │ }, 2026-10-25T02:20:05.7769223Z 159 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T02:20:05.7769353Z 160 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T02:20:05.7769483Z 161 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T02:20:05.7769588Z 162 │ │ onStateChange: (nextState) => 2026-10-25T02:20:05.7769676Z 163 │ │ setState({ 2026-10-25T02:20:05.7769771Z 164 │ │ state: nextState, 2026-10-25T02:20:05.7769905Z 165 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T02:20:05.7770028Z 166 │ │ label: sessionRef.current?.label ?? null, 2026-10-25T02:20:05.7770152Z 167 │ │ }), 2026-10-25T02:20:05.7770306Z 168 │ ├─▶ }); 2026-10-25T02:20:05.7770499Z · ╰──── Cannot access ref value during render 2026-10-25T02:20:05.7770553Z 169 │ } 2026-10-25T02:20:05.7770603Z ╰──── 2026-10-25T02:20:05.7771051Z  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-25T02:20:05.7771331Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7771334Z 2026-10-25T02:20:05.7771482Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7771638Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:152:15] 2026-10-25T02:20:05.7771717Z 151 │ recorderRef.current = recorder; 2026-10-25T02:20:05.7771817Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:20:05.7771926Z ·  ─────┬────────┬─── 2026-10-25T02:20:05.7772100Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.7772214Z · ╰── This value is a ref 2026-10-25T02:20:05.7772276Z 153 │ recorder, 2026-10-25T02:20:05.7772326Z ╰──── 2026-10-25T02:20:05.7772777Z  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-25T02:20:05.7773057Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7773060Z 2026-10-25T02:20:05.7773200Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7773351Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:181:7] 2026-10-25T02:20:05.7773435Z 180 │ return () => subscription.remove(); 2026-10-25T02:20:05.7773498Z 181 │ }, [controller]); 2026-10-25T02:20:05.7773572Z ·  ─────┬──── 2026-10-25T02:20:05.7773711Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7773762Z 182 │ 2026-10-25T02:20:05.7773853Z ╰──── 2026-10-25T02:20:05.7774324Z  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-25T02:20:05.7774601Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7774604Z 2026-10-25T02:20:05.7774741Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7774892Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:181:6] 2026-10-25T02:20:05.7774975Z 180 │ return () => subscription.remove(); 2026-10-25T02:20:05.7775037Z 181 │ }, [controller]); 2026-10-25T02:20:05.7775126Z ·  ──────┬───── 2026-10-25T02:20:05.7775291Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7775343Z 182 │ 2026-10-25T02:20:05.7775394Z ╰──── 2026-10-25T02:20:05.7775841Z  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-25T02:20:05.7776120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7776123Z 2026-10-25T02:20:05.7776258Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7776414Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:188:6] 2026-10-25T02:20:05.7776471Z 187 │ }, 2026-10-25T02:20:05.7776539Z 188 │ [controller, recorder], 2026-10-25T02:20:05.7776610Z ·  ─────┬──── 2026-10-25T02:20:05.7776748Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7776802Z 189 │ ); 2026-10-25T02:20:05.7776852Z ╰──── 2026-10-25T02:20:05.7777297Z  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-25T02:20:05.7777574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7777577Z 2026-10-25T02:20:05.7777719Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7777871Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:173:20] 2026-10-25T02:20:05.7777959Z 172 │ const controller = session.controller; 2026-10-25T02:20:05.7778041Z 173 │ const recorder = recorderRef.current; 2026-10-25T02:20:05.7778143Z ·  ─────────┬───────── 2026-10-25T02:20:05.7778296Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7778347Z 174 │ 2026-10-25T02:20:05.7778397Z ╰──── 2026-10-25T02:20:05.7778893Z  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-25T02:20:05.7779195Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7779198Z 2026-10-25T02:20:05.7779335Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7779484Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:188:5] 2026-10-25T02:20:05.7779538Z 187 │ }, 2026-10-25T02:20:05.7779607Z 188 │ [controller, recorder], 2026-10-25T02:20:05.7779694Z ·  ───────────┬────────── 2026-10-25T02:20:05.7779836Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7779891Z 189 │ ); 2026-10-25T02:20:05.7779942Z ╰──── 2026-10-25T02:20:05.7780395Z  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-25T02:20:05.7780673Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7780675Z 2026-10-25T02:20:05.7780813Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7780963Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:242:20] 2026-10-25T02:20:05.7781052Z 241 │ return () => clearInterval(intervalId); 2026-10-25T02:20:05.7781160Z 242 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T02:20:05.7781244Z ·  ─────┬──── 2026-10-25T02:20:05.7781399Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7781451Z 243 │ 2026-10-25T02:20:05.7781502Z ╰──── 2026-10-25T02:20:05.7781948Z  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-25T02:20:05.7782230Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7782232Z 2026-10-25T02:20:05.7782368Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7782521Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:242:6] 2026-10-25T02:20:05.7782611Z 241 │ return () => clearInterval(intervalId); 2026-10-25T02:20:05.7782714Z 242 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T02:20:05.7782844Z ·  ────────────────────────┬─────────────────────── 2026-10-25T02:20:05.7782997Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7783047Z 243 │ 2026-10-25T02:20:05.7783096Z ╰──── 2026-10-25T02:20:05.7783543Z  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-25T02:20:05.7783863Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7783893Z 2026-10-25T02:20:05.7784033Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7784183Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:257:5] 2026-10-25T02:20:05.7784247Z 256 │ setOwnerFocused, 2026-10-25T02:20:05.7784309Z 257 │ session, 2026-10-25T02:20:05.7784377Z ·  ───┬─── 2026-10-25T02:20:05.7784512Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7784568Z 258 │ stop, 2026-10-25T02:20:05.7784618Z ╰──── 2026-10-25T02:20:05.7785098Z  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-25T02:20:05.7785377Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7785380Z 2026-10-25T02:20:05.7785515Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7785666Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:247:10] 2026-10-25T02:20:05.7785718Z 246 │ 2026-10-25T02:20:05.7785855Z 247 │ ╭─▶ return { 2026-10-25T02:20:05.7786058Z 248 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-25T02:20:05.7786137Z 249 │ │ state, 2026-10-25T02:20:05.7786225Z 250 │ │ audioLevels, 2026-10-25T02:20:05.7786322Z 251 │ │ elapsedSeconds, 2026-10-25T02:20:05.7786450Z 252 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-25T02:20:05.7786531Z 253 │ │ ownerKey, 2026-10-25T02:20:05.7786607Z 254 │ │ label, 2026-10-25T02:20:05.7786696Z 255 │ │ focusedOwners, 2026-10-25T02:20:05.7786786Z 256 │ │ setOwnerFocused, 2026-10-25T02:20:05.7786865Z 257 │ │ session, 2026-10-25T02:20:05.7786941Z 258 │ │ stop, 2026-10-25T02:20:05.7787017Z 259 │ │ cancel, 2026-10-25T02:20:05.7787140Z 260 │ ├─▶ }; 2026-10-25T02:20:05.7787342Z · ╰──── Cannot access ref value during render 2026-10-25T02:20:05.7787399Z 261 │ } 2026-10-25T02:20:05.7787449Z ╰──── 2026-10-25T02:20:05.7787898Z  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-25T02:20:05.7788178Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7788180Z 2026-10-25T02:20:05.7788333Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7788483Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:208:7] 2026-10-25T02:20:05.7788676Z 119 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T02:20:05.7788821Z 120 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T02:20:05.7788898Z ·  ─────┬───── 2026-10-25T02:20:05.7789029Z · ╰── `audioLevels` originates here 2026-10-25T02:20:05.7789146Z 121 │ const sessionRef = useRef(null); 2026-10-25T02:20:05.7789286Z 122 │ const recorderRef = useRef | null>(null); 2026-10-25T02:20:05.7789339Z 123 │ 2026-10-25T02:20:05.7789442Z 124 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T02:20:05.7789540Z 125 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T02:20:05.7789673Z 126 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T02:20:05.7789771Z 127 │ onStatus: (status: RecordingStatus) => { 2026-10-25T02:20:05.7789892Z 128 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T02:20:05.7789978Z 129 │ isFinished: status.isFinished, 2026-10-25T02:20:05.7790117Z 130 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T02:20:05.7790191Z 131 │ error: status.error, 2026-10-25T02:20:05.7790259Z 132 │ url: status.url, 2026-10-25T02:20:05.7790319Z 133 │ }); 2026-10-25T02:20:05.7790374Z 134 │ }, 2026-10-25T02:20:05.7790537Z 135 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T02:20:05.7790614Z 136 │ selectInput: (inputs) => { 2026-10-25T02:20:05.7790735Z 137 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T02:20:05.7790849Z 138 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T02:20:05.7790987Z 139 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T02:20:05.7791097Z 140 │ const order = rememberMicrophones(known, inputs); 2026-10-25T02:20:05.7791170Z 141 │ if (order !== known) { 2026-10-25T02:20:05.7791273Z 142 │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T02:20:05.7791356Z 143 │ transform: (current) => ({ 2026-10-25T02:20:05.7791528Z 144 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T02:20:05.7791590Z 145 │ }), 2026-10-25T02:20:05.7791649Z 146 │ }); 2026-10-25T02:20:05.7791707Z 147 │ } 2026-10-25T02:20:05.7791814Z 148 │ return preferredMicrophoneInput(inputs, order); 2026-10-25T02:20:05.7791870Z 149 │ }, 2026-10-25T02:20:05.7791923Z 150 │ }); 2026-10-25T02:20:05.7792009Z 151 │ recorderRef.current = recorder; 2026-10-25T02:20:05.7792110Z 152 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T02:20:05.7792173Z 153 │ recorder, 2026-10-25T02:20:05.7792268Z 154 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T02:20:05.7792352Z 155 │ requestPermission: async () => { 2026-10-25T02:20:05.7792479Z 156 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T02:20:05.7792629Z 157 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T02:20:05.7792686Z 158 │ }, 2026-10-25T02:20:05.7792794Z 159 │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T02:20:05.7792898Z 160 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T02:20:05.7792997Z 161 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T02:20:05.7793120Z 162 │ onStateChange: (nextState) => 2026-10-25T02:20:05.7793219Z 163 │ setState({ 2026-10-25T02:20:05.7793289Z 164 │ state: nextState, 2026-10-25T02:20:05.7793390Z 165 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T02:20:05.7793487Z 166 │ label: sessionRef.current?.label ?? null, 2026-10-25T02:20:05.7793546Z 167 │ }), 2026-10-25T02:20:05.7793601Z 168 │ }); 2026-10-25T02:20:05.7793654Z 169 │ } 2026-10-25T02:20:05.7793707Z 170 │ 2026-10-25T02:20:05.7793791Z 171 │ const session = sessionRef.current; 2026-10-25T02:20:05.7793877Z 172 │ const controller = session.controller; 2026-10-25T02:20:05.7793959Z 173 │ const recorder = recorderRef.current; 2026-10-25T02:20:05.7794012Z 174 │ 2026-10-25T02:20:05.7794078Z 175 │ useEffect(() => { 2026-10-25T02:20:05.7794231Z 176 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-25T02:20:05.7794471Z 177 │ // iOS permission dialogs report inactive; cancel preparation only on background. Recorder status handles capture interruptions. 2026-10-25T02:20:05.7794605Z 178 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-25T02:20:05.7794661Z 179 │ }); 2026-10-25T02:20:05.7794744Z 180 │ return () => subscription.remove(); 2026-10-25T02:20:05.7794806Z 181 │ }, [controller]); 2026-10-25T02:20:05.7794862Z 182 │ 2026-10-25T02:20:05.7794922Z 183 │ useEffect( 2026-10-25T02:20:05.7794983Z 184 │ () => () => { 2026-10-25T02:20:05.7795053Z 185 │ controller.dispose(); 2026-10-25T02:20:05.7795154Z 186 │ recorder.release(); 2026-10-25T02:20:05.7795208Z 187 │ }, 2026-10-25T02:20:05.7795275Z 188 │ [controller, recorder], 2026-10-25T02:20:05.7795329Z 189 │ ); 2026-10-25T02:20:05.7795381Z 190 │ 2026-10-25T02:20:05.7795450Z 191 │ useEffect(() => { 2026-10-25T02:20:05.7795543Z 192 │ if (state.phase !== "recording") return; 2026-10-25T02:20:05.7795596Z 193 │ 2026-10-25T02:20:05.7795740Z 194 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-25T02:20:05.7795844Z 195 │ const activation = activateKeepAwakeAsync(tag); 2026-10-25T02:20:05.7795922Z 196 │ void activation.catch(() => {}); 2026-10-25T02:20:05.7795986Z 197 │ return () => { 2026-10-25T02:20:05.7796132Z 198 │ // Release after activation settles, even if the recording ends immediately. 2026-10-25T02:20:05.7796269Z 199 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-25T02:20:05.7796321Z 200 │ }; 2026-10-25T02:20:05.7796400Z 201 │ }, [keepAwakeId, state.phase]); 2026-10-25T02:20:05.7796452Z 202 │ 2026-10-25T02:20:05.7796520Z 203 │ useEffect(() => { 2026-10-25T02:20:05.7796651Z 204 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T02:20:05.7796705Z 205 │ 2026-10-25T02:20:05.7796824Z 206 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T02:20:05.7796974Z 207 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T02:20:05.7797074Z 208 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T02:20:05.7797151Z ·  ─────┬───── 2026-10-25T02:20:05.7797288Z · ╰── `audioLevels` cannot be modified 2026-10-25T02:20:05.7797343Z 209 │ } 2026-10-25T02:20:05.7797394Z ╰──── 2026-10-25T02:20:05.7797655Z  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-25T02:20:05.7798007Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7798041Z 2026-10-25T02:20:05.7798239Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:20:05.7798393Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:208:7] 2026-10-25T02:20:05.7798447Z 202 │ 2026-10-25T02:20:05.7798512Z 203 │ useEffect(() => { 2026-10-25T02:20:05.7798590Z ·  ───┬─── 2026-10-25T02:20:05.7798807Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-25T02:20:05.7798943Z 204 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T02:20:05.7799001Z 205 │ 2026-10-25T02:20:05.7799124Z 206 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T02:20:05.7799272Z 207 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T02:20:05.7799374Z 208 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T02:20:05.7799450Z ·  ─────┬───── 2026-10-25T02:20:05.7799580Z · ╰── This modifies `audioLevels` 2026-10-25T02:20:05.7799633Z 209 │ } 2026-10-25T02:20:05.7799686Z ╰──── 2026-10-25T02:20:05.7800017Z  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-25T02:20:05.7800316Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7800320Z 2026-10-25T02:20:05.7800541Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:20:05.7800768Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2143:15] 2026-10-25T02:20:05.7800836Z 2142 │ assert.equal( 2026-10-25T02:20:05.7800984Z 2143 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-25T02:20:05.7801063Z ·  ────── 2026-10-25T02:20:05.7801138Z 2144 │ "authoritative answer", 2026-10-25T02:20:05.7801191Z ╰──── 2026-10-25T02:20:05.7801359Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:20:05.7801363Z 2026-10-25T02:20:05.7801826Z ⚠ 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-25T02:20:05.7801995Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4245:7] 2026-10-25T02:20:05.7802174Z 4244 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-25T02:20:05.7802375Z 4245 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-25T02:20:05.7802483Z 4246 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7802615Z 4247 │ ╰─▶ } 2026-10-25T02:20:05.7802734Z 4248 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-25T02:20:05.7802844Z ╰──── 2026-10-25T02:20:05.7802882Z 2026-10-25T02:20:05.7803331Z ⚠ 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-25T02:20:05.7803498Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6355:9] 2026-10-25T02:20:05.7803584Z 6354 │ .pipe(Effect.forkScoped); 2026-10-25T02:20:05.7803770Z 6355 │ ╭─▶ while (promptGates.length < 1) { 2026-10-25T02:20:05.7803881Z 6356 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7804011Z 6357 │ ╰─▶ } 2026-10-25T02:20:05.7804182Z 6358 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-25T02:20:05.7804238Z ╰──── 2026-10-25T02:20:05.7804241Z 2026-10-25T02:20:05.7804687Z ⚠ 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-25T02:20:05.7804850Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6490:9] 2026-10-25T02:20:05.7804937Z 6489 │ .pipe(Effect.forkScoped); 2026-10-25T02:20:05.7805140Z 6490 │ ╭─▶ while (promptGates.length < 2) { 2026-10-25T02:20:05.7805251Z 6491 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7805387Z 6492 │ ╰─▶ } 2026-10-25T02:20:05.7805554Z 6493 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-25T02:20:05.7805605Z ╰──── 2026-10-25T02:20:05.7805607Z 2026-10-25T02:20:05.7806050Z ⚠ 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-25T02:20:05.7806186Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-25T02:20:05.7806250Z 130 │ ) { 2026-10-25T02:20:05.7806451Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.7806615Z 132 │ │ if (subscriptions.length >= count) { 2026-10-25T02:20:05.7806739Z 133 │ │ return; 2026-10-25T02:20:05.7806820Z 134 │ │ } 2026-10-25T02:20:05.7806926Z 135 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7807054Z 136 │ ╰─▶ } 2026-10-25T02:20:05.7807213Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-25T02:20:05.7807265Z ╰──── 2026-10-25T02:20:05.7807267Z 2026-10-25T02:20:05.7807713Z ⚠ 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-25T02:20:05.7807846Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-25T02:20:05.7808009Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-25T02:20:05.7808254Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-25T02:20:05.7808360Z 253 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7808488Z 254 │ ╰─▶ } 2026-10-25T02:20:05.7808608Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-25T02:20:05.7808661Z ╰──── 2026-10-25T02:20:05.7808663Z 2026-10-25T02:20:05.7809109Z ⚠ 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-25T02:20:05.7809241Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-25T02:20:05.7809295Z 257 │ 2026-10-25T02:20:05.7809538Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T02:20:05.7809642Z 259 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7809769Z 260 │ ╰─▶ } 2026-10-25T02:20:05.7809873Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T02:20:05.7809926Z ╰──── 2026-10-25T02:20:05.7809928Z 2026-10-25T02:20:05.7810377Z ⚠ 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-25T02:20:05.7810508Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-25T02:20:05.7810568Z 321 │ ); 2026-10-25T02:20:05.7810812Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-25T02:20:05.7810915Z 323 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7811042Z 324 │ ╰─▶ } 2026-10-25T02:20:05.7811096Z 325 │ 2026-10-25T02:20:05.7811145Z ╰──── 2026-10-25T02:20:05.7811148Z 2026-10-25T02:20:05.7811633Z ⚠ 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-25T02:20:05.7811795Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-25T02:20:05.7811955Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-25T02:20:05.7812195Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T02:20:05.7812295Z 331 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7812422Z 332 │ ╰─▶ } 2026-10-25T02:20:05.7812524Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T02:20:05.7812577Z ╰──── 2026-10-25T02:20:05.7812579Z 2026-10-25T02:20:05.7812724Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7812897Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-25T02:20:05.7812981Z 26 │ const latestInput = useRef(input); 2026-10-25T02:20:05.7813056Z 27 │ latestInput.current = input; 2026-10-25T02:20:05.7813165Z ·  ─────┬─────────┬─── 2026-10-25T02:20:05.7813345Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.7813459Z · ╰── This value is a ref 2026-10-25T02:20:05.7813534Z 28 │ const mounted = useRef(true); 2026-10-25T02:20:05.7813584Z ╰──── 2026-10-25T02:20:05.7814046Z  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-25T02:20:05.7814331Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7814333Z 2026-10-25T02:20:05.7814776Z ⚠ 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-25T02:20:05.7814910Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-25T02:20:05.7814964Z 225 │ ) { 2026-10-25T02:20:05.7815189Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.7815302Z 227 │ │ const socket = sockets[index]; 2026-10-25T02:20:05.7815394Z 228 │ │ if (socket) { 2026-10-25T02:20:05.7815485Z 229 │ │ return socket; 2026-10-25T02:20:05.7815560Z 230 │ │ } 2026-10-25T02:20:05.7815660Z 231 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7815784Z 232 │ ╰─▶ } 2026-10-25T02:20:05.7815953Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-25T02:20:05.7816006Z ╰──── 2026-10-25T02:20:05.7816009Z 2026-10-25T02:20:05.7816496Z ⚠ 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-25T02:20:05.7816659Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-25T02:20:05.7816715Z 239 │ ) { 2026-10-25T02:20:05.7816909Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.7817119Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-25T02:20:05.7817208Z 242 │ │ if (request) { 2026-10-25T02:20:05.7817302Z 243 │ │ return request; 2026-10-25T02:20:05.7817374Z 244 │ │ } 2026-10-25T02:20:05.7817475Z 245 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7817603Z 246 │ ╰─▶ } 2026-10-25T02:20:05.7817769Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-25T02:20:05.7817820Z ╰──── 2026-10-25T02:20:05.7817822Z 2026-10-25T02:20:05.7818074Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7818225Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:562:5] 2026-10-25T02:20:05.7818283Z 560 │ }, []); 2026-10-25T02:20:05.7818346Z 561 │ useEffect(() => { 2026-10-25T02:20:05.7818419Z ·  ────┬──── 2026-10-25T02:20:05.7818546Z · ╰── This is the containing effect 2026-10-25T02:20:05.7818632Z 562 │ setKeyboardStateSuspect(false); 2026-10-25T02:20:05.7818719Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7818894Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7818997Z 563 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T02:20:05.7819049Z ╰──── 2026-10-25T02:20:05.7819631Z  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-25T02:20:05.7819947Z  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-25T02:20:05.7819950Z 2026-10-25T02:20:05.7820203Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7820352Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:956:7] 2026-10-25T02:20:05.7820505Z 953 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-25T02:20:05.7820567Z 954 │ useEffect(() => { 2026-10-25T02:20:05.7820640Z ·  ────┬──── 2026-10-25T02:20:05.7820766Z · ╰── This is the containing effect 2026-10-25T02:20:05.7820922Z 955 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-25T02:20:05.7821036Z 956 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-25T02:20:05.7821132Z ·  ─────────────┬──────────── 2026-10-25T02:20:05.7821347Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7821432Z 957 │ } 2026-10-25T02:20:05.7821482Z ╰──── 2026-10-25T02:20:05.7822062Z  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-25T02:20:05.7822375Z  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-25T02:20:05.7822377Z 2026-10-25T02:20:05.7822625Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7822780Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1199:5] 2026-10-25T02:20:05.7822834Z 1197 │ 2026-10-25T02:20:05.7822900Z 1198 │ useEffect(() => { 2026-10-25T02:20:05.7822974Z ·  ────┬──── 2026-10-25T02:20:05.7823103Z · ╰── This is the containing effect 2026-10-25T02:20:05.7823178Z 1199 │ setAnchorMessageId(null); 2026-10-25T02:20:05.7823262Z ·  ─────────┬──────── 2026-10-25T02:20:05.7823431Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7823513Z 1200 │ setSubmittedMessageId(null); 2026-10-25T02:20:05.7823563Z ╰──── 2026-10-25T02:20:05.7824145Z  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-25T02:20:05.7824459Z  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-25T02:20:05.7824462Z 2026-10-25T02:20:05.7824660Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7824807Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:563:7] 2026-10-25T02:20:05.7824888Z 562 │ setKeyboardStateSuspect(false); 2026-10-25T02:20:05.7824986Z 563 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T02:20:05.7825138Z ·  ────────┬──────── ─────────┬──────── 2026-10-25T02:20:05.7825372Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-25T02:20:05.7825529Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-25T02:20:05.7825653Z 564 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-25T02:20:05.7825706Z ╰──── 2026-10-25T02:20:05.7825993Z  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-25T02:20:05.7826292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7826295Z 2026-10-25T02:20:05.7826487Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7826682Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1147:7] 2026-10-25T02:20:05.7826798Z 1146 │ userInputInsetProgress.set(1); 2026-10-25T02:20:05.7826958Z 1147 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-25T02:20:05.7827050Z ·  ────────────┬─────────── 2026-10-25T02:20:05.7827225Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-25T02:20:05.7827330Z 1148 │ const showContent = props.showContent ?? true; 2026-10-25T02:20:05.7827383Z ╰──── 2026-10-25T02:20:05.7827664Z  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-25T02:20:05.7827969Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7827974Z 2026-10-25T02:20:05.7828167Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7828318Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1205:15] 2026-10-25T02:20:05.7828386Z 1204 │ freeze.set(false); 2026-10-25T02:20:05.7828466Z 1205 │ }, [freeze, selectedThreadKey]); 2026-10-25T02:20:05.7828560Z ·  ────────┬──────── 2026-10-25T02:20:05.7828720Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-25T02:20:05.7828774Z 1206 │ 2026-10-25T02:20:05.7828824Z ╰──── 2026-10-25T02:20:05.7829112Z  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-25T02:20:05.7829416Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7829419Z 2026-10-25T02:20:05.7829571Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7829716Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1042:5] 2026-10-25T02:20:05.7829827Z 1037 │ const composerPopoverHeight = useSharedValue(0); 2026-10-25T02:20:05.7829934Z 1038 │ const floatingControlCoverage = useSharedValue( 2026-10-25T02:20:05.7830027Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7830185Z · ╰── `floatingControlCoverage` originates here 2026-10-25T02:20:05.7830362Z 1039 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T02:20:05.7830448Z 1040 │ ); 2026-10-25T02:20:05.7830514Z 1041 │ useEffect(() => { 2026-10-25T02:20:05.7830616Z 1042 │ floatingControlCoverage.value = withTiming( 2026-10-25T02:20:05.7830706Z ·  ───────────┬─────────── 2026-10-25T02:20:05.7830865Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-25T02:20:05.7830993Z 1043 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T02:20:05.7831043Z ╰──── 2026-10-25T02:20:05.7831298Z  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-25T02:20:05.7831598Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7831603Z 2026-10-25T02:20:05.7831755Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7831901Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:7] 2026-10-25T02:20:05.7832083Z 1048 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-25T02:20:05.7832208Z 1049 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-25T02:20:05.7832321Z ·  ────────────────┬──────────────── 2026-10-25T02:20:05.7832504Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-25T02:20:05.7832630Z 1050 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-25T02:20:05.7832686Z 1051 │ ); 2026-10-25T02:20:05.7832761Z 1052 │ useAnimatedReaction( 2026-10-25T02:20:05.7832824Z 1053 │ () => 2026-10-25T02:20:05.7832915Z 1054 │ contentInsetEndAdjustment.value + 2026-10-25T02:20:05.7833003Z 1055 │ floatingControlCoverage.value + 2026-10-25T02:20:05.7833196Z 1056 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-25T02:20:05.7833262Z 1057 │ (value) => { 2026-10-25T02:20:05.7833374Z 1058 │ combinedContentInsetEndAdjustment.value = value; 2026-10-25T02:20:05.7833482Z ·  ────────────────┬──────────────── 2026-10-25T02:20:05.7833668Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-25T02:20:05.7833726Z 1059 │ }, 2026-10-25T02:20:05.7833776Z ╰──── 2026-10-25T02:20:05.7834038Z  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-25T02:20:05.7834338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7834340Z 2026-10-25T02:20:05.7834614Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:20:05.7834780Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:469:19] 2026-10-25T02:20:05.7834840Z 468 │ onFilters, 2026-10-25T02:20:05.7834909Z 469 │ authorOptions = [], 2026-10-25T02:20:05.7834986Z ·  ── 2026-10-25T02:20:05.7835054Z 470 │ labelOptions = [], 2026-10-25T02:20:05.7835115Z ╰──── 2026-10-25T02:20:05.7835494Z  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-25T02:20:05.7835526Z 2026-10-25T02:20:05.7835796Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:20:05.7835962Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:470:18] 2026-10-25T02:20:05.7836026Z 469 │ authorOptions = [], 2026-10-25T02:20:05.7836093Z 470 │ labelOptions = [], 2026-10-25T02:20:05.7836170Z ·  ── 2026-10-25T02:20:05.7836235Z 471 │ optionScope, 2026-10-25T02:20:05.7836286Z ╰──── 2026-10-25T02:20:05.7836594Z  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-25T02:20:05.7836599Z 2026-10-25T02:20:05.7836748Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7836914Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-25T02:20:05.7836966Z 90 │ }) { 2026-10-25T02:20:05.7837078Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-25T02:20:05.7837153Z ·  ────┬─── 2026-10-25T02:20:05.7837282Z · ╰── `rotation` originates here 2026-10-25T02:20:05.7837348Z 92 │ useLayoutEffect(() => { 2026-10-25T02:20:05.7837489Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-25T02:20:05.7837564Z ·  ────┬─── 2026-10-25T02:20:05.7837700Z · ╰── `rotation` cannot be modified 2026-10-25T02:20:05.7837778Z 94 │ }, [props.hidden, rotation]); 2026-10-25T02:20:05.7837829Z ╰──── 2026-10-25T02:20:05.7838085Z  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-25T02:20:05.7838382Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7838384Z 2026-10-25T02:20:05.7838536Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7838699Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:266:5] 2026-10-25T02:20:05.7838793Z 263 │ const variant = props.variant ?? "plain"; 2026-10-25T02:20:05.7838930Z 264 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-25T02:20:05.7839019Z ·  ────────┬──────── 2026-10-25T02:20:05.7839164Z · ╰── `loadingVisibility` originates here 2026-10-25T02:20:05.7839234Z 265 │ useLayoutEffect(() => { 2026-10-25T02:20:05.7839389Z 266 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-25T02:20:05.7839471Z ·  ────────┬──────── 2026-10-25T02:20:05.7839613Z · ╰── `loadingVisibility` cannot be modified 2026-10-25T02:20:05.7839704Z 267 │ }, [loadingVisibility, props.loading]); 2026-10-25T02:20:05.7839758Z ╰──── 2026-10-25T02:20:05.7840010Z  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-25T02:20:05.7840350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7840385Z 2026-10-25T02:20:05.7840534Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7840743Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:325:5] 2026-10-25T02:20:05.7840800Z 322 │ }) { 2026-10-25T02:20:05.7840953Z 323 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-25T02:20:05.7841041Z ·  ─────────┬───────── 2026-10-25T02:20:05.7841190Z · ╰── `recordingVisibility` originates here 2026-10-25T02:20:05.7841259Z 324 │ useLayoutEffect(() => { 2026-10-25T02:20:05.7841446Z 325 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-25T02:20:05.7841533Z ·  ─────────┬───────── 2026-10-25T02:20:05.7841683Z · ╰── `recordingVisibility` cannot be modified 2026-10-25T02:20:05.7841775Z 326 │ }, [props.phase, recordingVisibility]); 2026-10-25T02:20:05.7841826Z ╰──── 2026-10-25T02:20:05.7842081Z  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-25T02:20:05.7842379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7842381Z 2026-10-25T02:20:05.7842530Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7842686Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T02:20:05.7842741Z 79 │ 2026-10-25T02:20:05.7842833Z 80 │ const cardCoverage = props.cardCoverage; 2026-10-25T02:20:05.7842911Z ·  ──────┬───── 2026-10-25T02:20:05.7843043Z · ╰── `cardCoverage` originates here 2026-10-25T02:20:05.7843119Z 81 │ const barHeightRef = useRef(0); 2026-10-25T02:20:05.7843198Z 82 │ const cardHeightRef = useRef(0); 2026-10-25T02:20:05.7843282Z 83 │ const cardHeight = useSharedValue(0); 2026-10-25T02:20:05.7843373Z 84 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:20:05.7843437Z 85 │ if (!cardCoverage) { 2026-10-25T02:20:05.7843499Z 86 │ return; 2026-10-25T02:20:05.7843552Z 87 │ } 2026-10-25T02:20:05.7843718Z 88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:20:05.7843820Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T02:20:05.7843974Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:20:05.7844048Z ·  ──────┬───── 2026-10-25T02:20:05.7844181Z · ╰── `cardCoverage` cannot be modified 2026-10-25T02:20:05.7844245Z 91 │ }, [cardCoverage]); 2026-10-25T02:20:05.7844298Z ╰──── 2026-10-25T02:20:05.7844587Z  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-25T02:20:05.7844884Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7844886Z 2026-10-25T02:20:05.7845110Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7845303Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:102:7] 2026-10-25T02:20:05.7845383Z  82 │ const cardHeightRef = useRef(0); 2026-10-25T02:20:05.7845467Z  83 │ const cardHeight = useSharedValue(0); 2026-10-25T02:20:05.7845542Z ·  ─────┬──── 2026-10-25T02:20:05.7845673Z · ╰── `cardHeight` originates here 2026-10-25T02:20:05.7845765Z  84 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:20:05.7845834Z  85 │ if (!cardCoverage) { 2026-10-25T02:20:05.7845893Z  86 │ return; 2026-10-25T02:20:05.7845948Z  87 │ } 2026-10-25T02:20:05.7846110Z  88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:20:05.7846214Z  89 │ // feed inset and floating controls trailing it. 2026-10-25T02:20:05.7846368Z  90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:20:05.7846434Z  91 │ }, [cardCoverage]); 2026-10-25T02:20:05.7846517Z  92 │ const handleBarLayout = useCallback( 2026-10-25T02:20:05.7846596Z  93 │ (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.7846716Z  94 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:20:05.7846783Z  95 │ notifyCoverage(); 2026-10-25T02:20:05.7846838Z  96 │ }, 2026-10-25T02:20:05.7846904Z  97 │ [notifyCoverage], 2026-10-25T02:20:05.7846956Z  98 │ ); 2026-10-25T02:20:05.7847040Z  99 │ const handleCardLayout = useCallback( 2026-10-25T02:20:05.7847122Z 100 │ (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.7847253Z 101 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:20:05.7847366Z 102 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T02:20:05.7847442Z ·  ─────┬──── 2026-10-25T02:20:05.7847577Z · ╰── `cardHeight` cannot be modified 2026-10-25T02:20:05.7847643Z 103 │ notifyCoverage(); 2026-10-25T02:20:05.7847693Z ╰──── 2026-10-25T02:20:05.7847950Z  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-25T02:20:05.7848244Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7848247Z 2026-10-25T02:20:05.7848448Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:20:05.7848599Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T02:20:05.7848684Z 83 │ const cardHeight = useSharedValue(0); 2026-10-25T02:20:05.7848774Z 84 │ const notifyCoverage = useCallback(() => { 2026-10-25T02:20:05.7848876Z ·  ───┬─── 2026-10-25T02:20:05.7849105Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T02:20:05.7849173Z 85 │ if (!cardCoverage) { 2026-10-25T02:20:05.7849233Z 86 │ return; 2026-10-25T02:20:05.7849287Z 87 │ } 2026-10-25T02:20:05.7849445Z 88 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T02:20:05.7849543Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T02:20:05.7849752Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:20:05.7849874Z ·  ──────┬───── 2026-10-25T02:20:05.7850001Z · ╰── This modifies `cardCoverage` 2026-10-25T02:20:05.7850067Z 91 │ }, [cardCoverage]); 2026-10-25T02:20:05.7850118Z ╰──── 2026-10-25T02:20:05.7850452Z  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-25T02:20:05.7850744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7850750Z 2026-10-25T02:20:05.7850946Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:20:05.7851097Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5] 2026-10-25T02:20:05.7851198Z 89 │ // feed inset and floating controls trailing it. 2026-10-25T02:20:05.7851349Z 90 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T02:20:05.7851422Z ·  ──────┬───── 2026-10-25T02:20:05.7851551Z · ╰── This modifies `cardCoverage` 2026-10-25T02:20:05.7851617Z 91 │ }, [cardCoverage]); 2026-10-25T02:20:05.7851701Z 92 │ const handleBarLayout = useCallback( 2026-10-25T02:20:05.7851779Z 93 │ (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.7851882Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.7852104Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T02:20:05.7852227Z 94 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:20:05.7852277Z ╰──── 2026-10-25T02:20:05.7852601Z  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-25T02:20:05.7852897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7852900Z 2026-10-25T02:20:05.7853092Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:20:05.7853244Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:102:7] 2026-10-25T02:20:05.7853388Z  99 │ const handleCardLayout = useCallback( 2026-10-25T02:20:05.7853502Z 100 │ (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.7853606Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.7853821Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-25T02:20:05.7853944Z 101 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T02:20:05.7854059Z 102 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T02:20:05.7854136Z ·  ─────┬──── 2026-10-25T02:20:05.7854263Z · ╰── This modifies `cardHeight` 2026-10-25T02:20:05.7854329Z 103 │ notifyCoverage(); 2026-10-25T02:20:05.7854382Z ╰──── 2026-10-25T02:20:05.7854709Z  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-25T02:20:05.7855006Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7855008Z 2026-10-25T02:20:05.7855299Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7855483Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-25T02:20:05.7855538Z 104 │ 2026-10-25T02:20:05.7855605Z 105 │ useEffect(() => { 2026-10-25T02:20:05.7855674Z ·  ────┬──── 2026-10-25T02:20:05.7855802Z · ╰── This is the containing effect 2026-10-25T02:20:05.7855886Z 106 │ clearReviewCommentTarget(); 2026-10-25T02:20:05.7855985Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T02:20:05.7856089Z ·  ────────────────┬─────────────── 2026-10-25T02:20:05.7856263Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7856336Z 108 │ }, [selectedSection?.id]); 2026-10-25T02:20:05.7856389Z ╰──── 2026-10-25T02:20:05.7856970Z  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-25T02:20:05.7857284Z  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-25T02:20:05.7857290Z 2026-10-25T02:20:05.7857538Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7857720Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-25T02:20:05.7857772Z 109 │ 2026-10-25T02:20:05.7857835Z 110 │ useEffect(() => { 2026-10-25T02:20:05.7857906Z ·  ────┬──── 2026-10-25T02:20:05.7858035Z · ╰── This is the containing effect 2026-10-25T02:20:05.7858122Z 111 │ if (activeCommentTarget === null) { 2026-10-25T02:20:05.7858219Z 112 │ setPendingNativeCommentSelection(null); 2026-10-25T02:20:05.7858327Z ·  ────────────────┬─────────────── 2026-10-25T02:20:05.7858547Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7858637Z 113 │ } 2026-10-25T02:20:05.7858686Z ╰──── 2026-10-25T02:20:05.7859270Z  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-25T02:20:05.7859583Z  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-25T02:20:05.7859586Z 2026-10-25T02:20:05.7859782Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7859965Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-25T02:20:05.7860061Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T02:20:05.7860134Z 108 │ }, [selectedSection?.id]); 2026-10-25T02:20:05.7860221Z ·  ─────────┬───────── 2026-10-25T02:20:05.7860379Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-25T02:20:05.7860431Z 109 │ 2026-10-25T02:20:05.7860485Z ╰──── 2026-10-25T02:20:05.7860768Z  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-25T02:20:05.7861069Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7861076Z 2026-10-25T02:20:05.7861268Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.7861413Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-25T02:20:05.7861519Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-25T02:20:05.7861612Z 223 │ 2026-10-25T02:20:05.7861718Z ·  ─────────────── 2026-10-25T02:20:05.7861808Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-25T02:20:05.7861860Z ╰──── 2026-10-25T02:20:05.7862005Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:20:05.7862008Z 2026-10-25T02:20:05.7862197Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.7862344Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-25T02:20:05.7862422Z 226 │ 0) break; 2026-10-25T02:20:05.7866490Z 180 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7866616Z 181 │ ╰─▶ } 2026-10-25T02:20:05.7866671Z 182 │ 2026-10-25T02:20:05.7866723Z ╰──── 2026-10-25T02:20:05.7866725Z 2026-10-25T02:20:05.7867171Z ⚠ 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-25T02:20:05.7867315Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-25T02:20:05.7867441Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-25T02:20:05.7867629Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T02:20:05.7867748Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-25T02:20:05.7867939Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-25T02:20:05.7868026Z 310 │ │ break; 2026-10-25T02:20:05.7868105Z 311 │ │ } 2026-10-25T02:20:05.7868207Z 312 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.7868379Z 313 │ ╰─▶ } 2026-10-25T02:20:05.7868467Z 314 │ 2026-10-25T02:20:05.7868520Z ╰──── 2026-10-25T02:20:05.7868522Z 2026-10-25T02:20:05.7868705Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T02:20:05.7868829Z ╭─[packages/client-runtime/src/state/shell.ts:203:5] 2026-10-25T02:20:05.7868935Z 200 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-25T02:20:05.7869002Z 201 │ let next = initial; 2026-10-25T02:20:05.7869072Z ·  ──┬─ 2026-10-25T02:20:05.7869190Z · ╰── From this accumulator 2026-10-25T02:20:05.7869270Z 202 │ let receivedSnapshot = false; 2026-10-25T02:20:05.7869343Z 203 │ for (const item of items) { 2026-10-25T02:20:05.7869416Z ·  ─┬─ 2026-10-25T02:20:05.7869524Z · ╰── For this loop 2026-10-25T02:20:05.7869613Z 204 │ if (item.kind === "synchronized") { 2026-10-25T02:20:05.7869682Z 205 │ waiting = false; 2026-10-25T02:20:05.7869773Z 206 │ if (Option.isSome(next.snapshot)) { 2026-10-25T02:20:05.7902560Z 207 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-25T02:20:05.7902766Z ·  ───┬─── 2026-10-25T02:20:05.7902914Z · ╰── From this spread 2026-10-25T02:20:05.7902973Z 208 │ } 2026-10-25T02:20:05.7903026Z ╰──── 2026-10-25T02:20:05.7903185Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T02:20:05.7903352Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:20:05.7903360Z 2026-10-25T02:20:05.7903529Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.7903686Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:699:76] 2026-10-25T02:20:05.7903863Z 698 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-25T02:20:05.7904023Z 699 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-25T02:20:05.7904157Z ·  ─────┬──── 2026-10-25T02:20:05.7904337Z · ╰── Cannot call impure function 2026-10-25T02:20:05.7904583Z 700 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-25T02:20:05.7904687Z ╰──── 2026-10-25T02:20:05.7904962Z  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-25T02:20:05.7905282Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.7905287Z 2026-10-25T02:20:05.7905447Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.7905600Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:71] 2026-10-25T02:20:05.7905679Z 719 │ const snoozePresets = useMemo( 2026-10-25T02:20:05.7905850Z 720 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T02:20:05.7905978Z ·  ─────┬──── 2026-10-25T02:20:05.7906153Z · ╰── Cannot call impure function 2026-10-25T02:20:05.7906268Z 721 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T02:20:05.7906317Z ╰──── 2026-10-25T02:20:05.7906581Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.7906860Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.7906862Z 2026-10-25T02:20:05.7907036Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:20:05.7907189Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:721:6] 2026-10-25T02:20:05.7907358Z 720 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T02:20:05.7907467Z 721 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T02:20:05.7907557Z ·  ────────────┬─────────── 2026-10-25T02:20:05.7907727Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-25T02:20:05.7907780Z 722 │ ); 2026-10-25T02:20:05.7907828Z ╰──── 2026-10-25T02:20:05.7908129Z  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-25T02:20:05.7908436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7908441Z 2026-10-25T02:20:05.7908613Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:20:05.7908759Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:767:7] 2026-10-25T02:20:05.7908827Z 766 │ thread.pinnedAt, 2026-10-25T02:20:05.7908887Z 767 │ variant, 2026-10-25T02:20:05.7908957Z ·  ───┬─── 2026-10-25T02:20:05.7909085Z · ╰── Unnecessary dependency `variant` 2026-10-25T02:20:05.7909140Z 768 │ ], 2026-10-25T02:20:05.7909189Z ╰──── 2026-10-25T02:20:05.7909538Z  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-25T02:20:05.7909857Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7909862Z 2026-10-25T02:20:05.7910047Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.7910200Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-25T02:20:05.7910325Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-25T02:20:05.7910455Z 1216 │ 2026-10-25T02:20:05.7910563Z ·  ────────────────────────── 2026-10-25T02:20:05.7910668Z 1217 │ 2026-10-25T02:20:05.7910723Z ╰──── 2026-10-25T02:20:05.7910865Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:20:05.7910868Z 2026-10-25T02:20:05.7911113Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7911279Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:59:5] 2026-10-25T02:20:05.7911329Z 49 │ 2026-10-25T02:20:05.7911392Z 50 │ useEffect(() => { 2026-10-25T02:20:05.7911459Z ·  ────┬──── 2026-10-25T02:20:05.7911584Z · ╰── This is the containing effect 2026-10-25T02:20:05.7911675Z 51 │ traceDiffHighlight("viewport-reset", { 2026-10-25T02:20:05.7911763Z 52 │ reset: diffHighlightTraceId(resetKey), 2026-10-25T02:20:05.7911820Z 53 │ enabled, 2026-10-25T02:20:05.7911889Z 54 │ rows: rows.length, 2026-10-25T02:20:05.7911945Z 55 │ }); 2026-10-25T02:20:05.7912031Z 56 │ const previousRange = scheduler.reset(); 2026-10-25T02:20:05.7912122Z 57 │ highlightedRowIdsRef.current = new Set(); 2026-10-25T02:20:05.7912202Z 58 │ pendingPatchesRef.current = []; 2026-10-25T02:20:05.7912305Z 59 │ setViewport({ scope: viewportScope, range: null }); 2026-10-25T02:20:05.7912376Z ·  ─────┬───── 2026-10-25T02:20:05.7912534Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7912642Z 60 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-25T02:20:05.7912691Z ╰──── 2026-10-25T02:20:05.7913271Z  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-25T02:20:05.7913580Z  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-25T02:20:05.7913584Z 2026-10-25T02:20:05.7913777Z ⚠ eslint(no-unused-vars): Type 'PullRequestChecks' is imported but never used. 2026-10-25T02:20:05.7913935Z ╭─[apps/web/src/components/pullRequest/pullRequestDetail.logic.ts:16:8] 2026-10-25T02:20:05.7914002Z 15 │ type PullRequestCheck, 2026-10-25T02:20:05.7914068Z 16 │ type PullRequestChecks, 2026-10-25T02:20:05.7914148Z ·  ────────┬──────── 2026-10-25T02:20:05.7914332Z · ╰── 'PullRequestChecks' is imported here 2026-10-25T02:20:05.7914487Z 17 │ type PullRequestChecksState as ContractPullRequestChecksState, 2026-10-25T02:20:05.7914535Z ╰──── 2026-10-25T02:20:05.7914627Z  help: Consider removing this import. 2026-10-25T02:20:05.7914629Z 2026-10-25T02:20:05.7914846Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-25T02:20:05.7915002Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1387:10] 2026-10-25T02:20:05.7915054Z 1386 │ 2026-10-25T02:20:05.7915148Z 1387 │ function assertUserMessagesExclude( 2026-10-25T02:20:05.7915280Z ·  ────────────┬──────────── 2026-10-25T02:20:05.7915440Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-25T02:20:05.7915551Z 1388 │ projection: OrchestrationV2ThreadProjection, 2026-10-25T02:20:05.7915603Z ╰──── 2026-10-25T02:20:05.7915701Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7915704Z 2026-10-25T02:20:05.7915949Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7916091Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-25T02:20:05.7916245Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-25T02:20:05.7916308Z 29 │ useEffect(() => { 2026-10-25T02:20:05.7916374Z ·  ────┬──── 2026-10-25T02:20:05.7916498Z · ╰── This is the containing effect 2026-10-25T02:20:05.7916613Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-25T02:20:05.7916716Z ·  ───┬─── 2026-10-25T02:20:05.7916900Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7916968Z 31 │ }, [key, live, snapshot]); 2026-10-25T02:20:05.7917016Z ╰──── 2026-10-25T02:20:05.7917585Z  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-25T02:20:05.7917893Z  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-25T02:20:05.7917901Z 2026-10-25T02:20:05.7918093Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7918222Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-25T02:20:05.7918302Z 453 │ showAuxiliaryPane("inspector"); 2026-10-25T02:20:05.7918404Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-25T02:20:05.7918544Z ·  ──────┬────── ────┬─── 2026-10-25T02:20:05.7918731Z · │ ╰── Unnecessary dependency `threadId` 2026-10-25T02:20:05.7918872Z · ╰── Unnecessary dependency `environmentId` 2026-10-25T02:20:05.7918929Z 455 │ const { 2026-10-25T02:20:05.7918978Z ╰──── 2026-10-25T02:20:05.7919312Z  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-25T02:20:05.7919640Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7919643Z 2026-10-25T02:20:05.7919818Z ⚠ react(static-components): Cannot create components during render 2026-10-25T02:20:05.7919948Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:722:20] 2026-10-25T02:20:05.7920100Z 489 │ // Expo may return null before registration or in older binaries; use the fallback. 2026-10-25T02:20:05.7920222Z 490 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-25T02:20:05.7920342Z ·  ─────────────┬───────────── 2026-10-25T02:20:05.7920517Z · ╰── The component is created during render here 2026-10-25T02:20:05.7920673Z 491 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-25T02:20:05.7920852Z 492 │ const showcasedReviewDrawRef = useRef(null); 2026-10-25T02:20:05.7920979Z 493 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-25T02:20:05.7921069Z 494 │ const handlePullToRefresh = async () => { 2026-10-25T02:20:05.7921143Z 495 │ setIsPullRefreshing(true); 2026-10-25T02:20:05.7921222Z 496 │ await refreshSelectedSection(); 2026-10-25T02:20:05.7921296Z 497 │ setIsPullRefreshing(false); 2026-10-25T02:20:05.7921349Z 498 │ }; 2026-10-25T02:20:05.7921487Z 499 │ const reviewFileNavigatorRef = useRef(null); 2026-10-25T02:20:05.7921626Z 500 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-25T02:20:05.7921730Z 501 │ const fileVisibility = useReviewFileVisibility({ 2026-10-25T02:20:05.7921813Z 502 │ threadKey: reviewCache.threadKey, 2026-10-25T02:20:05.7921898Z 503 │ sectionId: selectedSection?.id ?? null, 2026-10-25T02:20:05.7921962Z 504 │ files: reviewFiles, 2026-10-25T02:20:05.7922056Z 505 │ cachedExpandedFileIds: selectedSection?.id 2026-10-25T02:20:05.7922184Z 506 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-25T02:20:05.7922246Z 507 │ : undefined, 2026-10-25T02:20:05.7922337Z 508 │ cachedViewedFileIds: selectedSection?.id 2026-10-25T02:20:05.7922454Z 509 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-25T02:20:05.7922514Z 510 │ : undefined, 2026-10-25T02:20:05.7922566Z 511 │ }); 2026-10-25T02:20:05.7922758Z 512 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-25T02:20:05.7922887Z 513 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-25T02:20:05.7922948Z 514 │ environmentId, 2026-10-25T02:20:05.7923007Z 515 │ threadId, 2026-10-25T02:20:05.7923070Z 516 │ selectedSection, 2026-10-25T02:20:05.7923137Z 517 │ nativeReviewDiffData, 2026-10-25T02:20:05.7923189Z 518 │ }); 2026-10-25T02:20:05.7923289Z 519 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-25T02:20:05.7923371Z 520 │ threadKey: reviewCache.threadKey, 2026-10-25T02:20:05.7923455Z 521 │ sectionId: selectedSection?.id ?? null, 2026-10-25T02:20:05.7923529Z 522 │ diff: selectedSection?.diff, 2026-10-25T02:20:05.7923602Z 523 │ data: nativeReviewDiffData, 2026-10-25T02:20:05.7923729Z 524 │ collapsedFileIds, 2026-10-25T02:20:05.7923821Z 525 │ viewedFileIds, 2026-10-25T02:20:05.7923929Z 526 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-25T02:20:05.7924022Z 527 │ canHighlight: parsedDiff.kind === "files", 2026-10-25T02:20:05.7924074Z 528 │ }); 2026-10-25T02:20:05.7924143Z 529 │ const showcaseReviewKey = 2026-10-25T02:20:05.7924270Z 530 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-25T02:20:05.7924469Z 531 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-25T02:20:05.7924529Z 532 │ : null; 2026-10-25T02:20:05.7924687Z 533 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-25T02:20:05.7924762Z 534 │ nativeBridge.onDebug(event); 2026-10-25T02:20:05.7924817Z 535 │ if ( 2026-10-25T02:20:05.7924899Z 536 │ showcaseReviewKey === null || 2026-10-25T02:20:05.7925019Z 537 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-25T02:20:05.7925166Z 538 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-25T02:20:05.7925220Z 539 │ ) { 2026-10-25T02:20:05.7925277Z 540 │ return; 2026-10-25T02:20:05.7925330Z 541 │ } 2026-10-25T02:20:05.7925437Z 542 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-25T02:20:05.7925592Z 543 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-25T02:20:05.7925642Z 544 │ }; 2026-10-25T02:20:05.7925693Z 545 │ 2026-10-25T02:20:05.7925808Z 546 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-25T02:20:05.7925886Z 547 │ loadVisibleFile(fileId, true); 2026-10-25T02:20:05.7925969Z 548 │ commentSelection.clearSelection(); 2026-10-25T02:20:05.7926093Z 549 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-25T02:20:05.7926173Z 550 │ toggleExpandedFile(fileId); 2026-10-25T02:20:05.7926225Z 551 │ } 2026-10-25T02:20:05.7926331Z 552 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-25T02:20:05.7926400Z 553 │ if (!nativeView) return; 2026-10-25T02:20:05.7926489Z 554 │ const result = await settlePromise(() => 2026-10-25T02:20:05.7926655Z 555 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-25T02:20:05.7926706Z 556 │ ); 2026-10-25T02:20:05.7926791Z 557 │ if (AsyncResult.isFailure(result)) { 2026-10-25T02:20:05.7926964Z 558 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-25T02:20:05.7927016Z 559 │ } 2026-10-25T02:20:05.7927066Z 560 │ }; 2026-10-25T02:20:05.7927151Z 561 │ const handleVisibleFileChange = ( 2026-10-25T02:20:05.7927280Z 562 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-25T02:20:05.7927333Z 563 │ ) => { 2026-10-25T02:20:05.7927436Z 564 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T02:20:05.7927598Z 565 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T02:20:05.7927649Z 566 │ }; 2026-10-25T02:20:05.7927723Z 567 │ const renderInspector = () => ( 2026-10-25T02:20:05.7927789Z 568 │ void handleSelectFile(fileId)} 2026-10-25T02:20:05.7928358Z 574 │ /> 2026-10-25T02:20:05.7928408Z 575 │ ); 2026-10-25T02:20:05.7928459Z 576 │ 2026-10-25T02:20:05.7928634Z 577 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-25T02:20:05.7928718Z 578 │ const { fileId } = event.nativeEvent; 2026-10-25T02:20:05.7928777Z 579 │ if (fileId) { 2026-10-25T02:20:05.7928855Z 580 │ loadVisibleFile(fileId, true); 2026-10-25T02:20:05.7928930Z 581 │ toggleExpandedFile(fileId); 2026-10-25T02:20:05.7928982Z 582 │ } 2026-10-25T02:20:05.7929032Z 583 │ }; 2026-10-25T02:20:05.7929083Z 584 │ 2026-10-25T02:20:05.7929168Z 585 │ const handleNativeToggleViewedFile = ( 2026-10-25T02:20:05.7929280Z 586 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-25T02:20:05.7929333Z 587 │ ) => { 2026-10-25T02:20:05.7929420Z 588 │ const { fileId } = event.nativeEvent; 2026-10-25T02:20:05.7929482Z 589 │ if (fileId) { 2026-10-25T02:20:05.7929554Z 590 │ toggleViewedFile(fileId); 2026-10-25T02:20:05.7929606Z 591 │ } 2026-10-25T02:20:05.7929656Z 592 │ }; 2026-10-25T02:20:05.7929706Z 593 │ 2026-10-25T02:20:05.7929773Z 594 │ const parsedDiffNotice = 2026-10-25T02:20:05.7929929Z 595 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-25T02:20:05.7930045Z 596 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-25T02:20:05.7930195Z 597 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-25T02:20:05.7930309Z 598 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-25T02:20:05.7930466Z 599 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-25T02:20:05.7930575Z 600 │ hasEnvironmentPresentation: environment.isReady, 2026-10-25T02:20:05.7930671Z 601 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-25T02:20:05.7930738Z 602 │ hasCachedSelectedDiff, 2026-10-25T02:20:05.7930802Z 603 │ hasAnyCachedDiff, 2026-10-25T02:20:05.7930853Z 604 │ }); 2026-10-25T02:20:05.7930938Z 605 │ const handleRetryEnvironment = () => { 2026-10-25T02:20:05.7931020Z 606 │ void retryEnvironment(environmentId); 2026-10-25T02:20:05.7931071Z 607 │ }; 2026-10-25T02:20:05.7931152Z 608 │ const handleReturnToThread = () => { 2026-10-25T02:20:05.7931228Z 609 │ if (navigation.canGoBack()) { 2026-10-25T02:20:05.7931296Z 610 │ navigation.goBack(); 2026-10-25T02:20:05.7931355Z 611 │ return; 2026-10-25T02:20:05.7931407Z 612 │ } 2026-10-25T02:20:05.7931485Z 613 │ navigation.navigate("Thread", { 2026-10-25T02:20:05.7931574Z 614 │ environmentId: String(environmentId), 2026-10-25T02:20:05.7931653Z 615 │ threadId: String(threadId), 2026-10-25T02:20:05.7931706Z 616 │ }); 2026-10-25T02:20:05.7931756Z 617 │ }; 2026-10-25T02:20:05.7931837Z 618 │ const androidHeaderSubtitle = [ 2026-10-25T02:20:05.7931907Z 619 │ selectedSection?.title, 2026-10-25T02:20:05.7931984Z 620 │ headerDiffSummary.additions, 2026-10-25T02:20:05.7932058Z 621 │ headerDiffSummary.deletions, 2026-10-25T02:20:05.7932109Z 622 │ ] 2026-10-25T02:20:05.7932211Z 623 │ .filter((part): part is string => Boolean(part)) 2026-10-25T02:20:05.7932271Z 624 │ .join(" · "); 2026-10-25T02:20:05.7932320Z 625 │ 2026-10-25T02:20:05.7932395Z 626 │ const showChangedFilesPane = 2026-10-25T02:20:05.7932465Z 627 │ !showConnectionNotice && 2026-10-25T02:20:05.7932586Z 628 │ selectedSection !== null && 2026-10-25T02:20:05.7932691Z 629 │ parsedDiff.kind === "files" && 2026-10-25T02:20:05.7932767Z 630 │ NativeReviewDiffView !== null; 2026-10-25T02:20:05.7932930Z 631 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-25T02:20:05.7933094Z 632 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-25T02:20:05.7933143Z 633 │ 2026-10-25T02:20:05.7933212Z 634 │ const listHeader = (() => { 2026-10-25T02:20:05.7933294Z 635 │ const children: ReactElement[] = []; 2026-10-25T02:20:05.7933343Z 636 │ 2026-10-25T02:20:05.7933402Z 637 │ if (error) { 2026-10-25T02:20:05.7933466Z 638 │ children.push( 2026-10-25T02:20:05.7933524Z 639 │ 2026-10-25T02:20:05.7934158Z 646 │ Review unavailable 2026-10-25T02:20:05.7934307Z 647 │ {error} 2026-10-25T02:20:05.7934364Z 648 │ , 2026-10-25T02:20:05.7934419Z 649 │ ); 2026-10-25T02:20:05.7934470Z 650 │ } 2026-10-25T02:20:05.7934520Z 651 │ 2026-10-25T02:20:05.7934588Z 652 │ if (parsedDiffNotice) { 2026-10-25T02:20:05.7934742Z 653 │ children.push(); 2026-10-25T02:20:05.7934800Z 654 │ } 2026-10-25T02:20:05.7934852Z 655 │ 2026-10-25T02:20:05.7934925Z 656 │ if (children.length === 0) { 2026-10-25T02:20:05.7934986Z 657 │ return null; 2026-10-25T02:20:05.7935039Z 658 │ } 2026-10-25T02:20:05.7935108Z 659 │ 2026-10-25T02:20:05.7935176Z 660 │ return <>{children}; 2026-10-25T02:20:05.7935228Z 661 │ })(); 2026-10-25T02:20:05.7935295Z 662 │ const headerSubtitle = [ 2026-10-25T02:20:05.7935370Z 663 │ headerDiffSummary.additions, 2026-10-25T02:20:05.7935446Z 664 │ headerDiffSummary.deletions, 2026-10-25T02:20:05.7935523Z 665 │ pendingReviewCommentCount > 0 2026-10-25T02:20:05.7935690Z 666 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-25T02:20:05.7935747Z 667 │ : null, 2026-10-25T02:20:05.7935799Z 668 │ ] 2026-10-25T02:20:05.7935914Z 669 │ .filter(Boolean) 2026-10-25T02:20:05.7936000Z 670 │ .join(" · "); 2026-10-25T02:20:05.7936129Z 671 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-25T02:20:05.7936181Z 672 │ 2026-10-25T02:20:05.7936240Z 673 │ return ( 2026-10-25T02:20:05.7936293Z 674 │ <> 2026-10-25T02:20:05.7936354Z 675 │ 2026-10-25T02:20:05.7937619Z 691 │ 2026-10-25T02:20:05.7937682Z 692 │ 2026-10-25T02:20:05.7937798Z 693 │ 2026-10-25T02:20:05.7937874Z 694 │ {showConnectionNotice ? ( 2026-10-25T02:20:05.7938014Z 695 │ 2026-10-25T02:20:05.7938103Z 696 │ 2026-10-25T02:20:05.7939072Z 708 │ 2026-10-25T02:20:05.7939225Z 709 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-25T02:20:05.7939283Z 710 │ 2026-10-25T02:20:05.7939703Z 716 │ 2026-10-25T02:20:05.7940043Z 720 │ {listHeader} 2026-10-25T02:20:05.7940204Z 721 │ 2026-10-25T02:20:05.7940308Z 722 │ { 2026-10-25T02:20:05.7941872Z ·  ────┬──── 2026-10-25T02:20:05.7941996Z · ╰── This is the containing effect 2026-10-25T02:20:05.7942057Z 261 │ stop(); 2026-10-25T02:20:05.7942123Z ·  ──┬─ 2026-10-25T02:20:05.7942280Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7942342Z 262 │ }, [orderVersion]); 2026-10-25T02:20:05.7942394Z ╰──── 2026-10-25T02:20:05.7942974Z  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-25T02:20:05.7943286Z  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-25T02:20:05.7943288Z 2026-10-25T02:20:05.7943495Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.7943648Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T02:20:05.7943713Z 260 │ useEffect(() => { 2026-10-25T02:20:05.7943772Z 261 │ stop(); 2026-10-25T02:20:05.7943841Z ·  ──┬─ 2026-10-25T02:20:05.7943965Z · ╰── Missing dependency `stop` 2026-10-25T02:20:05.7944029Z 262 │ }, [orderVersion]); 2026-10-25T02:20:05.7944105Z ·  ──────┬───── 2026-10-25T02:20:05.7944245Z · ╰── Unnecessary dependency `orderVersion` 2026-10-25T02:20:05.7944304Z 263 │ useEffect( 2026-10-25T02:20:05.7944353Z ╰──── 2026-10-25T02:20:05.7944760Z  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-25T02:20:05.7945128Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7945155Z 2026-10-25T02:20:05.7945293Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7945445Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-25T02:20:05.7945519Z 95 │ const latest = useRef(props); 2026-10-25T02:20:05.7945585Z 96 │ latest.current = props; 2026-10-25T02:20:05.7945686Z ·  ───┬──────┬─── 2026-10-25T02:20:05.7945863Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.7945973Z · ╰── This value is a ref 2026-10-25T02:20:05.7946038Z 97 │ const gesture = useMemo( 2026-10-25T02:20:05.7946086Z ╰──── 2026-10-25T02:20:05.7946546Z  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-25T02:20:05.7946829Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7946832Z 2026-10-25T02:20:05.7946971Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7947125Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-25T02:20:05.7947189Z 103 │ .runOnJS(true) 2026-10-25T02:20:05.7947285Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:20:05.7947402Z ·  ───────────────┬────────────── 2026-10-25T02:20:05.7947600Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7947730Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7947781Z ╰──── 2026-10-25T02:20:05.7948230Z  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-25T02:20:05.7948513Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7948516Z 2026-10-25T02:20:05.7948652Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7948807Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-25T02:20:05.7948905Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:20:05.7949031Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7949169Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T02:20:05.7949367Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7949489Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7949539Z ╰──── 2026-10-25T02:20:05.7950027Z  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-25T02:20:05.7950332Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7950336Z 2026-10-25T02:20:05.7950471Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7950622Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-25T02:20:05.7950748Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7950866Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7951002Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T02:20:05.7951205Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7951330Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:20:05.7951379Z ╰──── 2026-10-25T02:20:05.7951821Z  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-25T02:20:05.7952098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7952101Z 2026-10-25T02:20:05.7952238Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7952389Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-25T02:20:05.7952510Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7952630Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:20:05.7952764Z ·  ───────────────────────┬────────────────────── 2026-10-25T02:20:05.7952962Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.7953029Z 108 │ [props.disabled], 2026-10-25T02:20:05.7953078Z ╰──── 2026-10-25T02:20:05.7953523Z  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-25T02:20:05.7953806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7953811Z 2026-10-25T02:20:05.7953947Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7954103Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-25T02:20:05.7954212Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T02:20:05.7954315Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-25T02:20:05.7954416Z ·  ───┬──────┬─── 2026-10-25T02:20:05.7954590Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.7954698Z · ╰── This value is a ref 2026-10-25T02:20:05.7954750Z 250 │ 2026-10-25T02:20:05.7954849Z ╰──── 2026-10-25T02:20:05.7955348Z  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-25T02:20:05.7955626Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7955630Z 2026-10-25T02:20:05.7955765Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.7955917Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-25T02:20:05.7956032Z 246 │ const [preview, setPreview] = useState(null); 2026-10-25T02:20:05.7956145Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-25T02:20:05.7956264Z ·  ──────────────────┬────────────────── 2026-10-25T02:20:05.7956425Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.7956534Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T02:20:05.7956584Z ╰──── 2026-10-25T02:20:05.7957029Z  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-25T02:20:05.7957307Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.7957309Z 2026-10-25T02:20:05.7957476Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.7957632Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-25T02:20:05.7957695Z 323 │ update(0); 2026-10-25T02:20:05.7957771Z 324 │ let last = performance.now(); 2026-10-25T02:20:05.7957866Z ·  ────────┬──────── 2026-10-25T02:20:05.7958000Z · ╰── Cannot call impure function 2026-10-25T02:20:05.7958067Z 325 │ const tick = () => { 2026-10-25T02:20:05.7958116Z ╰──── 2026-10-25T02:20:05.7958401Z  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-25T02:20:05.7958729Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.7958757Z 2026-10-25T02:20:05.7958937Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:20:05.7959088Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-25T02:20:05.7959146Z  98 │ () => 2026-10-25T02:20:05.7959210Z  99 │ Gesture.Pan() 2026-10-25T02:20:05.7959282Z ·  ─┬─ 2026-10-25T02:20:05.7959406Z · ╰── `Pan` may be a component 2026-10-25T02:20:05.7959484Z 100 │ .enabled(!props.disabled) 2026-10-25T02:20:05.7959535Z ╰──── 2026-10-25T02:20:05.7959808Z  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-25T02:20:05.7960239Z  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-25T02:20:05.7960242Z 2026-10-25T02:20:05.7960421Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:20:05.7960574Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-25T02:20:05.7960716Z 103 │ .runOnJS(true) 2026-10-25T02:20:05.7960812Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T02:20:05.7960895Z ·  ───┬── 2026-10-25T02:20:05.7961316Z · ╰── 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-25T02:20:05.7961447Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7961567Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T02:20:05.7961685Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T02:20:05.7961749Z 108 │ [props.disabled], 2026-10-25T02:20:05.7961828Z ·  ────────┬─────── 2026-10-25T02:20:05.7962009Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.7962060Z 109 │ ); 2026-10-25T02:20:05.7962110Z ╰──── 2026-10-25T02:20:05.7962312Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:20:05.7962616Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7962618Z 2026-10-25T02:20:05.7962866Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7963030Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-25T02:20:05.7963081Z 118 │ 2026-10-25T02:20:05.7963144Z 119 │ useEffect(() => { 2026-10-25T02:20:05.7963214Z ·  ────┬──── 2026-10-25T02:20:05.7963338Z · ╰── This is the containing effect 2026-10-25T02:20:05.7963424Z 120 │ if (orientationSettled) return; 2026-10-25T02:20:05.7963592Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-25T02:20:05.7963696Z 122 │ if (orientation === null) { 2026-10-25T02:20:05.7963774Z 123 │ setOrientationSettled(true); 2026-10-25T02:20:05.7963862Z ·  ──────────┬────────── 2026-10-25T02:20:05.7964029Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7964088Z 124 │ return; 2026-10-25T02:20:05.7964137Z ╰──── 2026-10-25T02:20:05.7964712Z  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-25T02:20:05.7965027Z  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-25T02:20:05.7965032Z 2026-10-25T02:20:05.7965311Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7965473Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:298:7] 2026-10-25T02:20:05.7965523Z 286 │ 2026-10-25T02:20:05.7965587Z 287 │ useEffect(() => { 2026-10-25T02:20:05.7965655Z ·  ────┬──── 2026-10-25T02:20:05.7965780Z · ╰── This is the containing effect 2026-10-25T02:20:05.7965836Z 288 │ if ( 2026-10-25T02:20:05.7965901Z 289 │ scene === null || 2026-10-25T02:20:05.7965974Z 290 │ requestedScene === null || 2026-10-25T02:20:05.7966053Z 291 │ scene !== requestedScene || 2026-10-25T02:20:05.7966120Z 292 │ !hasFixture || 2026-10-25T02:20:05.7966190Z 293 │ !orientationSettled || 2026-10-25T02:20:05.7966255Z 294 │ !themeApplied || 2026-10-25T02:20:05.7966366Z 295 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-25T02:20:05.7966496Z 296 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-25T02:20:05.7966550Z 297 │ ) { 2026-10-25T02:20:05.7966618Z 298 │ setReadyScene(null); 2026-10-25T02:20:05.7966694Z ·  ──────┬────── 2026-10-25T02:20:05.7966858Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7966918Z 299 │ return; 2026-10-25T02:20:05.7966968Z ╰──── 2026-10-25T02:20:05.7967544Z  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-25T02:20:05.7967856Z  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-25T02:20:05.7967859Z 2026-10-25T02:20:05.7968120Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.7968283Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-25T02:20:05.7968351Z 127 │ let cancelled = false; 2026-10-25T02:20:05.7968438Z 128 │ let lastOutcome: string | null = null; 2026-10-25T02:20:05.7968555Z ·  ─────┬───── 2026-10-25T02:20:05.7968715Z · ╰── 'lastOutcome' is declared here 2026-10-25T02:20:05.7968889Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-25T02:20:05.7968937Z ╰──── 2026-10-25T02:20:05.7969040Z  help: Consider removing this declaration. 2026-10-25T02:20:05.7969042Z 2026-10-25T02:20:05.7969230Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.7969390Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:803:17] 2026-10-25T02:20:05.7969450Z 802 │
{ 2026-10-25T02:20:05.7970668Z ·  ────┬──── 2026-10-25T02:20:05.7970793Z · ╰── This is the containing effect 2026-10-25T02:20:05.7970876Z 119 │ void refreshNotifications(); 2026-10-25T02:20:05.7970964Z ·  ──────────┬───────── 2026-10-25T02:20:05.7971132Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7971269Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-25T02:20:05.7971319Z ╰──── 2026-10-25T02:20:05.7971888Z  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-25T02:20:05.7972200Z  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-25T02:20:05.7972206Z 2026-10-25T02:20:05.7972449Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7972627Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-25T02:20:05.7972677Z 125 │ 2026-10-25T02:20:05.7972738Z 126 │ useEffect(() => { 2026-10-25T02:20:05.7972807Z ·  ────┬──── 2026-10-25T02:20:05.7972931Z · ╰── This is the containing effect 2026-10-25T02:20:05.7972994Z 127 │ if (!isLoaded) { 2026-10-25T02:20:05.7973081Z 128 │ setLiveActivityStatus("checking"); 2026-10-25T02:20:05.7973167Z ·  ──────────┬────────── 2026-10-25T02:20:05.7973382Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7973467Z 129 │ return; 2026-10-25T02:20:05.7973515Z ╰──── 2026-10-25T02:20:05.7974089Z  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-25T02:20:05.7974400Z  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-25T02:20:05.7974403Z 2026-10-25T02:20:05.7974647Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7974811Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-25T02:20:05.7974868Z 213 │ }; 2026-10-25T02:20:05.7974930Z 214 │ useEffect(() => { 2026-10-25T02:20:05.7974998Z ·  ────┬──── 2026-10-25T02:20:05.7975132Z · ╰── This is the containing effect 2026-10-25T02:20:05.7975323Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-25T02:20:05.7975385Z 216 │ if (inserted) { 2026-10-25T02:20:05.7975460Z 217 │ setSelection((current) => 2026-10-25T02:20:05.7975536Z ·  ──────┬───── 2026-10-25T02:20:05.7975698Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7975862Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-25T02:20:05.7975918Z ╰──── 2026-10-25T02:20:05.7976494Z  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-25T02:20:05.7976799Z  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-25T02:20:05.7976805Z 2026-10-25T02:20:05.7977049Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7977208Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:297:7] 2026-10-25T02:20:05.7977286Z 285 │ }, [hasWorkspaceSnapshot]); 2026-10-25T02:20:05.7977351Z 286 │ useEffect(() => { 2026-10-25T02:20:05.7977417Z ·  ────┬──── 2026-10-25T02:20:05.7977540Z · ╰── This is the containing effect 2026-10-25T02:20:05.7977685Z 287 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-25T02:20:05.7977830Z 288 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-25T02:20:05.7977898Z 289 │ const now = Date.now(); 2026-10-25T02:20:05.7978008Z 290 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-25T02:20:05.7978064Z 291 │ if ( 2026-10-25T02:20:05.7978138Z 292 │ lastRequest?.key === key && 2026-10-25T02:20:05.7978271Z 293 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-25T02:20:05.7978324Z 294 │ ) 2026-10-25T02:20:05.7978425Z 295 │ return; 2026-10-25T02:20:05.7978622Z 296 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-25T02:20:05.7978704Z 297 │ setWorkspaceRefreshRetry(null); 2026-10-25T02:20:05.7978795Z ·  ────────────┬─────────── 2026-10-25T02:20:05.7978965Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7979021Z 298 │ return; 2026-10-25T02:20:05.7979070Z ╰──── 2026-10-25T02:20:05.7979643Z  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-25T02:20:05.7979955Z  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-25T02:20:05.7979960Z 2026-10-25T02:20:05.7980154Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.7980311Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:327:5] 2026-10-25T02:20:05.7980364Z 326 │ }, [ 2026-10-25T02:20:05.7980426Z 327 │ draftMessage, 2026-10-25T02:20:05.7980501Z ·  ──────┬───── 2026-10-25T02:20:05.7980641Z · ╰── Unnecessary dependency `draftMessage` 2026-10-25T02:20:05.7980704Z 328 │ environmentId, 2026-10-25T02:20:05.7980754Z ╰──── 2026-10-25T02:20:05.7981051Z  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-25T02:20:05.7981355Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7981357Z 2026-10-25T02:20:05.7981562Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.7981698Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:767:7] 2026-10-25T02:20:05.7981799Z 766 │ if (settingsSheetPresentation.isActive) { 2026-10-25T02:20:05.7981929Z 767 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-25T02:20:05.7982020Z ·  ────────────┬──────────── 2026-10-25T02:20:05.7982228Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-25T02:20:05.7982308Z 768 │ } 2026-10-25T02:20:05.7982506Z 769 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-25T02:20:05.7982609Z ·  ────────────────┬──────────────── 2026-10-25T02:20:05.7982878Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-25T02:20:05.7982930Z 770 │ 2026-10-25T02:20:05.7982981Z ╰──── 2026-10-25T02:20:05.7983385Z  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-25T02:20:05.7983689Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.7983694Z 2026-10-25T02:20:05.7983843Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7983980Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:388:5] 2026-10-25T02:20:05.7984136Z 384 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-25T02:20:05.7984264Z 385 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-25T02:20:05.7984352Z ·  ──────────┬───────── 2026-10-25T02:20:05.7984500Z · ╰── `animatedBorderRadius` originates here 2026-10-25T02:20:05.7984654Z 386 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-25T02:20:05.7984727Z 387 │ useLayoutEffect(() => { 2026-10-25T02:20:05.7984829Z 388 │ animatedBorderRadius.value = shouldAnimate 2026-10-25T02:20:05.7984912Z ·  ──────────┬───────── 2026-10-25T02:20:05.7985063Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-25T02:20:05.7985157Z 389 │ ? withTiming(targetBorderRadius, { 2026-10-25T02:20:05.7985234Z ╰──── 2026-10-25T02:20:05.7985490Z  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-25T02:20:05.7985783Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7985786Z 2026-10-25T02:20:05.7986007Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:20:05.7986146Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-25T02:20:05.7986207Z 237 │ ): string { 2026-10-25T02:20:05.7986358Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-25T02:20:05.7986465Z ·  ────── 2026-10-25T02:20:05.7986589Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-25T02:20:05.7986639Z ╰──── 2026-10-25T02:20:05.7986806Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:20:05.7986809Z 2026-10-25T02:20:05.7986999Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-25T02:20:05.7987175Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-25T02:20:05.7987271Z 1 │ import type { 2026-10-25T02:20:05.7987334Z 2 │ EnvironmentId, 2026-10-25T02:20:05.7987408Z ·  ──────┬────── 2026-10-25T02:20:05.7987536Z · ╰── 'EnvironmentId' is imported here 2026-10-25T02:20:05.7987620Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-25T02:20:05.7987669Z ╰──── 2026-10-25T02:20:05.7987765Z  help: Consider removing this import. 2026-10-25T02:20:05.7987767Z 2026-10-25T02:20:05.7987988Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T02:20:05.7988143Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-25T02:20:05.7988203Z 261 │ ): boolean { 2026-10-25T02:20:05.7988353Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-25T02:20:05.7988512Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-25T02:20:05.7988654Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-25T02:20:05.7988703Z ╰──── 2026-10-25T02:20:05.7988777Z  help: Switch to `Set` 2026-10-25T02:20:05.7988780Z 2026-10-25T02:20:05.7988991Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:20:05.7989118Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:998:15] 2026-10-25T02:20:05.7989184Z 997 │ instanceId, 2026-10-25T02:20:05.7989319Z 998 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-25T02:20:05.7989455Z ·  ────────────────────────────────────────────────── 2026-10-25T02:20:05.7989519Z 999 │ ]), 2026-10-25T02:20:05.7989570Z ╰──── 2026-10-25T02:20:05.7989825Z  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-25T02:20:05.7989828Z 2026-10-25T02:20:05.7990073Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.7990240Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-25T02:20:05.7990291Z 58 │ 2026-10-25T02:20:05.7990356Z 59 │ useEffect(() => { 2026-10-25T02:20:05.7990426Z ·  ────┬──── 2026-10-25T02:20:05.7990551Z · ╰── This is the containing effect 2026-10-25T02:20:05.7990635Z 60 │ setMountedModes((current) => { 2026-10-25T02:20:05.7990714Z ·  ───────┬─────── 2026-10-25T02:20:05.7990876Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.7990954Z 61 │ if (current.has(props.mode)) { 2026-10-25T02:20:05.7991005Z ╰──── 2026-10-25T02:20:05.7991580Z  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-25T02:20:05.7991891Z  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-25T02:20:05.7991894Z 2026-10-25T02:20:05.7992087Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7992266Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:108:5] 2026-10-25T02:20:05.7992320Z 104 │ ); 2026-10-25T02:20:05.7992469Z 105 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-25T02:20:05.7992555Z ·  ─────────┬──────── 2026-10-25T02:20:05.7992701Z · ╰── `separationProgress` originates here 2026-10-25T02:20:05.7992752Z 106 │ 2026-10-25T02:20:05.7992815Z 107 │ useEffect(() => { 2026-10-25T02:20:05.7992983Z 108 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-25T02:20:05.7993063Z ·  ─────────┬──────── 2026-10-25T02:20:05.7993214Z · ╰── `separationProgress` cannot be modified 2026-10-25T02:20:05.7993323Z 109 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-25T02:20:05.7993375Z ╰──── 2026-10-25T02:20:05.7993627Z  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-25T02:20:05.7993923Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7993926Z 2026-10-25T02:20:05.7994076Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7994234Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:132:5] 2026-10-25T02:20:05.7994455Z 122 │ // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting. 2026-10-25T02:20:05.7994577Z 123 │ const capsuleWidth = useSharedValue(null); 2026-10-25T02:20:05.7994657Z ·  ──────┬───── 2026-10-25T02:20:05.7994786Z · ╰── `capsuleWidth` originates here 2026-10-25T02:20:05.7994893Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T02:20:05.7995004Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.7995135Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:20:05.7995228Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T02:20:05.7995285Z 128 │ return; 2026-10-25T02:20:05.7995338Z 129 │ } 2026-10-25T02:20:05.7995443Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T02:20:05.7995525Z 131 │ measuredWidthRef.current = width; 2026-10-25T02:20:05.7995666Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:20:05.7995744Z ·  ──────┬───── 2026-10-25T02:20:05.7995879Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T02:20:05.7995931Z 133 │ }; 2026-10-25T02:20:05.7995980Z ╰──── 2026-10-25T02:20:05.7996232Z  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-25T02:20:05.7996523Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7996525Z 2026-10-25T02:20:05.7996675Z ⚠ react(immutability): This value cannot be modified 2026-10-25T02:20:05.7996874Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:139:7] 2026-10-25T02:20:05.7997114Z 122 │ // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting. 2026-10-25T02:20:05.7997226Z 123 │ const capsuleWidth = useSharedValue(null); 2026-10-25T02:20:05.7997304Z ·  ──────┬───── 2026-10-25T02:20:05.7997433Z · ╰── `capsuleWidth` originates here 2026-10-25T02:20:05.7997538Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T02:20:05.7997647Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.7997747Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:20:05.7997839Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T02:20:05.7997896Z 128 │ return; 2026-10-25T02:20:05.7997954Z 129 │ } 2026-10-25T02:20:05.7998058Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T02:20:05.7998142Z 131 │ measuredWidthRef.current = width; 2026-10-25T02:20:05.7998276Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:20:05.7998328Z 133 │ }; 2026-10-25T02:20:05.7998417Z 134 │ const hasStatus = props.status !== null; 2026-10-25T02:20:05.7998545Z 135 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T02:20:05.7998607Z 136 │ useEffect(() => { 2026-10-25T02:20:05.7998671Z 137 │ if (!hasStatus) { 2026-10-25T02:20:05.7998755Z 138 │ measuredWidthRef.current = null; 2026-10-25T02:20:05.7998831Z 139 │ capsuleWidth.value = null; 2026-10-25T02:20:05.7998907Z ·  ──────┬───── 2026-10-25T02:20:05.7999049Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T02:20:05.7999103Z 140 │ } 2026-10-25T02:20:05.7999152Z ╰──── 2026-10-25T02:20:05.7999408Z  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-25T02:20:05.7999700Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.7999703Z 2026-10-25T02:20:05.7999893Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:20:05.8000052Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:139:7] 2026-10-25T02:20:05.8000181Z 135 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T02:20:05.8000288Z 136 │ useEffect(() => { 2026-10-25T02:20:05.8000391Z ·  ───┬─── 2026-10-25T02:20:05.8000607Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T02:20:05.8000729Z 137 │ if (!hasStatus) { 2026-10-25T02:20:05.8000813Z 138 │ measuredWidthRef.current = null; 2026-10-25T02:20:05.8000890Z 139 │ capsuleWidth.value = null; 2026-10-25T02:20:05.8000963Z ·  ──────┬───── 2026-10-25T02:20:05.8001092Z · ╰── This modifies `capsuleWidth` 2026-10-25T02:20:05.8001144Z 140 │ } 2026-10-25T02:20:05.8001194Z ╰──── 2026-10-25T02:20:05.8001527Z  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-25T02:20:05.8001821Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.8001824Z 2026-10-25T02:20:05.8002014Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T02:20:05.8002170Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:132:5] 2026-10-25T02:20:05.8002280Z 124 │ const measuredWidthRef = useRef(null); 2026-10-25T02:20:05.8002393Z 125 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T02:20:05.8002510Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.8002750Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T02:20:05.8002855Z 126 │ const width = event.nativeEvent.layout.width; 2026-10-25T02:20:05.8002948Z 127 │ if (width === measuredWidthRef.current) { 2026-10-25T02:20:05.8003006Z 128 │ return; 2026-10-25T02:20:05.8003058Z 129 │ } 2026-10-25T02:20:05.8003159Z 130 │ const first = measuredWidthRef.current === null; 2026-10-25T02:20:05.8003242Z 131 │ measuredWidthRef.current = width; 2026-10-25T02:20:05.8003377Z 132 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T02:20:05.8003450Z ·  ──────┬───── 2026-10-25T02:20:05.8003579Z · ╰── This modifies `capsuleWidth` 2026-10-25T02:20:05.8003631Z 133 │ }; 2026-10-25T02:20:05.8003680Z ╰──── 2026-10-25T02:20:05.8004012Z  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-25T02:20:05.8004311Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T02:20:05.8004314Z 2026-10-25T02:20:05.8004495Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:20:05.8004642Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:606:27] 2026-10-25T02:20:05.8004807Z 605 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-25T02:20:05.8004882Z 606 │ const gesture = Gesture.Pan() 2026-10-25T02:20:05.8004967Z ·  ─┬─ 2026-10-25T02:20:05.8005192Z · ╰── `Pan` may be a component 2026-10-25T02:20:05.8005306Z 607 │ .enabled(!props.disabled) 2026-10-25T02:20:05.8005356Z ╰──── 2026-10-25T02:20:05.8005621Z  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-25T02:20:05.8006048Z  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-25T02:20:05.8006051Z 2026-10-25T02:20:05.8006244Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8006381Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1362:5] 2026-10-25T02:20:05.8006464Z 1361 │ queuedMessagesByThreadKey, 2026-10-25T02:20:05.8006528Z 1362 │ retryTick, 2026-10-25T02:20:05.8006597Z ·  ────┬──── 2026-10-25T02:20:05.8006734Z · ╰── Unnecessary dependency `retryTick` 2026-10-25T02:20:05.8006803Z 1363 │ restoreQueuedMessage, 2026-10-25T02:20:05.8006854Z ╰──── 2026-10-25T02:20:05.8007133Z  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-25T02:20:05.8007433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8007436Z 2026-10-25T02:20:05.8007688Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8007818Z ╭─[packages/provider-grok/src/server/adapter.ts:411:7] 2026-10-25T02:20:05.8007869Z 410 │ 2026-10-25T02:20:05.8007935Z 411 │ const layer: Layer.Layer< 2026-10-25T02:20:05.8008002Z ·  ──┬── 2026-10-25T02:20:05.8008118Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.8008206Z 412 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T02:20:05.8008256Z ╰──── 2026-10-25T02:20:05.8008356Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8008359Z 2026-10-25T02:20:05.8008604Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8008757Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:433:5] 2026-10-25T02:20:05.8008822Z 423 │ : null; 2026-10-25T02:20:05.8008888Z 424 │ useEffect(() => { 2026-10-25T02:20:05.8008955Z ·  ────┬──── 2026-10-25T02:20:05.8009079Z · ╰── This is the containing effect 2026-10-25T02:20:05.8009134Z 425 │ if ( 2026-10-25T02:20:05.8009207Z 426 │ props.active === false || 2026-10-25T02:20:05.8009281Z 427 │ activeDraftKey !== null || 2026-10-25T02:20:05.8009359Z 428 │ editingPendingTask !== null || 2026-10-25T02:20:05.8009434Z 429 │ selectedProject === null 2026-10-25T02:20:05.8009489Z 430 │ ) { 2026-10-25T02:20:05.8009547Z 431 │ return; 2026-10-25T02:20:05.8009597Z 432 │ } 2026-10-25T02:20:05.8009664Z 433 │ setActiveDraftKey( 2026-10-25T02:20:05.8009744Z ·  ────────┬──────── 2026-10-25T02:20:05.8009956Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8010054Z 434 │ createNewTaskDraft({ 2026-10-25T02:20:05.8010105Z ╰──── 2026-10-25T02:20:05.8010678Z  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-25T02:20:05.8010986Z  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-25T02:20:05.8010989Z 2026-10-25T02:20:05.8011221Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T02:20:05.8011382Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1214:36] 2026-10-25T02:20:05.8011485Z 1213 │ 2026-10-25T02:20:05.8011672Z 1214 │ {props.children} 2026-10-25T02:20:05.8011782Z ·  ───────────── 2026-10-25T02:20:05.8011851Z 1215 │ 2026-10-25T02:20:05.8011902Z ╰──── 2026-10-25T02:20:05.8012119Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T02:20:05.8012256Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T02:20:05.8012258Z 2026-10-25T02:20:05.8012446Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.8012614Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:84:15] 2026-10-25T02:20:05.8012677Z 83 │
  • { 2026-10-25T02:20:05.8016093Z ·  ────┬──── 2026-10-25T02:20:05.8016227Z · ╰── This is the containing effect 2026-10-25T02:20:05.8016318Z 410 │ setInspectorSelection((current) => { 2026-10-25T02:20:05.8016404Z ·  ──────────┬────────── 2026-10-25T02:20:05.8016573Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8016676Z 411 │ if (props.renderInspector === undefined) { 2026-10-25T02:20:05.8016728Z ╰──── 2026-10-25T02:20:05.8017306Z  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-25T02:20:05.8017627Z  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-25T02:20:05.8017632Z 2026-10-25T02:20:05.8017840Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:20:05.8017990Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:538:24] 2026-10-25T02:20:05.8018148Z 537 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-25T02:20:05.8018312Z 538 │ ╭─▶ const GitInspector = () => ( 2026-10-25T02:20:05.8018411Z 539 │ │ 2026-10-25T02:20:05.8019023Z 544 │ ╰─▶ ); 2026-10-25T02:20:05.8019104Z 545 │ const FilesInspector = () => 2026-10-25T02:20:05.8019156Z ╰──── 2026-10-25T02:20:05.8019373Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T02:20:05.8019375Z 2026-10-25T02:20:05.8019583Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:20:05.8019733Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:545:26] 2026-10-25T02:20:05.8019839Z 544 │ ); 2026-10-25T02:20:05.8020027Z 545 │ ╭─▶ const FilesInspector = () => 2026-10-25T02:20:05.8020176Z 546 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-25T02:20:05.8020283Z 547 │ │ 2026-10-25T02:20:05.8021440Z 555 │ ╰─▶ ) : null; 2026-10-25T02:20:05.8021638Z 556 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-25T02:20:05.8021701Z ╰──── 2026-10-25T02:20:05.8021943Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T02:20:05.8021945Z 2026-10-25T02:20:05.8022426Z ⚠ 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-25T02:20:05.8022617Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7] 2026-10-25T02:20:05.8022731Z 1741 │ yield* harness.replaceSession; 2026-10-25T02:20:05.8022965Z 1742 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.8023142Z 1743 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-25T02:20:05.8023249Z 1744 │ │ break; 2026-10-25T02:20:05.8023434Z 1745 │ │ } 2026-10-25T02:20:05.8023554Z 1746 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8023711Z 1747 │ ╰─▶ } 2026-10-25T02:20:05.8023812Z 1748 │ yield* Queue.offer( 2026-10-25T02:20:05.8023897Z ╰──── 2026-10-25T02:20:05.8023900Z 2026-10-25T02:20:05.8024423Z ⚠ 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-25T02:20:05.8024634Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7] 2026-10-25T02:20:05.8024751Z 1850 │ yield* harness.replaceSession; 2026-10-25T02:20:05.8024970Z 1851 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.8025209Z 1852 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-25T02:20:05.8025326Z 1853 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8025482Z 1854 │ ╰─▶ } 2026-10-25T02:20:05.8025643Z 1855 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-25T02:20:05.8025736Z ╰──── 2026-10-25T02:20:05.8025738Z 2026-10-25T02:20:05.8025959Z ⚠ eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used. 2026-10-25T02:20:05.8026141Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8] 2026-10-25T02:20:05.8026249Z  9 │ hasScheduledTaskDraftChanges, 2026-10-25T02:20:05.8026400Z 10 │ type ScheduledTaskDraft, 2026-10-25T02:20:05.8026510Z ·  ─────────┬──────── 2026-10-25T02:20:05.8026693Z · ╰── 'ScheduledTaskDraft' is imported here 2026-10-25T02:20:05.8026795Z 11 │ } from "./scheduledTaskDraft"; 2026-10-25T02:20:05.8026880Z ╰──── 2026-10-25T02:20:05.8026988Z  help: Consider removing this import. 2026-10-25T02:20:05.8026995Z 2026-10-25T02:20:05.8027215Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:20:05.8027397Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85] 2026-10-25T02:20:05.8027528Z 80 │ const startEditor = startScheduledTaskEditor; 2026-10-25T02:20:05.8027724Z 81 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-25T02:20:05.8027885Z ·  ─────┬───── 2026-10-25T02:20:05.8028119Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T02:20:05.8028227Z 82 │ const readEditor = useCallback( 2026-10-25T02:20:05.8028311Z ╰──── 2026-10-25T02:20:05.8028630Z  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-25T02:20:05.8028981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8028983Z 2026-10-25T02:20:05.8029189Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:20:05.8029380Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7] 2026-10-25T02:20:05.8029521Z 101 │ setEditor, 2026-10-25T02:20:05.8029606Z 102 │ startEditor, 2026-10-25T02:20:05.8029718Z ·  ─────┬───── 2026-10-25T02:20:05.8029940Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T02:20:05.8030062Z 103 │ hasChanges, 2026-10-25T02:20:05.8030119Z ╰──── 2026-10-25T02:20:05.8030468Z  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-25T02:20:05.8030798Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8030800Z 2026-10-25T02:20:05.8031074Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8031226Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:85:5] 2026-10-25T02:20:05.8031353Z 82 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-25T02:20:05.8031460Z 83 │ useEffect(() => { 2026-10-25T02:20:05.8031561Z ·  ────┬──── 2026-10-25T02:20:05.8031713Z · ╰── This is the containing effect 2026-10-25T02:20:05.8031805Z 84 │ if (!actionState.isRunning) return; 2026-10-25T02:20:05.8031924Z 85 │ setNowMs(Date.now()); 2026-10-25T02:20:05.8032025Z ·  ────┬─── 2026-10-25T02:20:05.8032277Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8032412Z 86 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-25T02:20:05.8032499Z ╰──── 2026-10-25T02:20:05.8033120Z  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-25T02:20:05.8033463Z  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-25T02:20:05.8033466Z 2026-10-25T02:20:05.8033689Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8033807Z ╭─[apps/mobile/src/state/thread-order.ts:28:7] 2026-10-25T02:20:05.8033933Z 27 │ getPendingThreadOrder(); 2026-10-25T02:20:05.8034040Z 28 │ }, [nowMinute, snoozeWakeTick]); 2026-10-25T02:20:05.8034187Z ·  ────┬──── ───────┬────── 2026-10-25T02:20:05.8034391Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:20:05.8034565Z · ╰── Unnecessary dependency `nowMinute` 2026-10-25T02:20:05.8034668Z 29 │ return pending; 2026-10-25T02:20:05.8034748Z ╰──── 2026-10-25T02:20:05.8035045Z  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-25T02:20:05.8035411Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8035414Z 2026-10-25T02:20:05.8035709Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8035972Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2221:5] 2026-10-25T02:20:05.8036088Z 2219 │ ); 2026-10-25T02:20:05.8036167Z 2220 │ useEffect(() => { 2026-10-25T02:20:05.8036269Z ·  ────┬──── 2026-10-25T02:20:05.8036432Z · ╰── This is the containing effect 2026-10-25T02:20:05.8036539Z 2221 │ setExpandedVideo(null); 2026-10-25T02:20:05.8036633Z ·  ────────┬─────── 2026-10-25T02:20:05.8036820Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8036945Z 2222 │ setExpandedFile(null); 2026-10-25T02:20:05.8037030Z ╰──── 2026-10-25T02:20:05.8037626Z  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-25T02:20:05.8037968Z  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-25T02:20:05.8037970Z 2026-10-25T02:20:05.8038257Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8038431Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2714:9] 2026-10-25T02:20:05.8038593Z 2705 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-25T02:20:05.8038671Z 2706 │ useEffect(() => { 2026-10-25T02:20:05.8038768Z ·  ────┬──── 2026-10-25T02:20:05.8038997Z · ╰── This is the containing effect 2026-10-25T02:20:05.8039160Z 2707 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-25T02:20:05.8039270Z 2708 │ const index = presentedFeed.findIndex( 2026-10-25T02:20:05.8039430Z 2709 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-25T02:20:05.8039515Z 2710 │ ); 2026-10-25T02:20:05.8039622Z 2711 │ if (index === -1) { 2026-10-25T02:20:05.8039760Z 2712 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-25T02:20:05.8039889Z 2713 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-25T02:20:05.8040002Z 2714 │ setInteractionState((current) => ({ 2026-10-25T02:20:05.8040140Z ·  ─────────┬───────── 2026-10-25T02:20:05.8040337Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8040420Z 2715 │ ...current, 2026-10-25T02:20:05.8040504Z ╰──── 2026-10-25T02:20:05.8041154Z  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-25T02:20:05.8041504Z  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-25T02:20:05.8041507Z 2026-10-25T02:20:05.8041756Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-25T02:20:05.8041898Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:72:10] 2026-10-25T02:20:05.8042121Z 71 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-25T02:20:05.8042419Z 72 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-25T02:20:05.8042542Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8042714Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-25T02:20:05.8042901Z 73 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-25T02:20:05.8042983Z ╰──── 2026-10-25T02:20:05.8043113Z  help: Consider removing this import. 2026-10-25T02:20:05.8043116Z 2026-10-25T02:20:05.8043327Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-25T02:20:05.8043488Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:98:3] 2026-10-25T02:20:05.8043572Z 97 │ import { 2026-10-25T02:20:05.8043684Z 98 │ createContext, 2026-10-25T02:20:05.8043771Z ·  ──────┬────── 2026-10-25T02:20:05.8043939Z · ╰── 'createContext' is imported here 2026-10-25T02:20:05.8044025Z 99 │ memo, 2026-10-25T02:20:05.8044106Z ╰──── 2026-10-25T02:20:05.8044220Z  help: Consider removing this import. 2026-10-25T02:20:05.8044223Z 2026-10-25T02:20:05.8044455Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T02:20:05.8044617Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:114:3] 2026-10-25T02:20:05.8044762Z 113 │ import { 2026-10-25T02:20:05.8044874Z 114 │ ActivityIndicator, 2026-10-25T02:20:05.8044966Z ·  ────────┬──────── 2026-10-25T02:20:05.8045180Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T02:20:05.8045271Z 115 │ Image, 2026-10-25T02:20:05.8045355Z ╰──── 2026-10-25T02:20:05.8045469Z  help: Consider removing this import. 2026-10-25T02:20:05.8045472Z 2026-10-25T02:20:05.8045696Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-25T02:20:05.8045855Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:3] 2026-10-25T02:20:05.8045938Z 120 │ Pressable, 2026-10-25T02:20:05.8046022Z 121 │ ScrollView, 2026-10-25T02:20:05.8046131Z ·  ─────┬──── 2026-10-25T02:20:05.8046287Z · ╰── 'ScrollView' is imported here 2026-10-25T02:20:05.8046376Z 122 │ StyleSheet, 2026-10-25T02:20:05.8046432Z ╰──── 2026-10-25T02:20:05.8046579Z  help: Consider removing this import. 2026-10-25T02:20:05.8046585Z 2026-10-25T02:20:05.8046809Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-25T02:20:05.8047018Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11] 2026-10-25T02:20:05.8047090Z 122 │ StyleSheet, 2026-10-25T02:20:05.8047189Z 123 │ Text as NativeText, 2026-10-25T02:20:05.8047306Z ·  ─────┬──── 2026-10-25T02:20:05.8047470Z · ╰── 'NativeText' is imported here 2026-10-25T02:20:05.8047548Z 124 │ type ColorValue, 2026-10-25T02:20:05.8047622Z ╰──── 2026-10-25T02:20:05.8047767Z  help: Consider removing this import. 2026-10-25T02:20:05.8047769Z 2026-10-25T02:20:05.8048058Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-25T02:20:05.8048231Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:146:10] 2026-10-25T02:20:05.8048395Z 145 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-25T02:20:05.8048549Z 146 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-25T02:20:05.8048670Z ·  ─────────┬──────── 2026-10-25T02:20:05.8048832Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-25T02:20:05.8049007Z 147 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-25T02:20:05.8049084Z ╰──── 2026-10-25T02:20:05.8049221Z  help: Consider removing this import. 2026-10-25T02:20:05.8049224Z 2026-10-25T02:20:05.8049515Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-25T02:20:05.8049660Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:149:10] 2026-10-25T02:20:05.8049825Z 148 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-25T02:20:05.8049980Z 149 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-25T02:20:05.8050102Z ·  ─────────┬───────── 2026-10-25T02:20:05.8050263Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-25T02:20:05.8050355Z 150 │ import { 2026-10-25T02:20:05.8050428Z ╰──── 2026-10-25T02:20:05.8050570Z  help: Consider removing this import. 2026-10-25T02:20:05.8050572Z 2026-10-25T02:20:05.8050790Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-25T02:20:05.8050956Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10] 2026-10-25T02:20:05.8051134Z 162 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-25T02:20:05.8051297Z 163 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-25T02:20:05.8051418Z ·  ────────┬─────── 2026-10-25T02:20:05.8051573Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-25T02:20:05.8051743Z 164 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-25T02:20:05.8051816Z ╰──── 2026-10-25T02:20:05.8051960Z  help: Consider removing this import. 2026-10-25T02:20:05.8051962Z 2026-10-25T02:20:05.8052239Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-25T02:20:05.8052451Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:3] 2026-10-25T02:20:05.8052593Z 166 │ attachmentVideoPreviewSource, 2026-10-25T02:20:05.8052692Z 167 │ mediaVideoPreviewUri, 2026-10-25T02:20:05.8052799Z ·  ──────────┬───────── 2026-10-25T02:20:05.8052976Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-25T02:20:05.8053073Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:20:05.8053148Z ╰──── 2026-10-25T02:20:05.8053260Z  help: Consider removing this import. 2026-10-25T02:20:05.8053263Z 2026-10-25T02:20:05.8053517Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-25T02:20:05.8053671Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3] 2026-10-25T02:20:05.8053769Z 167 │ mediaVideoPreviewUri, 2026-10-25T02:20:05.8053849Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:20:05.8053988Z ·  ───────────┬────────── 2026-10-25T02:20:05.8054169Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-25T02:20:05.8054277Z 169 │ type MediaVideoPreviewSource, 2026-10-25T02:20:05.8054340Z ╰──── 2026-10-25T02:20:05.8054519Z  help: Consider removing this import. 2026-10-25T02:20:05.8054522Z 2026-10-25T02:20:05.8054759Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-25T02:20:05.8054914Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:169:8] 2026-10-25T02:20:05.8055016Z 168 │ mediaVideoThumbnailKey, 2026-10-25T02:20:05.8055113Z 169 │ type MediaVideoPreviewSource, 2026-10-25T02:20:05.8055290Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8055481Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-25T02:20:05.8055598Z 170 │ } from "../../lib/videoPreviewSource"; 2026-10-25T02:20:05.8055666Z ╰──── 2026-10-25T02:20:05.8055792Z  help: Consider removing this import. 2026-10-25T02:20:05.8055794Z 2026-10-25T02:20:05.8056050Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-25T02:20:05.8056206Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3] 2026-10-25T02:20:05.8056278Z 190 │ import { 2026-10-25T02:20:05.8056378Z 191 │ resolveMarkdownFontSizes, 2026-10-25T02:20:05.8056515Z ·  ────────────┬─────────── 2026-10-25T02:20:05.8056697Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-25T02:20:05.8056798Z 192 │ resolveNativeMarkdownTypography, 2026-10-25T02:20:05.8056884Z ╰──── 2026-10-25T02:20:05.8057059Z  help: Consider removing this import. 2026-10-25T02:20:05.8057061Z 2026-10-25T02:20:05.8057345Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-25T02:20:05.8057500Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:198:3] 2026-10-25T02:20:05.8057593Z 197 │ normalizeNativeMarkdownUrl, 2026-10-25T02:20:05.8057707Z 198 │ resolveMarkdownInlineCodePresentation, 2026-10-25T02:20:05.8057859Z ·  ──────────────────┬────────────────── 2026-10-25T02:20:05.8058075Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-25T02:20:05.8058225Z 199 │ resolveMarkdownLinkPresentation, 2026-10-25T02:20:05.8058334Z ╰──── 2026-10-25T02:20:05.8058457Z  help: Consider removing this import. 2026-10-25T02:20:05.8058460Z 2026-10-25T02:20:05.8058702Z ⚠ eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used. 2026-10-25T02:20:05.8058846Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8] 2026-10-25T02:20:05.8058955Z 236 │ isCompactionCommandFeedEntry, 2026-10-25T02:20:05.8059051Z 237 │ type PendingThreadFeedEntry, 2026-10-25T02:20:05.8059191Z ·  ───────────┬────────── 2026-10-25T02:20:05.8059355Z · ╰── 'PendingThreadFeedEntry' is imported here 2026-10-25T02:20:05.8059451Z 238 │ type ThreadFeedRow, 2026-10-25T02:20:05.8059577Z ╰──── 2026-10-25T02:20:05.8063130Z  help: Consider removing this import. 2026-10-25T02:20:05.8063139Z 2026-10-25T02:20:05.8063372Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-25T02:20:05.8063502Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:248:3] 2026-10-25T02:20:05.8063563Z 247 │ useAssetUrl, 2026-10-25T02:20:05.8063635Z 248 │ useAssetUrlState, 2026-10-25T02:20:05.8063717Z ·  ────────┬─────── 2026-10-25T02:20:05.8063859Z · ╰── 'useAssetUrlState' is imported here 2026-10-25T02:20:05.8063924Z 249 │ useRefreshAssetUrl, 2026-10-25T02:20:05.8063976Z ╰──── 2026-10-25T02:20:05.8064070Z  help: Consider removing this import. 2026-10-25T02:20:05.8064072Z 2026-10-25T02:20:05.8064274Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8064407Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2223:7] 2026-10-25T02:20:05.8064480Z 2222 │ setExpandedFile(null); 2026-10-25T02:20:05.8064637Z 2223 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-25T02:20:05.8064855Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-25T02:20:05.8065175Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-25T02:20:05.8065365Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-25T02:20:05.8065532Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T02:20:05.8065673Z 2224 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-25T02:20:05.8065724Z ╰──── 2026-10-25T02:20:05.8066008Z  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-25T02:20:05.8066314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8066317Z 2026-10-25T02:20:05.8066512Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8066643Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2683:7] 2026-10-25T02:20:05.8066738Z 2682 │ reportHeaderMaterialVisibility(false); 2026-10-25T02:20:05.8066913Z 2683 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-25T02:20:05.8067026Z ·  ──────┬────── 2026-10-25T02:20:05.8067172Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-25T02:20:05.8067226Z 2684 │ 2026-10-25T02:20:05.8067276Z ╰──── 2026-10-25T02:20:05.8067555Z  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-25T02:20:05.8067854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8067856Z 2026-10-25T02:20:05.8068051Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8068185Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2699:7] 2026-10-25T02:20:05.8068245Z 2698 │ } 2026-10-25T02:20:05.8068374Z 2699 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-25T02:20:05.8068450Z ·  ──────┬───── 2026-10-25T02:20:05.8068591Z · ╰── Unnecessary dependency `listMountKey` 2026-10-25T02:20:05.8068730Z 2700 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-25T02:20:05.8068782Z ╰──── 2026-10-25T02:20:05.8069061Z  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-25T02:20:05.8069362Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8069369Z 2026-10-25T02:20:05.8069558Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8069688Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2893:7] 2026-10-25T02:20:05.8069743Z 2892 │ } 2026-10-25T02:20:05.8069921Z 2893 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-25T02:20:05.8070113Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-25T02:20:05.8070356Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-25T02:20:05.8070617Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-25T02:20:05.8070797Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-25T02:20:05.8070849Z 2894 │ 2026-10-25T02:20:05.8070902Z ╰──── 2026-10-25T02:20:05.8071182Z  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-25T02:20:05.8071482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8071484Z 2026-10-25T02:20:05.8071658Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T02:20:05.8071786Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:626:9] 2026-10-25T02:20:05.8071847Z 625 │ }; 2026-10-25T02:20:05.8071963Z 626 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-25T02:20:05.8072150Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-25T02:20:05.8072382Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-25T02:20:05.8072571Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-25T02:20:05.8072730Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T02:20:05.8072784Z 627 │ ); 2026-10-25T02:20:05.8072833Z ╰──── 2026-10-25T02:20:05.8073141Z  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-25T02:20:05.8073443Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8073446Z 2026-10-25T02:20:05.8073639Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T02:20:05.8073767Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-25T02:20:05.8073838Z 2 │ AuthFilesystemReadScope, 2026-10-25T02:20:05.8073907Z 3 │ type AuthSessionState, 2026-10-25T02:20:05.8073988Z ·  ────────┬─────── 2026-10-25T02:20:05.8074127Z · ╰── 'AuthSessionState' is imported here 2026-10-25T02:20:05.8074203Z 4 │ type FilesystemBrowseEntry, 2026-10-25T02:20:05.8074257Z ╰──── 2026-10-25T02:20:05.8074352Z  help: Consider removing this import. 2026-10-25T02:20:05.8074354Z 2026-10-25T02:20:05.8074513Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-25T02:20:05.8074698Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-25T02:20:05.8074835Z 219 │ 2026-10-25T02:20:05.8074971Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-25T02:20:05.8075106Z ·  ──┬─ 2026-10-25T02:20:05.8075264Z · ╰── 'U+001B' is a control character. 2026-10-25T02:20:05.8075374Z 221 │ 2026-10-25T02:20:05.8075453Z ╰──── 2026-10-25T02:20:05.8075677Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-25T02:20:05.8075680Z 2026-10-25T02:20:05.8075861Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-25T02:20:05.8075987Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-25T02:20:05.8076100Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-25T02:20:05.8076181Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T02:20:05.8076251Z ·  ─┬─ 2026-10-25T02:20:05.8076368Z · ╰── 'Arr' is imported here 2026-10-25T02:20:05.8076450Z 5 │ import * as Order from "effect/Order"; 2026-10-25T02:20:05.8076505Z ╰──── 2026-10-25T02:20:05.8076603Z  help: Consider removing this import. 2026-10-25T02:20:05.8076605Z 2026-10-25T02:20:05.8076786Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-25T02:20:05.8076914Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-25T02:20:05.8076992Z 4 │ import * as Arr from "effect/Array"; 2026-10-25T02:20:05.8077075Z 5 │ import * as Order from "effect/Order"; 2026-10-25T02:20:05.8077146Z ·  ──┬── 2026-10-25T02:20:05.8077270Z · ╰── 'Order' is imported here 2026-10-25T02:20:05.8077321Z 6 │ 2026-10-25T02:20:05.8077372Z ╰──── 2026-10-25T02:20:05.8077463Z  help: Consider removing this import. 2026-10-25T02:20:05.8077465Z 2026-10-25T02:20:05.8077913Z ⚠ 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-25T02:20:05.8078038Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-25T02:20:05.8078105Z 38 │ JSON.stringify( 2026-10-25T02:20:05.8078221Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-25T02:20:05.8078315Z ·  ──────────────────────── 2026-10-25T02:20:05.8078379Z 40 │ { name: "a" }, 2026-10-25T02:20:05.8078430Z ╰──── 2026-10-25T02:20:05.8078432Z 2026-10-25T02:20:05.8078635Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.8078806Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-25T02:20:05.8078890Z 248 │ mountedRef.current = false; 2026-10-25T02:20:05.8078964Z 249 │ flow.setBranchQuery(""); 2026-10-25T02:20:05.8079030Z ·  ──┬─ 2026-10-25T02:20:05.8079152Z · ╰── Missing dependency `flow` 2026-10-25T02:20:05.8079209Z 250 │ }; 2026-10-25T02:20:05.8079280Z 251 │ }, [flow.setBranchQuery]); 2026-10-25T02:20:05.8079362Z ·  ─────────┬───────── 2026-10-25T02:20:05.8079559Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-25T02:20:05.8079610Z 252 │ 2026-10-25T02:20:05.8079662Z ╰──── 2026-10-25T02:20:05.8080113Z  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-25T02:20:05.8080442Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8080445Z 2026-10-25T02:20:05.8080691Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T02:20:05.8080797Z ╭─[packages/contracts/src/rpc.ts:302:8] 2026-10-25T02:20:05.8080863Z 301 │ } from "./device.ts"; 2026-10-25T02:20:05.8080952Z 302 │ import {} from "./previewAutomation.ts"; 2026-10-25T02:20:05.8081020Z ·  ── 2026-10-25T02:20:05.8081079Z 303 │ import { 2026-10-25T02:20:05.8081129Z ╰──── 2026-10-25T02:20:05.8081214Z  help: Remove empty braces 2026-10-25T02:20:05.8081216Z 2026-10-25T02:20:05.8081433Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:20:05.8081570Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-25T02:20:05.8081633Z 20 │ [instanceId]: { 2026-10-25T02:20:05.8081708Z 21 │ ...(state[instanceId] ?? {}), 2026-10-25T02:20:05.8081809Z ·  ──────────────────────────── 2026-10-25T02:20:05.8081875Z 22 │ [model]: options, 2026-10-25T02:20:05.8081924Z ╰──── 2026-10-25T02:20:05.8082180Z  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-25T02:20:05.8082183Z 2026-10-25T02:20:05.8082411Z × t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background. 2026-10-25T02:20:05.8082539Z ╭─[packages/contracts/src/orchestrationV2.ts:746:1] 2026-10-25T02:20:05.8082594Z 745 │ 2026-10-25T02:20:05.8082719Z 746 │ ╭─▶ /** 2026-10-25T02:20:05.8082932Z 747 │ │ * Wire-only. Set for clients that opted in with `acceptDedupedBodies` or `dedupeBodies=1` when the 2026-10-25T02:20:05.8083129Z 748 │ │ * marked field was blanked because the client already holds the same value: in the record it 2026-10-25T02:20:05.8083282Z 749 │ │ * received earlier on the same response or stream. Restore with 2026-10-25T02:20:05.8083487Z 750 │ │ * `@t3tools/shared/orchestrationV2DedupedBodies` before use; never store or forward a marked 2026-10-25T02:20:05.8083691Z 751 │ │ * value. Clients that opted in restore only these fields, so blanking another field needs a new 2026-10-25T02:20:05.8083771Z 752 │ │ * opt-in. 2026-10-25T02:20:05.8083894Z 753 │ ╰─▶ */ 2026-10-25T02:20:05.8084026Z 754 │ const DedupedBodyMarker = Schema.optionalKey(Schema.Literal(true)); 2026-10-25T02:20:05.8084075Z ╰──── 2026-10-25T02:20:05.8084077Z 2026-10-25T02:20:05.8084326Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8084482Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-25T02:20:05.8084590Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-25T02:20:05.8084656Z 38 │ useLayoutEffect(() => { 2026-10-25T02:20:05.8084731Z ·  ───────┬─────── 2026-10-25T02:20:05.8084925Z · ╰── This is the containing effect 2026-10-25T02:20:05.8085027Z 39 │ reset(); 2026-10-25T02:20:05.8085117Z 40 │ setInitialized(true); 2026-10-25T02:20:05.8085193Z ·  ───────┬────── 2026-10-25T02:20:05.8085354Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8085415Z 41 │ }, [reset]); 2026-10-25T02:20:05.8085465Z ╰──── 2026-10-25T02:20:05.8086044Z  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-25T02:20:05.8086361Z  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-25T02:20:05.8086366Z 2026-10-25T02:20:05.8086611Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8086765Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-25T02:20:05.8086815Z 88 │ 2026-10-25T02:20:05.8086879Z 89 │ useEffect(() => { 2026-10-25T02:20:05.8086951Z ·  ────┬──── 2026-10-25T02:20:05.8087075Z · ╰── This is the containing effect 2026-10-25T02:20:05.8087226Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-25T02:20:05.8087327Z 91 │ const branchName = initialProjectRef.branch; 2026-10-25T02:20:05.8087397Z 92 │ let active = true; 2026-10-25T02:20:05.8087494Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-25T02:20:05.8087573Z ·  ─────────┬───────── 2026-10-25T02:20:05.8087738Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8087886Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-25T02:20:05.8087938Z ╰──── 2026-10-25T02:20:05.8088509Z  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-25T02:20:05.8088819Z  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-25T02:20:05.8088825Z 2026-10-25T02:20:05.8088964Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8089112Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:472:27] 2026-10-25T02:20:05.8089169Z 471 │ > 2026-10-25T02:20:05.8089243Z 472 │ {props.children(close)} 2026-10-25T02:20:05.8089330Z ·  ──┬── 2026-10-25T02:20:05.8089484Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.8089559Z 473 │ 2026-10-25T02:20:05.8089608Z ╰──── 2026-10-25T02:20:05.8090109Z  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-25T02:20:05.8090419Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8090422Z 2026-10-25T02:20:05.8090872Z ⚠ 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-25T02:20:05.8091045Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:222:5] 2026-10-25T02:20:05.8091113Z 221 │ let idlePasses = 0; 2026-10-25T02:20:05.8091259Z 222 │ ╭─▶ for (;;) { 2026-10-25T02:20:05.8091393Z 223 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-25T02:20:05.8091534Z 224 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-25T02:20:05.8091626Z 225 │ │ if (!pending) { 2026-10-25T02:20:05.8091717Z 226 │ │ idlePasses++; 2026-10-25T02:20:05.8091821Z 227 │ │ if (idlePasses >= 3) { 2026-10-25T02:20:05.8091904Z 228 │ │ return; 2026-10-25T02:20:05.8091979Z 229 │ │ } 2026-10-25T02:20:05.8092062Z 230 │ │ continue; 2026-10-25T02:20:05.8092137Z 231 │ │ } 2026-10-25T02:20:05.8092227Z 232 │ │ idlePasses = 0; 2026-10-25T02:20:05.8092344Z 233 │ │ const exit = yield* Effect.exit( 2026-10-25T02:20:05.8092555Z 234 │ │ pending.operation as Effect.Effect, 2026-10-25T02:20:05.8092629Z 235 │ │ ); 2026-10-25T02:20:05.8092733Z 236 │ │ yield* Effect.sync(() => { 2026-10-25T02:20:05.8092837Z 237 │ │ pending.resolve(exit); 2026-10-25T02:20:05.8092913Z 238 │ │ }); 2026-10-25T02:20:05.8093038Z 239 │ ╰─▶ } 2026-10-25T02:20:05.8093094Z 240 │ }, 2026-10-25T02:20:05.8093142Z ╰──── 2026-10-25T02:20:05.8093144Z 2026-10-25T02:20:05.8093365Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T02:20:05.8093535Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:14:8] 2026-10-25T02:20:05.8093632Z 13 │ threadSearchMatchKey, 2026-10-25T02:20:05.8093713Z 14 │ type EnvironmentThreadSearchMatch, 2026-10-25T02:20:05.8093814Z ·  ──────────────┬───────────── 2026-10-25T02:20:05.8093982Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T02:20:05.8094087Z 15 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T02:20:05.8094136Z ╰──── 2026-10-25T02:20:05.8094231Z  help: Consider removing this import. 2026-10-25T02:20:05.8094234Z 2026-10-25T02:20:05.8094427Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8094551Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:484:25] 2026-10-25T02:20:05.8094756Z 483 │ // snoozeWakeTick re-arms clamped timers even when the wake date exceeds 32-bit setTimeout and stays unchanged. 2026-10-25T02:20:05.8094846Z 484 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T02:20:05.8094945Z ·  ───────┬────── 2026-10-25T02:20:05.8095114Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T02:20:05.8095308Z 485 │ // Called as `props.onSelectThread(...)`, the compiler would cache this handler on the whole 2026-10-25T02:20:05.8095359Z ╰──── 2026-10-25T02:20:05.8095643Z  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-25T02:20:05.8095947Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8095952Z 2026-10-25T02:20:05.8096160Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T02:20:05.8096259Z ╭─[apps/mobile/src/Stack.tsx:1062:21] 2026-10-25T02:20:05.8096321Z 1061 │ } 2026-10-25T02:20:05.8096584Z ·  ───────────────────────────────────────────── 2026-10-25T02:20:05.8096662Z 1063 │ screenOptions={({ route }) => 2026-10-25T02:20:05.8096714Z ╰──── 2026-10-25T02:20:05.8097062Z  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-25T02:20:05.8097070Z 2026-10-25T02:20:05.8097321Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8097456Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-25T02:20:05.8097507Z 150 │ 2026-10-25T02:20:05.8097570Z 151 │ useEffect(() => { 2026-10-25T02:20:05.8097640Z ·  ────┬──── 2026-10-25T02:20:05.8097763Z · ╰── This is the containing effect 2026-10-25T02:20:05.8097844Z 152 │ if (!controlledSelectedPath) { 2026-10-25T02:20:05.8097904Z 153 │ return; 2026-10-25T02:20:05.8097958Z 154 │ } 2026-10-25T02:20:05.8098036Z 155 │ setExpandedPaths((current) => { 2026-10-25T02:20:05.8098114Z ·  ────────┬─────── 2026-10-25T02:20:05.8098328Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8098476Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-25T02:20:05.8098524Z ╰──── 2026-10-25T02:20:05.8099098Z  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-25T02:20:05.8099409Z  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-25T02:20:05.8099412Z 2026-10-25T02:20:05.8099662Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8099831Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:388:7] 2026-10-25T02:20:05.8099882Z 383 │ }; 2026-10-25T02:20:05.8099945Z 384 │ useEffect(() => { 2026-10-25T02:20:05.8100014Z ·  ────┬──── 2026-10-25T02:20:05.8100140Z · ╰── This is the containing effect 2026-10-25T02:20:05.8100235Z 385 │ if (!guidesEnabled && section === "guide") { 2026-10-25T02:20:05.8100328Z 386 │ requestedSection.current = "overview"; 2026-10-25T02:20:05.8100488Z 387 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T02:20:05.8100560Z 388 │ setSection("overview"); 2026-10-25T02:20:05.8100631Z ·  ─────┬──── 2026-10-25T02:20:05.8100800Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8100856Z 389 │ } 2026-10-25T02:20:05.8100906Z ╰──── 2026-10-25T02:20:05.8101480Z  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-25T02:20:05.8101790Z  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-25T02:20:05.8101792Z 2026-10-25T02:20:05.8101989Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:20:05.8102158Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:390:6] 2026-10-25T02:20:05.8102255Z 385 │ if (!guidesEnabled && section === "guide") { 2026-10-25T02:20:05.8102344Z 386 │ requestedSection.current = "overview"; 2026-10-25T02:20:05.8102422Z ·  ────────┬─────── 2026-10-25T02:20:05.8102846Z · ╰── 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-25T02:20:05.8103003Z 387 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T02:20:05.8103147Z ·  ─────────┬───────── ──────┬────── 2026-10-25T02:20:05.8103671Z · │ ╰── 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-25T02:20:05.8104131Z · ╰── 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-25T02:20:05.8104202Z 388 │ setSection("overview"); 2026-10-25T02:20:05.8104255Z 389 │ } 2026-10-25T02:20:05.8104342Z 390 │ }, [guidesEnabled, section, insets.top]); 2026-10-25T02:20:05.8104449Z ·  ──────────────────┬───────────────── 2026-10-25T02:20:05.8104634Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.8104729Z 391 │ const tabContent = activityContent; 2026-10-25T02:20:05.8104780Z ╰──── 2026-10-25T02:20:05.8104942Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:20:05.8105268Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8105271Z 2026-10-25T02:20:05.8105467Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-25T02:20:05.8105588Z ╭─[apps/desktop/src/preview/Manager.test.ts:150:18] 2026-10-25T02:20:05.8105684Z 149 │ BrowserWindow: browserWindowConstructor, 2026-10-25T02:20:05.8105839Z 150 │ ╭─▶ ClipboardItem: class { 2026-10-25T02:20:05.8105970Z 151 │ │ constructor(data: Record) { 2026-10-25T02:20:05.8106087Z 152 │ │ clipboardItemConstructor(data); 2026-10-25T02:20:05.8106158Z 153 │ │ } 2026-10-25T02:20:05.8106280Z 154 │ ╰─▶ }, 2026-10-25T02:20:05.8106343Z 155 │ clipboard: { 2026-10-25T02:20:05.8106394Z ╰──── 2026-10-25T02:20:05.8106555Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-25T02:20:05.8106558Z 2026-10-25T02:20:05.8106751Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8106894Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-25T02:20:05.8106988Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-25T02:20:05.8107069Z 257 │ }, [props.path, targetIndex]); 2026-10-25T02:20:05.8107144Z ·  ─────┬──── 2026-10-25T02:20:05.8107284Z · ╰── Unnecessary dependency `props.path` 2026-10-25T02:20:05.8107335Z 258 │ 2026-10-25T02:20:05.8107383Z ╰──── 2026-10-25T02:20:05.8107665Z  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-25T02:20:05.8107961Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8107963Z 2026-10-25T02:20:05.8108147Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.8108335Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:289:23] 2026-10-25T02:20:05.8108431Z 288 │ 2026-10-25T02:20:05.8109475Z ·  ─────────── 2026-10-25T02:20:05.8109540Z 306 │ {body} 2026-10-25T02:20:05.8109588Z ╰──── 2026-10-25T02:20:05.8109727Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T02:20:05.8109729Z 2026-10-25T02:20:05.8109923Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8110075Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:266:35] 2026-10-25T02:20:05.8110129Z 265 │ }; 2026-10-25T02:20:05.8110255Z 266 │ }, [method, nativeRef, payload, resetKey, onFailure, onDelivered]); 2026-10-25T02:20:05.8110359Z ·  ────┬─── 2026-10-25T02:20:05.8110521Z · ╰── Unnecessary dependency `resetKey` 2026-10-25T02:20:05.8110574Z 267 │ } 2026-10-25T02:20:05.8110623Z ╰──── 2026-10-25T02:20:05.8110905Z  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-25T02:20:05.8111207Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8111210Z 2026-10-25T02:20:05.8111350Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8111498Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:390:39] 2026-10-25T02:20:05.8111551Z 389 │ 2026-10-25T02:20:05.8111768Z 390 │ ╭─▶ return createElement(RawNativeView, { 2026-10-25T02:20:05.8111899Z 391 │ │ ...nativeProps, 2026-10-25T02:20:05.8112037Z 392 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-25T02:20:05.8112135Z 393 │ │ onDebug: (event) => { 2026-10-25T02:20:05.8112284Z 394 │ │ if (event.nativeEvent.message === "rows-decode-failed") { 2026-10-25T02:20:05.8112480Z 395 │ │ console.error("[native-review-diff] rows decode failed", event.nativeEvent.error); 2026-10-25T02:20:05.8112574Z 396 │ │ onRowsFailure(); 2026-10-25T02:20:05.8112648Z 397 │ │ } 2026-10-25T02:20:05.8112740Z 398 │ │ onDebug?.(event); 2026-10-25T02:20:05.8112814Z 399 │ │ }, 2026-10-25T02:20:05.8112907Z 400 │ │ ref: nativeRef, 2026-10-25T02:20:05.8113033Z 401 │ ├─▶ }); 2026-10-25T02:20:05.8113264Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.8113318Z 402 │ } 2026-10-25T02:20:05.8113367Z ╰──── 2026-10-25T02:20:05.8113817Z  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-25T02:20:05.8114097Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8114099Z 2026-10-25T02:20:05.8114309Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:20:05.8114431Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-25T02:20:05.8114527Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-25T02:20:05.8114609Z 259 │ for (const edit of edits.reverse()) 2026-10-25T02:20:05.8114700Z ·  ─────── 2026-10-25T02:20:05.8114861Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T02:20:05.8114910Z ╰──── 2026-10-25T02:20:05.8115193Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:20:05.8115195Z 2026-10-25T02:20:05.8115404Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:20:05.8115524Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-25T02:20:05.8115600Z 289 │ visit(parser.parse(markdown)); 2026-10-25T02:20:05.8115681Z 290 │ for (const edit of edits.reverse()) 2026-10-25T02:20:05.8115772Z ·  ─────── 2026-10-25T02:20:05.8115930Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T02:20:05.8115979Z ╰──── 2026-10-25T02:20:05.8116227Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:20:05.8116230Z 2026-10-25T02:20:05.8116431Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:20:05.8116591Z ╭─[apps/mobile/src/lib/markdownDocument.ts:339:38] 2026-10-25T02:20:05.8116698Z 338 │ visit(parser.parse(markdown)); 2026-10-25T02:20:05.8116796Z 339 │ for (const lineStart of lineStarts.reverse()) { 2026-10-25T02:20:05.8116896Z ·  ─────── 2026-10-25T02:20:05.8117082Z 340 │ // Lazy headers can lack container markers; copy the delimiter's markers to the header and blank line. 2026-10-25T02:20:05.8117132Z ╰──── 2026-10-25T02:20:05.8117375Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:20:05.8117377Z 2026-10-25T02:20:05.8117571Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-25T02:20:05.8117661Z ╭─[apps/web/src/types.ts:22:3] 2026-10-25T02:20:05.8117736Z 21 │ EnvironmentThreadShell, 2026-10-25T02:20:05.8117802Z 22 │ ThreadRunSummary, 2026-10-25T02:20:05.8117880Z ·  ────────┬─────── 2026-10-25T02:20:05.8118016Z · ╰── 'ThreadRunSummary' is imported here 2026-10-25T02:20:05.8118083Z 23 │ ThreadRuntimeSummary, 2026-10-25T02:20:05.8118132Z ╰──── 2026-10-25T02:20:05.8118226Z  help: Consider removing this import. 2026-10-25T02:20:05.8118229Z 2026-10-25T02:20:05.8118407Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T02:20:05.8118518Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-25T02:20:05.8118572Z 7 │ () => 2026-10-25T02:20:05.8118635Z 8 │ Gesture.Hover() 2026-10-25T02:20:05.8118708Z ·  ──┬── 2026-10-25T02:20:05.8118843Z · ╰── `Hover` may be a component 2026-10-25T02:20:05.8118914Z 9 │ .manualActivation(true) 2026-10-25T02:20:05.8118963Z ╰──── 2026-10-25T02:20:05.8119235Z  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-25T02:20:05.8119663Z  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-25T02:20:05.8119666Z 2026-10-25T02:20:05.8119873Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:20:05.8119995Z ╭─[apps/web/src/components/chat/ChatHeader.tsx:27:10] 2026-10-25T02:20:05.8120111Z 26 │ import { threadEnvironment } from "../../state/threads"; 2026-10-25T02:20:05.8120217Z 27 │ import { serverEnvironment } from "../../state/server"; 2026-10-25T02:20:05.8120302Z ·  ────────┬──────── 2026-10-25T02:20:05.8120445Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:20:05.8120572Z 28 │ import { canShareWithGuestAtom } from "./guestShareAvailability"; 2026-10-25T02:20:05.8120751Z ╰──── 2026-10-25T02:20:05.8120846Z  help: Consider removing this import. 2026-10-25T02:20:05.8120848Z 2026-10-25T02:20:05.8121080Z × t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background. 2026-10-25T02:20:05.8121221Z ╭─[packages/shared/src/orchestrationV2DedupedBodies.ts:13:1] 2026-10-25T02:20:05.8121276Z 12 │ 2026-10-25T02:20:05.8121465Z 13 │ ╭─▶ /** 2026-10-25T02:20:05.8121694Z 14 │ │ * A turn item repeats a body its record already carries: message text, checkpoint files, a 2026-10-25T02:20:05.8121892Z 15 │ │ * subagent's prompt and result. For clients that opt in, the server blanks the repeat and marks 2026-10-25T02:20:05.8122089Z 16 │ │ * the field (`textOmitted`, `filesOmitted`, `promptOmitted`, `resultOmitted`), and the client 2026-10-25T02:20:05.8122282Z 17 │ │ * copies the value back from the record it already holds. Only a body equal to the record's is 2026-10-25T02:20:05.8122388Z 18 │ │ * blanked, so the restore is exact. 2026-10-25T02:20:05.8122508Z 19 │ ╰─▶ */ 2026-10-25T02:20:05.8122598Z 20 │ export interface DedupedBodySource { 2026-10-25T02:20:05.8122652Z ╰──── 2026-10-25T02:20:05.8122655Z 2026-10-25T02:20:05.8122859Z ⚠ eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used. 2026-10-25T02:20:05.8122970Z ╭─[apps/web/src/components/Sidebar.tsx:129:40] 2026-10-25T02:20:05.8123099Z 128 │ import { environmentPresentations } from "../state/presentation"; 2026-10-25T02:20:05.8123257Z 129 │ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server"; 2026-10-25T02:20:05.8123371Z ·  ────────┬──────── 2026-10-25T02:20:05.8123540Z · ╰── 'serverEnvironment' is imported here 2026-10-25T02:20:05.8123653Z 130 │ import { environmentProjects } from "../state/projects"; 2026-10-25T02:20:05.8123708Z ╰──── 2026-10-25T02:20:05.8123804Z  help: Consider removing this import. 2026-10-25T02:20:05.8123806Z 2026-10-25T02:20:05.8123967Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.8124083Z ╭─[apps/web/src/components/Sidebar.tsx:1117:11] 2026-10-25T02:20:05.8124178Z 1116 │ foldSearchQuery(threadSearchQuery), 2026-10-25T02:20:05.8124243Z 1117 │ Date.now(), 2026-10-25T02:20:05.8124319Z ·  ─────┬──── 2026-10-25T02:20:05.8124450Z · ╰── Cannot call impure function 2026-10-25T02:20:05.8124584Z 1118 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-25T02:20:05.8124635Z ╰──── 2026-10-25T02:20:05.8124914Z  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-25T02:20:05.8125228Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.8125231Z 2026-10-25T02:20:05.8125451Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-25T02:20:05.8125570Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-25T02:20:05.8125746Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-25T02:20:05.8125835Z 35 │ instanceId === configured ? true : false, 2026-10-25T02:20:05.8125949Z ·  ──────────────────────────────────────── 2026-10-25T02:20:05.8126002Z 36 │ ); 2026-10-25T02:20:05.8126095Z ╰──── 2026-10-25T02:20:05.8126216Z  help: Remove this ternary operator 2026-10-25T02:20:05.8126219Z 2026-10-25T02:20:05.8126377Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.8126509Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-25T02:20:05.8126640Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-25T02:20:05.8126779Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-25T02:20:05.8126898Z ·  ─────┬──── 2026-10-25T02:20:05.8127062Z · ╰── Cannot call impure function 2026-10-25T02:20:05.8127164Z 141 │ onSelect={(selected) => { 2026-10-25T02:20:05.8127215Z ╰──── 2026-10-25T02:20:05.8127483Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.8127765Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.8127767Z 2026-10-25T02:20:05.8127924Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-25T02:20:05.8128076Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1436:12] 2026-10-25T02:20:05.8128127Z 1435 │ 2026-10-25T02:20:05.8128192Z 1436 │ for (const [] of [ 2026-10-25T02:20:05.8128262Z ·  ── 2026-10-25T02:20:05.8128332Z 1437 │ ["github", "github.com"], 2026-10-25T02:20:05.8128386Z ╰──── 2026-10-25T02:20:05.8128658Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-25T02:20:05.8128660Z 2026-10-25T02:20:05.8128859Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-25T02:20:05.8128958Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-25T02:20:05.8129092Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-25T02:20:05.8129203Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-25T02:20:05.8129287Z ·  ──────┬────── 2026-10-25T02:20:05.8129426Z · ╰── 'HookForwarder' is imported here 2026-10-25T02:20:05.8129530Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-25T02:20:05.8129584Z ╰──── 2026-10-25T02:20:05.8129676Z  help: Consider removing this import. 2026-10-25T02:20:05.8129678Z 2026-10-25T02:20:05.8130132Z ⚠ 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-25T02:20:05.8130257Z ╭─[apps/server/src/usage/UsageService.test.ts:2613:7] 2026-10-25T02:20:05.8130351Z 2612 │ let orphanedAt: number | undefined; 2026-10-25T02:20:05.8130576Z 2613 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-25T02:20:05.8130697Z 2614 │ │ const tasks: Array<() => void> = []; 2026-10-25T02:20:05.8130886Z 2615 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-25T02:20:05.8131096Z 2616 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-25T02:20:05.8131193Z 2617 │ │ flush: () => { 2026-10-25T02:20:05.8131312Z 2618 │ │ let task: (() => void) | undefined; 2026-10-25T02:20:05.8131455Z 2619 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-25T02:20:05.8131533Z 2620 │ │ }, 2026-10-25T02:20:05.8131612Z 2621 │ │ }; 2026-10-25T02:20:05.8131682Z 2622 │ │ 2026-10-25T02:20:05.8131837Z 2623 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-25T02:20:05.8131945Z 2624 │ │ let requestChecks = 0; 2026-10-25T02:20:05.8132075Z 2625 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-25T02:20:05.8132180Z 2626 │ │ executionMode: "async", 2026-10-25T02:20:05.8132298Z 2627 │ │ makeDispatcher: () => dispatcher, 2026-10-25T02:20:05.8132403Z 2628 │ │ shouldYield: (fiber) => { 2026-10-25T02:20:05.8132534Z 2629 │ │ if (fiber !== requestFiber) return false; 2026-10-25T02:20:05.8132637Z 2630 │ │ requestChecks += 1; 2026-10-25T02:20:05.8132775Z 2631 │ │ if (requestChecks !== interruptAt) return false; 2026-10-25T02:20:05.8132885Z 2632 │ │ fiber.interruptUnsafe(); 2026-10-25T02:20:05.8132986Z 2633 │ │ return true; 2026-10-25T02:20:05.8133067Z 2634 │ │ }, 2026-10-25T02:20:05.8133145Z 2635 │ │ }; 2026-10-25T02:20:05.8133212Z 2636 │ │ 2026-10-25T02:20:05.8133330Z 2637 │ │ const input: UsageSummaryInput = { 2026-10-25T02:20:05.8133422Z 2638 │ │ ...WINDOW, 2026-10-25T02:20:05.8133545Z 2639 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-25T02:20:05.8133730Z 2640 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-25T02:20:05.8133809Z 2641 │ │ }; 2026-10-25T02:20:05.8133919Z 2642 │ │ const first = yield* service 2026-10-25T02:20:05.8134027Z 2643 │ │ .readSummary(input) 2026-10-25T02:20:05.8134114Z 2644 │ │ .pipe( 2026-10-25T02:20:05.8134209Z 2645 │ │ Effect.exit, 2026-10-25T02:20:05.8134362Z 2646 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T02:20:05.8134463Z 2647 │ │ Effect.forkChild, 2026-10-25T02:20:05.8134540Z 2648 │ │ ); 2026-10-25T02:20:05.8134640Z 2649 │ │ requestFiber = first; 2026-10-25T02:20:05.8134744Z 2650 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8134846Z 2651 │ │ dispatcher.flush(); 2026-10-25T02:20:05.8134913Z 2652 │ │ 2026-10-25T02:20:05.8135117Z 2653 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-25T02:20:05.8135258Z 2654 │ │ Effect.match({ 2026-10-25T02:20:05.8135379Z 2655 │ │ onFailure: (error) => error.reason, 2026-10-25T02:20:05.8135498Z 2656 │ │ onSuccess: () => "success" as const, 2026-10-25T02:20:05.8135578Z 2657 │ │ }), 2026-10-25T02:20:05.8135728Z 2658 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T02:20:05.8135826Z 2659 │ │ Effect.forkChild, 2026-10-25T02:20:05.8135902Z 2660 │ │ ); 2026-10-25T02:20:05.8136004Z 2661 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8136102Z 2662 │ │ dispatcher.flush(); 2026-10-25T02:20:05.8136229Z 2663 │ │ const secondExit = second.pollUnsafe(); 2026-10-25T02:20:05.8136342Z 2664 │ │ if (secondExit === undefined) { 2026-10-25T02:20:05.8136454Z 2665 │ │ second.interruptUnsafe(); 2026-10-25T02:20:05.8136560Z 2666 │ │ orphanedAt = interruptAt; 2026-10-25T02:20:05.8136643Z 2667 │ │ break; 2026-10-25T02:20:05.8136720Z 2668 │ │ } 2026-10-25T02:20:05.8136834Z 2669 │ │ if (Exit.isFailure(secondExit)) { 2026-10-25T02:20:05.8136985Z 2670 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-25T02:20:05.8137060Z 2671 │ │ } 2026-10-25T02:20:05.8137207Z 2672 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-25T02:20:05.8137340Z 2673 │ ╰─▶ } 2026-10-25T02:20:05.8137396Z 2674 │ 2026-10-25T02:20:05.8137447Z ╰──── 2026-10-25T02:20:05.8137449Z 2026-10-25T02:20:05.8137707Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8137819Z ╭─[apps/server/src/usage/UsageService.ts:162:7] 2026-10-25T02:20:05.8137871Z 161 │ 2026-10-25T02:20:05.8137947Z 162 │ const layerTest = Layer.succeed( 2026-10-25T02:20:05.8138020Z ·  ────┬──── 2026-10-25T02:20:05.8138145Z · ╰── 'layerTest' is declared here 2026-10-25T02:20:05.8138209Z 163 │ UsageService, 2026-10-25T02:20:05.8138259Z ╰──── 2026-10-25T02:20:05.8138409Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8138441Z 2026-10-25T02:20:05.8138632Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8138756Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-25T02:20:05.8138810Z 81 │ }, 2026-10-25T02:20:05.8138872Z 82 │ [draftKey], 2026-10-25T02:20:05.8138941Z ·  ────┬─── 2026-10-25T02:20:05.8139075Z · ╰── Unnecessary dependency `draftKey` 2026-10-25T02:20:05.8139128Z 83 │ ); 2026-10-25T02:20:05.8139176Z ╰──── 2026-10-25T02:20:05.8139459Z  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-25T02:20:05.8139765Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8139771Z 2026-10-25T02:20:05.8140018Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8140146Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:59:5] 2026-10-25T02:20:05.8140197Z 56 │ 2026-10-25T02:20:05.8140262Z 57 │ useEffect(() => { 2026-10-25T02:20:05.8140331Z ·  ────┬──── 2026-10-25T02:20:05.8140454Z · ╰── This is the containing effect 2026-10-25T02:20:05.8140545Z 58 │ const controller = new AbortController(); 2026-10-25T02:20:05.8140615Z 59 │ setLoadState("pending"); 2026-10-25T02:20:05.8140688Z ·  ──────┬───── 2026-10-25T02:20:05.8140855Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8141009Z 60 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-25T02:20:05.8141063Z ╰──── 2026-10-25T02:20:05.8141644Z  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-25T02:20:05.8141955Z  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-25T02:20:05.8141957Z 2026-10-25T02:20:05.8142154Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8142283Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:70:7] 2026-10-25T02:20:05.8142362Z 69 │ return () => controller.abort(); 2026-10-25T02:20:05.8142456Z 70 │ }, [player, props.playRequested, attempt]); 2026-10-25T02:20:05.8142622Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-25T02:20:05.8142834Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-25T02:20:05.8143026Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-25T02:20:05.8143159Z · ╰── Unnecessary dependency `player_0` 2026-10-25T02:20:05.8143209Z 71 │ 2026-10-25T02:20:05.8143308Z ╰──── 2026-10-25T02:20:05.8143618Z  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-25T02:20:05.8143917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8143919Z 2026-10-25T02:20:05.8144167Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8144299Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:67:5] 2026-10-25T02:20:05.8144398Z 65 │ const { id: attachmentId, fileUri } = attachment; 2026-10-25T02:20:05.8144463Z 66 │ useEffect(() => { 2026-10-25T02:20:05.8144531Z ·  ────┬──── 2026-10-25T02:20:05.8144658Z · ╰── This is the containing effect 2026-10-25T02:20:05.8144722Z 67 │ setUri(null); 2026-10-25T02:20:05.8144790Z ·  ───┬── 2026-10-25T02:20:05.8144947Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8145010Z 68 │ setError(null); 2026-10-25T02:20:05.8145058Z ╰──── 2026-10-25T02:20:05.8145649Z  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-25T02:20:05.8145962Z  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-25T02:20:05.8145967Z 2026-10-25T02:20:05.8146159Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T02:20:05.8146289Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:90:7] 2026-10-25T02:20:05.8146340Z 89 │ }; 2026-10-25T02:20:05.8146414Z 90 │ }, [attachmentId, fileUri]); 2026-10-25T02:20:05.8146525Z ·  ──────┬───── ───┬─── 2026-10-25T02:20:05.8146699Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-25T02:20:05.8146838Z · ╰── Unnecessary dependency `attachmentId` 2026-10-25T02:20:05.8146967Z 91 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-25T02:20:05.8147026Z ╰──── 2026-10-25T02:20:05.8147311Z  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-25T02:20:05.8147605Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8147610Z 2026-10-25T02:20:05.8147813Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.8147948Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:212:34] 2026-10-25T02:20:05.8148012Z 211 │ useEffect(() => { 2026-10-25T02:20:05.8148122Z 212 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-25T02:20:05.8148214Z ·  ──┬── 2026-10-25T02:20:05.8148404Z · ╰── Missing dependency `props` 2026-10-25T02:20:05.8148536Z 213 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-25T02:20:05.8148645Z ·  ──────────┬───────── 2026-10-25T02:20:05.8148863Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-25T02:20:05.8148934Z 214 │ const { source } = props; 2026-10-25T02:20:05.8148984Z ╰──── 2026-10-25T02:20:05.8149388Z  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-25T02:20:05.8149689Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8149695Z 2026-10-25T02:20:05.8149871Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-25T02:20:05.8150003Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-25T02:20:05.8150086Z 14 │ import * as Layer from "effect/Layer"; 2026-10-25T02:20:05.8150176Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-25T02:20:05.8150251Z ·  ──┬── 2026-10-25T02:20:05.8150379Z · ╰── 'Scope' is imported here 2026-10-25T02:20:05.8150463Z 16 │ import * as Stream from "effect/Stream"; 2026-10-25T02:20:05.8150512Z ╰──── 2026-10-25T02:20:05.8150604Z  help: Consider removing this import. 2026-10-25T02:20:05.8150612Z 2026-10-25T02:20:05.8150861Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8150988Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:171:5] 2026-10-25T02:20:05.8151172Z 166 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-25T02:20:05.8151239Z 167 │ useLayoutEffect(() => { 2026-10-25T02:20:05.8151315Z ·  ───────┬─────── 2026-10-25T02:20:05.8151441Z · ╰── This is the containing effect 2026-10-25T02:20:05.8151526Z 168 │ if (faviconRequest === null) return; 2026-10-25T02:20:05.8151576Z 169 │ 2026-10-25T02:20:05.8151702Z 170 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-25T02:20:05.8151801Z 171 │ setActiveFaviconRequest(faviconRequest); 2026-10-25T02:20:05.8151893Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8152059Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8152125Z 172 │ return endRequest; 2026-10-25T02:20:05.8152177Z ╰──── 2026-10-25T02:20:05.8152751Z  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-25T02:20:05.8153058Z  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-25T02:20:05.8153062Z 2026-10-25T02:20:05.8153379Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T02:20:05.8153538Z ╭─[apps/server/src/provider/AntigravityAuth.ts:303:20] 2026-10-25T02:20:05.8153594Z 302 │ }, 2026-10-25T02:20:05.8153674Z 303 │ (effect, flow, stopSessions) => 2026-10-25T02:20:05.8153761Z ·  ──────┬───── 2026-10-25T02:20:05.8153902Z · ╰── 'stopSessions' is declared here 2026-10-25T02:20:05.8153966Z 304 │ effect.pipe( 2026-10-25T02:20:05.8154016Z ╰──── 2026-10-25T02:20:05.8154114Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8154117Z 2026-10-25T02:20:05.8154571Z ⚠ 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-25T02:20:05.8154693Z ╭─[packages/shared/src/atomicWrite.test.ts:137:5] 2026-10-25T02:20:05.8154767Z 136 │ Effect.gen(function* () { 2026-10-25T02:20:05.8154953Z 137 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-25T02:20:05.8155073Z 138 │ │ yield* TestClock.adjust("100 millis"); 2026-10-25T02:20:05.8155414Z 139 │ │ // 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-25T02:20:05.8155594Z 140 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-25T02:20:05.8155727Z 141 │ ╰─▶ } 2026-10-25T02:20:05.8155812Z 142 │ return yield* Fiber.join(fiber); 2026-10-25T02:20:05.8155862Z ╰──── 2026-10-25T02:20:05.8155865Z 2026-10-25T02:20:05.8156123Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8156229Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-25T02:20:05.8156279Z 35 │ 2026-10-25T02:20:05.8156406Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-25T02:20:05.8156478Z ·  ─────┬──── 2026-10-25T02:20:05.8156609Z · ╰── 'claudeCaps' is declared here 2026-10-25T02:20:05.8156676Z 37 │ optionDescriptors: [ 2026-10-25T02:20:05.8156733Z ╰──── 2026-10-25T02:20:05.8156839Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8156845Z 2026-10-25T02:20:05.8156985Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8157129Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:148:27] 2026-10-25T02:20:05.8157313Z 147 │ 2026-10-25T02:20:05.8157390Z 148 │ {props.children(open)} 2026-10-25T02:20:05.8157475Z ·  ──┬─ 2026-10-25T02:20:05.8157627Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.8157689Z 149 │ 2026-10-25T02:20:05.8157738Z ╰──── 2026-10-25T02:20:05.8158244Z  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-25T02:20:05.8158552Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8158557Z 2026-10-25T02:20:05.8158747Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-25T02:20:05.8158892Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:136:9] 2026-10-25T02:20:05.8158972Z 135 │ if (action.id !== undefined) { 2026-10-25T02:20:05.8159047Z 136 │ props.onPressAction?.({ 2026-10-25T02:20:05.8159116Z ·  ──┬── 2026-10-25T02:20:05.8159245Z · ╰── Missing dependency `props` 2026-10-25T02:20:05.8159337Z 137 │ nativeEvent: { event: action.id }, 2026-10-25T02:20:05.8159478Z 138 │ } as Parameters>[0]); 2026-10-25T02:20:05.8159532Z 139 │ } 2026-10-25T02:20:05.8159585Z 140 │ }, 2026-10-25T02:20:05.8159665Z 141 │ [close, props.onPressAction], 2026-10-25T02:20:05.8159756Z ·  ─────────┬───────── 2026-10-25T02:20:05.8159961Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-25T02:20:05.8160015Z 142 │ ); 2026-10-25T02:20:05.8160065Z ╰──── 2026-10-25T02:20:05.8160532Z  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-25T02:20:05.8160876Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8160879Z 2026-10-25T02:20:05.8161150Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T02:20:05.8161300Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:160:24] 2026-10-25T02:20:05.8161357Z 159 │ keys, 2026-10-25T02:20:05.8161427Z 160 │ overridingProjects = [], 2026-10-25T02:20:05.8161505Z ·  ── 2026-10-25T02:20:05.8161570Z 161 │ onClearOverrides, 2026-10-25T02:20:05.8161620Z ╰──── 2026-10-25T02:20:05.8161984Z  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-25T02:20:05.8162024Z 2026-10-25T02:20:05.8162378Z ⚠ 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-25T02:20:05.8162495Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-25T02:20:05.8162551Z 145 │ name, 2026-10-25T02:20:05.8162687Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-25T02:20:05.8162789Z ·  ────────────────────────── 2026-10-25T02:20:05.8162908Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-25T02:20:05.8162957Z ╰──── 2026-10-25T02:20:05.8162965Z 2026-10-25T02:20:05.8163416Z ⚠ 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-25T02:20:05.8163567Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-25T02:20:05.8163620Z 27 │ ) { 2026-10-25T02:20:05.8163818Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.8163957Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-25T02:20:05.8164079Z 30 │ │ if (predicate(available)) return available; 2026-10-25T02:20:05.8164175Z 31 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8164297Z 32 │ ╰─▶ } 2026-10-25T02:20:05.8164473Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-25T02:20:05.8164524Z ╰──── 2026-10-25T02:20:05.8164527Z 2026-10-25T02:20:05.8164968Z ⚠ 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-25T02:20:05.8165121Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-25T02:20:05.8165175Z 93 │ ) { 2026-10-25T02:20:05.8165365Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T02:20:05.8165535Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-25T02:20:05.8165652Z 96 │ │ if (predicate(project)) return project; 2026-10-25T02:20:05.8165749Z 97 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8165866Z 98 │ ╰─▶ } 2026-10-25T02:20:05.8166009Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-25T02:20:05.8166062Z ╰──── 2026-10-25T02:20:05.8166065Z 2026-10-25T02:20:05.8166225Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.8166365Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:460:14] 2026-10-25T02:20:05.8166417Z 459 │ 2026-10-25T02:20:05.8166518Z 460 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-25T02:20:05.8166638Z ·  ── 2026-10-25T02:20:05.8166717Z 461 │ } 2026-10-25T02:20:05.8166767Z ╰──── 2026-10-25T02:20:05.8166989Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.8166992Z 2026-10-25T02:20:05.8167194Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:20:05.8167326Z ╭─[packages/shared/src/composerContextLegacySend.ts:15:45] 2026-10-25T02:20:05.8167449Z 14 │ const occurrences = collectComposerContextReferences(text); 2026-10-25T02:20:05.8167551Z 15 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-25T02:20:05.8167657Z ·  ─────── 2026-10-25T02:20:05.8167771Z 16 │ const record = recordsById.get(occurrence.contextId); 2026-10-25T02:20:05.8167824Z ╰──── 2026-10-25T02:20:05.8168073Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:20:05.8168075Z 2026-10-25T02:20:05.8168259Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-25T02:20:05.8168350Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-25T02:20:05.8168436Z  9 │ import * as Effect from "effect/Effect"; 2026-10-25T02:20:05.8168515Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-25T02:20:05.8168588Z ·  ──┬── 2026-10-25T02:20:05.8168714Z · ╰── 'Fiber' is imported here 2026-10-25T02:20:05.8168813Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-25T02:20:05.8168862Z ╰──── 2026-10-25T02:20:05.8168963Z  help: Consider removing this import. 2026-10-25T02:20:05.8168968Z 2026-10-25T02:20:05.8169159Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-25T02:20:05.8169250Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-25T02:20:05.8169328Z 16 │ import * as Ref from "effect/Ref"; 2026-10-25T02:20:05.8169419Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-25T02:20:05.8169494Z ·  ────┬─── 2026-10-25T02:20:05.8169624Z · ╰── 'Schedule' is imported here 2026-10-25T02:20:05.8169705Z 18 │ import * as Schema from "effect/Schema"; 2026-10-25T02:20:05.8169755Z ╰──── 2026-10-25T02:20:05.8169849Z  help: Consider removing this import. 2026-10-25T02:20:05.8169851Z 2026-10-25T02:20:05.8170144Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8170242Z ╭─[apps/server/src/ws.ts:1296:13] 2026-10-25T02:20:05.8170391Z 1295 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-25T02:20:05.8170582Z 1296 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-25T02:20:05.8170685Z ·  ────────────┬─────────── 2026-10-25T02:20:05.8170849Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-25T02:20:05.8171012Z 1297 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-25T02:20:05.8171063Z ╰──── 2026-10-25T02:20:05.8171210Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8171245Z 2026-10-25T02:20:05.8171657Z ⚠ 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-25T02:20:05.8171796Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:260:20] 2026-10-25T02:20:05.8171877Z 259 │ ...(update._meta !== undefined 2026-10-25T02:20:05.8172036Z 260 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-25T02:20:05.8172121Z ·  ───────── 2026-10-25T02:20:05.8172181Z 261 │ : {}), 2026-10-25T02:20:05.8172232Z ╰──── 2026-10-25T02:20:05.8172235Z 2026-10-25T02:20:05.8172428Z ⚠ eslint(no-unused-vars): Identifier 'Option' is imported but never used. 2026-10-25T02:20:05.8172560Z ╭─[apps/server/src/guest/GuestShareService.test.ts:24:13] 2026-10-25T02:20:05.8172637Z 23 │ import * as Ref from "effect/Ref"; 2026-10-25T02:20:05.8172720Z 24 │ import * as Option from "effect/Option"; 2026-10-25T02:20:05.8172793Z ·  ───┬── 2026-10-25T02:20:05.8172920Z · ╰── 'Option' is imported here 2026-10-25T02:20:05.8173001Z 25 │ import * as Stream from "effect/Stream"; 2026-10-25T02:20:05.8173050Z ╰──── 2026-10-25T02:20:05.8173142Z  help: Consider removing this import. 2026-10-25T02:20:05.8173144Z 2026-10-25T02:20:05.8173361Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:20:05.8173491Z ╭─[apps/server/src/guest/GuestShareService.test.ts:733:50] 2026-10-25T02:20:05.8173639Z 732 │ yield* guestShares.submit(session, { shareId, text: `note ${index}` }, []); 2026-10-25T02:20:05.8173804Z 733 │ const [waiting] = (yield* waitingMessages).filter((next) => next.status === "pending"); 2026-10-25T02:20:05.8173912Z ·  ────── 2026-10-25T02:20:05.8173993Z 734 │ yield* orchestrator.dispatch({ 2026-10-25T02:20:05.8174042Z ╰──── 2026-10-25T02:20:05.8174205Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:20:05.8174208Z 2026-10-25T02:20:05.8174393Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.8174531Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-25T02:20:05.8174613Z 35 │ ( 2026-10-25T02:20:05.8176744Z ·  ┬ 2026-10-25T02:20:05.8176873Z · ╰── 'I' is declared here 2026-10-25T02:20:05.8176950Z 89 │ events: Stream.Stream, 2026-10-25T02:20:05.8177005Z ╰──── 2026-10-25T02:20:05.8177104Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8177106Z 2026-10-25T02:20:05.8177245Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8177357Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-25T02:20:05.8177528Z 53 │ const child = children as ReactElement>; 2026-10-25T02:20:05.8177696Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-25T02:20:05.8177796Z 55 │ │ onTouchStart: (event) => { 2026-10-25T02:20:05.8177989Z 56 │ │ // onPressIn can repeat within one gesture when a finger leaves and re-enters the row. 2026-10-25T02:20:05.8178117Z 57 │ │ menuPress.current.isPreparing = false; 2026-10-25T02:20:05.8178278Z 58 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-25T02:20:05.8178387Z 59 │ │ pendingPress.current = null; 2026-10-25T02:20:05.8178500Z 60 │ │ child.props.onTouchStart?.(event); 2026-10-25T02:20:05.8178575Z 61 │ │ }, 2026-10-25T02:20:05.8178671Z 62 │ │ onPress: (event) => { 2026-10-25T02:20:05.8178873Z 63 │ │ // Accessibility clicks lack touch identifiers and must ignore previous touch cancellation. 2026-10-25T02:20:05.8179032Z 64 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-25T02:20:05.8179220Z 65 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-25T02:20:05.8179306Z 66 │ │ return; 2026-10-25T02:20:05.8179380Z 67 │ │ } 2026-10-25T02:20:05.8179513Z 68 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-25T02:20:05.8179721Z 69 │ │ // A release can precede native display; let UIKit's display/cancel callback decide its outcome. 2026-10-25T02:20:05.8179816Z 70 │ │ event.persist(); 2026-10-25T02:20:05.8179968Z 71 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-25T02:20:05.8180048Z 72 │ │ return; 2026-10-25T02:20:05.8180123Z 73 │ │ } 2026-10-25T02:20:05.8180232Z 74 │ │ child.props.onPress?.(event); 2026-10-25T02:20:05.8180353Z 75 │ │ }, 2026-10-25T02:20:05.8180504Z 76 │ ├─▶ }); 2026-10-25T02:20:05.8180731Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.8180831Z 77 │ menuProps.onMenuInteractionStart = () => { 2026-10-25T02:20:05.8180882Z ╰──── 2026-10-25T02:20:05.8181332Z  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-25T02:20:05.8181618Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8181622Z 2026-10-25T02:20:05.8181844Z ⚠ unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily. 2026-10-25T02:20:05.8181978Z ╭─[apps/mobile/src/native/native-layout-metrics.tsx:43:27] 2026-10-25T02:20:05.8182044Z 42 │ latestMetrics = next; 2026-10-25T02:20:05.8182152Z 43 │ for (const settle of [...metricsWaiters]) settle(next); 2026-10-25T02:20:05.8182235Z ·  ─── 2026-10-25T02:20:05.8182300Z 44 │ setMetrics(next); 2026-10-25T02:20:05.8182350Z ╰──── 2026-10-25T02:20:05.8182528Z  help: `for…of` can iterate over iterable, it's unnecessary to convert to an array. 2026-10-25T02:20:05.8182531Z 2026-10-25T02:20:05.8182732Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-25T02:20:05.8182860Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:75:10] 2026-10-25T02:20:05.8182913Z 74 │ 2026-10-25T02:20:05.8183044Z 75 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-25T02:20:05.8183128Z ·  ────────┬─────── 2026-10-25T02:20:05.8183270Z · ╰── 'describeSchedule' is declared here 2026-10-25T02:20:05.8183375Z 76 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-25T02:20:05.8183424Z ╰──── 2026-10-25T02:20:05.8183524Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8183526Z 2026-10-25T02:20:05.8183699Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-25T02:20:05.8183817Z ╭─[apps/web/src/terminal/ghostty/core.ts:186:19] 2026-10-25T02:20:05.8183946Z 185 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-25T02:20:05.8184037Z 186 │ const codes = new Array(count); 2026-10-25T02:20:05.8184143Z ·  ──────────────────────── 2026-10-25T02:20:05.8184242Z 187 │ for (let index = 0; index < count; index += 1) { 2026-10-25T02:20:05.8184293Z ╰──── 2026-10-25T02:20:05.8184695Z  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-25T02:20:05.8184698Z 2026-10-25T02:20:05.8185235Z ⚠ 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-25T02:20:05.8185452Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:520:13] 2026-10-25T02:20:05.8185522Z 519 │ })).delivery; 2026-10-25T02:20:05.8185713Z 520 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-25T02:20:05.8185822Z 521 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8185963Z 522 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-25T02:20:05.8186061Z 523 │ │ id: task.id, 2026-10-25T02:20:05.8186174Z 524 │ │ deliveryId: deliveryId!, 2026-10-25T02:20:05.8186268Z 525 │ │ })).delivery; 2026-10-25T02:20:05.8186408Z 526 │ ╰─▶ } 2026-10-25T02:20:05.8186525Z 527 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-25T02:20:05.8186576Z ╰──── 2026-10-25T02:20:05.8186578Z 2026-10-25T02:20:05.8186938Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.8187060Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-25T02:20:05.8187205Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-25T02:20:05.8187356Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-25T02:20:05.8187473Z ·  ────────────────────────── 2026-10-25T02:20:05.8187590Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-25T02:20:05.8187644Z ╰──── 2026-10-25T02:20:05.8187646Z 2026-10-25T02:20:05.8188077Z ⚠ 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-25T02:20:05.8188204Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-25T02:20:05.8188336Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-25T02:20:05.8188519Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-25T02:20:05.8188631Z ·  ─────────────────── 2026-10-25T02:20:05.8188722Z 1013 │ expect(encoded).not.toContain(url); 2026-10-25T02:20:05.8188822Z ╰──── 2026-10-25T02:20:05.8188852Z 2026-10-25T02:20:05.8189032Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8189163Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-25T02:20:05.8189320Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-25T02:20:05.8189404Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-25T02:20:05.8189486Z ·  ┬ 2026-10-25T02:20:05.8189615Z · ╰── '_' is declared here 2026-10-25T02:20:05.8189713Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-25T02:20:05.8189762Z ╰──── 2026-10-25T02:20:05.8189862Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8189864Z 2026-10-25T02:20:05.8190046Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8190180Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-25T02:20:05.8190232Z 133 │ ); 2026-10-25T02:20:05.8190335Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-25T02:20:05.8190430Z ·  ┬ 2026-10-25T02:20:05.8190566Z · ╰── '_' is declared here 2026-10-25T02:20:05.8190630Z 135 │ Effect.succeed( 2026-10-25T02:20:05.8190680Z ╰──── 2026-10-25T02:20:05.8190779Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8190781Z 2026-10-25T02:20:05.8190957Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8191093Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-25T02:20:05.8191148Z 177 │ }); 2026-10-25T02:20:05.8191243Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-25T02:20:05.8191328Z ·  ┬ 2026-10-25T02:20:05.8191455Z · ╰── '_' is declared here 2026-10-25T02:20:05.8191552Z 179 │ switch (options.continuation ?? "queued") { 2026-10-25T02:20:05.8191605Z ╰──── 2026-10-25T02:20:05.8191703Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8191705Z 2026-10-25T02:20:05.8191882Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8192010Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-25T02:20:05.8192068Z 202 │ ); 2026-10-25T02:20:05.8192166Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-25T02:20:05.8192253Z ·  ┬ 2026-10-25T02:20:05.8192381Z · ╰── '_' is declared here 2026-10-25T02:20:05.8192460Z 204 │ options.removeWorktreeFails 2026-10-25T02:20:05.8192509Z ╰──── 2026-10-25T02:20:05.8192603Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8192607Z 2026-10-25T02:20:05.8192778Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8192906Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-25T02:20:05.8192960Z 207 │ ); 2026-10-25T02:20:05.8193060Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-25T02:20:05.8193197Z ·  ┬ 2026-10-25T02:20:05.8193358Z · ╰── '_' is declared here 2026-10-25T02:20:05.8193442Z 209 │ options.deleteLocalBranchFails 2026-10-25T02:20:05.8193492Z ╰──── 2026-10-25T02:20:05.8193586Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8193588Z 2026-10-25T02:20:05.8193763Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8193892Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-25T02:20:05.8193944Z 212 │ ); 2026-10-25T02:20:05.8194052Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-25T02:20:05.8194146Z ·  ┬ 2026-10-25T02:20:05.8194290Z · ╰── '_' is declared here 2026-10-25T02:20:05.8194375Z 214 │ options.fetchWorktreeBaseFails 2026-10-25T02:20:05.8194423Z ╰──── 2026-10-25T02:20:05.8194521Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8194523Z 2026-10-25T02:20:05.8194695Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8194823Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-25T02:20:05.8194873Z 253 │ ); 2026-10-25T02:20:05.8194962Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-25T02:20:05.8195046Z ·  ┬ 2026-10-25T02:20:05.8195214Z · ╰── '_' is declared here 2026-10-25T02:20:05.8195279Z 255 │ Effect.succeed({ 2026-10-25T02:20:05.8195334Z ╰──── 2026-10-25T02:20:05.8195433Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8195436Z 2026-10-25T02:20:05.8195608Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8195735Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-25T02:20:05.8195787Z 263 │ ); 2026-10-25T02:20:05.8195932Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-25T02:20:05.8196018Z ·  ┬ 2026-10-25T02:20:05.8196147Z · ╰── '_' is declared here 2026-10-25T02:20:05.8196290Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-25T02:20:05.8196340Z ╰──── 2026-10-25T02:20:05.8196441Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8196446Z 2026-10-25T02:20:05.8196604Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.8196720Z ╭─[apps/server/src/processRunner.test.ts:264:14] 2026-10-25T02:20:05.8196772Z 263 │ 2026-10-25T02:20:05.8196873Z 264 │ for (const {} of ["timeout", "success"] as const) { 2026-10-25T02:20:05.8196942Z ·  ── 2026-10-25T02:20:05.8196994Z 265 │ } 2026-10-25T02:20:05.8197043Z ╰──── 2026-10-25T02:20:05.8197266Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.8197269Z 2026-10-25T02:20:05.8197524Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8197700Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:327:7] 2026-10-25T02:20:05.8197786Z 326 │ 2026-10-25T02:20:05.8197887Z 327 │ const layerTest = AnalyticsService.layerTest; 2026-10-25T02:20:05.8197958Z ·  ────┬──── 2026-10-25T02:20:05.8198086Z · ╰── 'layerTest' is declared here 2026-10-25T02:20:05.8198137Z ╰──── 2026-10-25T02:20:05.8198238Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8198240Z 2026-10-25T02:20:05.8198436Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T02:20:05.8198598Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-25T02:20:05.8198672Z 14 │ } from "@t3tools/contracts"; 2026-10-25T02:20:05.8198765Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-25T02:20:05.8198835Z ·  ── 2026-10-25T02:20:05.8198885Z 16 │ 2026-10-25T02:20:05.8198934Z ╰──── 2026-10-25T02:20:05.8199015Z  help: Remove empty braces 2026-10-25T02:20:05.8199017Z 2026-10-25T02:20:05.8199211Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T02:20:05.8199341Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-25T02:20:05.8199502Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T02:20:05.8199589Z 226 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.8199676Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8200130Z · ╰── 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-25T02:20:05.8200205Z 227 │ mostRecentEventCount, 2026-10-25T02:20:05.8200260Z 228 │ ); 2026-10-25T02:20:05.8200380Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T02:20:05.8200510Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T02:20:05.8200740Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.8200824Z 230 │ const assumedValue = props.value; 2026-10-25T02:20:05.8200873Z ╰──── 2026-10-25T02:20:05.8201033Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T02:20:05.8201344Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8201350Z 2026-10-25T02:20:05.8201559Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T02:20:05.8201690Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:235:7] 2026-10-25T02:20:05.8201829Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T02:20:05.8201916Z 235 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.8202004Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8202446Z · ╰── 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-25T02:20:05.8202577Z 236 │ controlledEventCount, 2026-10-25T02:20:05.8202742Z 237 │ assumedValue, 2026-10-25T02:20:05.8202798Z 238 │ ); 2026-10-25T02:20:05.8202951Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T02:20:05.8203083Z ·  ───────────┬────────── 2026-10-25T02:20:05.8203283Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T02:20:05.8203372Z 240 │ const acceptNativeEvent = useCallback( 2026-10-25T02:20:05.8203422Z ╰──── 2026-10-25T02:20:05.8203832Z  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-25T02:20:05.8204139Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8204144Z 2026-10-25T02:20:05.8204283Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8204419Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-25T02:20:05.8204540Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:20:05.8204649Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:20:05.8204761Z ·  ─────────────┬──────────── 2026-10-25T02:20:05.8204924Z · ╰── Cannot access ref value during render 2026-10-25T02:20:05.8204986Z 163 │ }); 2026-10-25T02:20:05.8205040Z ╰──── 2026-10-25T02:20:05.8205514Z  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-25T02:20:05.8205796Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8205798Z 2026-10-25T02:20:05.8205940Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8206072Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-25T02:20:05.8206191Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:20:05.8206300Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:20:05.8206413Z ·  ─────────────┬──────────── 2026-10-25T02:20:05.8206615Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.8206669Z 163 │ }); 2026-10-25T02:20:05.8206717Z ╰──── 2026-10-25T02:20:05.8207165Z  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-25T02:20:05.8207448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8207450Z 2026-10-25T02:20:05.8207638Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8207800Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-25T02:20:05.8207855Z 163 │ }); 2026-10-25T02:20:05.8207942Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T02:20:05.8208063Z ·  ─────────┬────────────┬─── 2026-10-25T02:20:05.8208243Z · │ ╰── Cannot update ref value during render 2026-10-25T02:20:05.8208355Z · ╰── This value is a ref 2026-10-25T02:20:05.8208425Z 165 │ return JSON.stringify( 2026-10-25T02:20:05.8208477Z ╰──── 2026-10-25T02:20:05.8208927Z  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-25T02:20:05.8209208Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8209210Z 2026-10-25T02:20:05.8209350Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8209480Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-25T02:20:05.8209550Z 205 │ mostRecentEventCount, 2026-10-25T02:20:05.8209635Z 206 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.8209736Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.8209924Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.8209980Z 207 │ ); 2026-10-25T02:20:05.8210028Z ╰──── 2026-10-25T02:20:05.8210473Z  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-25T02:20:05.8210753Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8210755Z 2026-10-25T02:20:05.8210893Z ⚠ react(refs): Cannot access refs during render 2026-10-25T02:20:05.8211024Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-25T02:20:05.8211092Z 211 │ mostRecentEventCount, 2026-10-25T02:20:05.8211220Z 212 │ nativeEventSnapshotsRef.current, 2026-10-25T02:20:05.8211353Z ·  ───────────────┬─────────────── 2026-10-25T02:20:05.8211536Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T02:20:05.8211588Z 213 │ ); 2026-10-25T02:20:05.8211638Z ╰──── 2026-10-25T02:20:05.8212084Z  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-25T02:20:05.8212362Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T02:20:05.8212364Z 2026-10-25T02:20:05.8212548Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:20:05.8212680Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-25T02:20:05.8212799Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T02:20:05.8212908Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T02:20:05.8213014Z ·  ─────────┬──────── 2026-10-25T02:20:05.8213458Z · ╰── 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-25T02:20:05.8213516Z 163 │ }); 2026-10-25T02:20:05.8213605Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T02:20:05.8213673Z 165 │ return JSON.stringify( 2026-10-25T02:20:05.8213836Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T02:20:05.8213905Z 167 │ const record = 2026-10-25T02:20:05.8213981Z 168 │ token.type === "context" 2026-10-25T02:20:05.8214142Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T02:20:05.8214204Z 170 │ : undefined; 2026-10-25T02:20:05.8214309Z 171 │ const presentation = contextChipPresentation( 2026-10-25T02:20:05.8214416Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-25T02:20:05.8214479Z 173 │ record, 2026-10-25T02:20:05.8214536Z 174 │ ); 2026-10-25T02:20:05.8214618Z 175 │ const icon = contextChipIcon( 2026-10-25T02:20:05.8214685Z 176 │ presentation, 2026-10-25T02:20:05.8214831Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T02:20:05.8214889Z 178 │ ); 2026-10-25T02:20:05.8214952Z 179 │ return { 2026-10-25T02:20:05.8215021Z 180 │ type: token.type, 2026-10-25T02:20:05.8215123Z 181 │ source: token.source, 2026-10-25T02:20:05.8215193Z 182 │ start: token.start, 2026-10-25T02:20:05.8215257Z 183 │ end: token.end, 2026-10-25T02:20:05.8215399Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T02:20:05.8215459Z 185 │ label: 2026-10-25T02:20:05.8215532Z 186 │ token.type === "skill" 2026-10-25T02:20:05.8215636Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T02:20:05.8215716Z 188 │ : token.type === "context" 2026-10-25T02:20:05.8215989Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T02:20:05.8216097Z 190 │ : basename(token.value), 2026-10-25T02:20:05.8216236Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T02:20:05.8216326Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-25T02:20:05.8216411Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-25T02:20:05.8216466Z 194 │ }; 2026-10-25T02:20:05.8216523Z 195 │ }), 2026-10-25T02:20:05.8216576Z 196 │ ); 2026-10-25T02:20:05.8216702Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T02:20:05.8216849Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T02:20:05.8217056Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.8217197Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T02:20:05.8217246Z ╰──── 2026-10-25T02:20:05.8217446Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:20:05.8217748Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8217750Z 2026-10-25T02:20:05.8217932Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T02:20:05.8218063Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:257:5] 2026-10-25T02:20:05.8218188Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T02:20:05.8218290Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T02:20:05.8218380Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8218822Z · ╰── 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-25T02:20:05.8218911Z 251 │ eventCount: acknowledgedEventCount, 2026-10-25T02:20:05.8218970Z 252 │ value, 2026-10-25T02:20:05.8219046Z 253 │ selection: nextSelection, 2026-10-25T02:20:05.8219102Z 254 │ }); 2026-10-25T02:20:05.8219182Z 255 │ return acknowledgedEventCount; 2026-10-25T02:20:05.8219235Z 256 │ }, 2026-10-25T02:20:05.8219288Z 257 │ [], 2026-10-25T02:20:05.8219355Z ·  ─┬ 2026-10-25T02:20:05.8219535Z · ╰── This dependency list is missing values used by the callback 2026-10-25T02:20:05.8219591Z 258 │ ); 2026-10-25T02:20:05.8219641Z ╰──── 2026-10-25T02:20:05.8220999Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T02:20:05.8221308Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T02:20:05.8221313Z 2026-10-25T02:20:05.8221463Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-25T02:20:05.8221585Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-25T02:20:05.8221695Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-25T02:20:05.8221786Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-25T02:20:05.8221943Z ·  ───────────────────────────── 2026-10-25T02:20:05.8222104Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-25T02:20:05.8222154Z ╰──── 2026-10-25T02:20:05.8222306Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-25T02:20:05.8222310Z 2026-10-25T02:20:05.8222740Z ⚠ 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-25T02:20:05.8222861Z ╭─[apps/server/src/serverSettings.test.ts:1740:32] 2026-10-25T02:20:05.8223025Z 1739 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-25T02:20:05.8223208Z 1740 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T02:20:05.8223318Z ·  ─────────────────── 2026-10-25T02:20:05.8223424Z 1741 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T02:20:05.8223475Z ╰──── 2026-10-25T02:20:05.8223478Z 2026-10-25T02:20:05.8223906Z ⚠ 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-25T02:20:05.8224025Z ╭─[apps/server/src/serverSettings.test.ts:1741:34] 2026-10-25T02:20:05.8224200Z 1740 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T02:20:05.8224301Z 1741 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T02:20:05.8224417Z ·  ─────────────────── 2026-10-25T02:20:05.8224532Z 1742 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-25T02:20:05.8224581Z ╰──── 2026-10-25T02:20:05.8224583Z 2026-10-25T02:20:05.8224777Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-25T02:20:05.8224877Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-25T02:20:05.8224962Z 27 │ import * as Schema from "effect/Schema"; 2026-10-25T02:20:05.8225050Z 28 │ import { identity } from "effect/Function"; 2026-10-25T02:20:05.8225151Z ·  ────┬─── 2026-10-25T02:20:05.8225279Z · ╰── 'identity' is imported here 2026-10-25T02:20:05.8225362Z 29 │ import * as Layer from "effect/Layer"; 2026-10-25T02:20:05.8225410Z ╰──── 2026-10-25T02:20:05.8225512Z  help: Consider removing this import. 2026-10-25T02:20:05.8225517Z 2026-10-25T02:20:05.8225966Z ⚠ 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-25T02:20:05.8226111Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-25T02:20:05.8226237Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-25T02:20:05.8226377Z 133 │ ╭─▶ for ( 2026-10-25T02:20:05.8226476Z 134 │ │ let attempt = 0; 2026-10-25T02:20:05.8226638Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-25T02:20:05.8226784Z 136 │ │ attempt += 1 2026-10-25T02:20:05.8226890Z 137 │ │ ) { 2026-10-25T02:20:05.8226998Z 138 │ │ yield* Effect.yieldNow; 2026-10-25T02:20:05.8227126Z 139 │ ╰─▶ } 2026-10-25T02:20:05.8227247Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-25T02:20:05.8227295Z ╰──── 2026-10-25T02:20:05.8227298Z 2026-10-25T02:20:05.8227569Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8227710Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12551:7] 2026-10-25T02:20:05.8227763Z 12550 │ 2026-10-25T02:20:05.8227903Z 12551 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-25T02:20:05.8227987Z ·  ────────┬─────── 2026-10-25T02:20:05.8228131Z · ╰── 'layerUnavailable' is declared here 2026-10-25T02:20:05.8228198Z 12552 │ OrchestratorV2, 2026-10-25T02:20:05.8228247Z ╰──── 2026-10-25T02:20:05.8228348Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8228350Z 2026-10-25T02:20:05.8228564Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:20:05.8228690Z ╭─[scripts/lib/cli-external-packages.test.ts:104:11] 2026-10-25T02:20:05.8228756Z 103 │ const declared = { 2026-10-25T02:20:05.8228843Z 104 │ ...(manifest.dependencies ?? {}), 2026-10-25T02:20:05.8228950Z ·  ──────────────────────────────── 2026-10-25T02:20:05.8229057Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:20:05.8229109Z ╰──── 2026-10-25T02:20:05.8229367Z  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-25T02:20:05.8229369Z 2026-10-25T02:20:05.8229580Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:20:05.8229703Z ╭─[scripts/lib/cli-external-packages.test.ts:105:11] 2026-10-25T02:20:05.8229789Z 104 │ ...(manifest.dependencies ?? {}), 2026-10-25T02:20:05.8229889Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:20:05.8230006Z ·  ──────────────────────────────────────── 2026-10-25T02:20:05.8230099Z 106 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T02:20:05.8230191Z ╰──── 2026-10-25T02:20:05.8230473Z  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-25T02:20:05.8230475Z 2026-10-25T02:20:05.8230684Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:20:05.8230805Z ╭─[scripts/lib/cli-external-packages.test.ts:106:11] 2026-10-25T02:20:05.8230903Z 105 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T02:20:05.8230995Z 106 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T02:20:05.8231106Z ·  ──────────────────────────────────── 2026-10-25T02:20:05.8231163Z 107 │ }; 2026-10-25T02:20:05.8231212Z ╰──── 2026-10-25T02:20:05.8231469Z  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-25T02:20:05.8231475Z 2026-10-25T02:20:05.8231670Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-25T02:20:05.8231828Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-25T02:20:05.8231911Z 24 │ import * as Schema from "effect/Schema"; 2026-10-25T02:20:05.8232022Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-25T02:20:05.8232101Z ·  ─────┬───── 2026-10-25T02:20:05.8232236Z · ╰── 'HostProcess' is imported here 2026-10-25T02:20:05.8232287Z 26 │ 2026-10-25T02:20:05.8232335Z ╰──── 2026-10-25T02:20:05.8232428Z  help: Consider removing this import. 2026-10-25T02:20:05.8232431Z 2026-10-25T02:20:05.8232697Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8232861Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-25T02:20:05.8232939Z 123 │ const path = yield* Path.Path; 2026-10-25T02:20:05.8233051Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T02:20:05.8233129Z ·  ──────┬───── 2026-10-25T02:20:05.8233262Z · ╰── 'serverConfig' is declared here 2026-10-25T02:20:05.8233397Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T02:20:05.8233446Z ╰──── 2026-10-25T02:20:05.8233545Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8233547Z 2026-10-25T02:20:05.8233816Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8233976Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-25T02:20:05.8234085Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T02:20:05.8234217Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T02:20:05.8234298Z ·  ───────┬────── 2026-10-25T02:20:05.8234435Z · ╰── 'serverSettings' is declared here 2026-10-25T02:20:05.8234566Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-25T02:20:05.8234615Z ╰──── 2026-10-25T02:20:05.8234712Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8234762Z 2026-10-25T02:20:05.8235006Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T02:20:05.8235150Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-25T02:20:05.8235206Z 730 │ ); 2026-10-25T02:20:05.8235370Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-25T02:20:05.8235464Z ·  ────── 2026-10-25T02:20:05.8235573Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-25T02:20:05.8235622Z ╰──── 2026-10-25T02:20:05.8235785Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T02:20:05.8235788Z 2026-10-25T02:20:05.8236075Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8236198Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:214:7] 2026-10-25T02:20:05.8236248Z 213 │ 2026-10-25T02:20:05.8236392Z 214 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-25T02:20:05.8236478Z ·  ──────────┬────────── 2026-10-25T02:20:05.8236627Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-25T02:20:05.8236807Z 215 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-25T02:20:05.8236857Z ╰──── 2026-10-25T02:20:05.8236954Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8236957Z 2026-10-25T02:20:05.8237259Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8237380Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:217:7] 2026-10-25T02:20:05.8237431Z 216 │ 2026-10-25T02:20:05.8237559Z 217 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-25T02:20:05.8237658Z ·  ──────────────┬────────────── 2026-10-25T02:20:05.8237827Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-25T02:20:05.8237984Z 218 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-25T02:20:05.8238039Z ╰──── 2026-10-25T02:20:05.8238137Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8238139Z 2026-10-25T02:20:05.8238296Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T02:20:05.8238484Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-25T02:20:05.8238538Z 52 │ 2026-10-25T02:20:05.8238602Z 53 │ for (const {} of [ 2026-10-25T02:20:05.8238670Z ·  ── 2026-10-25T02:20:05.8238734Z 54 │ { healthy: true }, 2026-10-25T02:20:05.8238783Z ╰──── 2026-10-25T02:20:05.8239004Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T02:20:05.8239006Z 2026-10-25T02:20:05.8239216Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T02:20:05.8239329Z ╭─[packages/shared/src/serverSettings.ts:333:9] 2026-10-25T02:20:05.8239427Z 332 │ const entry: ProjectSettingsOverrides = { 2026-10-25T02:20:05.8239607Z 333 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-25T02:20:05.8239778Z ·  ────────────────────────────────────────────────────────────── 2026-10-25T02:20:05.8239834Z 334 │ }; 2026-10-25T02:20:05.8239883Z ╰──── 2026-10-25T02:20:05.8240137Z  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-25T02:20:05.8240140Z 2026-10-25T02:20:05.8240350Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-25T02:20:05.8240463Z ╭─[packages/shared/src/serverSettings.ts:435:24] 2026-10-25T02:20:05.8240527Z 434 │ const favorites = 2026-10-25T02:20:05.8240740Z 435 │ setModelFavorites?.reduce((current, change) => { 2026-10-25T02:20:05.8240831Z ·  ───┬── 2026-10-25T02:20:05.8240954Z · ╰── For this reduce 2026-10-25T02:20:05.8241031Z 436 │ const exists = current.some( 2026-10-25T02:20:05.8241198Z 437 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-25T02:20:05.8241253Z 438 │ ); 2026-10-25T02:20:05.8241321Z 439 │ return change.favorite 2026-10-25T02:20:05.8241384Z 440 │ ? exists 2026-10-25T02:20:05.8241443Z 441 │ ? current 2026-10-25T02:20:05.8241572Z 442 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-25T02:20:05.8241652Z ·  ─────┬──── 2026-10-25T02:20:05.8241766Z · ╰── From this spread 2026-10-25T02:20:05.8241832Z 443 │ : current.filter( 2026-10-25T02:20:05.8241887Z ╰──── 2026-10-25T02:20:05.8242087Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T02:20:05.8242237Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:20:05.8242240Z 2026-10-25T02:20:05.8242419Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T02:20:05.8242531Z ╭─[packages/shared/src/serverSettings.ts:453:3] 2026-10-25T02:20:05.8242586Z 451 │ null; 2026-10-25T02:20:05.8242696Z 452 │ let nextModelPreferences = initialModelPreferences; 2026-10-25T02:20:05.8242780Z ·  ──────────┬───────── 2026-10-25T02:20:05.8242902Z · ╰── From this accumulator 2026-10-25T02:20:05.8243002Z 453 │ for (const change of setModelsHidden ?? []) { 2026-10-25T02:20:05.8243068Z ·  ─┬─ 2026-10-25T02:20:05.8243168Z · ╰── For this loop 2026-10-25T02:20:05.8243296Z 454 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-25T02:20:05.8243360Z 455 │ hiddenModels: [], 2026-10-25T02:20:05.8243424Z 456 │ modelOrder: [], 2026-10-25T02:20:05.8243477Z 457 │ }; 2026-10-25T02:20:05.8243646Z 458 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-25T02:20:05.8243751Z 459 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-25T02:20:05.8243822Z 460 │ nextModelPreferences = { 2026-10-25T02:20:05.8243895Z 461 │ ...nextModelPreferences, 2026-10-25T02:20:05.8243985Z ·  ───────────┬─────────── 2026-10-25T02:20:05.8244168Z · ╰── From this spread 2026-10-25T02:20:05.8244311Z 462 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-25T02:20:05.8244360Z ╰──── 2026-10-25T02:20:05.8244507Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T02:20:05.8244655Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T02:20:05.8244658Z 2026-10-25T02:20:05.8244909Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8245028Z ╭─[apps/server/src/serverRuntimeStartup.ts:720:7] 2026-10-25T02:20:05.8245102Z 719 │ 2026-10-25T02:20:05.8245180Z 720 │ const layer = layerWithOptions(); 2026-10-25T02:20:05.8245250Z ·  ──┬── 2026-10-25T02:20:05.8245374Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.8245426Z ╰──── 2026-10-25T02:20:05.8245524Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8245526Z 2026-10-25T02:20:05.8245727Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:20:05.8245853Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-25T02:20:05.8245924Z 89 │ let cursor = prompt.length; 2026-10-25T02:20:05.8246024Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-25T02:20:05.8246124Z ·  ─────── 2026-10-25T02:20:05.8246202Z 91 │ let { start, end } = occurrence; 2026-10-25T02:20:05.8246251Z ╰──── 2026-10-25T02:20:05.8246505Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:20:05.8246510Z 2026-10-25T02:20:05.8246690Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-25T02:20:05.8246832Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-25T02:20:05.8246886Z  80 │ 2026-10-25T02:20:05.8247146Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-25T02:20:05.8247262Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-25T02:20:05.8247377Z  83 │ │ ): Effect.fn.Return { 2026-10-25T02:20:05.8247540Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-25T02:20:05.8247715Z  85 │ │ const connections = new Map(); 2026-10-25T02:20:05.8247812Z  86 │ │ 2026-10-25T02:20:05.8248017Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-25T02:20:05.8248113Z  88 │ │ Effect.suspend(() => { 2026-10-25T02:20:05.8248244Z  89 │ │ const connection = connections.get(connectionId); 2026-10-25T02:20:05.8248349Z  90 │ │ return connection === undefined 2026-10-25T02:20:05.8248555Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-25T02:20:05.8248659Z  92 │ │ : Effect.succeed(connection); 2026-10-25T02:20:05.8248732Z  93 │ │ }); 2026-10-25T02:20:05.8248802Z  94 │ │ 2026-10-25T02:20:05.8248888Z  95 │ │ const send = ( 2026-10-25T02:20:05.8248982Z  96 │ │ connection: Connection, 2026-10-25T02:20:05.8249070Z  97 │ │ message: unknown, 2026-10-25T02:20:05.8249220Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-25T02:20:05.8249331Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-25T02:20:05.8249433Z 100 │ │ Effect.gen(function* () { 2026-10-25T02:20:05.8249549Z 101 │ │ const body = JSON.stringify(message); 2026-10-25T02:20:05.8249685Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-25T02:20:05.8249897Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-25T02:20:05.8249974Z 104 │ │ } 2026-10-25T02:20:05.8250101Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T02:20:05.8250194Z 106 │ │ try: (signal) => 2026-10-25T02:20:05.8250320Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-25T02:20:05.8250418Z 108 │ │ method: "POST", 2026-10-25T02:20:05.8250506Z 109 │ │ signal, 2026-10-25T02:20:05.8250598Z 110 │ │ headers: { 2026-10-25T02:20:05.8250720Z 111 │ │ "content-type": "application/json", 2026-10-25T02:20:05.8250858Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-25T02:20:05.8250989Z 113 │ │ authorization: options.authorization, 2026-10-25T02:20:05.8251112Z 114 │ │ ...(connection.sessionId === null 2026-10-25T02:20:05.8251204Z 115 │ │ ? {} 2026-10-25T02:20:05.8251342Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-25T02:20:05.8251470Z 117 │ │ ...(connection.protocolVersion === null 2026-10-25T02:20:05.8251556Z 118 │ │ ? {} 2026-10-25T02:20:05.8251717Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T02:20:05.8251798Z 120 │ │ }, 2026-10-25T02:20:05.8251885Z 121 │ │ body, 2026-10-25T02:20:05.8252011Z 122 │ │ }), 2026-10-25T02:20:05.8252136Z 123 │ │ catch: bridgeError, 2026-10-25T02:20:05.8252213Z 124 │ │ }); 2026-10-25T02:20:05.8252417Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-25T02:20:05.8252513Z 126 │ │ if (!response.ok) { 2026-10-25T02:20:05.8252615Z 127 │ │ yield* Effect.promise( 2026-10-25T02:20:05.8252791Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T02:20:05.8252869Z 129 │ │ ); 2026-10-25T02:20:05.8252975Z 130 │ │ return yield* Effect.fail( 2026-10-25T02:20:05.8253180Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-25T02:20:05.8253259Z 132 │ │ ); 2026-10-25T02:20:05.8253333Z 133 │ │ } 2026-10-25T02:20:05.8253536Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-25T02:20:05.8253650Z 135 │ │ for (const payload of payloads) { 2026-10-25T02:20:05.8253858Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-25T02:20:05.8253931Z 137 │ │ } 2026-10-25T02:20:05.8254026Z 138 │ │ return payloads; 2026-10-25T02:20:05.8254143Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-25T02:20:05.8254221Z 140 │ │ ); 2026-10-25T02:20:05.8254293Z 141 │ │ 2026-10-25T02:20:05.8254462Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-25T02:20:05.8254582Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-25T02:20:05.8254761Z 144 │ │ ): Effect.fn.Return { 2026-10-25T02:20:05.8254915Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:20:05.8255035Z 146 │ │ connections.delete(request.connectionId); 2026-10-25T02:20:05.8255185Z 147 │ │ const sessionId = connection.sessionId; 2026-10-25T02:20:05.8255283Z 148 │ │ if (sessionId !== null) { 2026-10-25T02:20:05.8255411Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T02:20:05.8255506Z 150 │ │ try: (signal) => 2026-10-25T02:20:05.8255628Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-25T02:20:05.8255725Z 152 │ │ method: "DELETE", 2026-10-25T02:20:05.8255810Z 153 │ │ signal, 2026-10-25T02:20:05.8255899Z 154 │ │ headers: { 2026-10-25T02:20:05.8256023Z 155 │ │ authorization: options.authorization, 2026-10-25T02:20:05.8256136Z 156 │ │ "mcp-session-id": sessionId, 2026-10-25T02:20:05.8256263Z 157 │ │ ...(connection.protocolVersion === null 2026-10-25T02:20:05.8256404Z 158 │ │ ? {} 2026-10-25T02:20:05.8256587Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T02:20:05.8256667Z 160 │ │ }, 2026-10-25T02:20:05.8256745Z 161 │ │ }), 2026-10-25T02:20:05.8256840Z 162 │ │ catch: bridgeError, 2026-10-25T02:20:05.8256913Z 163 │ │ }); 2026-10-25T02:20:05.8257042Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-25T02:20:05.8257147Z 165 │ │ return yield* Effect.fail( 2026-10-25T02:20:05.8257251Z 166 │ │ new AcpMcpOverAcpError( 2026-10-25T02:20:05.8257427Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-25T02:20:05.8257508Z 168 │ │ ), 2026-10-25T02:20:05.8257587Z 169 │ │ ); 2026-10-25T02:20:05.8257660Z 170 │ │ } 2026-10-25T02:20:05.8257759Z 171 │ │ yield* Effect.promise( 2026-10-25T02:20:05.8257929Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T02:20:05.8258005Z 173 │ │ ); 2026-10-25T02:20:05.8258076Z 174 │ │ } 2026-10-25T02:20:05.8258158Z 175 │ │ return {}; 2026-10-25T02:20:05.8258227Z 176 │ │ }); 2026-10-25T02:20:05.8258293Z 177 │ │ 2026-10-25T02:20:05.8258370Z 178 │ │ return { 2026-10-25T02:20:05.8258541Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-25T02:20:05.8258660Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-25T02:20:05.8258765Z 181 │ │ return yield* Effect.fail( 2026-10-25T02:20:05.8258944Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-25T02:20:05.8259019Z 183 │ │ ); 2026-10-25T02:20:05.8259090Z 184 │ │ } 2026-10-25T02:20:05.8259213Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-25T02:20:05.8259415Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-25T02:20:05.8259487Z 187 │ │ } 2026-10-25T02:20:05.8259641Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-25T02:20:05.8259755Z 189 │ │ connections.set(connectionId, { 2026-10-25T02:20:05.8259868Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-25T02:20:05.8259960Z 191 │ │ sessionId: null, 2026-10-25T02:20:05.8260062Z 192 │ │ protocolVersion: null, 2026-10-25T02:20:05.8260157Z 193 │ │ nextRequestId: 0, 2026-10-25T02:20:05.8260232Z 194 │ │ }); 2026-10-25T02:20:05.8260331Z 195 │ │ return { connectionId }; 2026-10-25T02:20:05.8260402Z 196 │ │ }), 2026-10-25T02:20:05.8260566Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-25T02:20:05.8260771Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:20:05.8260919Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-25T02:20:05.8261040Z 200 │ │ const payloads = yield* send(connection, { 2026-10-25T02:20:05.8261133Z 201 │ │ jsonrpc: "2.0", 2026-10-25T02:20:05.8261211Z 202 │ │ id, 2026-10-25T02:20:05.8261312Z 203 │ │ method: request.method, 2026-10-25T02:20:05.8261463Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T02:20:05.8261537Z 205 │ │ }); 2026-10-25T02:20:05.8261716Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-25T02:20:05.8261840Z 207 │ │ const envelope = asEnvelope(response); 2026-10-25T02:20:05.8261940Z 208 │ │ if (envelope === null) { 2026-10-25T02:20:05.8262043Z 209 │ │ return yield* Effect.fail( 2026-10-25T02:20:05.8262222Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-25T02:20:05.8262297Z 211 │ │ ); 2026-10-25T02:20:05.8262368Z 212 │ │ } 2026-10-25T02:20:05.8262483Z 213 │ │ if (envelope.error !== undefined) { 2026-10-25T02:20:05.8262672Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-25T02:20:05.8262743Z 215 │ │ } 2026-10-25T02:20:05.8262913Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-25T02:20:05.8262987Z 217 │ │ }), 2026-10-25T02:20:05.8263172Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-25T02:20:05.8263326Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T02:20:05.8263427Z 220 │ │ yield* send(connection, { 2026-10-25T02:20:05.8263518Z 221 │ │ jsonrpc: "2.0", 2026-10-25T02:20:05.8263616Z 222 │ │ method: request.method, 2026-10-25T02:20:05.8263767Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T02:20:05.8263842Z 224 │ │ }); 2026-10-25T02:20:05.8263918Z 225 │ │ }), 2026-10-25T02:20:05.8264003Z 226 │ │ disconnect, 2026-10-25T02:20:05.8264108Z 227 │ │ dispose: Effect.suspend(() => 2026-10-25T02:20:05.8264200Z 228 │ │ Effect.forEach( 2026-10-25T02:20:05.8264300Z 229 │ │ [...connections.keys()], 2026-10-25T02:20:05.8264464Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-25T02:20:05.8264560Z 231 │ │ { discard: true }, 2026-10-25T02:20:05.8264635Z 232 │ │ ), 2026-10-25T02:20:05.8264707Z 233 │ │ ), 2026-10-25T02:20:05.8264778Z 234 │ │ }; 2026-10-25T02:20:05.8264900Z 235 │ ╰─▶ }); 2026-10-25T02:20:05.8265061Z ╰──── 2026-10-25T02:20:05.8265357Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-25T02:20:05.8265360Z 2026-10-25T02:20:05.8265565Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-25T02:20:05.8265700Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-25T02:20:05.8265750Z 21 │ 2026-10-25T02:20:05.8265902Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-25T02:20:05.8265987Z ·  ────────┬─────── 2026-10-25T02:20:05.8266131Z · ╰── 'summarizePayload' is declared here 2026-10-25T02:20:05.8266232Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-25T02:20:05.8266281Z ╰──── 2026-10-25T02:20:05.8266386Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8266391Z 2026-10-25T02:20:05.8266658Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T02:20:05.8266782Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-25T02:20:05.8266835Z 248 │ }, 2026-10-25T02:20:05.8266913Z 249 │ (effect, flow, stopSessions) => 2026-10-25T02:20:05.8267002Z ·  ──────┬───── 2026-10-25T02:20:05.8267144Z · ╰── 'stopSessions' is declared here 2026-10-25T02:20:05.8267207Z 250 │ effect.pipe( 2026-10-25T02:20:05.8267257Z ╰──── 2026-10-25T02:20:05.8267355Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8267363Z 2026-10-25T02:20:05.8267809Z ⚠ 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-25T02:20:05.8267925Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-25T02:20:05.8268014Z 128 │ const secret = "acp-summary-secret"; 2026-10-25T02:20:05.8268120Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-25T02:20:05.8268233Z ·  ────────────────────────── 2026-10-25T02:20:05.8268300Z 130 │ Schema.Struct({ 2026-10-25T02:20:05.8268348Z ╰──── 2026-10-25T02:20:05.8268351Z 2026-10-25T02:20:05.8268715Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.8268829Z ╭─[packages/effect-acp/src/client.ts:1270:11] 2026-10-25T02:20:05.8268976Z 1269 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-25T02:20:05.8269143Z 1270 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-25T02:20:05.8269243Z ·  ────────────────────────── 2026-10-25T02:20:05.8269384Z 1271 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-25T02:20:05.8269435Z ╰──── 2026-10-25T02:20:05.8269437Z 2026-10-25T02:20:05.8269709Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8269903Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-25T02:20:05.8269987Z 14 │ 2026-10-25T02:20:05.8270057Z 15 │ const legacyCredentials = { 2026-10-25T02:20:05.8270137Z ·  ────────┬──────── 2026-10-25T02:20:05.8270279Z · ╰── 'legacyCredentials' is declared here 2026-10-25T02:20:05.8270348Z 16 │ version: 1 as const, 2026-10-25T02:20:05.8270398Z ╰──── 2026-10-25T02:20:05.8270496Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8270499Z 2026-10-25T02:20:05.8270734Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-25T02:20:05.8270842Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-25T02:20:05.8270892Z 55 │ 2026-10-25T02:20:05.8270987Z 56 │ function normalizeTerminalContextSelection( 2026-10-25T02:20:05.8271099Z ·  ────────────────┬──────────────── 2026-10-25T02:20:05.8271286Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-25T02:20:05.8271371Z 57 │ selection: TerminalContextSelection, 2026-10-25T02:20:05.8271419Z ╰──── 2026-10-25T02:20:05.8271518Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8271520Z 2026-10-25T02:20:05.8271698Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T02:20:05.8271800Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-25T02:20:05.8271862Z 457 │ ): Array { 2026-10-25T02:20:05.8271963Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-25T02:20:05.8272061Z ·  ┬ 2026-10-25T02:20:05.8272206Z · ╰── '_' is declared here 2026-10-25T02:20:05.8272277Z 459 │ for (const b of data) { 2026-10-25T02:20:05.8272326Z ╰──── 2026-10-25T02:20:05.8272423Z  help: Consider removing this parameter. 2026-10-25T02:20:05.8272425Z 2026-10-25T02:20:05.8272870Z ⚠ 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-25T02:20:05.8272991Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-25T02:20:05.8273040Z 499 │ 2026-10-25T02:20:05.8273149Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-25T02:20:05.8273370Z ·  ────────────────────────── 2026-10-25T02:20:05.8273499Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-25T02:20:05.8273547Z ╰──── 2026-10-25T02:20:05.8273549Z 2026-10-25T02:20:05.8273797Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8273934Z ╭─[packages/provider-opencode/src/server/adapter.ts:3719:7] 2026-10-25T02:20:05.8273985Z 3718 │ 2026-10-25T02:20:05.8274176Z 3719 │ const layer: Layer.Layer = 2026-10-25T02:20:05.8274245Z ·  ──┬── 2026-10-25T02:20:05.8274367Z · ╰── 'layer' is declared here 2026-10-25T02:20:05.8274430Z 3720 │ Layer.effect( 2026-10-25T02:20:05.8274478Z ╰──── 2026-10-25T02:20:05.8274583Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8274588Z 2026-10-25T02:20:05.8274910Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.8275024Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-25T02:20:05.8275199Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-25T02:20:05.8275319Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-25T02:20:05.8275393Z ·  ───────── 2026-10-25T02:20:05.8275452Z 19 │ expect( 2026-10-25T02:20:05.8275501Z ╰──── 2026-10-25T02:20:05.8275504Z 2026-10-25T02:20:05.8275824Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-25T02:20:05.8275938Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-25T02:20:05.8275994Z 19 │ expect( 2026-10-25T02:20:05.8276155Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-25T02:20:05.8276224Z ·  ───────── 2026-10-25T02:20:05.8276284Z 21 │ ).toBe(true); 2026-10-25T02:20:05.8276332Z ╰──── 2026-10-25T02:20:05.8276335Z 2026-10-25T02:20:05.8276535Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T02:20:05.8276653Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-25T02:20:05.8276705Z 40 │ 2026-10-25T02:20:05.8276807Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-25T02:20:05.8276920Z ·  ─────── 2026-10-25T02:20:05.8277016Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-25T02:20:05.8277064Z ╰──── 2026-10-25T02:20:05.8277314Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T02:20:05.8277316Z 2026-10-25T02:20:05.8277477Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.8277619Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:373:47] 2026-10-25T02:20:05.8277749Z 372 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-25T02:20:05.8277898Z 373 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-25T02:20:05.8278053Z ·  ─────┬──── 2026-10-25T02:20:05.8278236Z · ╰── Cannot call impure function 2026-10-25T02:20:05.8278293Z 374 │ return ( 2026-10-25T02:20:05.8278343Z ╰──── 2026-10-25T02:20:05.8278610Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.8278895Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.8278899Z 2026-10-25T02:20:05.8279057Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.8279197Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:860:39] 2026-10-25T02:20:05.8279292Z 859 │ if (snoozeGateClock.thread !== thread) { 2026-10-25T02:20:05.8279417Z 860 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-25T02:20:05.8279519Z ·  ─────┬──── 2026-10-25T02:20:05.8279669Z · ╰── Cannot call impure function 2026-10-25T02:20:05.8279722Z 861 │ } 2026-10-25T02:20:05.8279773Z ╰──── 2026-10-25T02:20:05.8280036Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.8280322Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.8280325Z 2026-10-25T02:20:05.8280488Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.8280618Z ╭─[apps/web/src/components/CommandPalette.tsx:2048:20] 2026-10-25T02:20:05.8280773Z 2047 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-25T02:20:05.8280864Z 2048 │ createdAt: new Date().toISOString(), 2026-10-25T02:20:05.8280952Z ·  ─────┬──── 2026-10-25T02:20:05.8281090Z · ╰── Cannot call impure function 2026-10-25T02:20:05.8281192Z 2049 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-25T02:20:05.8281241Z ╰──── 2026-10-25T02:20:05.8281506Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T02:20:05.8281792Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.8281797Z 2026-10-25T02:20:05.8281991Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T02:20:05.8282107Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-25T02:20:05.8282171Z 37 │ get isConnected() { 2026-10-25T02:20:05.8282259Z 38 │ let current: FakeElement | null = this; 2026-10-25T02:20:05.8282329Z ·  ─────── 2026-10-25T02:20:05.8282397Z 39 │ while (current?.parent) { 2026-10-25T02:20:05.8282446Z ╰──── 2026-10-25T02:20:05.8282708Z  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-25T02:20:05.8282710Z 2026-10-25T02:20:05.8283030Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-25T02:20:05.8283204Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:57:9] 2026-10-25T02:20:05.8283257Z 56 │ ) { 2026-10-25T02:20:05.8283418Z 57 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-25T02:20:05.8283495Z ·  ──────┬────── 2026-10-25T02:20:05.8283628Z · ╰── 'useDragRegion' is declared here 2026-10-25T02:20:05.8283715Z 58 │ const isInline = props.mode === "inline"; 2026-10-25T02:20:05.8283764Z ╰──── 2026-10-25T02:20:05.8283865Z  help: Consider removing this declaration. 2026-10-25T02:20:05.8283867Z 2026-10-25T02:20:05.8284118Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T02:20:05.8284257Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-25T02:20:05.8284313Z 61 │ }, []); 2026-10-25T02:20:05.8284376Z 62 │ useEffect(() => { 2026-10-25T02:20:05.8284445Z ·  ────┬──── 2026-10-25T02:20:05.8284567Z · ╰── This is the containing effect 2026-10-25T02:20:05.8284709Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-25T02:20:05.8284827Z ·  ───────┬────── 2026-10-25T02:20:05.8285023Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T02:20:05.8285138Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-25T02:20:05.8285190Z ╰──── 2026-10-25T02:20:05.8285772Z  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-25T02:20:05.8286085Z  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-25T02:20:05.8286088Z 2026-10-25T02:20:05.8286248Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T02:20:05.8286394Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-25T02:20:05.8286572Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-25T02:20:05.8286702Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-25T02:20:05.8286817Z ·  ─────┬──── 2026-10-25T02:20:05.8286979Z · ╰── Cannot call impure function 2026-10-25T02:20:05.8287034Z 153 │ } 2026-10-25T02:20:05.8287084Z ╰──── 2026-10-25T02:20:05.8287357Z  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-25T02:20:05.8287639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T02:20:05.8287643Z 2026-10-25T02:20:05.8287876Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T02:20:05.8288048Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-25T02:20:05.8288151Z 271 │ {record.elements?.map((element, index) => ( 2026-10-25T02:20:05.8288310Z 272 │ 2026-10-25T02:20:05.8288456Z ·  ─────────────────────────────────────────────────────── 2026-10-25T02:20:05.8288530Z 273 │