GitHub check

256 KB of 597 KB loaded Download the full log (597 KB)
341 KB of earlier output not loaded
6-10-24T06:23:36.8254225Z      ยท                    โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ From this spread
 194 โ”‚         }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider using `Object.assign()` to mutate the accumulator instead.
  note: Using spreads within accumulators leads to `O(n^2)` time complexity.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
 453 โ”‚     showAuxiliaryPane("inspector");
 454 โ”‚   }, [environmentId, showAuxiliaryPane, threadId]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€                     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท             โ”‚                               โ•ฐโ”€โ”€ Unnecessary dependency `threadId`
     ยท             โ•ฐโ”€โ”€ Unnecessary dependency `environmentId`
 455 โ”‚   const {
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(static-components): Cannot create components during render
     โ•ญโ”€[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
 492 โ”‚   // same check.
 493 โ”‚   const NativeReviewDiffView = resolveNativeReviewDiffView();
     ยท                                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                             โ•ฐโ”€โ”€ The component is created during render here
 494 โ”‚   const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
 495 โ”‚   const showcasedReviewDrawRef = useRef<string | null>(null);
 496 โ”‚   const [isPullRefreshing, setIsPullRefreshing] = useState(false);
 497 โ”‚   const handlePullToRefresh = async () => {
 498 โ”‚     setIsPullRefreshing(true);
 499 โ”‚     await refreshSelectedSection();
 500 โ”‚     setIsPullRefreshing(false);
 501 โ”‚   };
 502 โ”‚   const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
 503 โ”‚   const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
 504 โ”‚   const fileVisibility = useReviewFileVisibility({
 505 โ”‚     threadKey: reviewCache.threadKey,
 506 โ”‚     sectionId: selectedSection?.id ?? null,
 507 โ”‚     files: reviewFiles,
 508 โ”‚     cachedExpandedFileIds: selectedSection?.id
 509 โ”‚       ? reviewCache.expandedFileIdsBySection[selectedSection.id]
 510 โ”‚       : undefined,
 511 โ”‚     cachedViewedFileIds: selectedSection?.id
 512 โ”‚       ? reviewCache.viewedFileIdsBySection[selectedSection.id]
 513 โ”‚       : undefined,
 514 โ”‚   });
 515 โ”‚   const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
 516 โ”‚   const commentSelection = useReviewCommentSelectionController({
 517 โ”‚     environmentId,
 518 โ”‚     threadId,
 519 โ”‚     selectedSection,
 520 โ”‚     nativeReviewDiffData,
 521 โ”‚   });
 522 โ”‚   const nativeBridge = useNativeReviewDiffBridge({
 523 โ”‚     threadKey: reviewCache.threadKey,
 524 โ”‚     sectionId: selectedSection?.id ?? null,
 525 โ”‚     diff: selectedSection?.diff,
 526 โ”‚     data: nativeReviewDiffData,
 527 โ”‚     collapsedFileIds,
 528 โ”‚     viewedFileIds,
 529 โ”‚     selectedRowIds: commentSelection.selectedRowIds,
 530 โ”‚     canHighlight: parsedDiff.kind === "files",
 531 โ”‚   });
 532 โ”‚   const showcaseReviewKey =
 533 โ”‚     SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
 534 โ”‚       ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
 535 โ”‚       : null;
 536 โ”‚   const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
 537 โ”‚     nativeBridge.onDebug(event);
 538 โ”‚     if (
 539 โ”‚       showcaseReviewKey === null ||
 540 โ”‚       showcasedReviewDrawRef.current === showcaseReviewKey ||
 541 โ”‚       !isNativeReviewDiffDrawEvent(event.nativeEvent)
 542 โ”‚     ) {
 543 โ”‚       return;
 544 โ”‚     }
 545 โ”‚     showcasedReviewDrawRef.current = showcaseReviewKey;
 546 โ”‚     reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
 547 โ”‚   };
 548 โ”‚
 549 โ”‚   const handleSelectFile = async (fileId: string | null) => {
 550 โ”‚     loadVisibleFile(fileId, true);
 551 โ”‚     commentSelection.clearSelection();
 552 โ”‚     if (fileId !== null && collapsedFileIds.includes(fileId)) {
 553 โ”‚       toggleExpandedFile(fileId);
 554 โ”‚     }
 555 โ”‚     const nativeView = nativeReviewDiffViewRef.current;
 556 โ”‚     if (!nativeView) return;
 557 โ”‚     const result = await settlePromise(() =>
 558 โ”‚       fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
 559 โ”‚     );
 560 โ”‚     if (AsyncResult.isFailure(result)) {
 561 โ”‚       console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
 562 โ”‚     }
 563 โ”‚   };
 564 โ”‚   const handleVisibleFileChange = (
 565 โ”‚     event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
 566 โ”‚   ) => {
 567 โ”‚     loadVisibleFile(event.nativeEvent.fileId ?? null);
 568 โ”‚     reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
 569 โ”‚   };
 570 โ”‚   const renderInspector = () => (
 571 โ”‚     <ReviewFileNavigator
 572 โ”‚       ref={reviewFileNavigatorRef}
 573 โ”‚       files={nativeReviewDiffData.files}
 574 โ”‚       headerInset={insets.top}
 575 โ”‚       sectionId={selectedSection?.id ?? null}
 576 โ”‚       onSelectFile={(fileId) => void handleSelectFile(fileId)}
 577 โ”‚     />
 578 โ”‚   );
 579 โ”‚
 580 โ”‚   const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
 581 โ”‚     const { fileId } = event.nativeEvent;
 582 โ”‚     if (fileId) {
 583 โ”‚       loadVisibleFile(fileId, true);
 584 โ”‚       toggleExpandedFile(fileId);
 585 โ”‚     }
 586 โ”‚   };
 587 โ”‚
 588 โ”‚   const handleNativeToggleViewedFile = (
 589 โ”‚     event: NativeSyntheticEvent<{ readonly fileId?: string }>,
 590 โ”‚   ) => {
 591 โ”‚     const { fileId } = event.nativeEvent;
 592 โ”‚     if (fileId) {
 593 โ”‚       toggleViewedFile(fileId);
 594 โ”‚     }
 595 โ”‚   };
 596 โ”‚
 597 โ”‚   const parsedDiffNotice =
 598 โ”‚     parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
 599 โ”‚   const hasCachedSelectedDiff = selectedSection?.diff != null;
 600 โ”‚   const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
 601 โ”‚   const sectionMenu = buildReviewSectionMenu(reviewSections);
 602 โ”‚   const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
 603 โ”‚     hasEnvironmentPresentation: environment.isReady,
 604 โ”‚     isEnvironmentConnected: isEnvironmentReady,
 605 โ”‚     hasCachedSelectedDiff,
 606 โ”‚     hasAnyCachedDiff,
 607 โ”‚   });
 608 โ”‚   const handleRetryEnvironment = () => {
 609 โ”‚     void retryEnvironment(environmentId);
 610 โ”‚   };
 611 โ”‚   const handleReturnToThread = () => {
 612 โ”‚     if (navigation.canGoBack()) {
 613 โ”‚       navigation.goBack();
 614 โ”‚       return;
 615 โ”‚     }
 616 โ”‚     navigation.navigate("Thread", {
 617 โ”‚       environmentId: String(environmentId),
 618 โ”‚       threadId: String(threadId),
 619 โ”‚     });
 620 โ”‚   };
 621 โ”‚   const androidHeaderSubtitle = [
 622 โ”‚     selectedSection?.title,
 623 โ”‚     headerDiffSummary.additions,
 624 โ”‚     headerDiffSummary.deletions,
 625 โ”‚   ]
 626 โ”‚     .filter((part): part is string => Boolean(part))
 627 โ”‚     .join(" ยท ");
 628 โ”‚
 629 โ”‚   const showChangedFilesPane =
 630 โ”‚     !showConnectionNotice &&
 631 โ”‚     selectedSection !== null &&
 632 โ”‚     parsedDiff.kind === "files" &&
 633 โ”‚     NativeReviewDiffView !== null;
 634 โ”‚   useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
 635 โ”‚   const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
 636 โ”‚
 637 โ”‚   const listHeader = (() => {
 638 โ”‚     const children: ReactElement[] = [];
 639 โ”‚
 640 โ”‚     if (error) {
 641 โ”‚       children.push(
 642 โ”‚         <View
 643 โ”‚           key="review-error"
 644 โ”‚           className={cn(
 645 โ”‚             "bg-card px-4 py-3",
 646 โ”‚             Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
 647 โ”‚           )}
 648 โ”‚         >
 649 โ”‚           <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
 650 โ”‚           <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
 651 โ”‚         </View>,
 652 โ”‚       );
 653 โ”‚     }
 654 โ”‚
 655 โ”‚     if (parsedDiffNotice) {
 656 โ”‚       children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
 657 โ”‚     }
 658 โ”‚
 659 โ”‚     if (children.length === 0) {
 660 โ”‚       return null;
 661 โ”‚     }
 662 โ”‚
 663 โ”‚     return <>{children}</>;
 664 โ”‚   })();
 665 โ”‚   const headerSubtitle = [
 666 โ”‚     headerDiffSummary.additions,
 667 โ”‚     headerDiffSummary.deletions,
 668 โ”‚     pendingReviewCommentCount > 0
 669 โ”‚       ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
 670 โ”‚       : null,
 671 โ”‚   ]
 672 โ”‚     .filter(Boolean)
 673 โ”‚     .join(" ยท ");
 674 โ”‚   const headerTitleText = selectedSection?.title ?? "Review changes";
 675 โ”‚
 676 โ”‚   return (
 677 โ”‚     <>
 678 โ”‚       <ReviewHeader
 679 โ”‚         environmentId={environmentId}
 680 โ”‚         threadId={threadId}
 681 โ”‚         title={headerTitleText}
 682 โ”‚         subtitle={headerSubtitle}
 683 โ”‚         androidSubtitle={androidHeaderSubtitle}
 684 โ”‚         iconColor={headerIcon}
 685 โ”‚         selectedThreadCwd={selectedThreadCwd}
 686 โ”‚         sectionMenu={sectionMenu}
 687 โ”‚         selectedSection={selectedSection}
 688 โ”‚         showSectionToolbar={showSectionToolbar}
 689 โ”‚         showChangedFilesToggle={showChangedFilesToggle}
 690 โ”‚         onRefresh={handlePullToRefresh}
 691 โ”‚         onSelectSection={selectSection}
 692 โ”‚         onReturnToThread={handleReturnToThread}
 693 โ”‚       />
 694 โ”‚
 695 โ”‚       <ScreenContent>
 696 โ”‚         <View className="flex-1 bg-sheet android:bg-sheet-solid">
 697 โ”‚           {showConnectionNotice ? (
 698 โ”‚             <View className="flex-1" style={{ paddingTop: topContentInset }}>
 699 โ”‚               <EnvironmentConnectionNotice
 700 โ”‚                 environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
 701 โ”‚                 connection={
 702 โ”‚                   environment.presentation?.connection ?? {
 703 โ”‚                     phase: "available",
 704 โ”‚                     error: null,
 705 โ”‚                     traceId: null,
 706 โ”‚                   }
 707 โ”‚                 }
 708 โ”‚                 resourceName="review"
 709 โ”‚                 onRetry={handleRetryEnvironment}
 710 โ”‚               />
 711 โ”‚             </View>
 712 โ”‚           ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
 713 โ”‚             <View
 714 โ”‚               className="flex-1"
 715 โ”‚               style={{
 716 โ”‚                 backgroundColor: nativeBridge.theme.background,
 717 โ”‚               }}
 718 โ”‚             >
 719 โ”‚               <View
 720 โ”‚                 className="min-w-0 flex-1"
 721 โ”‚                 style={listHeader ? { paddingTop: topContentInset } : undefined}
 722 โ”‚               >
 723 โ”‚                 {listHeader}
 724 โ”‚                 <View className="min-w-0 flex-1" collapsable={false}>
 725 โ”‚                   <NativeReviewDiffView
     ยท                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                              โ•ฐโ”€โ”€ This component is created during render
 726 โ”‚                     collapsable={false}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Components created during render will reset their state each time they are created. Declare components outside of render
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components

  โš  eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used.
    โ•ญโ”€[apps/server/src/checkpointing/Utils.ts:12:10]
 11 โ”‚
 12 โ”‚ function resolveThreadWorkspaceCwd(input: {
    ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                      โ•ฐโ”€โ”€ 'resolveThreadWorkspaceCwd' is declared here
 13 โ”‚   readonly thread: {
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  eslint(no-unused-vars): Identifier 'Fiber' is imported but never used.
    โ•ญโ”€[apps/server/src/ws.ts:10:13]
  9 โ”‚ import * as Effect from "effect/Effect";
 10 โ”‚ import * as Fiber from "effect/Fiber";
    ยท             โ”€โ”€โ”ฌโ”€โ”€
    ยท               โ•ฐโ”€โ”€ 'Fiber' is imported here
 11 โ”‚ import * as FileSystem from "effect/FileSystem";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'Schedule' is imported but never used.
    โ•ญโ”€[apps/server/src/ws.ts:17:13]
 16 โ”‚ import * as Ref from "effect/Ref";
 17 โ”‚ import * as Schedule from "effect/Schedule";
    ยท             โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท                 โ•ฐโ”€โ”€ 'Schedule' is imported here
 18 โ”‚ import * as Schema from "effect/Schema";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'.
      โ•ญโ”€[apps/server/src/ws.ts:1285:13]
 1284 โ”‚       const usageLimitSources = yield* UsageLimitSources.UsageLimitSources;
 1285 โ”‚       const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner;
      ยท             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                         โ•ฐโ”€โ”€ 'projectSetupScriptRunner' is declared here
 1286 โ”‚       const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker;
      โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
   โ•ญโ”€[packages/client-runtime/src/state/usageAccess.ts:3:8]
 2 โ”‚   AuthDiagnosticsReadScope,
 3 โ”‚   type AuthSessionState,
   ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
   ยท                โ•ฐโ”€โ”€ 'AuthSessionState' is imported here
 4 โ”‚   sessionGrantsScope,
   โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret.
     โ•ญโ”€[apps/server/src/vcs/GitVcsDriverCore.ts:509:11]
 508 โ”‚         GIT_DIAGNOSTIC_LINE_PATTERN.test(line) ||
 509 โ”‚         (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 510 โ”‚     )
     โ•ฐโ”€โ”€โ”€โ”€
  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`.

  โš  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.
     โ•ญโ”€[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
 520 โ”‚                 })).delivery;
 521 โ”‚ โ•ญโ”€โ–ถ             while (delivery.outcome === "accepted") {
 522 โ”‚ โ”‚                 yield* Effect.yieldNow;
 523 โ”‚ โ”‚                 delivery = (yield* service.getWebhookDelivery({
 524 โ”‚ โ”‚                   id: task.id,
 525 โ”‚ โ”‚                   deliveryId: deliveryId!,
 526 โ”‚ โ”‚                 })).delivery;
 527 โ”‚ โ•ฐโ”€โ–ถ             }
 528 โ”‚                 assert.equal(delivery.outcome, "dispatch_failed");
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
 55 โ”‚
 56 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 57 โ”‚     scheduler.reset();
 58 โ”‚     highlightedRowIdsRef.current = new Set();
 59 โ”‚     visibleChunkIndexRef.current = 0;
 60 โ”‚     setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 61 โ”‚     setTokensPatchJson(createEmptyTokenPatch(resetKey));
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
 62 โ”‚     return () => scheduler.cancel();
 63 โ”‚   }, [enabled, resetKey, rows.length, scheduler]);
    ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€            โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท          โ”‚                    โ•ฐโ”€โ”€ Unnecessary dependency `rows.length`
    ยท          โ•ฐโ”€โ”€ Unnecessary dependency `enabled`
 64 โ”‚
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
    โ•ญโ”€[apps/server/src/scheduledTasks/Schedule.ts:79:10]
 78 โ”‚
 79 โ”‚ function describeSchedule(schedule: ScheduledTaskSchedule): string {
    ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                  โ•ฐโ”€โ”€ 'describeSchedule' is declared here
 80 โ”‚   if (schedule.type === "webhook") return "On webhook";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  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.
      โ•ญโ”€[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34]
 1785 โ”‚           const stat = branch.files!.find((file) => file.path === path)!;
 1786 โ”‚           const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({
      ยท                                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1787 โ”‚             cwd,
      โ•ฐโ”€โ”€โ”€โ”€

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
 100 โ”‚
 101 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 102 โ”‚     if (!target || selectedLines.length === 0) {
 103 โ”‚       setHighlightedLinesById({});
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 104 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
 104 โ”‚
 105 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 106 โ”‚     clearReviewCommentTarget();
 107 โ”‚     setPendingNativeCommentSelection(null);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 108 โ”‚   }, [selectedSection?.id]);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
 109 โ”‚
 110 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 111 โ”‚     if (activeCommentTarget === null) {
 112 โ”‚       setPendingNativeCommentSelection(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 113 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
 107 โ”‚     setPendingNativeCommentSelection(null);
 108 โ”‚   }, [selectedSection?.id]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Unnecessary dependency `selectedSection?.id`
 109 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(purity): Cannot call impure function during render
      โ•ญโ”€[apps/web/src/components/CommandPalette.tsx:1996:20]
 1995 โ”‚         title: inferProjectTitleFromPath(destinationPath),
 1996 โ”‚         createdAt: new Date().toISOString(),
      ยท                    โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท                         โ•ฐโ”€โ”€ Cannot call impure function
 1997 โ”‚         remoteUrl: addProjectCloneFlow.remoteUrl,
      โ•ฐโ”€โ”€โ”€โ”€
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
 222 โ”‚               ? snippetTokens.map((line, lineIndex) => (
 223 โ”‚                   <NativeText key={lineIndex}>
     ยท                               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 224 โ”‚                     {lineIndex > 0 ? "\n" : ""}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
 226 โ”‚                       <NativeText
 227 โ”‚                         key={tokenIndex}
     ยท                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 228 โ”‚                         style={{
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  eslint(no-empty-pattern): Empty object binding pattern
     โ•ญโ”€[apps/server/src/processRunner.test.ts:266:14]
 265 โ”‚
 266 โ”‚   for (const {} of ["timeout", "success"] as const) {
     ยท              โ”€โ”€
 267 โ”‚   }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  โš  eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used.
     โ•ญโ”€[packages/client-runtime/src/work-log/presentation.ts:234:10]
 233 โ”‚
 234 โ”‚ function nonEmptyString(value: unknown): string | null {
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ 'nonEmptyString' is declared here
 235 โ”‚   return typeof value === "string" && value.trim().length > 0 ? value : null;
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
     โ•ญโ”€[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19]
 472 โ”‚   onFilters,
 473 โ”‚   authorOptions = [],
     ยท                   โ”€โ”€
 474 โ”‚   labelOptions = [],
     โ•ฐโ”€โ”€โ”€โ”€
  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.

  โš  react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
     โ•ญโ”€[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18]
 473 โ”‚   authorOptions = [],
 474 โ”‚   labelOptions = [],
     ยท                  โ”€โ”€
 475 โ”‚   optionScope,
     โ•ฐโ”€โ”€โ”€โ”€
  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.

  โš  react(capitalized-calls): Capitalized function called without JSX
   โ•ญโ”€[apps/mobile/src/lib/useHoverGesture.ts:8:15]
 7 โ”‚     () =>
 8 โ”‚       Gesture.Hover()
   ยท               โ”€โ”€โ”ฌโ”€โ”€
   ยท                 โ•ฐโ”€โ”€ `Hover` may be a component
 9 โ”‚         .manualActivation(true)
   โ•ฐโ”€โ”€โ”€โ”€
  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
  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

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
    โ•ญโ”€[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15]
 87 โ”‚             <li
 88 โ”‚               key={`${index}:${check.name}`}
    ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 89 โ”‚               className="col-span-full grid grid-cols-subgrid items-center text-xs"
    โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     โ•ญโ”€[apps/mobile/src/lib/markdownDocument.ts:259:28]
 258 โ”‚   visit(parser.parse(markdown), false, false);
 259 โ”‚   for (const edit of edits.reverse())
     ยท                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 260 โ”‚     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     โ•ญโ”€[apps/mobile/src/lib/markdownDocument.ts:290:28]
 289 โ”‚   visit(parser.parse(markdown));
 290 โ”‚   for (const edit of edits.reverse())
     ยท                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 291 โ”‚     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     โ•ญโ”€[apps/mobile/src/lib/markdownDocument.ts:344:38]
 343 โ”‚   visit(parser.parse(markdown));
 344 โ”‚   for (const lineStart of lineStarts.reverse()) {
     ยท                                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 345 โ”‚     // The header row may be a lazy line without its container markers (`>` or list indent),
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
     โ•ญโ”€[packages/provider-grok/src/server/adapter.ts:408:7]
 407 โ”‚
 408 โ”‚ const layer: Layer.Layer<
     ยท       โ”€โ”€โ”ฌโ”€โ”€
     ยท         โ•ฐโ”€โ”€ 'layer' is declared here
 409 โ”‚   ProviderAdapter.ProviderAdapterV2,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
     โ•ญโ”€[packages/client-runtime/src/operations/projects.ts:228:51]
 227 โ”‚ ): string {
 228 โ”‚   const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
     ยท                                                   โ”€โ”€โ”€โ”€โ”€โ”€
 229 โ”‚   return target.owner ? `${target.owner}/${folderName}` : folderName;
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.

  โš  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.
     โ•ญโ”€[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
 222 โ”‚         let idlePasses = 0;
 223 โ”‚ โ•ญโ”€โ–ถ     for (;;) {
 224 โ”‚ โ”‚         yield* Effect.promise(() => Promise.resolve());
 225 โ”‚ โ”‚         const pending = backgroundRuntime.pending.shift();
 226 โ”‚ โ”‚         if (!pending) {
 227 โ”‚ โ”‚           idlePasses++;
 228 โ”‚ โ”‚           if (idlePasses >= 3) {
 229 โ”‚ โ”‚             return;
 230 โ”‚ โ”‚           }
 231 โ”‚ โ”‚           continue;
 232 โ”‚ โ”‚         }
 233 โ”‚ โ”‚         idlePasses = 0;
 234 โ”‚ โ”‚         const exit = yield* Effect.exit(
 235 โ”‚ โ”‚           pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
 236 โ”‚ โ”‚         );
 237 โ”‚ โ”‚         yield* Effect.sync(() => {
 238 โ”‚ โ”‚           pending.resolve(exit);
 239 โ”‚ โ”‚         });
 240 โ”‚ โ•ฐโ”€โ–ถ     }
 241 โ”‚       },
     โ•ฐโ”€โ”€โ”€โ”€

  โš  eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used.
      โ•ญโ”€[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10]
 1619 โ”‚
 1620 โ”‚ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean {
      ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                            โ•ฐโ”€โ”€ 'promptResponseHasMissingXAiStopReason' is declared here
 1621 โ”‚   const meta = response._meta;
      โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5]
 398 โ”‚
 399 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 400 โ”‚     setInspectorSelection((current) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 401 โ”‚       if (props.renderInspector === undefined) {
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(no-unstable-nested-components): Do not define components during render.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24]
 527 โ”‚       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
 528 โ”‚ โ•ญโ”€โ–ถ   const GitInspector = () => (
 529 โ”‚ โ”‚       <GitOverviewSheet
 530 โ”‚ โ”‚         headerInset={inspectorHeaderInset}
 531 โ”‚ โ”‚         presentation="inspector"
 532 โ”‚ โ”‚         route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
 533 โ”‚ โ”‚       />
 534 โ”‚ โ•ฐโ”€โ–ถ   );
 535 โ”‚       const FilesInspector = () =>
     โ•ฐโ”€โ”€โ”€โ”€
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  โš  react(no-unstable-nested-components): Do not define components during render.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26]
 534 โ”‚       );
 535 โ”‚ โ•ญโ”€โ–ถ   const FilesInspector = () =>
 536 โ”‚ โ”‚       selectedThread !== null && selectedThreadCwd !== null ? (
 537 โ”‚ โ”‚         <ThreadFileNavigatorPane
 538 โ”‚ โ”‚           cwd={selectedThreadCwd}
 539 โ”‚ โ”‚           environmentId={selectedThread.environmentId}
 540 โ”‚ โ”‚           headerInset={inspectorHeaderInset}
 541 โ”‚ โ”‚           projectName={selectedThreadProject?.title ?? "Files"}
 542 โ”‚ โ”‚           selectedPath={null}
 543 โ”‚ โ”‚           onSelectFile={handleSelectInspectorFile}
 544 โ”‚ โ”‚         />
 545 โ”‚ โ•ฐโ”€โ–ถ     ) : null;
 546 โ”‚       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  โš  eslint(no-unused-vars): Type 'Scope' is imported but never used.
    โ•ญโ”€[apps/server/src/provider/ProviderAuthService.ts:15:18]
 14 โ”‚ import * as Layer from "effect/Layer";
 15 โ”‚ import type * as Scope from "effect/Scope";
    ยท                  โ”€โ”€โ”ฌโ”€โ”€
    ยท                    โ•ฐโ”€โ”€ 'Scope' is imported here
 16 โ”‚ import * as Stream from "effect/Stream";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40]
 28 โ”‚   const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live);
 29 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 30 โ”‚     if (snapshot && snapshot !== live) setHeld({ key, snapshot });
    ยท                                        โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท                                           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 31 โ”‚   }, [key, live, snapshot]);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
 112 โ”‚   const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
 113 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 114 โ”‚     if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
 115 โ”‚       return;
 116 โ”‚     }
 117 โ”‚     setEntry({ key: input.targetKey, location: candidate });
     ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท         โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 118 โ”‚   }, [candidate, entry.key, entry.location, input.targetKey]);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
    โ•ญโ”€[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
 71 โ”‚             <Pressable
 72 โ”‚               key={index}
    ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 73 โ”‚               accessibilityRole="button"
    โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7]
 248 โ”‚       mountedRef.current = false;
 249 โ”‚       flow.setBranchQuery("");
     ยท       โ”€โ”€โ”ฌโ”€
     ยท         โ•ฐโ”€โ”€ Missing dependency `flow`
 250 โ”‚     };
 251 โ”‚   }, [flow.setBranchQuery]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
 252 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
     โ•ญโ”€[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9]
 264 โ”‚ ): boolean {
 265 โ”‚   const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 266 โ”‚   const holds = (label: string) => labels.includes(label.trim().toLowerCase());
     โ•ฐโ”€โ”€โ”€โ”€
  help: Switch to `Set`

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
 434 โ”‚       : null;
 435 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 436 โ”‚     if (
 437 โ”‚       props.active === false ||
 438 โ”‚       activeDraftKey !== null ||
 439 โ”‚       editingPendingTask !== null ||
 440 โ”‚       selectedProject === null
 441 โ”‚     ) {
 442 โ”‚       return;
 443 โ”‚     }
 444 โ”‚     setActiveDraftKey(
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 445 โ”‚       createNewTaskDraft({
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
      โ•ญโ”€[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
 1243 โ”‚     <ActiveNewTaskContext value={activeNewTask}>
 1244 โ”‚       <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
      ยท                                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1245 โ”‚     </ActiveNewTaskContext>
      โ•ฐโ”€โ”€โ”€โ”€
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
 638 โ”‚
 639 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 640 โ”‚     if (pendingLaunchEntry.key === launchTargetKey) {
 641 โ”‚       return;
 642 โ”‚     }
 643 โ”‚     setPendingLaunchEntry({
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 644 โ”‚       key: launchTargetKey,
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
 648 โ”‚
 649 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 650 โ”‚     if (initialAttachGridEntry.key === launchTargetKey) {
 651 โ”‚       return;
 652 โ”‚     }
 653 โ”‚     setInitialAttachGridEntry({
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 654 โ”‚       key: launchTargetKey,
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
 743 โ”‚
 744 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 745 โ”‚     if (!routeEnvironmentId || !routeThreadId) {
 746 โ”‚       setLastGridSize({
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 747 โ”‚         cols: DEFAULT_TERMINAL_COLS,
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
 537 โ”‚     });
 538 โ”‚   }, [terminal.buffer, terminal.buffer.length, terminalKey]);
     ยท                        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                   โ•ฐโ”€โ”€ Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
 539 โ”‚   const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
 708 โ”‚     sentInitialInputKeyRef.current = null;
 709 โ”‚   }, [terminalKey]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Unnecessary dependency `terminalKey`
 710 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
 799 โ”‚     };
 800 โ”‚   }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
     ยท                                                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                                                                โ”‚                   โ•ฐโ”€โ”€ Unnecessary dependency `terminalKey`
     ยท                                                                โ•ฐโ”€โ”€ Unnecessary dependency `terminal.lifecycleVersion`
 801 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
 792 โ”‚   }
 793 โ”‚   const pasteSession = pasteSessionRef.current;
     ยท                        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                   โ•ฐโ”€โ”€ Cannot access ref value during render
 794 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7]
 772 โ”‚     if (settingsSheetPresentation.isActive) {
 773 โ”‚       settingsRoutePresentation.present(settingsRouteSession);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ Missing dependency `settingsRoutePresentation`
 774 โ”‚     }
 775 โ”‚   }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
 776 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5]
 387 โ”‚     typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
 388 โ”‚   const animatedBorderRadius = useSharedValue(targetBorderRadius);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ `animatedBorderRadius` originates here
 389 โ”‚   const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
 390 โ”‚   useLayoutEffect(() => {
 391 โ”‚     animatedBorderRadius.value = shouldAnimate
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `animatedBorderRadius` cannot be modified
 392 โ”‚       ? withTiming(targetBorderRadius, {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:131:9]
 130 โ”‚           ) {
 131 โ”‚ โ•ญโ”€โ–ถ         for (let attempt = 0; attempt < 100; attempt += 1) {
 132 โ”‚ โ”‚             if (subscriptions.length >= count) {
 133 โ”‚ โ”‚               return;
 134 โ”‚ โ”‚             }
 135 โ”‚ โ”‚             yield* Effect.yieldNow;
 136 โ”‚ โ•ฐโ”€โ–ถ         }
 137 โ”‚             return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`));
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:252:7]
 251 โ”‚           yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient)));
 252 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) {
 253 โ”‚ โ”‚           yield* Effect.yieldNow;
 254 โ”‚ โ•ฐโ”€โ–ถ       }
 255 โ”‚           yield* SubscriptionRef.set(activeSession, Option.none());
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:258:7]
 257 โ”‚
 258 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
 259 โ”‚ โ”‚           yield* Effect.yieldNow;
 260 โ”‚ โ•ฐโ”€โ–ถ       }
 261 โ”‚           yield* Fiber.interrupt(subscriptionFiber);
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:322:7]
 321 โ”‚           );
 322 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
 323 โ”‚ โ”‚           yield* Effect.yieldNow;
 324 โ”‚ โ•ฐโ”€โ–ถ       }
 325 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:330:7]
 329 โ”‚           yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
 330 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
 331 โ”‚ โ”‚           yield* Effect.yieldNow;
 332 โ”‚ โ•ฐโ”€โ–ถ       }
 333 โ”‚           yield* Fiber.interrupt(subscriptionFiber);
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(static-components): Cannot create components during render
     โ•ญโ”€[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
 196 โ”‚   const { onInput, onResize } = props;
 197 โ”‚   const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
     ยท                                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                                     โ•ฐโ”€โ”€ The component is created during render here
 198 โ”‚   const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
 199 โ”‚
 200 โ”‚   useEffect(() => {
 201 โ”‚     terminalDebugLog("native:surface", {
 202 โ”‚       terminalKey: props.terminalKey,
 203 โ”‚       native: hasNativeSurface,
 204 โ”‚       hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
 205 โ”‚       bufferLen: props.buffer.length,
 206 โ”‚       isRunning: props.isRunning,
 207 โ”‚     });
 208 โ”‚   }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
 209 โ”‚   const handleNativeInput = useCallback(
 210 โ”‚     (event: NativeSyntheticEvent<TerminalInputEvent>) => {
 211 โ”‚       if (!props.isRunning || props.readOnly) {
 212 โ”‚         return;
 213 โ”‚       }
 214 โ”‚       terminalDebugLog("native:onInput", {
 215 โ”‚         codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
 216 โ”‚       });
 217 โ”‚       onInput(event.nativeEvent.data);
 218 โ”‚     },
 219 โ”‚     [onInput, props.isRunning, props.readOnly],
 220 โ”‚   );
 221 โ”‚   const handleNativeResize = useCallback(
 222 โ”‚     (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
 223 โ”‚       onResize({
 224 โ”‚         cols: event.nativeEvent.cols,
 225 โ”‚         rows: event.nativeEvent.rows,
 226 โ”‚       });
 227 โ”‚     },
 228 โ”‚     [onResize],
 229 โ”‚   );
 230 โ”‚
 231 โ”‚   if (NativeTerminalSurfaceView) {
 232 โ”‚     return (
 233 โ”‚       <View style={props.style}>
 234 โ”‚         <NativeTerminalSurfaceView
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                      โ•ฐโ”€โ”€ This component is created during render
 235 โ”‚           appearanceScheme={themeAppearance}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Components created during render will reset their state each time they are created. Declare components outside of render
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/session.test.ts:226:3]
 225 โ”‚     ) {
 226 โ”‚ โ•ญโ”€โ–ถ   for (let attempt = 0; attempt < 100; attempt += 1) {
 227 โ”‚ โ”‚       const socket = sockets[index];
 228 โ”‚ โ”‚       if (socket) {
 229 โ”‚ โ”‚         return socket;
 230 โ”‚ โ”‚       }
 231 โ”‚ โ”‚       yield* Effect.yieldNow;
 232 โ”‚ โ•ฐโ”€โ–ถ   }
 233 โ”‚       return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/rpc/session.test.ts:240:3]
 239 โ”‚     ) {
 240 โ”‚ โ•ญโ”€โ–ถ   for (let attempt = 0; attempt < 100; attempt += 1) {
 241 โ”‚ โ”‚       const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
 242 โ”‚ โ”‚       if (request) {
 243 โ”‚ โ”‚         return request;
 244 โ”‚ โ”‚       }
 245 โ”‚ โ”‚       yield* Effect.yieldNow;
 246 โ”‚ โ•ฐโ”€โ–ถ   }
 247 โ”‚       return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(capitalized-calls): Capitalized function called without JSX
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27]
 601 โ”‚   const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
 602 โ”‚   const gesture = Gesture.Pan()
     ยท                           โ”€โ”ฌโ”€
     ยท                            โ•ฐโ”€โ”€ `Pan` may be a component
 603 โ”‚     .enabled(!props.disabled)
     โ•ฐโ”€โ”€โ”€โ”€
  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
  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

  โš  react(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76]
 696 โ”‚   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
 697 โ”‚   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
     ยท                                                                            โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                                                 โ•ฐโ”€โ”€ Cannot call impure function
 698 โ”‚   const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  โš  react(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71]
 717 โ”‚   const snoozePresets = useMemo(
 718 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
     ยท                                                                       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                                            โ•ฐโ”€โ”€ Cannot call impure function
 719 โ”‚     [props.snoozePresetMinute, swipeActions.secondary],
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6]
 718 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
 719 โ”‚     [props.snoozePresetMinute, swipeActions.secondary],
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.snoozePresetMinute`
 720 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7]
 764 โ”‚       thread.pinnedAt,
 765 โ”‚       variant,
     ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท          โ•ฐโ”€โ”€ Unnecessary dependency `variant`
 766 โ”‚     ],
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
      โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21]
 1214 โ”‚             {providerDrivers.slice(0, -1).map((driver, index) => (
 1215 โ”‚               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
      ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1216 โ”‚                 <ProviderIcon provider={driver} size={12} />
      โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
     โ•ญโ”€[apps/server/src/provider/AntigravityAuth.ts:285:20]
 284 โ”‚     },
 285 โ”‚     (effect, flow, stopSessions) =>
     ยท                    โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                          โ•ฐโ”€โ”€ 'stopSessions' is declared here
 286 โ”‚       effect.pipe(
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this parameter.

  โš  eslint(no-empty-pattern): Empty object binding pattern
     โ•ญโ”€[apps/server/src/process/externalLauncher.test.ts:186:12]
 185 โ”‚
 186 โ”‚ for (const {} of ["darwin", "linux"] as const) {
     ยท            โ”€โ”€
 187 โ”‚ }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  โš  eslint(no-empty-pattern): Empty object binding pattern
     โ•ญโ”€[apps/server/src/process/externalLauncher.test.ts:189:12]
 188 โ”‚
 189 โ”‚ for (const {} of [
     ยท            โ”€โ”€
 190 โ”‚   { kind: "browser", folderVerb: "none" },
     โ•ฐโ”€โ”€โ”€โ”€
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  โš  eslint(no-empty-pattern): Empty object binding pattern
     โ•ญโ”€[apps/server/src/process/externalLauncher.test.ts:311:12]
 310 โ”‚
 311 โ”‚ for (const {} of ["rejected", "spawn-error", "stalled"] as const) {
     ยท            โ”€โ”€
 312 โ”‚ }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  โš  eslint(no-empty-pattern): Empty object binding pattern
     โ•ญโ”€[apps/server/src/process/externalLauncher.test.ts:314:12]
 313 โ”‚
 314 โ”‚ for (const {} of [
     ยท            โ”€โ”€
 315 โ”‚   {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  โš  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.
     โ•ญโ”€[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20]
 262 โ”‚       ...(update._meta !== undefined
 263 โ”‚         ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null }
     ยท                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 264 โ”‚         : {}),
     โ•ฐโ”€โ”€โ”€โ”€

  โš  eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
    โ•ญโ”€[infra/relay/src/http/Api.ts:69:13]
 68 โ”‚ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
 69 โ”‚ import * as HookForwarder from "../hooks/HookForwarder.ts";
    ยท             โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท                   โ•ฐโ”€โ”€ 'HookForwarder' is imported here
 70 โ”‚ import * as HeldHooks from "../hooks/HeldHooks.ts";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  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.
     โ•ญโ”€[packages/client-runtime/src/connection/supervisor.test.ts:135:3]
 134 โ”‚       let lastState = yield* SubscriptionRef.get(state);
 135 โ”‚ โ•ญโ”€โ–ถ   for (let iteration = 0; iteration < 100; iteration += 1) {
 136 โ”‚ โ”‚       lastState = yield* SubscriptionRef.get(state);
 137 โ”‚ โ”‚       if (predicate(lastState)) {
 138 โ”‚ โ”‚         return lastState;
 139 โ”‚ โ”‚       }
 140 โ”‚ โ”‚       yield* Effect.yieldNow;
 141 โ”‚ โ•ฐโ”€โ–ถ   }
 142 โ”‚       return yield* Effect.die(
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17]
 813 โ”‚               <div
 814 โ”‚                 key={`${index}:${check.name}:${check.url ?? ""}`}
     ยท                 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 815 โ”‚                 className="group flex items-center gap-2 rounded-md pr-1 hover:bg-accent/60"
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5]
 2137 โ”‚   );
 2138 โ”‚   useEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท       โ•ฐโ”€โ”€ This is the containing effect
 2139 โ”‚     setExpandedVideo(null);
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 2140 โ”‚     setExpandedFile(null);
      โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10]
 65 โ”‚ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
 66 โ”‚ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
    ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                     โ•ฐโ”€โ”€ 'isMarkdownFileLinkLabel' is imported here
 67 โ”‚ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3]
 91 โ”‚ import {
 92 โ”‚   createContext,
    ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ 'createContext' is imported here
 93 โ”‚   memo,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3]
 107 โ”‚ import {
 108 โ”‚   ActivityIndicator,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ 'ActivityIndicator' is imported here
 109 โ”‚   Image,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3]
 114 โ”‚   Pressable,
 115 โ”‚   ScrollView,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท        โ•ฐโ”€โ”€ 'ScrollView' is imported here
 116 โ”‚   StyleSheet,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11]
 116 โ”‚   StyleSheet,
 117 โ”‚   Text as NativeText,
     ยท           โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ 'NativeText' is imported here
 118 โ”‚   type ColorValue,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10]
 139 โ”‚ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
 140 โ”‚ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'tryOpenExternalUrl' is imported here
 141 โ”‚ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10]
 142 โ”‚ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
 143 โ”‚ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'faviconUrlForOrigin' is imported here
 144 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10]
 156 โ”‚ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
 157 โ”‚ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ 'MediaVideoPlayer' is imported here
 158 โ”‚ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3]
 160 โ”‚   attachmentVideoPreviewSource,
 161 โ”‚   mediaVideoPreviewUri,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ 'mediaVideoPreviewUri' is imported here
 162 โ”‚   mediaVideoThumbnailKey,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3]
 161 โ”‚   mediaVideoPreviewUri,
 162 โ”‚   mediaVideoThumbnailKey,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'mediaVideoThumbnailKey' is imported here
 163 โ”‚   type MediaVideoPreviewSource,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8]
 162 โ”‚   mediaVideoThumbnailKey,
 163 โ”‚   type MediaVideoPreviewSource,
     ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'MediaVideoPreviewSource' is imported here
 164 โ”‚ } from "../../lib/videoPreviewSource";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15]
 170 โ”‚ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
 171 โ”‚ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
     ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                      โ•ฐโ”€โ”€ 'ReviewDiffTheme' is imported here
 172 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3]
 185 โ”‚ import {
 186 โ”‚   resolveMarkdownFontSizes,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ 'resolveMarkdownFontSizes' is imported here
 187 โ”‚   resolveNativeMarkdownTypography,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10]
 190 โ”‚ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
 191 โ”‚ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ 'markdownLinkIconSource' is imported here
 192 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3]
 193 โ”‚   normalizeNativeMarkdownUrl,
 194 โ”‚   resolveMarkdownInlineCodePresentation,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ 'resolveMarkdownInlineCodePresentation' is imported here
 195 โ”‚   resolveMarkdownLinkIcon,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3]
 194 โ”‚   resolveMarkdownInlineCodePresentation,
 195 โ”‚   resolveMarkdownLinkIcon,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'resolveMarkdownLinkIcon' is imported here
 196 โ”‚   resolveMarkdownLinkPresentation,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10]
 233 โ”‚ import { ThreadMcpApp } from "./McpAppWebView";
 234 โ”‚ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                      โ•ฐโ”€โ”€ 'useMarkdownCodeHighlight' is imported here
 235 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3]
 237 โ”‚   useAssetUrl,
 238 โ”‚   useAssetUrlState,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ 'useAssetUrlState' is imported here
 239 โ”‚   useRefreshAssetUrl,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7]
 2140 โ”‚     setExpandedFile(null);
 2141 โ”‚   }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                โ”‚                  โ”‚                       โ•ฐโ”€โ”€ Unnecessary dependency `props.contentPresentation.kind`
      ยท                โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `props.threadId`
      ยท                โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
 2142 โ”‚   const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7]
 2608 โ”‚     reportHeaderMaterialVisibility(false);
 2609 โ”‚   }, [feedThreadKey, reportHeaderMaterialVisibility]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `feedThreadKey`
 2610 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7]
 2624 โ”‚     }
 2625 โ”‚   }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `listMountKey`
 2626 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7]
 2781 โ”‚     }
 2782 โ”‚   }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท              โ”‚                  โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkRows`
      ยท              โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkGroups`
      ยท              โ•ฐโ”€โ”€ Unnecessary dependency `expandedTurnIds`
 2783 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9]
 612 โ”‚       };
 613 โ”‚     }, [props.environmentId, attachment.id, httpBaseUrl]),
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                  โ”‚                 โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `httpBaseUrl`
     ยท                  โ”‚                 โ•ฐโ”€โ”€ Unnecessary dependency `attachment.id`
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
 614 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
 211 โ”‚   };
 212 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 213 โ”‚     const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
 214 โ”‚     if (inserted) {
 215 โ”‚       setSelection((current) =>
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 216 โ”‚         current.start === inserted.start && current.end === inserted.end ? current : inserted,
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
 284 โ”‚   }, [hasWorkspaceSnapshot]);
 285 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 286 โ”‚     if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
 287 โ”‚     const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
 288 โ”‚     const now = Date.now();
 289 โ”‚     const lastRequest = workspaceRefreshKeyRef.current;
 290 โ”‚     if (
 291 โ”‚       lastRequest?.key === key &&
 292 โ”‚       now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
 293 โ”‚     )
 294 โ”‚       return;
 295 โ”‚     if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
 296 โ”‚       setWorkspaceRefreshRetry(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 297 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
 325 โ”‚   }, [
 326 โ”‚     draftMessage,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ Unnecessary dependency `draftMessage`
 327 โ”‚     environmentId,
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  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.
     โ•ญโ”€[packages/shared/src/atomicWrite.test.ts:139:5]
 138 โ”‚       Effect.gen(function* () {
 139 โ”‚ โ•ญโ”€โ–ถ     while (fiber.pollUnsafe() === undefined) {
 140 โ”‚ โ”‚         yield* TestClock.adjust("100 millis");
 141 โ”‚ โ”‚         // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock
 142 โ”‚ โ”‚         yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve)));
 143 โ”‚ โ•ฐโ”€โ–ถ     }
 144 โ”‚         return yield* Fiber.join(fiber);
     โ•ฐโ”€โ”€โ”€โ”€

  โš  eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
     โ•ญโ”€[apps/server/src/serverRuntimeStartup.ts:728:7]
 727 โ”‚
 728 โ”‚ const layer = layerWithOptions();
     ยท       โ”€โ”€โ”ฌโ”€โ”€
     ยท         โ•ฐโ”€โ”€ 'layer' is declared here
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
 150 โ”‚
 151 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 152 โ”‚     if (!controlledSelectedPath) {
 153 โ”‚       return;
 154 โ”‚     }
 155 โ”‚     setExpandedPaths((current) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 156 โ”‚       const ancestors = ancestorPaths(controlledSelectedPath);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  eslint(no-unused-vars): Parameter '_' is declared but never used.
     โ•ญโ”€[packages/shared/src/qrCode.ts:458:44]
 457 โ”‚   ): Array<byte> {
 458 โ”‚     let result: Array<byte> = divisor.map((_) => 0);
     ยท                                            โ”ฌ
     ยท                                            โ•ฐโ”€โ”€ '_' is declared here
 459 โ”‚     for (const b of data) {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this parameter.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
 256 โ”‚     return () => cancelAnimationFrame(frame);
 257 โ”‚   }, [props.path, targetIndex]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Unnecessary dependency `props.path`
 258 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
 292 โ”‚                     <SourceText
 293 โ”‚                       key={`${index}:${tokenIndex}`}
     ยท                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 294 โ”‚                       style={{
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
 308 โ”‚             return (
 309 โ”‚               <SourceText key={index}>
     ยท                           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 310 โ”‚                 {body}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  eslint(no-empty-pattern): Empty object binding pattern
     โ•ญโ”€[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14]
 465 โ”‚
 466 โ”‚   for (const {} of ["direct", "wrapper"] as const) {
     ยท              โ”€โ”€
 467 โ”‚   }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
 118 โ”‚
 119 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 120 โ”‚     if (orientationSettled) return;
 121 โ”‚     const orientation = getNativeShowcaseOrientation();
 122 โ”‚     if (orientation === null) {
 123 โ”‚       setOrientationSettled(true);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 124 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
 292 โ”‚
 293 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 294 โ”‚     if (
 295 โ”‚       scene === null ||
 296 โ”‚       requestedScene === null ||
 297 โ”‚       scene !== requestedScene ||
 298 โ”‚       !hasFixture ||
 299 โ”‚       !orientationSettled ||
 300 โ”‚       !themeApplied ||
 301 โ”‚       (scene === "agent-activity" && !agentActivityStaged) ||
 302 โ”‚       !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
 303 โ”‚     ) {
 304 โ”‚       setReadyScene(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 305 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
     โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
 127 โ”‚     let cancelled = false;
 128 โ”‚     let lastOutcome: string | null = null;
     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'lastOutcome' is declared here
 129 โ”‚     void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:7]
 324 โ”‚   };
 325 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 326 โ”‚     if (!guidesEnabled && section === "guide") {
 327 โ”‚       requestedSection.current = "overview";
 328 โ”‚       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
 329 โ”‚       setSection("overview");
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 330 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found missing effect dependencies
     โ•ญโ”€[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:331:6]
 326 โ”‚     if (!guidesEnabled && section === "guide") {
 327 โ”‚       requestedSection.current = "overview";
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ 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
 328 โ”‚       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€           โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ”‚                          โ•ฐโ”€โ”€ 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
     ยท                โ•ฐโ”€โ”€ 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
 329 โ”‚       setSection("overview");
 330 โ”‚     }
 331 โ”‚   }, [guidesEnabled, section, insets.top]);
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                        โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 332 โ”‚   const tabContent = activityContent;
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause an effect to fire less often than it should
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found missing effect dependencies
     โ•ญโ”€[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:868:6]
 851 โ”‚     if (
 852 โ”‚       lastSelection.current.path === route.params.path &&
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 853 โ”‚       lastSelection.current.id === route.params.fileSelectionId
 854 โ”‚     )
 855 โ”‚       return;
 856 โ”‚     lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
 857 โ”‚     if (route.params.focus) navigation.setParams({ focus: undefined });
 858 โ”‚     setJumpPath(route.params.path);
 859 โ”‚     setSelectedRowId(null);
 860 โ”‚     jumpStarted.current = false;
 861 โ”‚     const file = data.files.find((entry) => entry.path === route.params.path);
 862 โ”‚     if (!file || !nativeView.current) return;
     ยท                   โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                        โ•ฐโ”€โ”€ Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 863 โ”‚     setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
 864 โ”‚     jumpStarted.current = true;
 865 โ”‚     void nativeView.current.scrollToFile(file.id, false).catch(() => {
 866 โ”‚       jumpStarted.current = false;
 867 โ”‚     });
 868 โ”‚   }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                                    โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 869 โ”‚   const appliedFilter = useRef(filter.hideTestFiles);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause an effect to fire less often than it should
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'.
     โ•ญโ”€[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7]
 345 โ”‚
 346 โ”‚ const layerFromProviderAdapter: Layer.Layer<
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'layerFromProviderAdapter' is declared here
 347 โ”‚   ProviderAdapterRegistryV2,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  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.
     โ•ญโ”€[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7]
 565 โ”‚           let afterSequence = created[0]!.sequence;
 566 โ”‚ โ•ญโ”€โ–ถ       for (let index = 1; index <= 32; index += 1) {
 567 โ”‚ โ”‚           const nextEvent = {
 568 โ”‚ โ”‚             id: EventId.make(`event:foundation-stream-race:${index}`),
 569 โ”‚ โ”‚             type: "thread.metadata-updated" as const,
 570 โ”‚ โ”‚             threadId,
 571 โ”‚ โ”‚             providerInstanceId,
 572 โ”‚ โ”‚             occurredAt: now,
 573 โ”‚ โ”‚             payload: { ...thread, title: `Race update ${index}` },
 574 โ”‚ โ”‚           } satisfies OrchestrationV2DomainEvent;
 575 โ”‚ โ”‚           const reader = yield* eventSink
 576 โ”‚ โ”‚             .stream({ threadId, afterSequence })
 577 โ”‚ โ”‚             .pipe(Stream.runHead, Effect.forkChild);
 578 โ”‚ โ”‚           yield* Effect.yieldNow;
 579 โ”‚ โ”‚           const written = yield* eventSink.write({ events: [nextEvent] });
 580 โ”‚ โ”‚           const received = yield* Fiber.join(reader);
 581 โ”‚ โ”‚           if (Option.isNone(received)) {
 582 โ”‚ โ”‚             return yield* Effect.die("The event stream ended before delivering the live event.");
 583 โ”‚ โ”‚           }
 584 โ”‚ โ”‚           assert.equal(received.value.sequence, written[0]?.sequence);
 585 โ”‚ โ”‚           assert.equal(received.value.event.id, nextEvent.id);
 586 โ”‚ โ”‚           afterSequence = received.value.sequence;
 587 โ”‚ โ•ฐโ”€โ–ถ       }
 588 โ”‚         }),
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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.
      โ•ญโ”€[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9]
 2326 โ”‚             let settled = false;
 2327 โ”‚ โ•ญโ”€โ–ถ         while (!settled) {
 2328 โ”‚ โ”‚             settled = (yield* outbox.listByCommandId(commandId)).every(
 2329 โ”‚ โ”‚               (effect) => effect.status === "succeeded",
 2330 โ”‚ โ”‚             );
 2331 โ”‚ โ”‚             if (!settled) yield* Effect.yieldNow;
 2332 โ”‚ โ•ฐโ”€โ–ถ         }
 2333 โ”‚           }).pipe(Effect.provide(layerWorker), Effect.scoped);
      โ•ฐโ”€โ”€โ”€โ”€

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33]
 113 โ”‚     return () => cancelAnimationFrame(frame);
 114 โ”‚   }, [restoreSearch, tabActive, bottomSearch]);
     ยท                                 โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                                       โ•ฐโ”€โ”€ Unnecessary dependency `bottomSearch`
 115 โ”‚   const composeButton = nativeToolbarCompose ? (
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'.
       โ•ญโ”€[apps/server/src/orchestration-v2/Orchestrator.ts:12366:7]
 12365 โ”‚
 12366 โ”‚ const layerUnavailable: Layer.Layer<OrchestratorV2> = Layer.succeed(
       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
       ยท               โ•ฐโ”€โ”€ 'layerUnavailable' is declared here
 12367 โ”‚   OrchestratorV2,
       โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     โ•ญโ”€[scripts/lib/cli-external-packages.test.ts:114:11]
 113 โ”‚         const declared = {
 114 โ”‚           ...(manifest.dependencies ?? {}),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 115 โ”‚           ...(manifest.optionalDependencies ?? {}),
     โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     โ•ญโ”€[scripts/lib/cli-external-packages.test.ts:115:11]
 114 โ”‚           ...(manifest.dependencies ?? {}),
 115 โ”‚           ...(manifest.optionalDependencies ?? {}),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 116 โ”‚           ...(manifest.peerDependencies ?? {}),
     โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     โ•ญโ”€[scripts/lib/cli-external-packages.test.ts:116:11]
 115 โ”‚           ...(manifest.optionalDependencies ?? {}),
 116 โ”‚           ...(manifest.peerDependencies ?? {}),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 117 โ”‚         };
     โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
    โ•ญโ”€[apps/mobile/src/state/use-model-option-memory.ts:21:7]
 20 โ”‚     [instanceId]: {
 21 โ”‚       ...(state[instanceId] ?? {}),
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 22 โ”‚       [model]: options,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/state/thread-order.ts:29:7]
 28 โ”‚     getPendingThreadOrder();
 29 โ”‚   }, [nowMinute, snoozeWakeTick]);
    ยท       โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท           โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `snoozeWakeTick`
    ยท           โ•ฐโ”€โ”€ Unnecessary dependency `nowMinute`
 30 โ”‚   return pending;
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34]
 115 โ”‚     return [...commands];
 116 โ”‚   }, [activeThreadRef, pathname, registrationVersion, navigation]);
     ยท                                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                           โ•ฐโ”€โ”€ Unnecessary dependency `registrationVersion`
 117 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(refs): Cannot access refs during render
    โ•ญโ”€[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
 26 โ”‚   const latestInput = useRef(input);
 27 โ”‚   latestInput.current = input;
    ยท   โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท        โ”‚         โ•ฐโ”€โ”€ Cannot update ref value during render
    ยท        โ•ฐโ”€โ”€ This value is a ref
 28 โ”‚   const mounted = useRef(true);
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(immutability): This value cannot be modified
    โ•ญโ”€[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
 65 โ”‚   const [expanded, setExpanded] = useState(false);
 66 โ”‚   const progress = useSharedValue(0);
    ยท         โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท             โ•ฐโ”€โ”€ `progress` originates here
 67 โ”‚   useEffect(() => {
 68 โ”‚     progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
    ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ `progress` cannot be modified
 69 โ”‚   }, [expanded, progress]);
    โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
 121 โ”‚   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
 122 โ”‚   const audioLevels = useSharedValue(audioLevelsRef.current);
     ยท                                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                                 โ•ฐโ”€โ”€ Cannot access ref value during render
 123 โ”‚   const sessionRef = useRef<VoiceInputSession | null>(null);
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
 125 โ”‚
 126 โ”‚   if (!sessionRef.current || !recorderRef.current) {
     ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ Cannot access ref value during render
 127 โ”‚     const recorder = createLazyVoiceRecorder({
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
 125 โ”‚
 126 โ”‚   if (!sessionRef.current || !recorderRef.current) {
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Cannot access ref value during render
 127 โ”‚     const recorder = createLazyVoiceRecorder({
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
 125 โ”‚
 126 โ”‚   if (!sessionRef.current || !recorderRef.current) {
     ยท                               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 127 โ”‚     const recorder = createLazyVoiceRecorder({
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
 125 โ”‚
 126 โ”‚   if (!sessionRef.current || !recorderRef.current) {
     ยท                              โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 127 โ”‚     const recorder = createLazyVoiceRecorder({
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
 126 โ”‚       if (!sessionRef.current || !recorderRef.current) {
 127 โ”‚ โ•ญโ”€โ–ถ     const recorder = createLazyVoiceRecorder({
 128 โ”‚ โ”‚         create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
 129 โ”‚ โ”‚         onStatus: (status: RecordingStatus) => {
 130 โ”‚ โ”‚           sessionRef.current?.controller.handleRecorderStatus({
 131 โ”‚ โ”‚             isFinished: status.isFinished,
 132 โ”‚ โ”‚             hasError: status.hasError || status.mediaServicesDidReset === true,
 133 โ”‚ โ”‚             error: status.error,
 134 โ”‚ โ”‚             url: status.url,
 135 โ”‚ โ”‚           });
 136 โ”‚ โ”‚         },
 137 โ”‚ โ”‚         // Read when recording starts so preference changes do not re-render every composer.
 138 โ”‚ โ”‚         selectInput: (inputs) => {
 139 โ”‚ โ”‚           const preferences = registry.get(mobilePreferencesAtom);
 140 โ”‚ โ”‚           if (!AsyncResult.isSuccess(preferences)) return null;
 141 โ”‚ โ”‚           const known = microphoneOrder(preferences.value.microphones);
 142 โ”‚ โ”‚           const order = rememberMicrophones(known, inputs);
 143 โ”‚ โ”‚           if (order !== known) {
 144 โ”‚ โ”‚             registry.set(updateMobilePreferencesAtom, {
 145 โ”‚ โ”‚               transform: (current) => ({
 146 โ”‚ โ”‚                 microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
 147 โ”‚ โ”‚               }),
 148 โ”‚ โ”‚             });
 149 โ”‚ โ”‚           }
 150 โ”‚ โ”‚           return preferredMicrophoneInput(inputs, order);
 151 โ”‚ โ”‚         },
 152 โ”‚ โ”œโ”€โ–ถ     });
     ยท โ•ฐโ”€โ”€โ”€โ”€ Passing a ref to a function may read its value during render
 153 โ”‚         recorderRef.current = recorder;
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
 152 โ”‚     });
 153 โ”‚     recorderRef.current = recorder;
     ยท     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท          โ”‚         โ•ฐโ”€โ”€ Cannot update ref value during render
     ยท          โ•ฐโ”€โ”€ This value is a ref
 154 โ”‚     sessionRef.current = new VoiceInputSession({
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
 153 โ”‚         recorderRef.current = recorder;
 154 โ”‚ โ•ญโ”€โ–ถ     sessionRef.current = new VoiceInputSession({
 155 โ”‚ โ”‚         recorder,
 156 โ”‚ โ”‚         getTranscriber: getLocalVoiceTranscriber,
 157 โ”‚ โ”‚         requestPermission: async () => {
 158 โ”‚ โ”‚           const permission = await requestRecordingPermissionsAsync();
 159 โ”‚ โ”‚           return { granted: permission.granted, canAskAgain: permission.canAskAgain };
 160 โ”‚ โ”‚         },
 161 โ”‚ โ”‚         configureRecording: configureVoiceRecordingAudio,
 162 โ”‚ โ”‚         releaseRecording: releaseVoiceRecordingAudio,
 163 โ”‚ โ”‚         deleteRecording: (uri) => new File(uri).delete(),
 164 โ”‚ โ”‚         onStateChange: (nextState) =>
 165 โ”‚ โ”‚           setState({
 166 โ”‚ โ”‚             state: nextState,
 167 โ”‚ โ”‚             ownerKey: sessionRef.current?.ownerKey ?? null,
 168 โ”‚ โ”‚             label: sessionRef.current?.label ?? null,
 169 โ”‚ โ”‚           }),
 170 โ”‚ โ”œโ”€โ–ถ     });
     ยท โ•ฐโ”€โ”€โ”€โ”€ Cannot access ref value during render
 171 โ”‚       }
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
 153 โ”‚     recorderRef.current = recorder;
 154 โ”‚     sessionRef.current = new VoiceInputSession({
     ยท     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท          โ”‚        โ•ฐโ”€โ”€ Cannot update ref value during render
     ยท          โ•ฐโ”€โ”€ This value is a ref
 155 โ”‚       recorder,
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
 184 โ”‚     return () => subscription.remove();
 185 โ”‚   }, [controller]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Cannot access ref value during render
 186 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
 184 โ”‚     return () => subscription.remove();
 185 โ”‚   }, [controller]);
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Cannot access ref value during render
 186 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
 191 โ”‚     },
 192 โ”‚     [controller, recorder],
     ยท      โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ Cannot access ref value during render
 193 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
 174 โ”‚   const controller = session.controller;
 175 โ”‚   const recorder = recorderRef.current;
     ยท                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                             โ•ฐโ”€โ”€ Cannot access ref value during render
 176 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
 191 โ”‚     },
 192 โ”‚     [controller, recorder],
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Cannot access ref value during render
 193 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
 245 โ”‚     return () => clearInterval(intervalId);
 246 โ”‚   }, [audioLevels, controller, recorder, state.phase]);
     ยท                    โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                         โ•ฐโ”€โ”€ Cannot access ref value during render
 247 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
 245 โ”‚     return () => clearInterval(intervalId);
 246 โ”‚   }, [audioLevels, controller, recorder, state.phase]);
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                              โ•ฐโ”€โ”€ Cannot access ref value during render
 247 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
 260 โ”‚     setOwnerFocused,
 261 โ”‚     session,
     ยท     โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท        โ•ฐโ”€โ”€ Cannot access ref value during render
 262 โ”‚     stop,
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
 250 โ”‚
 251 โ”‚ โ•ญโ”€โ–ถ   return {
 252 โ”‚ โ”‚       isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
 253 โ”‚ โ”‚       state,
 254 โ”‚ โ”‚       audioLevels,
 255 โ”‚ โ”‚       elapsedSeconds,
 256 โ”‚ โ”‚       isBusy: voiceInputBlocksSubmission(state),
 257 โ”‚ โ”‚       ownerKey,
 258 โ”‚ โ”‚       label,
 259 โ”‚ โ”‚       focusedOwners,
 260 โ”‚ โ”‚       setOwnerFocused,
 261 โ”‚ โ”‚       session,
 262 โ”‚ โ”‚       stop,
 263 โ”‚ โ”‚       cancel,
 264 โ”‚ โ”œโ”€โ–ถ   };
     ยท โ•ฐโ”€โ”€โ”€โ”€ Cannot access ref value during render
 265 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
 121 โ”‚   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
 122 โ”‚   const audioLevels = useSharedValue(audioLevelsRef.current);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ `audioLevels` originates here
 123 โ”‚   const sessionRef = useRef<VoiceInputSession | null>(null);
 124 โ”‚   const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
 125 โ”‚
 126 โ”‚   if (!sessionRef.current || !recorderRef.current) {
 127 โ”‚     const recorder = createLazyVoiceRecorder({
 128 โ”‚       create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
 129 โ”‚       onStatus: (status: RecordingStatus) => {
 130 โ”‚         sessionRef.current?.controller.handleRecorderStatus({
 131 โ”‚           isFinished: status.isFinished,
 132 โ”‚           hasError: status.hasError || status.mediaServicesDidReset === true,
 133 โ”‚           error: status.error,
 134 โ”‚           url: status.url,
 135 โ”‚         });
 136 โ”‚       },
 137 โ”‚       // Read when recording starts so preference changes do not re-render every composer.
 138 โ”‚       selectInput: (inputs) => {
 139 โ”‚         const preferences = registry.get(mobilePreferencesAtom);
 140 โ”‚         if (!AsyncResult.isSuccess(preferences)) return null;
 141 โ”‚         const known = microphoneOrder(preferences.value.microphones);
 142 โ”‚         const order = rememberMicrophones(known, inputs);
 143 โ”‚         if (order !== known) {
 144 โ”‚           registry.set(updateMobilePreferencesAtom, {
 145 โ”‚             transform: (current) => ({
 146 โ”‚               microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
 147 โ”‚             }),
 148 โ”‚           });
 149 โ”‚         }
 150 โ”‚         return preferredMicrophoneInput(inputs, order);
 151 โ”‚       },
 152 โ”‚     });
 153 โ”‚     recorderRef.current = recorder;
 154 โ”‚     sessionRef.current = new VoiceInputSession({
 155 โ”‚       recorder,
 156 โ”‚       getTranscriber: getLocalVoiceTranscriber,
 157 โ”‚       requestPermission: async () => {
 158 โ”‚         const permission = await requestRecordingPermissionsAsync();
 159 โ”‚         return { granted: permission.granted, canAskAgain: permission.canAskAgain };
 160 โ”‚       },
 161 โ”‚       configureRecording: configureVoiceRecordingAudio,
 162 โ”‚       releaseRecording: releaseVoiceRecordingAudio,
 163 โ”‚       deleteRecording: (uri) => new File(uri).delete(),
 164 โ”‚       onStateChange: (nextState) =>
 165 โ”‚         setState({
 166 โ”‚           state: nextState,
 167 โ”‚           ownerKey: sessionRef.current?.ownerKey ?? null,
 168 โ”‚           label: sessionRef.current?.label ?? null,
 169 โ”‚         }),
 170 โ”‚     });
 171 โ”‚   }
 172 โ”‚
 173 โ”‚   const session = sessionRef.current;
 174 โ”‚   const controller = session.controller;
 175 โ”‚   const recorder = recorderRef.current;
 176 โ”‚
 177 โ”‚   useEffect(() => {
 178 โ”‚     const subscription = AppState.addEventListener("change", (nextState) => {
 179 โ”‚       // iOS reports `inactive` while its permission dialog is open. Only the
 180 โ”‚       // real background state cancels preparation; recorder status handles
 181 โ”‚       // calls and route interruptions during capture.
 182 โ”‚       if (nextState === "background") controller.appMovedToBackground();
 183 โ”‚     });
 184 โ”‚     return () => subscription.remove();
 185 โ”‚   }, [controller]);
 186 โ”‚
 187 โ”‚   useEffect(
 188 โ”‚     () => () => {
 189 โ”‚       controller.dispose();
 190 โ”‚       recorder.release();
 191 โ”‚     },
 192 โ”‚     [controller, recorder],
 193 โ”‚   );
 194 โ”‚
 195 โ”‚   useEffect(() => {
 196 โ”‚     if (state.phase !== "recording") return;
 197 โ”‚
 198 โ”‚     const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
 199 โ”‚     const activation = activateKeepAwakeAsync(tag);
 200 โ”‚     void activation.catch(() => {});
 201 โ”‚     return () => {
 202 โ”‚       // Release after activation settles, even if the recording ends immediately.
 203 โ”‚       void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
 204 โ”‚     };
 205 โ”‚   }, [keepAwakeId, state.phase]);
 206 โ”‚
 207 โ”‚   useEffect(() => {
 208 โ”‚     if (state.phase !== "preparing" && state.phase !== "recording") return;
 209 โ”‚
 210 โ”‚     if (audioLevelsRef.current.some((level) => level !== 0)) {
 211 โ”‚       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
 212 โ”‚       audioLevels.value = audioLevelsRef.current;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ `audioLevels` cannot be modified
 213 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): Cannot modify local variables after render completes
     โ•ญโ”€[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
 206 โ”‚
 207 โ”‚   useEffect(() => {
     ยท             โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `audioLevels` after render
 208 โ”‚     if (state.phase !== "preparing" && state.phase !== "recording") return;
 209 โ”‚
 210 โ”‚     if (audioLevelsRef.current.some((level) => level !== 0)) {
 211 โ”‚       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
 212 โ”‚       audioLevels.value = audioLevelsRef.current;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ This modifies `audioLevels`
 213 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
    โ•ญโ”€[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
 90 โ”‚ }) {
 91 โ”‚   const rotation = useSharedValue(props.hidden ? 1 : 0);
    ยท         โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท             โ•ฐโ”€โ”€ `rotation` originates here
 92 โ”‚   useLayoutEffect(() => {
 93 โ”‚     rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
    ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ `rotation` cannot be modified
 94 โ”‚   }, [props.hidden, rotation]);
    โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
 266 โ”‚   const variant = props.variant ?? "plain";
 267 โ”‚   const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ `loadingVisibility` originates here
 268 โ”‚   useLayoutEffect(() => {
 269 โ”‚     loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ `loadingVisibility` cannot be modified
 270 โ”‚   }, [loadingVisibility, props.loading]);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
 325 โ”‚ }) {
 326 โ”‚   const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ `recordingVisibility` originates here
 327 โ”‚   useLayoutEffect(() => {
 328 โ”‚     recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ `recordingVisibility` cannot be modified
 329 โ”‚   }, [props.phase, recordingVisibility]);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  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.
     โ•ญโ”€[packages/shared/src/otelEnvironment.ts:146:14]
 145 โ”‚     name,
 146 โ”‚     (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()),
     ยท              โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 147 โ”‚     `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`,
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/state/use-vcs-action-state.ts:86:5]
 83 โ”‚   const [nowMs, setNowMs] = useState(() => Date.now());
 84 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 85 โ”‚     if (!actionState.isRunning) return;
 86 โ”‚     setNowMs(Date.now());
    ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 87 โ”‚     const interval = setInterval(() => setNowMs(Date.now()), 1000);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
      โ•ญโ”€[apps/mobile/src/state/use-composer-drafts.ts:1022:15]
 1021 โ”‚             instanceId,
 1022 โ”‚             { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models },
      ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1023 โ”‚           ]),
      โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5]
 1314 โ”‚     queuedMessagesByThreadKey,
 1315 โ”‚     retryTick,
      ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท         โ•ฐโ”€โ”€ Unnecessary dependency `retryTick`
 1316 โ”‚     restoreQueuedMessage,
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
    โ•ญโ”€[packages/shared/src/composerContextLegacySend.ts:19:45]
 18 โ”‚   const occurrences = collectComposerContextReferences(text);
 19 โ”‚   for (const occurrence of [...occurrences].reverse()) {
    ยท                                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 20 โ”‚     const record = recordsById.get(occurrence.contextId);
    โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression
    โ•ญโ”€[packages/shared/src/serverSettings.test.ts:35:7]
 34 โ”‚     const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) =>
 35 โ”‚       instanceId === configured ? true : false,
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 36 โ”‚     );
    โ•ฐโ”€โ”€โ”€โ”€
  help: Remove this ternary operator

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     โ•ญโ”€[packages/shared/src/serverSettings.ts:346:9]
 345 โ”‚       const entry: ProjectSettingsOverrides = {
 346 โ”‚         ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}),
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 347 โ”‚       };
     โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce()
     โ•ญโ”€[packages/shared/src/serverSettings.ts:448:24]
 447 โ”‚   const favorites =
 448 โ”‚     setModelFavorites?.reduce((current, change) => {
     ยท                        โ”€โ”€โ”€โ”ฌโ”€โ”€
     ยท                           โ•ฐโ”€โ”€ For this reduce
 449 โ”‚       const exists = current.some(
 450 โ”‚         (favorite) => favorite.provider === change.provider && favorite.model === change.model,
 451 โ”‚       );
 452 โ”‚       return change.favorite
 453 โ”‚         ? exists
 454 โ”‚           ? current
 455 โ”‚           : [...current, { provider: change.provider, model: change.model }]
     ยท              โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ From this spread
 456 โ”‚         : current.filter(
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead.
  note: Using spreads within accumulators leads to `O(n^2)` time complexity.

  โš  oxc(no-accumulating-spread): Do not spread accumulators in loops
     โ•ญโ”€[packages/shared/src/serverSettings.ts:466:3]
 464 โ”‚     null;
 465 โ”‚   let nextModelPreferences = initialModelPreferences;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ From this accumulator
 466 โ”‚   for (const change of setModelsHidden ?? []) {
     ยท   โ”€โ”ฌโ”€
     ยท    โ•ฐโ”€โ”€ For this loop
 467 โ”‚     const preferences = nextModelPreferences?.[change.provider] ?? {
 468 โ”‚       hiddenModels: [],
 469 โ”‚       modelOrder: [],
 470 โ”‚     };
 471 โ”‚     const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model);
 472 โ”‚     if (change.hidden) hiddenModels.push(change.model);
 473 โ”‚     nextModelPreferences = {
 474 โ”‚       ...nextModelPreferences,
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ From this spread
 475 โ”‚       [change.provider]: { ...preferences, hiddenModels },
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider using `Object.assign()` to mutate the accumulator instead.
  note: Using spreads within accumulators leads to `O(n^2)` time complexity.

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
    โ•ญโ”€[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
 35 โ”‚       <T3SourceTextRunNativeComponent
 36 โ”‚         key={index}
    ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 37 โ”‚         style={flattenedStyle}
    โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

Found 0 errors and 362 warnings in 5420 files (6.0s, 8 threads)
Post job cleanup.
Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d, not saving cache.
##[end-action id=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.__actions_cache;outcome=success;conclusion=success;duration_ms=119]
##[start-action display=Cache Vite+;id=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.vp_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache.
##[end-action id=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.vp_cache;outcome=success;conclusion=success;duration_ms=59]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/bde825dd-ba79-4937-bfb5-8ee285da746d' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
Removing SSH command configuration
[command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
[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' || :"
fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
Warning: The process '/usr/local/bin/git' failed with exit code 128
A job completed hook has been configured by the self-hosted runner administrator
โ–ธ Run '/job_completed.sh'
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
env:
  BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 187
  BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 406
  BLACKSMITH_CHECK_RUN_ID: 120801109398
  BLACKSMITH_JOB_DISPLAY_NAME: Lint
  GITHUB_ACTIONS_CACHE_MODE: write
Docker container cache not activated, skipping hash computation.
No active SSH sessions detected. Proceeding with shutdown immediately.
Cleaning up orphan processes