GitHub check

256 KB of 616 KB loaded Download the full log (616 KB)
360 KB of earlier output not loaded
Z   โš  t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/effect-codex-app-server/src/schema.test.ts:51:18]
 50 โ”‚     assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true);
 51 โ”‚     assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true);
    ยท                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 52 โ”‚   }
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/effect-codex-app-server/src/schema.test.ts:55:5]
 54 โ”‚   assert.equal(
 55 โ”‚     Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"),
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 56 โ”‚     true,
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/effect-codex-app-server/src/schema.test.ts:59:5]
 58 โ”‚   assert.equal(
 59 โ”‚     Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"),
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 60 โ”‚     true,
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
     โ•ญโ”€[packages/effect-codex-app-server/src/schema.test.ts:103:16]
 102 โ”‚
 103 โ”‚   assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true);
     ยท                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 104 โ”‚ });
     โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
      โ•ญโ”€[packages/effect-acp/src/client.ts:1270:11]
 1269 โ”‚         extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
 1270 โ”‚           Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
      ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1271 โ”‚             Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
      โ•ฐโ”€โ”€โ”€โ”€

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:122:34]
 121 โ”‚     return [...commands];
 122 โ”‚   }, [activeThreadRef, pathname, registrationVersion, navigation]);
     ยท                                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                           โ•ฐโ”€โ”€ Unnecessary dependency `registrationVersion`
 123 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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

  โš  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/project/ProjectEnrichmentService.test.ts:28:3]
 27 โ”‚     ) {
 28 โ”‚ โ•ญโ”€โ–ถ   for (let attempt = 0; attempt < 100; attempt += 1) {
 29 โ”‚ โ”‚       const available = yield* service.peek(workspaceRoot);
 30 โ”‚ โ”‚       if (predicate(available)) return available;
 31 โ”‚ โ”‚       yield* Effect.yieldNow;
 32 โ”‚ โ•ฐโ”€โ–ถ   }
 33 โ”‚       return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`);
    โ•ฐโ”€โ”€โ”€โ”€

  โš  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/project/ProjectService.test.ts:94:3]
 93 โ”‚     ) {
 94 โ”‚ โ•ญโ”€โ–ถ   for (let attempt = 0; attempt < 100; attempt += 1) {
 95 โ”‚ โ”‚       const project = Option.getOrThrow(yield* service.getById(projectId));
 96 โ”‚ โ”‚       if (predicate(project)) return project;
 97 โ”‚ โ”‚       yield* Effect.yieldNow;
 98 โ”‚ โ•ฐโ”€โ–ถ   }
 99 โ”‚       return yield* Effect.die(`Project ${projectId} was not enriched in time.`);
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/effect-acp/src/schema.test.ts:18:12]
 17 โ”‚     const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
 18 โ”‚     expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
    ยท            โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 19 โ”‚     expect(
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/effect-acp/src/schema.test.ts:20:7]
 19 โ”‚     expect(
 20 โ”‚       Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 21 โ”‚     ).toBe(true);
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
     โ•ญโ”€[packages/effect-acp/src/protocol.test.ts:500:31]
 499 โ”‚
 500 โ”‚       const response = yield* Schema.decodeUnknownEffect(
     ยท                               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 501 โ”‚         Schema.fromJsonString(JsonRpcErrorResponse),
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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

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

  โš  t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
     โ•ญโ”€[packages/effect-acp/src/errors.test.ts:129:28]
 128 โ”‚       const secret = "acp-summary-secret";
 129 โ”‚       const cause = yield* Schema.decodeUnknownEffect(
     ยท                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 130 โ”‚         Schema.Struct({
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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

  โš  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

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

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

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:124:7]
 119 โ”‚
 120 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 121 โ”‚     if (orientationSettled) return;
 122 โ”‚     const orientation = getNativeShowcaseOrientation();
 123 โ”‚     if (orientation === null) {
 124 โ”‚       setOrientationSettled(true);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 125 โ”‚       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:299:7]
 287 โ”‚
 288 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 289 โ”‚     if (
 290 โ”‚       scene === null ||
 291 โ”‚       requestedScene === null ||
 292 โ”‚       scene !== requestedScene ||
 293 โ”‚       !hasFixture ||
 294 โ”‚       !orientationSettled ||
 295 โ”‚       !themeApplied ||
 296 โ”‚       (scene === "agent-activity" && !agentActivityStaged) ||
 297 โ”‚       !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
 298 โ”‚     ) {
 299 โ”‚       setReadyScene(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 300 โ”‚       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:129:9]
 128 โ”‚     let cancelled = false;
 129 โ”‚     let lastOutcome: string | null = null;
     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'lastOutcome' is declared here
 130 โ”‚     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/review/useNativeReviewDiffHighlighting.ts:60:5]
 50 โ”‚
 51 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 52 โ”‚     traceDiffHighlight("viewport-reset", {
 53 โ”‚       reset: diffHighlightTraceId(resetKey),
 54 โ”‚       enabled,
 55 โ”‚       rows: rows.length,
 56 โ”‚     });
 57 โ”‚     const previousRange = scheduler.reset();
 58 โ”‚     highlightedRowIdsRef.current = new Set();
 59 โ”‚     pendingPatchesRef.current = [];
 60 โ”‚     setViewport({ scope: viewportScope, range: null });
    ยท     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท          โ•ฐโ”€โ”€ 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(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

  โš  eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
      โ•ญโ”€[packages/provider-pi/src/server/adapter.ts:3337:7]
 3336 โ”‚
 3337 โ”‚ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, PiAdapterV2DriverEnv> =
      ยท       โ”€โ”€โ”ฌโ”€โ”€
      ยท         โ•ฐโ”€โ”€ 'layer' is declared here
 3338 โ”‚   Layer.effect(
      โ•ฐโ”€โ”€โ”€โ”€
  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.
     โ•ญโ”€[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(
     โ•ฐโ”€โ”€โ”€โ”€

  โš  eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
     โ•ญโ”€[apps/server/src/usage/UsageService.ts:162:7]
 161 โ”‚
 162 โ”‚ const layerTest = Layer.succeed(
     ยท       โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ 'layerTest' is declared here
 163 โ”‚   UsageService,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used.
     โ•ญโ”€[apps/web/src/components/LegacySidebar.tsx:211:40]
 210 โ”‚ import { useClientSettings, updateClientSettings } from "~/hooks/useSettings";
 211 โ”‚ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server";
     ยท                                        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                                โ•ฐโ”€โ”€ 'serverEnvironment' is imported here
 212 โ”‚ import { appAtomRegistry } from "../rpc/atomRegistry";
     โ•ฐโ”€โ”€โ”€โ”€
  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.
      โ•ญโ”€[apps/server/src/usage/UsageService.test.ts:2613:7]
 2612 โ”‚           let orphanedAt: number | undefined;
 2613 โ”‚ โ•ญโ”€โ–ถ       for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
 2614 โ”‚ โ”‚           const tasks: Array<() => void> = [];
 2615 โ”‚ โ”‚           const dispatcher: Scheduler.SchedulerDispatcher = {
 2616 โ”‚ โ”‚             scheduleTask: (task) => tasks.push(task),
 2617 โ”‚ โ”‚             flush: () => {
 2618 โ”‚ โ”‚               let task: (() => void) | undefined;
 2619 โ”‚ โ”‚               while ((task = tasks.shift()) !== undefined) task();
 2620 โ”‚ โ”‚             },
 2621 โ”‚ โ”‚           };
 2622 โ”‚ โ”‚
 2623 โ”‚ โ”‚           let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
 2624 โ”‚ โ”‚           let requestChecks = 0;
 2625 โ”‚ โ”‚           const scheduler: Scheduler.Scheduler = {
 2626 โ”‚ โ”‚             executionMode: "async",
 2627 โ”‚ โ”‚             makeDispatcher: () => dispatcher,
 2628 โ”‚ โ”‚             shouldYield: (fiber) => {
 2629 โ”‚ โ”‚               if (fiber !== requestFiber) return false;
 2630 โ”‚ โ”‚               requestChecks += 1;
 2631 โ”‚ โ”‚               if (requestChecks !== interruptAt) return false;
 2632 โ”‚ โ”‚               fiber.interruptUnsafe();
 2633 โ”‚ โ”‚               return true;
 2634 โ”‚ โ”‚             },
 2635 โ”‚ โ”‚           };
 2636 โ”‚ โ”‚
 2637 โ”‚ โ”‚           const input: UsageSummaryInput = {
 2638 โ”‚ โ”‚             ...WINDOW,
 2639 โ”‚ โ”‚             sinceDay: UsageDay.make("2026-09-01"),
 2640 โ”‚ โ”‚             untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
 2641 โ”‚ โ”‚           };
 2642 โ”‚ โ”‚           const first = yield* service
 2643 โ”‚ โ”‚             .readSummary(input)
 2644 โ”‚ โ”‚             .pipe(
 2645 โ”‚ โ”‚               Effect.exit,
 2646 โ”‚ โ”‚               Effect.provideService(Scheduler.Scheduler, scheduler),
 2647 โ”‚ โ”‚               Effect.forkChild,
 2648 โ”‚ โ”‚             );
 2649 โ”‚ โ”‚           requestFiber = first;
 2650 โ”‚ โ”‚           yield* Effect.yieldNow;
 2651 โ”‚ โ”‚           dispatcher.flush();
 2652 โ”‚ โ”‚
 2653 โ”‚ โ”‚           const second = yield* service.readSummary(input).pipe(
 2654 โ”‚ โ”‚             Effect.match({
 2655 โ”‚ โ”‚               onFailure: (error) => error.reason,
 2656 โ”‚ โ”‚               onSuccess: () => "success" as const,
 2657 โ”‚ โ”‚             }),
 2658 โ”‚ โ”‚             Effect.provideService(Scheduler.Scheduler, scheduler),
 2659 โ”‚ โ”‚             Effect.forkChild,
 2660 โ”‚ โ”‚           );
 2661 โ”‚ โ”‚           yield* Effect.yieldNow;
 2662 โ”‚ โ”‚           dispatcher.flush();
 2663 โ”‚ โ”‚           const secondExit = second.pollUnsafe();
 2664 โ”‚ โ”‚           if (secondExit === undefined) {
 2665 โ”‚ โ”‚             second.interruptUnsafe();
 2666 โ”‚ โ”‚             orphanedAt = interruptAt;
 2667 โ”‚ โ”‚             break;
 2668 โ”‚ โ”‚           }
 2669 โ”‚ โ”‚           if (Exit.isFailure(secondExit)) {
 2670 โ”‚ โ”‚             assert.fail("the matching request fiber was interrupted");
 2671 โ”‚ โ”‚           }
 2672 โ”‚ โ”‚           assert.strictEqual(secondExit.value, "invalidWindow");
 2673 โ”‚ โ•ฐโ”€โ–ถ       }
 2674 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€

  โš  typescript(no-extraneous-class): Unexpected class with only a constructor.
     โ•ญโ”€[apps/desktop/src/preview/Manager.test.ts:150:18]
 149 โ”‚       BrowserWindow: browserWindowConstructor,
 150 โ”‚ โ•ญโ”€โ–ถ   ClipboardItem: class {
 151 โ”‚ โ”‚       constructor(data: Record<string, unknown>) {
 152 โ”‚ โ”‚         clipboardItemConstructor(data);
 153 โ”‚ โ”‚       }
 154 โ”‚ โ•ฐโ”€โ–ถ   },
 155 โ”‚       clipboard: {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Try replacing this class with a standalone function or deleting it entirely

  โš  unicorn(no-new-array): Do not use `new Array(singleArgument)`.
     โ•ญโ”€[apps/web/src/terminal/ghostty/core.ts:186:19]
 185 โ”‚     const count = Math.min(CHUNK_SIZE, graphemeLength - start);
 186 โ”‚     const codes = new Array<number>(count);
     ยท                   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 187 โ”‚     for (let index = 0; index < count; index += 1) {
     โ•ฐโ”€โ”€โ”€โ”€
  help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
 58 โ”‚
 59 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 60 โ”‚     setMountedModes((current) => {
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 61 โ”‚       if (current.has(props.mode)) {
    โ•ฐโ”€โ”€โ”€โ”€
  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): Function 'nonEmptyString' is declared but never used.
     โ•ญโ”€[packages/client-runtime/src/work-log/presentation.ts:237:10]
 236 โ”‚
 237 โ”‚ function nonEmptyString(value: unknown): string | null {
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ 'nonEmptyString' is declared here
 238 โ”‚   return typeof value === "string" && value.trim().length > 0 ? value : null;
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadComposer.tsx:767:7]
 766 โ”‚     if (settingsSheetPresentation.isActive) {
 767 โ”‚       settingsRoutePresentation.present(settingsRouteSession);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ Missing dependency `settingsRoutePresentation`
 768 โ”‚     }
 769 โ”‚   }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
 770 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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:388:5]
 384 โ”‚     typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
 385 โ”‚   const animatedBorderRadius = useSharedValue(targetBorderRadius);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ `animatedBorderRadius` originates here
 386 โ”‚   const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
 387 โ”‚   useLayoutEffect(() => {
 388 โ”‚     animatedBorderRadius.value = shouldAnimate
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `animatedBorderRadius` cannot be modified
 389 โ”‚       ? 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

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     โ•ญโ”€[scripts/lib/cli-external-packages.test.ts:104:11]
 103 โ”‚         const declared = {
 104 โ”‚           ...(manifest.dependencies ?? {}),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 105 โ”‚           ...(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:105:11]
 104 โ”‚           ...(manifest.dependencies ?? {}),
 105 โ”‚           ...(manifest.optionalDependencies ?? {}),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 106 โ”‚           ...(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:106:11]
 105 โ”‚           ...(manifest.optionalDependencies ?? {}),
 106 โ”‚           ...(manifest.peerDependencies ?? {}),
     ยท           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 107 โ”‚         };
     โ•ฐโ”€โ”€โ”€โ”€
  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(immutability): This value cannot be modified
    โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:90:5]
 79 โ”‚
 80 โ”‚   const cardCoverage = props.cardCoverage;
    ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท               โ•ฐโ”€โ”€ `cardCoverage` originates here
 81 โ”‚   const barHeightRef = useRef(0);
 82 โ”‚   const cardHeightRef = useRef(0);
 83 โ”‚   const cardHeight = useSharedValue(0);
 84 โ”‚   const notifyCoverage = useCallback(() => {
 85 โ”‚     if (!cardCoverage) {
 86 โ”‚       return;
 87 โ”‚     }
 88 โ”‚     // The card resizes with the keyboard every frame, so easing each sample would leave the
 89 โ”‚     // feed inset and floating controls trailing it.
 90 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ `cardCoverage` cannot be modified
 91 โ”‚   }, [cardCoverage]);
    โ•ฐโ”€โ”€โ”€โ”€
  help: Do not mutate component props or hook arguments. If the value should change, update it where it is owned and pass an update callback, or use local state
  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/threads/PendingUserInputCard.tsx:102:7]
  82 โ”‚   const cardHeightRef = useRef(0);
  83 โ”‚   const cardHeight = useSharedValue(0);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ `cardHeight` originates here
  84 โ”‚   const notifyCoverage = useCallback(() => {
  85 โ”‚     if (!cardCoverage) {
  86 โ”‚       return;
  87 โ”‚     }
  88 โ”‚     // The card resizes with the keyboard every frame, so easing each sample would leave the
  89 โ”‚     // feed inset and floating controls trailing it.
  90 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
  91 โ”‚   }, [cardCoverage]);
  92 โ”‚   const handleBarLayout = useCallback(
  93 โ”‚     (event: LayoutChangeEvent) => {
  94 โ”‚       barHeightRef.current = event.nativeEvent.layout.height;
  95 โ”‚       notifyCoverage();
  96 โ”‚     },
  97 โ”‚     [notifyCoverage],
  98 โ”‚   );
  99 โ”‚   const handleCardLayout = useCallback(
 100 โ”‚     (event: LayoutChangeEvent) => {
 101 โ”‚       cardHeightRef.current = event.nativeEvent.layout.height;
 102 โ”‚       cardHeight.value = event.nativeEvent.layout.height;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ `cardHeight` cannot be modified
 103 โ”‚       notifyCoverage();
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/PendingUserInputCard.tsx:90:5]
 83 โ”‚   const cardHeight = useSharedValue(0);
 84 โ”‚   const notifyCoverage = useCallback(() => {
    ยท                                      โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท                                         โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardCoverage` after render
 85 โ”‚     if (!cardCoverage) {
 86 โ”‚       return;
 87 โ”‚     }
 88 โ”‚     // The card resizes with the keyboard every frame, so easing each sample would leave the
 89 โ”‚     // feed inset and floating controls trailing it.
 90 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ This modifies `cardCoverage`
 91 โ”‚   }, [cardCoverage]);
    โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  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/threads/PendingUserInputCard.tsx:90:5]
 89 โ”‚     // feed inset and floating controls trailing it.
 90 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ This modifies `cardCoverage`
 91 โ”‚   }, [cardCoverage]);
 92 โ”‚   const handleBarLayout = useCallback(
 93 โ”‚     (event: LayoutChangeEvent) => {
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                    โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardCoverage` after render
 94 โ”‚       barHeightRef.current = event.nativeEvent.layout.height;
    โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  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/threads/PendingUserInputCard.tsx:102:7]
  99 โ”‚   const handleCardLayout = useCallback(
 100 โ”‚     (event: LayoutChangeEvent) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardHeight` after render
 101 โ”‚       cardHeightRef.current = event.nativeEvent.layout.height;
 102 โ”‚       cardHeight.value = event.nativeEvent.layout.height;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ This modifies `cardHeight`
 103 โ”‚       notifyCoverage();
     โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `cardHeight` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
      โ•ญโ”€[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2143:15]
 2142 โ”‚       assert.equal(
 2143 โ”‚         items.filter((item) => item.type === "assistant_message").at(-1)?.text,
      ยท               โ”€โ”€โ”€โ”€โ”€โ”€
 2144 โ”‚         "authoritative answer",
      โ•ฐโ”€โ”€โ”€โ”€
  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/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4245:7]
 4244 โ”‚           const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
 4245 โ”‚ โ•ญโ”€โ–ถ       while (!responseLifecycle.includes("failed")) {
 4246 โ”‚ โ”‚           yield* Effect.yieldNow;
 4247 โ”‚ โ•ฐโ”€โ–ถ       }
 4248 โ”‚           const responseExit = yield* Fiber.join(responseFiber);
      โ•ฐโ”€โ”€โ”€โ”€

  โš  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/Adapters/AcpAdapterV2.test.ts:6355:9]
 6354 โ”‚               .pipe(Effect.forkScoped);
 6355 โ”‚ โ•ญโ”€โ–ถ         while (promptGates.length < 1) {
 6356 โ”‚ โ”‚             yield* Effect.yieldNow;
 6357 โ”‚ โ•ฐโ”€โ–ถ         }
 6358 โ”‚             assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
      โ•ฐโ”€โ”€โ”€โ”€

  โš  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/Adapters/AcpAdapterV2.test.ts:6490:9]
 6489 โ”‚               .pipe(Effect.forkScoped);
 6490 โ”‚ โ•ญโ”€โ–ถ         while (promptGates.length < 2) {
 6491 โ”‚ โ”‚             yield* Effect.yieldNow;
 6492 โ”‚ โ•ฐโ”€โ–ถ         }
 6493 โ”‚             if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
      โ•ฐโ”€โ”€โ”€โ”€

  โš  eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used.
     โ•ญโ”€[apps/web/src/components/Sidebar.tsx:135:40]
 134 โ”‚ import { environmentPresentations } from "../state/presentation";
 135 โ”‚ import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server";
     ยท                                        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                                โ•ฐโ”€โ”€ 'serverEnvironment' is imported here
 136 โ”‚ import { environmentProjects } from "../state/projects";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  react(purity): Cannot call impure function during render
      โ•ญโ”€[apps/web/src/components/Sidebar.tsx:1177:11]
 1176 โ”‚           foldSearchQuery(threadSearchQuery),
 1177 โ”‚           Date.now(),
      ยท           โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท                โ•ฐโ”€โ”€ Cannot call impure function
 1178 โ”‚           // A list filter, as on mobile: a pick would move rows unexplained.
      โ•ฐโ”€โ”€โ”€โ”€
  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(capitalized-calls): Capitalized function called without JSX
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadQueueControl.tsx:617:27]
 616 โ”‚   const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
 617 โ”‚   const gesture = Gesture.Pan()
     ยท                           โ”€โ”ฌโ”€
     ยท                            โ•ฐโ”€โ”€ `Pan` may be a component
 618 โ”‚     .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

  โš  eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
     โ•ญโ”€[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:956:10]
 955 โ”‚
 956 โ”‚ function layerClaudeAgentSdkReplayQueryRunner(
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                            โ•ฐโ”€โ”€ 'layerClaudeAgentSdkReplayQueryRunner' is declared here
 957 โ”‚   transcript: ClaudeAgentSdkReplayTranscript,
     โ•ฐโ”€โ”€โ”€โ”€
  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/new-task-flow-provider.tsx:434:5]
 424 โ”‚       : null;
 425 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 426 โ”‚     if (
 427 โ”‚       props.active === false ||
 428 โ”‚       activeDraftKey !== null ||
 429 โ”‚       editingPendingTask !== null ||
 430 โ”‚       selectedProject === null
 431 โ”‚     ) {
 432 โ”‚       return;
 433 โ”‚     }
 434 โ”‚     setActiveDraftKey(
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 435 โ”‚       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:1217:36]
 1216 โ”‚     <ActiveNewTaskContext value={activeNewTask}>
 1217 โ”‚       <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
      ยท                                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1218 โ”‚     </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.

  โš  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/state/shell-sync.test.ts:319:7]
 318 โ”‚           });
 319 โ”‚ โ•ญโ”€โ–ถ       for (let index = 0; index < 100; index += 1) {
 320 โ”‚ โ”‚           if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
 321 โ”‚ โ”‚           yield* Effect.yieldNow;
 322 โ”‚ โ•ฐโ”€โ–ถ       }
 323 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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/state/shell-sync.test.ts:328:7]
 327 โ”‚           yield* Deferred.succeed(releaseSave, undefined);
 328 โ”‚ โ•ญโ”€โ–ถ       for (let index = 0; index < 100; index += 1) {
 329 โ”‚ โ”‚           if ((yield* Ref.get(saved)).length > 0) break;
 330 โ”‚ โ”‚           yield* Effect.yieldNow;
 331 โ”‚ โ•ฐโ”€โ–ถ       }
 332 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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/state/shell-sync.test.ts:457:7]
 456 โ”‚           yield* Deferred.succeed(releaseUnenrichedSave, undefined);
 457 โ”‚ โ•ญโ”€โ–ถ       for (let index = 0; index < 100; index += 1) {
 458 โ”‚ โ”‚           const values = yield* Ref.get(saved);
 459 โ”‚ โ”‚           if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
 460 โ”‚ โ”‚             break;
 461 โ”‚ โ”‚           }
 462 โ”‚ โ”‚           yield* Effect.yieldNow;
 463 โ”‚ โ•ฐโ”€โ–ถ       }
 464 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€

  โš  eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
      โ•ญโ”€[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1409:7]
 1408 โ”‚
 1409 โ”‚ const layerCodexAppServerClientFactoryCommand = (
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                          โ•ฐโ”€โ”€ 'layerCodexAppServerClientFactoryCommand' is declared here
 1410 โ”‚   options: CodexClient.CodexAppServerClientOptions & {
      โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
      โ•ญโ”€[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1645:7]
 1644 โ”‚
 1645 โ”‚ const layer: Layer.Layer<
      ยท       โ”€โ”€โ”ฌโ”€โ”€
      ยท         โ•ฐโ”€โ”€ 'layer' is declared here
 1646 โ”‚   ProviderAdapter.ProviderAdapterV2,
      โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
       โ•ญโ”€[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10633:7]
 10632 โ”‚
 10633 โ”‚ const layer: Layer.Layer<
       ยท       โ”€โ”€โ”ฌโ”€โ”€
       ยท         โ•ฐโ”€โ”€ 'layer' is declared here
 10634 โ”‚   ProviderAdapter.ProviderAdapterV2,
       โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  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.

  โš  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.

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

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:287:5]
 285 โ”‚     .join("|");
 286 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 287 โ”‚     stop();
     ยท     โ”€โ”€โ”ฌโ”€
     ยท       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 288 โ”‚   }, [orderVersion]);
     โ•ฐโ”€โ”€โ”€โ”€
  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/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:287:5]
 286 โ”‚   useEffect(() => {
 287 โ”‚     stop();
     ยท     โ”€โ”€โ”ฌโ”€
     ยท       โ•ฐโ”€โ”€ Missing dependency `stop`
 288 โ”‚   }, [orderVersion]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Unnecessary dependency `orderVersion`
 289 โ”‚   useEffect(
     โ•ฐโ”€โ”€โ”€โ”€
  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(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:9]
 104 โ”‚   const latest = useRef(props);
 105 โ”‚   latest.current = props;
     ยท   โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท      โ”‚      โ•ฐโ”€โ”€ Cannot update ref value during render
     ยท      โ•ฐโ”€โ”€ This value is a ref
 106 โ”‚   const gesture = useMemo(
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadArrangementSheet.tsx:113:18]
 112 โ”‚         .runOnJS(true)
 113 โ”‚         .onStart(() => latest.current.onStart())
     ยท                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                 โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 114 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadArrangementSheet.tsx:114:19]
 113 โ”‚         .onStart(() => latest.current.onStart())
 114 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
     ยท                   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                             โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 115 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadArrangementSheet.tsx:115:16]
 114 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
 115 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
     ยท                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                          โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 116 โ”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadArrangementSheet.tsx:116:21]
 115 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
 116 โ”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
     ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                            โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 117 โ”‚     [props.disabled],
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadArrangementSheet.tsx:275:9]
 274 โ”‚   const latest = useRef({ rows, planners, moveThread });
 275 โ”‚   latest.current = { rows, planners, moveThread };
     ยท   โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท      โ”‚      โ•ฐโ”€โ”€ Cannot update ref value during render
     ยท      โ•ฐโ”€โ”€ This value is a ref
 276 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadArrangementSheet.tsx:273:22]
 272 โ”‚   const [preview, setPreview] = useState<Drag | null>(null);
 273 โ”‚   const translateY = useRef(new Animated.Value(0)).current;
     ยท                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 274 โ”‚   const latest = useRef({ rows, planners, moveThread });
     โ•ฐโ”€โ”€โ”€โ”€
  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(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:350:16]
 349 โ”‚     update(0);
 350 โ”‚     let last = performance.now();
     ยท                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                        โ•ฐโ”€โ”€ Cannot call impure function
 351 โ”‚     const tick = () => {
     โ•ฐโ”€โ”€โ”€โ”€
  help: `performance.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(capitalized-calls): Capitalized function called without JSX
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:15]
 107 โ”‚     () =>
 108 โ”‚       Gesture.Pan()
     ยท               โ”€โ”ฌโ”€
     ยท                โ•ฐโ”€โ”€ `Pan` may be a component
 109 โ”‚         .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(memo-dependencies): Found missing memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:117:5]
 112 โ”‚         .runOnJS(true)
 113 โ”‚         .onStart(() => latest.current.onStart())
     ยท                        โ”€โ”€โ”€โ”ฌโ”€โ”€
     ยท                           โ•ฐโ”€โ”€ Missing dependency `latest`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 114 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
 115 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
 116 โ”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
 117 โ”‚     [props.disabled],
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 118 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
  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/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:250:7]
 249 โ”‚       mountedRef.current = false;
 250 โ”‚       flow.setBranchQuery("");
     ยท       โ”€โ”€โ”ฌโ”€
     ยท         โ•ฐโ”€โ”€ Missing dependency `flow`
 251 โ”‚     };
 252 โ”‚   }, [flow.setBranchQuery]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
 253 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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(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.

  โš  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/ThreadDetailScreen.tsx:565:5]
 563 โ”‚   }, []);
 564 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 565 โ”‚     setKeyboardStateSuspect(false);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 566 โ”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
     โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadDetailScreen.tsx:977:7]
 974 โ”‚   const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
 975 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 976 โ”‚     if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
 977 โ”‚       setLastKnownKeyboardHeight(liveKeyboardHeight);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 978 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadDetailScreen.tsx:1220:5]
 1218 โ”‚
 1219 โ”‚   useEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท       โ•ฐโ”€โ”€ This is the containing effect
 1220 โ”‚     setAnchorMessageId(null);
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 1221 โ”‚     setSubmittedMessageId(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

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:566:7]
 565 โ”‚     setKeyboardStateSuspect(false);
 566 โ”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ”‚                   โ•ฐโ”€โ”€ Unnecessary dependency `liveKeyboardHeight`
     ยท               โ•ฐโ”€โ”€ Unnecessary dependency `isKeyboardVisible`
 567 โ”‚   const handleOwnedInputFocusChange = (focused: boolean) => {
     โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadDetailScreen.tsx:1168:7]
 1167 โ”‚     userInputInsetProgress.set(1);
 1168 โ”‚   }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                   โ•ฐโ”€โ”€ Unnecessary dependency `activeUserInputRequestId`
 1169 โ”‚   const showContent = props.showContent ?? true;
      โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadDetailScreen.tsx:1226:15]
 1225 โ”‚     freeze.set(false);
 1226 โ”‚   }, [freeze, selectedThreadKey]);
      ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                       โ•ฐโ”€โ”€ Unnecessary dependency `selectedThreadKey`
 1227 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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(immutability): This value cannot be modified
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1063:5]
 1058 โ”‚   const composerPopoverHeight = useSharedValue(0);
 1059 โ”‚   const floatingControlCoverage = useSharedValue(
      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                    โ•ฐโ”€โ”€ `floatingControlCoverage` originates here
 1060 โ”‚     showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
 1061 โ”‚   );
 1062 โ”‚   useEffect(() => {
 1063 โ”‚     floatingControlCoverage.value = withTiming(
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                โ•ฐโ”€โ”€ `floatingControlCoverage` cannot be modified
 1064 โ”‚       showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
      โ•ฐโ”€โ”€โ”€โ”€
  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/threads/ThreadDetailScreen.tsx:1079:7]
 1069 โ”‚   const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
 1070 โ”‚   const combinedContentInsetEndAdjustment = useSharedValue(
      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                         โ•ฐโ”€โ”€ `combinedContentInsetEndAdjustment` originates here
 1071 โ”‚     Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
 1072 โ”‚   );
 1073 โ”‚   useAnimatedReaction(
 1074 โ”‚     () =>
 1075 โ”‚       contentInsetEndAdjustment.value +
 1076 โ”‚       floatingControlCoverage.value +
 1077 โ”‚       (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
 1078 โ”‚     (value) => {
 1079 โ”‚       combinedContentInsetEndAdjustment.value = value;
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                       โ•ฐโ”€โ”€ `combinedContentInsetEndAdjustment` cannot be modified
 1080 โ”‚     },
      โ•ฐโ”€โ”€โ”€โ”€
  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

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

  โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:287:50]
 286 โ”‚   return (
 287 โ”‚     <ExistingThreadSettingsRouteContext.Provider value={value}>
     ยท                                                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 288 โ”‚       {props.children}
     โ•ฐโ”€โ”€โ”€โ”€
  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(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:651:44]
 650 โ”‚   return (
 651 โ”‚     <ThreadSettingsSessionContext.Provider value={value}>
     ยท                                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 652 โ”‚       {props.children}
     โ•ฐโ”€โ”€โ”€โ”€
  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(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1460:55]
 1459 โ”‚   return (
 1460 โ”‚     <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
      ยท                                                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1461 โ”‚       <ThreadSettingsPickerStack.Navigator
      โ•ฐโ”€โ”€โ”€โ”€
  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.

  โš  eslint(no-unused-vars): Identifier 'androidWorkspaceNavigationState' is imported but never used.
    โ•ญโ”€[apps/mobile/src/lib/android-workspace-navigation.test.ts:9:3]
  8 โ”‚ import {
  9 โ”‚   androidWorkspaceNavigationState,
    ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                  โ•ฐโ”€โ”€ 'androidWorkspaceNavigationState' is imported here
 10 โ”‚   linkedThreadStep,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining
      โ•ญโ”€[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1849:8]
 1848 โ”‚     assert.equal(
 1849 โ”‚       (stored.context?.records[0] as { attachmentId: string }).attachmentId,
      ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1850 โ”‚       stored.attachments[0]?.id,
      โ•ฐโ”€โ”€โ”€โ”€
  help: If this short-circuits with 'undefined' the evaluation will throw TypeError

  โš  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."));
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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);
     โ•ฐโ”€โ”€โ”€โ”€

  โš  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:339:38]
 338 โ”‚   visit(parser.parse(markdown));
 339 โ”‚   for (const lineStart of lineStarts.reverse()) {
     ยท                                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 340 โ”‚     // Lazy headers can lack container markers; copy the delimiter's markers to the header and blank line.
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  react(purity): Cannot call impure function during render
      โ•ญโ”€[apps/web/src/components/CommandPalette.tsx:2057:20]
 2056 โ”‚         title: inferProjectTitleFromPath(destinationPath),
 2057 โ”‚         createdAt: new Date().toISOString(),
      ยท                    โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท                         โ•ฐโ”€โ”€ Cannot call impure function
 2058 โ”‚         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

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

  โš  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(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/thread-work-log.tsx:174:5]
 170 โ”‚   const expandedAngle = props.collapsedDirection === "right" ? 90 : 180;
 171 โ”‚   const rotation = useSharedValue(props.expanded ? expandedAngle : 0);
     ยท         โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ `rotation` originates here
 172 โ”‚
 173 โ”‚   useLayoutEffect(() => {
 174 โ”‚     rotation.value = withTiming(props.expanded ? expandedAngle : 0, {
     ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท         โ•ฐโ”€โ”€ `rotation` cannot be modified
 175 โ”‚       duration: THREAD_DISCLOSURE_TRANSITION_MS,
     โ•ฐโ”€โ”€โ”€โ”€
  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(no-array-index-key): Usage of Array index in keys is not allowed
      โ•ญโ”€[apps/mobile/src/features/threads/thread-work-log.tsx:1239:23]
 1238 โ”‚                     <Text
 1239 โ”‚                       key={`${index}:${line}`}
      ยท                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1240 โ”‚                       selectable
      โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadMarkdownImage.tsx:52:5]
 50 โ”‚
 51 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 52 โ”‚     setDecodedSize(null);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 53 โ”‚   }, [props.sourceKey]);
    โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadMarkdownImage.tsx:56:5]
 54 โ”‚
 55 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 56 โ”‚     setFailedUri(null);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 57 โ”‚   }, [props.uri]);
    โ•ฐโ”€โ”€โ”€โ”€
  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 'ActivityIndicator' is imported but never used.
   โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
 6 โ”‚ import { parse, SvgAst, type JsxAST } from "react-native-svg";
 7 โ”‚ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
   ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   ยท                  โ•ฐโ”€โ”€ 'ActivityIndicator' is imported here
 8 โ”‚
   โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:53:7]
 52 โ”‚     setDecodedSize(null);
 53 โ”‚   }, [props.sourceKey]);
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท              โ•ฐโ”€โ”€ Unnecessary dependency `props.sourceKey`
 54 โ”‚
    โ•ฐโ”€โ”€โ”€โ”€
  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/ThreadMarkdownImage.tsx:57:7]
 56 โ”‚     setFailedUri(null);
 57 โ”‚   }, [props.uri]);
    ยท       โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ Unnecessary dependency `props.uri`
 58 โ”‚
    โ•ฐโ”€โ”€โ”€โ”€
  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-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/contracts/src/auth.test.ts:17:12]
 16 โ”‚   it("decodes legacy review credentials without offering them in new grants", () => {
 17 โ”‚     expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([
    ยท            โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 18 โ”‚       "review:write",
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/contracts/src/auth.test.ts:20:18]
 19 โ”‚     ]);
 20 โ”‚     expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow();
    ยท                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 21 โ”‚     expect(AuthStandardClientScopes).not.toContain("review:write");
    โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    โ•ญโ”€[packages/contracts/src/auth.test.ts:57:21]
 56 โ”‚   it("ignores unknown response permissions without falling back to broader scopes", () => {
 57 โ”‚     const session = Schema.decodeUnknownSync(AuthSessionState)({
    ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 58 โ”‚       authenticated: true,
    โ•ฐโ”€โ”€โ”€โ”€

  โš  react(purity): Cannot call impure function during render
     โ•ญโ”€[apps/web/src/components/sidebar/SidebarThreadRow.tsx:373:47]
 372 โ”‚   const { open, onOpenChange, onSnooze, timestampFormat } = props;
 373 โ”‚   const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
     ยท                                               โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                    โ•ฐโ”€โ”€ Cannot call impure function
 374 โ”‚   return (
     โ•ฐโ”€โ”€โ”€โ”€
  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(purity): Cannot call impure function during render
     โ•ญโ”€[apps/web/src/components/sidebar/SidebarThreadRow.tsx:860:39]
 859 โ”‚   if (snoozeGateClock.thread !== thread) {
 860 โ”‚     setSnoozeGateClock({ thread, now: new Date().toISOString() });
     ยท                                       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                            โ•ฐโ”€โ”€ Cannot call impure function
 861 โ”‚   }
     โ•ฐโ”€โ”€โ”€โ”€
  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

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

  โš  t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
     โ•ญโ”€[apps/server/src/assets/AssetAccess.test.ts:975:35]
 974 โ”‚       // Every client and server release spells the resource this way on the wire.
 975 โ”‚       const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({
     ยท                                   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 976 โ”‚         resource: { _tag: "github-media", cwd: "/repo", url },
     โ•ฐโ”€โ”€โ”€โ”€

  โš  t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
      โ•ญโ”€[apps/server/src/assets/AssetAccess.test.ts:1012:32]
 1011 โ”‚         expect(error._tag).toBe("AssetGitHubMediaUrlValidationError");
 1012 โ”‚         const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error);
      ยท                                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1013 โ”‚         expect(encoded).not.toContain(url);
      โ•ฐโ”€โ”€โ”€โ”€

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/components/ComposerEditor.tsx:82:6]
 81 โ”‚     },
 82 โ”‚     [draftKey],
    ยท      โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท          โ•ฐโ”€โ”€ Unnecessary dependency `draftKey`
 83 โ”‚   );
    โ•ฐโ”€โ”€โ”€โ”€
  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-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
     โ•ญโ”€[packages/contracts/src/composerContext.test.ts:181:18]
 180 โ”‚   it("sends a message without the records the wire cannot carry", () => {
 181 โ”‚     const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({
     ยท                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 182 โ”‚       version: 1,
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:413:5]
 411 โ”‚
 412 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 413 โ”‚     setInspectorSelection((current) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 414 โ”‚       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:541:24]
 540 โ”‚       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
 541 โ”‚ โ•ญโ”€โ–ถ   const GitInspector = () => (
 542 โ”‚ โ”‚       <GitOverviewSheet
 543 โ”‚ โ”‚         headerInset={inspectorHeaderInset}
 544 โ”‚ โ”‚         presentation="inspector"
 545 โ”‚ โ”‚         route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
 546 โ”‚ โ”‚       />
 547 โ”‚ โ•ฐโ”€โ–ถ   );
 548 โ”‚       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:548:26]
 547 โ”‚       );
 548 โ”‚ โ•ญโ”€โ–ถ   const FilesInspector = () =>
 549 โ”‚ โ”‚       selectedThread !== null && selectedThreadCwd !== null ? (
 550 โ”‚ โ”‚         <ThreadFileNavigatorPane
 551 โ”‚ โ”‚           cwd={selectedThreadCwd}
 552 โ”‚ โ”‚           environmentId={selectedThread.environmentId}
 553 โ”‚ โ”‚           headerInset={inspectorHeaderInset}
 554 โ”‚ โ”‚           projectName={selectedThreadProject?.title ?? "Files"}
 555 โ”‚ โ”‚           selectedPath={null}
 556 โ”‚ โ”‚           onSelectFile={handleSelectInspectorFile}
 557 โ”‚ โ”‚         />
 558 โ”‚ โ•ฐโ”€โ–ถ     ) : null;
 559 โ”‚       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.tsx:67:5]
 65 โ”‚   const { id: attachmentId, fileUri } = attachment;
 66 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 67 โ”‚     setUri(null);
    ยท     โ”€โ”€โ”€โ”ฌโ”€โ”€
    ยท        โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 68 โ”‚     setError(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

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.tsx:90:7]
 89 โ”‚     };
 90 โ”‚   }, [attachmentId, fileUri]);
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท             โ”‚          โ•ฐโ”€โ”€ Unnecessary dependency `fileUri`
    ยท             โ•ฐโ”€โ”€ Unnecessary dependency `attachmentId`
 91 โ”‚   const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
    โ•ฐโ”€โ”€โ”€โ”€
  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 missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.tsx:212:34]
 211 โ”‚   useEffect(() => {
 212 โ”‚     if (!isFocused && hasSource) props.onRequestClose();
     ยท                                  โ”€โ”€โ”ฌโ”€โ”€
     ยท                                    โ•ฐโ”€โ”€ Missing dependency `props`
 213 โ”‚   }, [isFocused, hasSource, props.onRequestClose]);
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                       โ•ฐโ”€โ”€ Overly precise dependency `props.onRequestClose`, use `props` instead
 214 โ”‚   const { source } = props;
     โ•ฐโ”€โ”€โ”€โ”€
  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/floating-working-control.tsx:108:5]
 104 โ”‚   );
 105 โ”‚   const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ `separationProgress` originates here
 106 โ”‚
 107 โ”‚   useEffect(() => {
 108 โ”‚     separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ `separationProgress` cannot be modified
 109 โ”‚   }, [props.showScrollToEnd, separationProgress]);
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/floating-working-control.tsx:132:5]
 122 โ”‚   // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting.
 123 โ”‚   const capsuleWidth = useSharedValue<number | null>(null);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `capsuleWidth` originates here
 124 โ”‚   const measuredWidthRef = useRef<number | null>(null);
 125 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
 126 โ”‚     const width = event.nativeEvent.layout.width;
 127 โ”‚     if (width === measuredWidthRef.current) {
 128 โ”‚       return;
 129 โ”‚     }
 130 โ”‚     const first = measuredWidthRef.current === null;
 131 โ”‚     measuredWidthRef.current = width;
 132 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ `capsuleWidth` cannot be modified
 133 โ”‚   };
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/floating-working-control.tsx:139:7]
 122 โ”‚   // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting.
 123 โ”‚   const capsuleWidth = useSharedValue<number | null>(null);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `capsuleWidth` originates here
 124 โ”‚   const measuredWidthRef = useRef<number | null>(null);
 125 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
 126 โ”‚     const width = event.nativeEvent.layout.width;
 127 โ”‚     if (width === measuredWidthRef.current) {
 128 โ”‚       return;
 129 โ”‚     }
 130 โ”‚     const first = measuredWidthRef.current === null;
 131 โ”‚     measuredWidthRef.current = width;
 132 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
 133 โ”‚   };
 134 โ”‚   const hasStatus = props.status !== null;
 135 โ”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
 136 โ”‚   useEffect(() => {
 137 โ”‚     if (!hasStatus) {
 138 โ”‚       measuredWidthRef.current = null;
 139 โ”‚       capsuleWidth.value = null;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ `capsuleWidth` cannot be modified
 140 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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/threads/floating-working-control.tsx:139:7]
 135 โ”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
 136 โ”‚   useEffect(() => {
     ยท             โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `capsuleWidth` after render
 137 โ”‚     if (!hasStatus) {
 138 โ”‚       measuredWidthRef.current = null;
 139 โ”‚       capsuleWidth.value = null;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ This modifies `capsuleWidth`
 140 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  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/threads/floating-working-control.tsx:132:5]
 124 โ”‚   const measuredWidthRef = useRef<number | null>(null);
 125 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                            โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `capsuleWidth` after render
 126 โ”‚     const width = event.nativeEvent.layout.width;
 127 โ”‚     if (width === measuredWidthRef.current) {
 128 โ”‚       return;
 129 โ”‚     }
 130 โ”‚     const first = measuredWidthRef.current === null;
 131 โ”‚     measuredWidthRef.current = width;
 132 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ This modifies `capsuleWidth`
 133 โ”‚   };
     โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  eslint(no-empty-pattern): Empty array binding pattern
      โ•ญโ”€[apps/server/src/pullRequest/PullRequestService.test.ts:1436:12]
 1435 โ”‚
 1436 โ”‚ for (const [] of [
      ยท            โ”€โ”€
 1437 โ”‚   ["github", "github.com"],
      โ•ฐโ”€โ”€โ”€โ”€
  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2223:5]
 2221 โ”‚   );
 2222 โ”‚   useEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท       โ•ฐโ”€โ”€ This is the containing effect
 2223 โ”‚     setExpandedVideo(null);
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 2224 โ”‚     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

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2716:9]
 2707 โ”‚   const stopFollowingEnd = useEffectEvent(() => setEndFollow(false));
 2708 โ”‚   useEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท       โ•ฐโ”€โ”€ This is the containing effect
 2709 โ”‚     if (!jumpToMessageId || loadedListKey !== listMountKey) return;
 2710 โ”‚     const index = presentedFeed.findIndex(
 2711 โ”‚       (entry) => entry.type === "message" && entry.id === jumpToMessageId,
 2712 โ”‚     );
 2713 โ”‚     if (index === -1) {
 2714 โ”‚       const runId = messageFoldRunId(props.feed, jumpToMessageId);
 2715 โ”‚       if (runId && !expandedTurnIds.has(runId)) {
 2716 โ”‚         setInteractionState((current) => ({
      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                  โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 2717 โ”‚           ...current,
      โ•ฐโ”€โ”€โ”€โ”€
  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:72:10]
 71 โ”‚ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
 72 โ”‚ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
    ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                     โ•ฐโ”€โ”€ 'isMarkdownFileLinkLabel' is imported here
 73 โ”‚ 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:98:3]
 97 โ”‚ import {
 98 โ”‚   createContext,
    ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ 'createContext' is imported here
 99 โ”‚   memo,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

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

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

  โš  eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11]
 122 โ”‚   StyleSheet,
 123 โ”‚   Text as NativeText,
     ยท           โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ 'NativeText' is imported here
 124 โ”‚   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:146:10]
 145 โ”‚ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
 146 โ”‚ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'tryOpenExternalUrl' is imported here
 147 โ”‚ 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:149:10]
 148 โ”‚ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
 149 โ”‚ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'faviconUrlForOrigin' is imported here
 150 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10]
 162 โ”‚ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
 163 โ”‚ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ 'MediaVideoPlayer' is imported here
 164 โ”‚ 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:167:3]
 166 โ”‚   attachmentVideoPreviewSource,
 167 โ”‚   mediaVideoPreviewUri,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ 'mediaVideoPreviewUri' is imported here
 168 โ”‚   mediaVideoThumbnailKey,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3]
 167 โ”‚   mediaVideoPreviewUri,
 168 โ”‚   mediaVideoThumbnailKey,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'mediaVideoThumbnailKey' is imported here
 169 โ”‚   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:169:8]
 168 โ”‚   mediaVideoThumbnailKey,
 169 โ”‚   type MediaVideoPreviewSource,
     ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'MediaVideoPreviewSource' is imported here
 170 โ”‚ } from "../../lib/videoPreviewSource";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

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

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

  โš  eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8]
 236 โ”‚   isCompactionCommandFeedEntry,
 237 โ”‚   type PendingThreadFeedEntry,
     ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'PendingThreadFeedEntry' is imported here
 238 โ”‚   type ThreadFeedRow,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

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

  โš  eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:438:9]
 437 โ”‚   const forkFromRun = useAtomCommand(threadEnvironment.forkFromRun, "fork from response");
 438 โ”‚   const navigation = useNavigation();
     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'navigation' is declared here
 439 โ”‚   const selectDetail = useSelectWorkspaceDetail();
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this declaration.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2225:7]
 2224 โ”‚     setExpandedFile(null);
 2225 โ”‚   }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                โ”‚                  โ”‚                       โ•ฐโ”€โ”€ Unnecessary dependency `props.contentPresentation.kind`
      ยท                โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `props.threadId`
      ยท                โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
 2226 โ”‚   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:2685:7]
 2684 โ”‚     reportHeaderMaterialVisibility(false);
 2685 โ”‚   }, [feedThreadKey, reportHeaderMaterialVisibility]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `feedThreadKey`
 2686 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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:2701:7]
 2700 โ”‚     }
 2701 โ”‚   }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `listMountKey`
 2702 โ”‚   // Opening at a message: its run unfolds, the list stops following the end
      โ•ฐโ”€โ”€โ”€โ”€
  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:2895:7]
 2894 โ”‚     }
 2895 โ”‚   }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท              โ”‚                  โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkRows`
      ยท              โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkGroups`
      ยท              โ•ฐโ”€โ”€ Unnecessary dependency `expandedTurnIds`
 2896 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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:628:9]
 627 โ”‚       };
 628 โ”‚     }, [props.environmentId, attachment.id, httpBaseUrl]),
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                  โ”‚                 โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `httpBaseUrl`
     ยท                  โ”‚                 โ•ฐโ”€โ”€ Unnecessary dependency `attachment.id`
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
 629 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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:221:7]
 217 โ”‚   };
 218 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 219 โ”‚     const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
 220 โ”‚     if (inserted) {
 221 โ”‚       setSelection((current) =>
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 222 โ”‚         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:301:7]
 289 โ”‚   }, [hasWorkspaceSnapshot]);
 290 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 291 โ”‚     if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
 292 โ”‚     const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
 293 โ”‚     const now = Date.now();
 294 โ”‚     const lastRequest = workspaceRefreshKeyRef.current;
 295 โ”‚     if (
 296 โ”‚       lastRequest?.key === key &&
 297 โ”‚       now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
 298 โ”‚     )
 299 โ”‚       return;
 300 โ”‚     if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
 301 โ”‚       setWorkspaceRefreshRetry(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 302 โ”‚       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:331:5]
 330 โ”‚   }, [
 331 โ”‚     draftMessage,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ Unnecessary dependency `draftMessage`
 332 โ”‚     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

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
 37 โ”‚   const [initialized, setInitialized] = useState(false);
 38 โ”‚   useLayoutEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท          โ•ฐโ”€โ”€ This is the containing effect
 39 โ”‚     reset();
 40 โ”‚     setInitialized(true);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 41 โ”‚   }, [reset]);
    โ•ฐโ”€โ”€โ”€โ”€
  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/NewTaskDraftRouteScreen.tsx:93:5]
 88 โ”‚
 89 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 90 โ”‚     if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
 91 โ”‚     const branchName = initialProjectRef.branch;
 92 โ”‚     let active = true;
 93 โ”‚     setPendingCheckouts((count) => count + 1);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 94 โ”‚     // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
    โ•ฐโ”€โ”€โ”€โ”€
  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(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:712:76]
 711 โ”‚   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
 712 โ”‚   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
     ยท                                                                            โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                                                 โ•ฐโ”€โ”€ Cannot call impure function
 713 โ”‚   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:733:71]
 732 โ”‚   const snoozePresets = useMemo(
 733 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
     ยท                                                                       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                                            โ•ฐโ”€โ”€ Cannot call impure function
 734 โ”‚     [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:734:6]
 733 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
 734 โ”‚     [props.snoozePresetMinute, swipeActions.secondary],
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.snoozePresetMinute`
 735 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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:780:7]
 779 โ”‚       thread.pinnedAt,
 780 โ”‚       variant,
     ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท          โ•ฐโ”€โ”€ Unnecessary dependency `variant`
 781 โ”‚     ],
     โ•ฐโ”€โ”€โ”€โ”€
  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:1229:21]
 1228 โ”‚             {providerDrivers.slice(0, -1).map((driver, index) => (
 1229 โ”‚               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
      ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1230 โ”‚                 <ProviderIcon provider={driver} size={12} />
      โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

Found 0 errors and 383 warnings in 5589 files (5.8s, 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=__cdc1a910-3d38-401a-8b1b-103b2321eb93.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-1af206af93d733fa7c4e35fa5de35961f61c0d15b9f10a3bf0b6b76380c4d2df, not saving cache.
##[end-action id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.__actions_cache;outcome=success;conclusion=success;duration_ms=160]
##[start-action display=Cache Vite+;id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.vp_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.4.0-node26.12.1-pnpm@12.14.0, not saving cache.
##[end-action id=__cdc1a910-3d38-401a-8b1b-103b2321eb93.vp_cache;outcome=success;conclusion=success;duration_ms=69]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/7611a110-3880-4aff-b7eb-0cec05687e29' 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: 146
  BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 552
  BLACKSMITH_CHECK_RUN_ID: 121182404788
  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