GitHub check

256 KB of 607 KB loaded Download the full log (607 KB)
351 KB of earlier output not loaded
:04:53.8024438Z      ╰────
2026-10-25T01:04:53.8024440Z
2026-10-25T01:04:53.8024892Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8025022Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7]
2026-10-25T01:04:53.8025081Z  321 │           );
2026-10-25T01:04:53.8025335Z  322 │ ╭─▶       for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
2026-10-25T01:04:53.8025441Z  323 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8025574Z  324 │ ╰─▶       }
2026-10-25T01:04:53.8025632Z  325 │
2026-10-25T01:04:53.8025689Z      ╰────
2026-10-25T01:04:53.8025692Z
2026-10-25T01:04:53.8026140Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8026270Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7]
2026-10-25T01:04:53.8026433Z  329 │           yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
2026-10-25T01:04:53.8026678Z  330 │ ╭─▶       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-25T01:04:53.8026786Z  331 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8026919Z  332 │ ╰─▶       }
2026-10-25T01:04:53.8027025Z  333 │           yield* Fiber.interrupt(subscriptionFiber);
2026-10-25T01:04:53.8027076Z      ╰────
2026-10-25T01:04:53.8027078Z
2026-10-25T01:04:53.8027327Z   ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used.
2026-10-25T01:04:53.8027445Z     ╭─[apps/web/src/lib/terminalContext.ts:56:10]
2026-10-25T01:04:53.8027503Z  55 │
2026-10-25T01:04:53.8027602Z  56 │ function normalizeTerminalContextSelection(
2026-10-25T01:04:53.8027719Z     ·          ────────────────┬────────────────
2026-10-25T01:04:53.8027911Z     ·                          ╰── 'normalizeTerminalContextSelection' is declared here
2026-10-25T01:04:53.8028001Z  57 │   selection: TerminalContextSelection,
2026-10-25T01:04:53.8028053Z     ╰────
2026-10-25T01:04:53.8028206Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8028238Z
2026-10-25T01:04:53.8028687Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8028822Z      ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3]
2026-10-25T01:04:53.8028886Z  225 │     ) {
2026-10-25T01:04:53.8029086Z  226 │ ╭─▶   for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T01:04:53.8029201Z  227 │ │       const socket = sockets[index];
2026-10-25T01:04:53.8029291Z  228 │ │       if (socket) {
2026-10-25T01:04:53.8029393Z  229 │ │         return socket;
2026-10-25T01:04:53.8029468Z  230 │ │       }
2026-10-25T01:04:53.8029572Z  231 │ │       yield* Effect.yieldNow;
2026-10-25T01:04:53.8029702Z  232 │ ╰─▶   }
2026-10-25T01:04:53.8029878Z  233 │       return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
2026-10-25T01:04:53.8029927Z      ╰────
2026-10-25T01:04:53.8029930Z
2026-10-25T01:04:53.8030430Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8030563Z      ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3]
2026-10-25T01:04:53.8030621Z  239 │     ) {
2026-10-25T01:04:53.8030824Z  240 │ ╭─▶   for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T01:04:53.8031042Z  241 │ │       const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
2026-10-25T01:04:53.8031135Z  242 │ │       if (request) {
2026-10-25T01:04:53.8031232Z  243 │ │         return request;
2026-10-25T01:04:53.8031312Z  244 │ │       }
2026-10-25T01:04:53.8031412Z  245 │ │       yield* Effect.yieldNow;
2026-10-25T01:04:53.8031537Z  246 │ ╰─▶   }
2026-10-25T01:04:53.8031705Z  247 │       return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
2026-10-25T01:04:53.8031761Z      ╰────
2026-10-25T01:04:53.8031764Z
2026-10-25T01:04:53.8032020Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-25T01:04:53.8032188Z     ╭─[apps/web/src/lib/composerContextReferences.ts:90:40]
2026-10-25T01:04:53.8032267Z  89 │   let cursor = prompt.length;
2026-10-25T01:04:53.8032372Z  90 │   for (const occurrence of occurrences.reverse()) {
2026-10-25T01:04:53.8032478Z     ·                                        ───────
2026-10-25T01:04:53.8032562Z  91 │     let { start, end } = occurrence;
2026-10-25T01:04:53.8032616Z     ╰────
2026-10-25T01:04:53.8032876Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-25T01:04:53.8032878Z
2026-10-25T01:04:53.8033083Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-25T01:04:53.8033217Z    ╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2026-10-25T01:04:53.8033292Z  2 │   AuthFilesystemReadScope,
2026-10-25T01:04:53.8033363Z  3 │   type AuthSessionState,
2026-10-25T01:04:53.8033447Z    ·        ────────┬───────
2026-10-25T01:04:53.8033594Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-25T01:04:53.8033671Z  4 │   type FilesystemBrowseEntry,
2026-10-25T01:04:53.8033723Z    ╰────
2026-10-25T01:04:53.8033820Z   help: Consider removing this import.
2026-10-25T01:04:53.8033823Z
2026-10-25T01:04:53.8034011Z   ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
2026-10-25T01:04:53.8034138Z      ╭─[packages/client-runtime/src/state/shell.ts:189:5]
2026-10-25T01:04:53.8034255Z  186 │     let waiting = yield* Ref.get(awaitingCompletion);
2026-10-25T01:04:53.8034325Z  187 │     let next = initial;
2026-10-25T01:04:53.8034400Z      ·         ──┬─
2026-10-25T01:04:53.8034527Z      ·           ╰── From this accumulator
2026-10-25T01:04:53.8034611Z  188 │     let receivedSnapshot = false;
2026-10-25T01:04:53.8034685Z  189 │     for (const item of items) {
2026-10-25T01:04:53.8034757Z      ·     ─┬─
2026-10-25T01:04:53.8034865Z      ·      ╰── For this loop
2026-10-25T01:04:53.8034958Z  190 │       if (item.kind === "synchronized") {
2026-10-25T01:04:53.8035027Z  191 │         waiting = false;
2026-10-25T01:04:53.8035121Z  192 │         if (Option.isSome(next.snapshot)) {
2026-10-25T01:04:53.8035240Z  193 │           next = { ...next, status: "live", error: Option.none() };
2026-10-25T01:04:53.8035338Z      ·                    ───┬───
2026-10-25T01:04:53.8035469Z      ·                       ╰── From this spread
2026-10-25T01:04:53.8035532Z  194 │         }
2026-10-25T01:04:53.8035587Z      ╰────
2026-10-25T01:04:53.8035744Z   help: Consider using `Object.assign()` to mutate the accumulator instead.
2026-10-25T01:04:53.8035899Z   note: Using spreads within accumulators leads to `O(n^2)` time complexity.
2026-10-25T01:04:53.8035902Z
2026-10-25T01:04:53.8036115Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-25T01:04:53.8036241Z     ╭─[apps/web/src/lib/announce.browser.test.ts:41:46]
2026-10-25T01:04:53.8036299Z  40 │
2026-10-25T01:04:53.8036407Z  41 │     expect(regionTexts()).toEqual([...first].reverse());
2026-10-25T01:04:53.8036573Z     ·                                              ───────
2026-10-25T01:04:53.8036706Z  42 │     expect(regionTexts()).toContain("Claude");
2026-10-25T01:04:53.8036760Z     ╰────
2026-10-25T01:04:53.8037015Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-25T01:04:53.8037017Z
2026-10-25T01:04:53.8037460Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-25T01:04:53.8037588Z       ╭─[apps/server/src/serverSettings.test.ts:1741:32]
2026-10-25T01:04:53.8037761Z  1740 │       const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5");
2026-10-25T01:04:53.8037951Z  1741 │       const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
2026-10-25T01:04:53.8038065Z       ·                                ───────────────────
2026-10-25T01:04:53.8038178Z  1742 │       const scriptsJson = yield* Schema.encodeEffect(
2026-10-25T01:04:53.8038234Z       ╰────
2026-10-25T01:04:53.8038237Z
2026-10-25T01:04:53.8038676Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-25T01:04:53.8038795Z       ╭─[apps/server/src/serverSettings.test.ts:1742:34]
2026-10-25T01:04:53.8038980Z  1741 │       const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
2026-10-25T01:04:53.8039089Z  1742 │       const scriptsJson = yield* Schema.encodeEffect(
2026-10-25T01:04:53.8039213Z       ·                                  ───────────────────
2026-10-25T01:04:53.8039332Z  1743 │         Schema.fromJsonString(Schema.Array(ProjectScript)),
2026-10-25T01:04:53.8039386Z       ╰────
2026-10-25T01:04:53.8039388Z
2026-10-25T01:04:53.8039557Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8039718Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76]
2026-10-25T01:04:53.8039899Z  697 │   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
2026-10-25T01:04:53.8040064Z  698 │   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
2026-10-25T01:04:53.8040204Z      ·                                                                            ─────┬────
2026-10-25T01:04:53.8040422Z      ·                                                                                 ╰── Cannot call impure function
2026-10-25T01:04:53.8040561Z  699 │   const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
2026-10-25T01:04:53.8040612Z      ╰────
2026-10-25T01:04:53.8040903Z   help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8041201Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8041203Z
2026-10-25T01:04:53.8041373Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8041533Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71]
2026-10-25T01:04:53.8041656Z  718 │   const snoozePresets = useMemo(
2026-10-25T01:04:53.8041868Z  719 │     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-25T01:04:53.8042003Z      ·                                                                       ─────┬────
2026-10-25T01:04:53.8042185Z      ·                                                                            ╰── Cannot call impure function
2026-10-25T01:04:53.8042302Z  720 │     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-25T01:04:53.8042356Z      ╰────
2026-10-25T01:04:53.8042631Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8042927Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8042932Z
2026-10-25T01:04:53.8043114Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-25T01:04:53.8043267Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6]
2026-10-25T01:04:53.8043443Z  719 │     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-25T01:04:53.8043558Z  720 │     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-25T01:04:53.8043654Z      ·      ────────────┬───────────
2026-10-25T01:04:53.8043827Z      ·                  ╰── Unnecessary dependency `props.snoozePresetMinute`
2026-10-25T01:04:53.8043886Z  721 │   );
2026-10-25T01:04:53.8043939Z      ╰────
2026-10-25T01:04:53.8044260Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T01:04:53.8044651Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8044655Z
2026-10-25T01:04:53.8044838Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-25T01:04:53.8044995Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7]
2026-10-25T01:04:53.8045067Z  765 │       thread.pinnedAt,
2026-10-25T01:04:53.8045129Z  766 │       variant,
2026-10-25T01:04:53.8045207Z      ·       ───┬───
2026-10-25T01:04:53.8045346Z      ·          ╰── Unnecessary dependency `variant`
2026-10-25T01:04:53.8045407Z  767 │     ],
2026-10-25T01:04:53.8045458Z      ╰────
2026-10-25T01:04:53.8045779Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T01:04:53.8046091Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8046093Z
2026-10-25T01:04:53.8046290Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T01:04:53.8046449Z       ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21]
2026-10-25T01:04:53.8046772Z  1215 │             {providerDrivers.slice(0, -1).map((driver, index) => (
2026-10-25T01:04:53.8046910Z  1216 │               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
2026-10-25T01:04:53.8047092Z       ·                     ──────────────────────────
2026-10-25T01:04:53.8047240Z  1217 │                 <ProviderIcon provider={driver} size={12} />
2026-10-25T01:04:53.8047293Z       ╰────
2026-10-25T01:04:53.8047448Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T01:04:53.8047451Z
2026-10-25T01:04:53.8047654Z   ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
2026-10-25T01:04:53.8047748Z     ╭─[apps/web/src/types.ts:22:3]
2026-10-25T01:04:53.8047819Z  21 │   EnvironmentThreadShell,
2026-10-25T01:04:53.8047888Z  22 │   ThreadRunSummary,
2026-10-25T01:04:53.8047972Z     ·   ────────┬───────
2026-10-25T01:04:53.8048117Z     ·           ╰── 'ThreadRunSummary' is imported here
2026-10-25T01:04:53.8048185Z  23 │   ThreadRuntimeSummary,
2026-10-25T01:04:53.8048246Z     ╰────
2026-10-25T01:04:53.8048350Z   help: Consider removing this import.
2026-10-25T01:04:53.8048353Z
2026-10-25T01:04:53.8048567Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T01:04:53.8048711Z      ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7]
2026-10-25T01:04:53.8048816Z  772 │     if (settingsSheetPresentation.isActive) {
2026-10-25T01:04:53.8048946Z  773 │       settingsRoutePresentation.present(settingsRouteSession);
2026-10-25T01:04:53.8049043Z      ·       ────────────┬────────────
2026-10-25T01:04:53.8049213Z      ·                   ╰── Missing dependency `settingsRoutePresentation`
2026-10-25T01:04:53.8049271Z  774 │     }
2026-10-25T01:04:53.8049482Z  775 │   }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
2026-10-25T01:04:53.8049596Z      ·       ────────────────┬────────────────
2026-10-25T01:04:53.8049878Z      ·                       ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
2026-10-25T01:04:53.8049931Z  776 │
2026-10-25T01:04:53.8049986Z      ╰────
2026-10-25T01:04:53.8050439Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8050749Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8050752Z
2026-10-25T01:04:53.8050911Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8051057Z      ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5]
2026-10-25T01:04:53.8051220Z  387 │     typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
2026-10-25T01:04:53.8051356Z  388 │   const animatedBorderRadius = useSharedValue(targetBorderRadius);
2026-10-25T01:04:53.8051448Z      ·         ──────────┬─────────
2026-10-25T01:04:53.8051603Z      ·                   ╰── `animatedBorderRadius` originates here
2026-10-25T01:04:53.8051761Z  389 │   const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
2026-10-25T01:04:53.8051833Z  390 │   useLayoutEffect(() => {
2026-10-25T01:04:53.8051935Z  391 │     animatedBorderRadius.value = shouldAnimate
2026-10-25T01:04:53.8052074Z      ·     ──────────┬─────────
2026-10-25T01:04:53.8052266Z      ·               ╰── `animatedBorderRadius` cannot be modified
2026-10-25T01:04:53.8052357Z  392 │       ? withTiming(targetBorderRadius, {
2026-10-25T01:04:53.8052410Z      ╰────
2026-10-25T01:04:53.8052671Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8052976Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8052978Z
2026-10-25T01:04:53.8053146Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8053268Z      ╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
2026-10-25T01:04:53.8053374Z  820 │     const resolved = resolveThreadTarget(target);
2026-10-25T01:04:53.8053535Z  821 │     if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
2026-10-25T01:04:53.8053661Z      ·                                                        ─────┬────
2026-10-25T01:04:53.8053830Z      ·                                                             ╰── Cannot call impure function
2026-10-25T01:04:53.8053909Z  822 │       return AsyncResult.failure(
2026-10-25T01:04:53.8053964Z      ╰────
2026-10-25T01:04:53.8054237Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8054527Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8054532Z
2026-10-25T01:04:53.8054705Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8054828Z      ╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
2026-10-25T01:04:53.8054901Z  708 │     const wokeAt = resolved
2026-10-25T01:04:53.8055037Z  709 │       ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
2026-10-25T01:04:53.8055150Z      ·                                              ─────┬────
2026-10-25T01:04:53.8055306Z      ·                                                   ╰── Cannot call impure function
2026-10-25T01:04:53.8055369Z  710 │       : null;
2026-10-25T01:04:53.8055421Z      ╰────
2026-10-25T01:04:53.8055690Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8056021Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8056061Z
2026-10-25T01:04:53.8056224Z   ⚠ eslint(no-control-regex): Unexpected control character
2026-10-25T01:04:53.8056415Z      ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
2026-10-25T01:04:53.8056552Z  219 │               <Text selectable className="font-mono text-sm text-foreground">
2026-10-25T01:04:53.8056689Z  220 │                 {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
2026-10-25T01:04:53.8056794Z      ·                                              ──┬─
2026-10-25T01:04:53.8056959Z      ·                                                ╰── 'U+001B' is a control character.
2026-10-25T01:04:53.8057029Z  221 │               </Text>
2026-10-25T01:04:53.8057084Z      ╰────
2026-10-25T01:04:53.8057310Z   help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.
2026-10-25T01:04:53.8057312Z
2026-10-25T01:04:53.8057568Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-25T01:04:53.8057699Z       ╭─[packages/provider-pi/src/server/adapter.ts:3405:7]
2026-10-25T01:04:53.8057753Z  3404 │
2026-10-25T01:04:53.8057939Z  3405 │ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, PiAdapterV2DriverEnv> =
2026-10-25T01:04:53.8058012Z       ·       ──┬──
2026-10-25T01:04:53.8058136Z       ·         ╰── 'layer' is declared here
2026-10-25T01:04:53.8058259Z  3406 │   Layer.effect(
2026-10-25T01:04:53.8058315Z       ╰────
2026-10-25T01:04:53.8058422Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8058425Z
2026-10-25T01:04:53.8058683Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8058869Z      ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
2026-10-25T01:04:53.8058920Z  117 │
2026-10-25T01:04:53.8058986Z  118 │   useEffect(() => {
2026-10-25T01:04:53.8059058Z      ·   ────┬────
2026-10-25T01:04:53.8059187Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8059266Z  119 │     void refreshNotifications();
2026-10-25T01:04:53.8059359Z      ·          ──────────┬─────────
2026-10-25T01:04:53.8059540Z      ·                    ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8059686Z  120 │     const subscription = AppState.addEventListener("change", (state) => {
2026-10-25T01:04:53.8059736Z      ╰────
2026-10-25T01:04:53.8060334Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8060688Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8060691Z
2026-10-25T01:04:53.8061006Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8061226Z      ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
2026-10-25T01:04:53.8061277Z  125 │
2026-10-25T01:04:53.8061342Z  126 │   useEffect(() => {
2026-10-25T01:04:53.8061413Z      ·   ────┬────
2026-10-25T01:04:53.8061541Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8061605Z  127 │     if (!isLoaded) {
2026-10-25T01:04:53.8061696Z  128 │       setLiveActivityStatus("checking");
2026-10-25T01:04:53.8061786Z      ·       ──────────┬──────────
2026-10-25T01:04:53.8061955Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8062016Z  129 │       return;
2026-10-25T01:04:53.8062069Z      ╰────
2026-10-25T01:04:53.8062659Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8062980Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8062982Z
2026-10-25T01:04:53.8063443Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-25T01:04:53.8063566Z      ╭─[packages/effect-acp/src/protocol.test.ts:500:31]
2026-10-25T01:04:53.8063622Z  499 │
2026-10-25T01:04:53.8063741Z  500 │       const response = yield* Schema.decodeUnknownEffect(
2026-10-25T01:04:53.8063859Z      ·                               ──────────────────────────
2026-10-25T01:04:53.8063966Z  501 │         Schema.fromJsonString(JsonRpcErrorResponse),
2026-10-25T01:04:53.8064019Z      ╰────
2026-10-25T01:04:53.8064022Z
2026-10-25T01:04:53.8064226Z   ⚠ eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used.
2026-10-25T01:04:53.8064382Z     ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8]
2026-10-25T01:04:53.8064463Z   9 │   hasScheduledTaskDraftChanges,
2026-10-25T01:04:53.8064533Z  10 │   type ScheduledTaskDraft,
2026-10-25T01:04:53.8064621Z     ·        ─────────┬────────
2026-10-25T01:04:53.8064780Z     ·                 ╰── 'ScheduledTaskDraft' is imported here
2026-10-25T01:04:53.8064859Z  11 │ } from "./scheduledTaskDraft";
2026-10-25T01:04:53.8064909Z     ╰────
2026-10-25T01:04:53.8065006Z   help: Consider removing this import.
2026-10-25T01:04:53.8065008Z
2026-10-25T01:04:53.8065188Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-25T01:04:53.8065344Z     ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85]
2026-10-25T01:04:53.8065445Z  80 │   const startEditor = startScheduledTaskEditor;
2026-10-25T01:04:53.8065624Z  81 │   const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
2026-10-25T01:04:53.8065768Z     ·                                                                                     ─────┬─────
2026-10-25T01:04:53.8066024Z     ·                                                                                          ╰── Unnecessary dependency `startEditor`
2026-10-25T01:04:53.8066132Z  82 │   const readEditor = useCallback(
2026-10-25T01:04:53.8066184Z     ╰────
2026-10-25T01:04:53.8066496Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T01:04:53.8066804Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8066807Z
2026-10-25T01:04:53.8066984Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-25T01:04:53.8067140Z      ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7]
2026-10-25T01:04:53.8067209Z  101 │       setEditor,
2026-10-25T01:04:53.8067276Z  102 │       startEditor,
2026-10-25T01:04:53.8067354Z      ·       ─────┬─────
2026-10-25T01:04:53.8067496Z      ·            ╰── Unnecessary dependency `startEditor`
2026-10-25T01:04:53.8067560Z  103 │       hasChanges,
2026-10-25T01:04:53.8067610Z      ╰────
2026-10-25T01:04:53.8067914Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T01:04:53.8068217Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8068220Z
2026-10-25T01:04:53.8068419Z   ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
2026-10-25T01:04:53.8068547Z     ╭─[apps/web/src/contextMenuFallback.test.ts:38:9]
2026-10-25T01:04:53.8068620Z  37 │   get isConnected() {
2026-10-25T01:04:53.8068711Z  38 │     let current: FakeElement | null = this;
2026-10-25T01:04:53.8068784Z     ·         ───────
2026-10-25T01:04:53.8068856Z  39 │     while (current?.parent) {
2026-10-25T01:04:53.8068907Z     ╰────
2026-10-25T01:04:53.8069174Z   help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
2026-10-25T01:04:53.8069177Z
2026-10-25T01:04:53.8069546Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-25T01:04:53.8069661Z       ╭─[packages/effect-acp/src/client.ts:1270:11]
2026-10-25T01:04:53.8069817Z  1269 │         extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
2026-10-25T01:04:53.8069992Z  1270 │           Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
2026-10-25T01:04:53.8070097Z       ·           ──────────────────────────
2026-10-25T01:04:53.8070244Z  1271 │             Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
2026-10-25T01:04:53.8070298Z       ╰────
2026-10-25T01:04:53.8070301Z
2026-10-25T01:04:53.8070666Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-25T01:04:53.8070781Z     ╭─[packages/effect-acp/src/schema.test.ts:18:12]
2026-10-25T01:04:53.8070941Z  17 │     const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
2026-10-25T01:04:53.8071111Z  18 │     expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
2026-10-25T01:04:53.8071220Z     ·            ─────────
2026-10-25T01:04:53.8071278Z  19 │     expect(
2026-10-25T01:04:53.8071331Z     ╰────
2026-10-25T01:04:53.8071334Z
2026-10-25T01:04:53.8071658Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-25T01:04:53.8071773Z     ╭─[packages/effect-acp/src/schema.test.ts:20:7]
2026-10-25T01:04:53.8071832Z  19 │     expect(
2026-10-25T01:04:53.8072000Z  20 │       Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
2026-10-25T01:04:53.8072073Z     ·       ─────────
2026-10-25T01:04:53.8072135Z  21 │     ).toBe(true);
2026-10-25T01:04:53.8072184Z     ╰────
2026-10-25T01:04:53.8072193Z
2026-10-25T01:04:53.8072649Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-25T01:04:53.8072770Z      ╭─[packages/effect-acp/src/errors.test.ts:129:28]
2026-10-25T01:04:53.8072864Z  128 │       const secret = "acp-summary-secret";
2026-10-25T01:04:53.8072972Z  129 │       const cause = yield* Schema.decodeUnknownEffect(
2026-10-25T01:04:53.8073086Z      ·                            ──────────────────────────
2026-10-25T01:04:53.8073157Z  130 │         Schema.Struct({
2026-10-25T01:04:53.8073207Z      ╰────
2026-10-25T01:04:53.8073210Z
2026-10-25T01:04:53.8073427Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-25T01:04:53.8073558Z      ╭─[scripts/lib/cli-external-packages.test.ts:114:11]
2026-10-25T01:04:53.8073631Z  113 │         const declared = {
2026-10-25T01:04:53.8073723Z  114 │           ...(manifest.dependencies ?? {}),
2026-10-25T01:04:53.8073834Z      ·           ────────────────────────────────
2026-10-25T01:04:53.8073935Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-25T01:04:53.8073987Z      ╰────
2026-10-25T01:04:53.8074249Z   help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-25T01:04:53.8074252Z
2026-10-25T01:04:53.8074470Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-25T01:04:53.8074593Z      ╭─[scripts/lib/cli-external-packages.test.ts:115:11]
2026-10-25T01:04:53.8074690Z  114 │           ...(manifest.dependencies ?? {}),
2026-10-25T01:04:53.8074796Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-25T01:04:53.8074917Z      ·           ────────────────────────────────────────
2026-10-25T01:04:53.8075014Z  116 │           ...(manifest.peerDependencies ?? {}),
2026-10-25T01:04:53.8075065Z      ╰────
2026-10-25T01:04:53.8075324Z   help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-25T01:04:53.8075327Z
2026-10-25T01:04:53.8075542Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-25T01:04:53.8075665Z      ╭─[scripts/lib/cli-external-packages.test.ts:116:11]
2026-10-25T01:04:53.8075764Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-25T01:04:53.8075918Z  116 │           ...(manifest.peerDependencies ?? {}),
2026-10-25T01:04:53.8076059Z      ·           ────────────────────────────────────
2026-10-25T01:04:53.8076123Z  117 │         };
2026-10-25T01:04:53.8076172Z      ╰────
2026-10-25T01:04:53.8076431Z   help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-25T01:04:53.8076434Z
2026-10-25T01:04:53.8076626Z   ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used.
2026-10-25T01:04:53.8076763Z    ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3]
2026-10-25T01:04:53.8076824Z  1 │ import type {
2026-10-25T01:04:53.8076887Z  2 │   EnvironmentId,
2026-10-25T01:04:53.8076964Z    ·   ──────┬──────
2026-10-25T01:04:53.8077108Z    ·         ╰── 'EnvironmentId' is imported here
2026-10-25T01:04:53.8077194Z  3 │   ExecutionEnvironmentCapabilities,
2026-10-25T01:04:53.8077246Z    ╰────
2026-10-25T01:04:53.8077346Z   help: Consider removing this import.
2026-10-25T01:04:53.8077348Z
2026-10-25T01:04:53.8077513Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8077646Z      ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58]
2026-10-25T01:04:53.8077780Z  139 │                             {...(weekStartsOn === undefined ? {} : { weekStartsOn })}
2026-10-25T01:04:53.8077928Z  140 │                             disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }}
2026-10-25T01:04:53.8078051Z      ·                                                          ─────┬────
2026-10-25T01:04:53.8078224Z      ·                                                               ╰── Cannot call impure function
2026-10-25T01:04:53.8078325Z  141 │                             onSelect={(selected) => {
2026-10-25T01:04:53.8078377Z      ╰────
2026-10-25T01:04:53.8078653Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8078941Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8078946Z
2026-10-25T01:04:53.8079220Z   ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
2026-10-25T01:04:53.8079349Z      ╭─[packages/provider-cursor/src/server/auth.ts:249:20]
2026-10-25T01:04:53.8079458Z  248 │     },
2026-10-25T01:04:53.8079572Z  249 │     (effect, flow, stopSessions) =>
2026-10-25T01:04:53.8079662Z      ·                    ──────┬─────
2026-10-25T01:04:53.8079807Z      ·                          ╰── 'stopSessions' is declared here
2026-10-25T01:04:53.8079872Z  250 │       effect.pipe(
2026-10-25T01:04:53.8079925Z      ╰────
2026-10-25T01:04:53.8080026Z   help: Consider removing this parameter.
2026-10-25T01:04:53.8080029Z
2026-10-25T01:04:53.8080515Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8080692Z      ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
2026-10-25T01:04:53.8080768Z  222 │         let idlePasses = 0;
2026-10-25T01:04:53.8080912Z  223 │ ╭─▶     for (;;) {
2026-10-25T01:04:53.8081055Z  224 │ │         yield* Effect.promise(() => Promise.resolve());
2026-10-25T01:04:53.8081197Z  225 │ │         const pending = backgroundRuntime.pending.shift();
2026-10-25T01:04:53.8081291Z  226 │ │         if (!pending) {
2026-10-25T01:04:53.8081382Z  227 │ │           idlePasses++;
2026-10-25T01:04:53.8081487Z  228 │ │           if (idlePasses >= 3) {
2026-10-25T01:04:53.8081573Z  229 │ │             return;
2026-10-25T01:04:53.8081650Z  230 │ │           }
2026-10-25T01:04:53.8081734Z  231 │ │           continue;
2026-10-25T01:04:53.8081817Z  232 │ │         }
2026-10-25T01:04:53.8081914Z  233 │ │         idlePasses = 0;
2026-10-25T01:04:53.8082028Z  234 │ │         const exit = yield* Effect.exit(
2026-10-25T01:04:53.8082236Z  235 │ │           pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
2026-10-25T01:04:53.8082314Z  236 │ │         );
2026-10-25T01:04:53.8082421Z  237 │ │         yield* Effect.sync(() => {
2026-10-25T01:04:53.8082527Z  238 │ │           pending.resolve(exit);
2026-10-25T01:04:53.8082602Z  239 │ │         });
2026-10-25T01:04:53.8082731Z  240 │ ╰─▶     }
2026-10-25T01:04:53.8082789Z  241 │       },
2026-10-25T01:04:53.8082840Z      ╰────
2026-10-25T01:04:53.8082843Z
2026-10-25T01:04:53.8083128Z   ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
2026-10-25T01:04:53.8083284Z     ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
2026-10-25T01:04:53.8083339Z  14 │
2026-10-25T01:04:53.8083412Z  15 │ const legacyCredentials = {
2026-10-25T01:04:53.8083496Z     ·       ────────┬────────
2026-10-25T01:04:53.8083641Z     ·               ╰── 'legacyCredentials' is declared here
2026-10-25T01:04:53.8083711Z  16 │   version: 1 as const,
2026-10-25T01:04:53.8083763Z     ╰────
2026-10-25T01:04:53.8083864Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8083868Z
2026-10-25T01:04:53.8084064Z   ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used.
2026-10-25T01:04:53.8084249Z     ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13]
2026-10-25T01:04:53.8084376Z  23 │ import * as Deferred from "effect/Deferred";
2026-10-25T01:04:53.8084465Z  24 │ import * as Duration from "effect/Duration";
2026-10-25T01:04:53.8084541Z     ·             ────┬───
2026-10-25T01:04:53.8084672Z     ·                 ╰── 'Duration' is imported here
2026-10-25T01:04:53.8084759Z  25 │ import * as Effect from "effect/Effect";
2026-10-25T01:04:53.8084812Z     ╰────
2026-10-25T01:04:53.8084906Z   help: Consider removing this import.
2026-10-25T01:04:53.8084908Z
2026-10-25T01:04:53.8085073Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8085197Z       ╭─[apps/web/src/components/Sidebar.tsx:1136:11]
2026-10-25T01:04:53.8085300Z  1135 │           foldSearchQuery(threadSearchQuery),
2026-10-25T01:04:53.8085368Z  1136 │           Date.now(),
2026-10-25T01:04:53.8085449Z       ·           ─────┬────
2026-10-25T01:04:53.8085583Z       ·                ╰── Cannot call impure function
2026-10-25T01:04:53.8085720Z  1137 │           // A list filter, as on mobile: a pick would move rows unexplained.
2026-10-25T01:04:53.8085771Z       ╰────
2026-10-25T01:04:53.8086051Z   help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8086341Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8086343Z
2026-10-25T01:04:53.8086491Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8086650Z      ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
2026-10-25T01:04:53.8086709Z  276 │
2026-10-25T01:04:53.8086890Z  277 │ ╭─▶   return createElement(RawNativeView, {
2026-10-25T01:04:53.8086984Z  278 │ │       ...nativeProps,
2026-10-25T01:04:53.8087124Z  279 │ │       refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-25T01:04:53.8087216Z  280 │ │       ref: nativeRef,
2026-10-25T01:04:53.8087343Z  281 │ ├─▶   });
2026-10-25T01:04:53.8087579Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-25T01:04:53.8087640Z  282 │     }
2026-10-25T01:04:53.8087693Z      ╰────
2026-10-25T01:04:53.8088155Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8088439Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8088441Z
2026-10-25T01:04:53.8088648Z   ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
2026-10-25T01:04:53.8088771Z     ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10]
2026-10-25T01:04:53.8088825Z  78 │
2026-10-25T01:04:53.8089007Z  79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string {
2026-10-25T01:04:53.8089201Z     ·          ────────┬───────
2026-10-25T01:04:53.8089347Z     ·                  ╰── 'describeSchedule' is declared here
2026-10-25T01:04:53.8089454Z  80 │   if (schedule.type === "webhook") return "On webhook";
2026-10-25T01:04:53.8089504Z     ╰────
2026-10-25T01:04:53.8089606Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8089608Z
2026-10-25T01:04:53.8090068Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8090246Z      ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
2026-10-25T01:04:53.8090318Z  520 │                 })).delivery;
2026-10-25T01:04:53.8090550Z  521 │ ╭─▶             while (delivery.outcome === "accepted") {
2026-10-25T01:04:53.8090667Z  522 │ │                 yield* Effect.yieldNow;
2026-10-25T01:04:53.8090813Z  523 │ │                 delivery = (yield* service.getWebhookDelivery({
2026-10-25T01:04:53.8090913Z  524 │ │                   id: task.id,
2026-10-25T01:04:53.8091027Z  525 │ │                   deliveryId: deliveryId!,
2026-10-25T01:04:53.8091125Z  526 │ │                 })).delivery;
2026-10-25T01:04:53.8091260Z  527 │ ╰─▶             }
2026-10-25T01:04:53.8091376Z  528 │                 assert.equal(delivery.outcome, "dispatch_failed");
2026-10-25T01:04:53.8091429Z      ╰────
2026-10-25T01:04:53.8091431Z
2026-10-25T01:04:53.8091580Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8091738Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
2026-10-25T01:04:53.8091894Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-25T01:04:53.8092016Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-25T01:04:53.8092137Z      ·                                      ───────────┬──────────
2026-10-25T01:04:53.8092310Z      ·                                                 ╰── Cannot access ref value during render
2026-10-25T01:04:53.8092427Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-25T01:04:53.8092478Z      ╰────
2026-10-25T01:04:53.8092941Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8093230Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8093232Z
2026-10-25T01:04:53.8093373Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8093529Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
2026-10-25T01:04:53.8093581Z  125 │
2026-10-25T01:04:53.8093690Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-25T01:04:53.8093776Z      ·        ─────────┬────────
2026-10-25T01:04:53.8093978Z      ·                 ╰── Cannot access ref value during render
2026-10-25T01:04:53.8094112Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-25T01:04:53.8094162Z      ╰────
2026-10-25T01:04:53.8094615Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8094897Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8094899Z
2026-10-25T01:04:53.8095076Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8095237Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
2026-10-25T01:04:53.8095290Z  125 │
2026-10-25T01:04:53.8095398Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-25T01:04:53.8095488Z      ·       ─────────┬─────────
2026-10-25T01:04:53.8095646Z      ·                ╰── Cannot access ref value during render
2026-10-25T01:04:53.8095747Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-25T01:04:53.8095795Z      ╰────
2026-10-25T01:04:53.8096249Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8096534Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8096536Z
2026-10-25T01:04:53.8096682Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8096840Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
2026-10-25T01:04:53.8096890Z  125 │
2026-10-25T01:04:53.8096998Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-25T01:04:53.8097110Z      ·                               ─────────┬─────────
2026-10-25T01:04:53.8097276Z      ·                                        ╰── Cannot access ref value during render
2026-10-25T01:04:53.8097373Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-25T01:04:53.8097425Z      ╰────
2026-10-25T01:04:53.8097932Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8098312Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8098315Z
2026-10-25T01:04:53.8098457Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8098610Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
2026-10-25T01:04:53.8098662Z  125 │
2026-10-25T01:04:53.8098767Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-25T01:04:53.8098879Z      ·                              ──────────┬─────────
2026-10-25T01:04:53.8099040Z      ·                                        ╰── Cannot access ref value during render
2026-10-25T01:04:53.8099144Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-25T01:04:53.8099199Z      ╰────
2026-10-25T01:04:53.8099653Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8099933Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8099938Z
2026-10-25T01:04:53.8100075Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8100230Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
2026-10-25T01:04:53.8100340Z  126 │       if (!sessionRef.current || !recorderRef.current) {
2026-10-25T01:04:53.8100573Z  127 │ ╭─▶     const recorder = createLazyVoiceRecorder({
2026-10-25T01:04:53.8100744Z  128 │ │         create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-25T01:04:53.8100868Z  129 │ │         onStatus: (status: RecordingStatus) => {
2026-10-25T01:04:53.8101020Z  130 │ │           sessionRef.current?.controller.handleRecorderStatus({
2026-10-25T01:04:53.8101137Z  131 │ │             isFinished: status.isFinished,
2026-10-25T01:04:53.8101309Z  132 │ │             hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-25T01:04:53.8101412Z  133 │ │             error: status.error,
2026-10-25T01:04:53.8101510Z  134 │ │             url: status.url,
2026-10-25T01:04:53.8101597Z  135 │ │           });
2026-10-25T01:04:53.8101676Z  136 │ │         },
2026-10-25T01:04:53.8101873Z  137 │ │         // Read when recording starts so preference changes do not re-render every composer.
2026-10-25T01:04:53.8101982Z  138 │ │         selectInput: (inputs) => {
2026-10-25T01:04:53.8102134Z  139 │ │           const preferences = registry.get(mobilePreferencesAtom);
2026-10-25T01:04:53.8102277Z  140 │ │           if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-25T01:04:53.8102441Z  141 │ │           const known = microphoneOrder(preferences.value.microphones);
2026-10-25T01:04:53.8102578Z  142 │ │           const order = rememberMicrophones(known, inputs);
2026-10-25T01:04:53.8102680Z  143 │ │           if (order !== known) {
2026-10-25T01:04:53.8102878Z  144 │ │             registry.set(updateMobilePreferencesAtom, {
2026-10-25T01:04:53.8103026Z  145 │ │               transform: (current) => ({
2026-10-25T01:04:53.8103228Z  146 │ │                 microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-25T01:04:53.8103314Z  147 │ │               }),
2026-10-25T01:04:53.8103396Z  148 │ │             });
2026-10-25T01:04:53.8103472Z  149 │ │           }
2026-10-25T01:04:53.8103613Z  150 │ │           return preferredMicrophoneInput(inputs, order);
2026-10-25T01:04:53.8103689Z  151 │ │         },
2026-10-25T01:04:53.8103819Z  152 │ ├─▶     });
2026-10-25T01:04:53.8104056Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-25T01:04:53.8104143Z  153 │         recorderRef.current = recorder;
2026-10-25T01:04:53.8104195Z      ╰────
2026-10-25T01:04:53.8104651Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8104933Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8104938Z
2026-10-25T01:04:53.8105077Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8105238Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
2026-10-25T01:04:53.8105298Z  152 │     });
2026-10-25T01:04:53.8105380Z  153 │     recorderRef.current = recorder;
2026-10-25T01:04:53.8105490Z      ·     ─────┬─────────┬───
2026-10-25T01:04:53.8105736Z      ·          │         ╰── Cannot update ref value during render
2026-10-25T01:04:53.8105887Z      ·          ╰── This value is a ref
2026-10-25T01:04:53.8105992Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-25T01:04:53.8106041Z      ╰────
2026-10-25T01:04:53.8106501Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8106791Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8106797Z
2026-10-25T01:04:53.8106941Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8107094Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
2026-10-25T01:04:53.8107178Z  153 │         recorderRef.current = recorder;
2026-10-25T01:04:53.8107366Z  154 │ ╭─▶     sessionRef.current = new VoiceInputSession({
2026-10-25T01:04:53.8107451Z  155 │ │         recorder,
2026-10-25T01:04:53.8107580Z  156 │ │         getTranscriber: getLocalVoiceTranscriber,
2026-10-25T01:04:53.8107695Z  157 │ │         requestPermission: async () => {
2026-10-25T01:04:53.8107912Z  158 │ │           const permission = await requestRecordingPermissionsAsync();
2026-10-25T01:04:53.8108135Z  159 │ │           return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-25T01:04:53.8108213Z  160 │ │         },
2026-10-25T01:04:53.8108352Z  161 │ │         configureRecording: configureVoiceRecordingAudio,
2026-10-25T01:04:53.8108487Z  162 │ │         releaseRecording: releaseVoiceRecordingAudio,
2026-10-25T01:04:53.8108620Z  163 │ │         deleteRecording: (uri) => new File(uri).delete(),
2026-10-25T01:04:53.8108732Z  164 │ │         onStateChange: (nextState) =>
2026-10-25T01:04:53.8108820Z  165 │ │           setState({
2026-10-25T01:04:53.8108927Z  166 │ │             state: nextState,
2026-10-25T01:04:53.8109068Z  167 │ │             ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-25T01:04:53.8109197Z  168 │ │             label: sessionRef.current?.label ?? null,
2026-10-25T01:04:53.8109276Z  169 │ │           }),
2026-10-25T01:04:53.8109404Z  170 │ ├─▶     });
2026-10-25T01:04:53.8109603Z      · ╰──── Cannot access ref value during render
2026-10-25T01:04:53.8109660Z  171 │       }
2026-10-25T01:04:53.8109710Z      ╰────
2026-10-25T01:04:53.8110175Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8110511Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8110514Z
2026-10-25T01:04:53.8110657Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8110813Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
2026-10-25T01:04:53.8110893Z  153 │     recorderRef.current = recorder;
2026-10-25T01:04:53.8110995Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-25T01:04:53.8111106Z      ·     ─────┬────────┬───
2026-10-25T01:04:53.8111285Z      ·          │        ╰── Cannot update ref value during render
2026-10-25T01:04:53.8111405Z      ·          ╰── This value is a ref
2026-10-25T01:04:53.8111473Z  155 │       recorder,
2026-10-25T01:04:53.8111526Z      ╰────
2026-10-25T01:04:53.8111977Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8112256Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8112260Z
2026-10-25T01:04:53.8112400Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8112555Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
2026-10-25T01:04:53.8112642Z  184 │     return () => subscription.remove();
2026-10-25T01:04:53.8112756Z  185 │   }, [controller]);
2026-10-25T01:04:53.8112862Z      ·       ─────┬────
2026-10-25T01:04:53.8113006Z      ·            ╰── Cannot access ref value during render
2026-10-25T01:04:53.8113058Z  186 │
2026-10-25T01:04:53.8113108Z      ╰────
2026-10-25T01:04:53.8113559Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8113843Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8113845Z
2026-10-25T01:04:53.8113989Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8114146Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
2026-10-25T01:04:53.8114230Z  184 │     return () => subscription.remove();
2026-10-25T01:04:53.8114293Z  185 │   }, [controller]);
2026-10-25T01:04:53.8114370Z      ·      ──────┬─────
2026-10-25T01:04:53.8114510Z      ·            ╰── Cannot access ref value during render
2026-10-25T01:04:53.8114561Z  186 │
2026-10-25T01:04:53.8114612Z      ╰────
2026-10-25T01:04:53.8115063Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8115350Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8115355Z
2026-10-25T01:04:53.8115494Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8115644Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
2026-10-25T01:04:53.8115701Z  191 │     },
2026-10-25T01:04:53.8115772Z  192 │     [controller, recorder],
2026-10-25T01:04:53.8115848Z      ·      ─────┬────
2026-10-25T01:04:53.8115986Z      ·           ╰── Cannot access ref value during render
2026-10-25T01:04:53.8116041Z  193 │   );
2026-10-25T01:04:53.8116092Z      ╰────
2026-10-25T01:04:53.8116552Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8116835Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8116841Z
2026-10-25T01:04:53.8116980Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8117135Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
2026-10-25T01:04:53.8117226Z  174 │   const controller = session.controller;
2026-10-25T01:04:53.8117314Z  175 │   const recorder = recorderRef.current;
2026-10-25T01:04:53.8117415Z      ·                    ─────────┬─────────
2026-10-25T01:04:53.8117569Z      ·                             ╰── Cannot access ref value during render
2026-10-25T01:04:53.8117622Z  176 │
2026-10-25T01:04:53.8117717Z      ╰────
2026-10-25T01:04:53.8118197Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8118479Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8118481Z
2026-10-25T01:04:53.8118621Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8118777Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
2026-10-25T01:04:53.8118847Z  191 │     },
2026-10-25T01:04:53.8118918Z  192 │     [controller, recorder],
2026-10-25T01:04:53.8119009Z      ·     ───────────┬──────────
2026-10-25T01:04:53.8119157Z      ·                ╰── Cannot access ref value during render
2026-10-25T01:04:53.8119210Z  193 │   );
2026-10-25T01:04:53.8119260Z      ╰────
2026-10-25T01:04:53.8119712Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8119994Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8119997Z
2026-10-25T01:04:53.8120137Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8120292Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
2026-10-25T01:04:53.8120395Z  245 │     return () => clearInterval(intervalId);
2026-10-25T01:04:53.8120532Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-25T01:04:53.8120620Z      ·                    ─────┬────
2026-10-25T01:04:53.8120770Z      ·                         ╰── Cannot access ref value during render
2026-10-25T01:04:53.8120824Z  247 │
2026-10-25T01:04:53.8120875Z      ╰────
2026-10-25T01:04:53.8121327Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8121613Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8121621Z
2026-10-25T01:04:53.8121758Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8121913Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
2026-10-25T01:04:53.8122002Z  245 │     return () => clearInterval(intervalId);
2026-10-25T01:04:53.8122116Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-25T01:04:53.8122244Z      ·      ────────────────────────┬───────────────────────
2026-10-25T01:04:53.8122400Z      ·                              ╰── Cannot access ref value during render
2026-10-25T01:04:53.8122454Z  247 │
2026-10-25T01:04:53.8122504Z      ╰────
2026-10-25T01:04:53.8123003Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8123318Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8123320Z
2026-10-25T01:04:53.8123462Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8123615Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
2026-10-25T01:04:53.8123683Z  260 │     setOwnerFocused,
2026-10-25T01:04:53.8123743Z  261 │     session,
2026-10-25T01:04:53.8123817Z      ·     ───┬───
2026-10-25T01:04:53.8123954Z      ·        ╰── Cannot access ref value during render
2026-10-25T01:04:53.8124011Z  262 │     stop,
2026-10-25T01:04:53.8124068Z      ╰────
2026-10-25T01:04:53.8124522Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8124807Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8124810Z
2026-10-25T01:04:53.8124952Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8125105Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
2026-10-25T01:04:53.8125159Z  250 │
2026-10-25T01:04:53.8125297Z  251 │ ╭─▶   return {
2026-10-25T01:04:53.8125511Z  252 │ │       isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
2026-10-25T01:04:53.8125591Z  253 │ │       state,
2026-10-25T01:04:53.8125681Z  254 │ │       audioLevels,
2026-10-25T01:04:53.8125774Z  255 │ │       elapsedSeconds,
2026-10-25T01:04:53.8125902Z  256 │ │       isBusy: voiceInputBlocksSubmission(state),
2026-10-25T01:04:53.8125980Z  257 │ │       ownerKey,
2026-10-25T01:04:53.8126061Z  258 │ │       label,
2026-10-25T01:04:53.8126152Z  259 │ │       focusedOwners,
2026-10-25T01:04:53.8126246Z  260 │ │       setOwnerFocused,
2026-10-25T01:04:53.8126325Z  261 │ │       session,
2026-10-25T01:04:53.8126450Z  262 │ │       stop,
2026-10-25T01:04:53.8126564Z  263 │ │       cancel,
2026-10-25T01:04:53.8126693Z  264 │ ├─▶   };
2026-10-25T01:04:53.8126887Z      · ╰──── Cannot access ref value during render
2026-10-25T01:04:53.8126942Z  265 │     }
2026-10-25T01:04:53.8126992Z      ╰────
2026-10-25T01:04:53.8127446Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8127725Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8127729Z
2026-10-25T01:04:53.8127886Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8128046Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-25T01:04:53.8128201Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-25T01:04:53.8128323Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-25T01:04:53.8128400Z      ·         ─────┬─────
2026-10-25T01:04:53.8128535Z      ·              ╰── `audioLevels` originates here
2026-10-25T01:04:53.8128654Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-25T01:04:53.8128801Z  124 │   const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
2026-10-25T01:04:53.8128853Z  125 │
2026-10-25T01:04:53.8128968Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-25T01:04:53.8129070Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-25T01:04:53.8129208Z  128 │       create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-25T01:04:53.8129301Z  129 │       onStatus: (status: RecordingStatus) => {
2026-10-25T01:04:53.8129422Z  130 │         sessionRef.current?.controller.handleRecorderStatus({
2026-10-25T01:04:53.8129508Z  131 │           isFinished: status.isFinished,
2026-10-25T01:04:53.8129648Z  132 │           hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-25T01:04:53.8129721Z  133 │           error: status.error,
2026-10-25T01:04:53.8129791Z  134 │           url: status.url,
2026-10-25T01:04:53.8129851Z  135 │         });
2026-10-25T01:04:53.8129909Z  136 │       },
2026-10-25T01:04:53.8130077Z  137 │       // Read when recording starts so preference changes do not re-render every composer.
2026-10-25T01:04:53.8130160Z  138 │       selectInput: (inputs) => {
2026-10-25T01:04:53.8130284Z  139 │         const preferences = registry.get(mobilePreferencesAtom);
2026-10-25T01:04:53.8130407Z  140 │         if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-25T01:04:53.8130565Z  141 │         const known = microphoneOrder(preferences.value.microphones);
2026-10-25T01:04:53.8130673Z  142 │         const order = rememberMicrophones(known, inputs);
2026-10-25T01:04:53.8130745Z  143 │         if (order !== known) {
2026-10-25T01:04:53.8130850Z  144 │           registry.set(updateMobilePreferencesAtom, {
2026-10-25T01:04:53.8130931Z  145 │             transform: (current) => ({
2026-10-25T01:04:53.8131102Z  146 │               microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-25T01:04:53.8131163Z  147 │             }),
2026-10-25T01:04:53.8131271Z  148 │           });
2026-10-25T01:04:53.8131355Z  149 │         }
2026-10-25T01:04:53.8131463Z  150 │         return preferredMicrophoneInput(inputs, order);
2026-10-25T01:04:53.8131521Z  151 │       },
2026-10-25T01:04:53.8131573Z  152 │     });
2026-10-25T01:04:53.8131656Z  153 │     recorderRef.current = recorder;
2026-10-25T01:04:53.8131755Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-25T01:04:53.8131817Z  155 │       recorder,
2026-10-25T01:04:53.8131914Z  156 │       getTranscriber: getLocalVoiceTranscriber,
2026-10-25T01:04:53.8132000Z  157 │       requestPermission: async () => {
2026-10-25T01:04:53.8132127Z  158 │         const permission = await requestRecordingPermissionsAsync();
2026-10-25T01:04:53.8132282Z  159 │         return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-25T01:04:53.8132336Z  160 │       },
2026-10-25T01:04:53.8132452Z  161 │       configureRecording: configureVoiceRecordingAudio,
2026-10-25T01:04:53.8132559Z  162 │       releaseRecording: releaseVoiceRecordingAudio,
2026-10-25T01:04:53.8132664Z  163 │       deleteRecording: (uri) => new File(uri).delete(),
2026-10-25T01:04:53.8132741Z  164 │       onStateChange: (nextState) =>
2026-10-25T01:04:53.8132806Z  165 │         setState({
2026-10-25T01:04:53.8132876Z  166 │           state: nextState,
2026-10-25T01:04:53.8132982Z  167 │           ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-25T01:04:53.8133078Z  168 │           label: sessionRef.current?.label ?? null,
2026-10-25T01:04:53.8133138Z  169 │         }),
2026-10-25T01:04:53.8133191Z  170 │     });
2026-10-25T01:04:53.8133246Z  171 │   }
2026-10-25T01:04:53.8133296Z  172 │
2026-10-25T01:04:53.8133381Z  173 │   const session = sessionRef.current;
2026-10-25T01:04:53.8133476Z  174 │   const controller = session.controller;
2026-10-25T01:04:53.8133563Z  175 │   const recorder = recorderRef.current;
2026-10-25T01:04:53.8133612Z  176 │
2026-10-25T01:04:53.8133677Z  177 │   useEffect(() => {
2026-10-25T01:04:53.8133826Z  178 │     const subscription = AppState.addEventListener("change", (nextState) => {
2026-10-25T01:04:53.8133965Z  179 │       // iOS reports `inactive` while its permission dialog is open. Only the
2026-10-25T01:04:53.8134099Z  180 │       // real background state cancels preparation; recorder status handles
2026-10-25T01:04:53.8134204Z  181 │       // calls and route interruptions during capture.
2026-10-25T01:04:53.8134338Z  182 │       if (nextState === "background") controller.appMovedToBackground();
2026-10-25T01:04:53.8134394Z  183 │     });
2026-10-25T01:04:53.8134478Z  184 │     return () => subscription.remove();
2026-10-25T01:04:53.8134542Z  185 │   }, [controller]);
2026-10-25T01:04:53.8134601Z  186 │
2026-10-25T01:04:53.8134662Z  187 │   useEffect(
2026-10-25T01:04:53.8134723Z  188 │     () => () => {
2026-10-25T01:04:53.8134794Z  189 │       controller.dispose();
2026-10-25T01:04:53.8134864Z  190 │       recorder.release();
2026-10-25T01:04:53.8134917Z  191 │     },
2026-10-25T01:04:53.8134987Z  192 │     [controller, recorder],
2026-10-25T01:04:53.8135042Z  193 │   );
2026-10-25T01:04:53.8135093Z  194 │
2026-10-25T01:04:53.8135154Z  195 │   useEffect(() => {
2026-10-25T01:04:53.8135248Z  196 │     if (state.phase !== "recording") return;
2026-10-25T01:04:53.8135299Z  197 │
2026-10-25T01:04:53.8135446Z  198 │     const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
2026-10-25T01:04:53.8135548Z  199 │     const activation = activateKeepAwakeAsync(tag);
2026-10-25T01:04:53.8135632Z  200 │     void activation.catch(() => {});
2026-10-25T01:04:53.8135760Z  201 │     return () => {
2026-10-25T01:04:53.8135941Z  202 │       // Release after activation settles, even if the recording ends immediately.
2026-10-25T01:04:53.8136076Z  203 │       void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
2026-10-25T01:04:53.8136132Z  204 │     };
2026-10-25T01:04:53.8136212Z  205 │   }, [keepAwakeId, state.phase]);
2026-10-25T01:04:53.8136262Z  206 │
2026-10-25T01:04:53.8136325Z  207 │   useEffect(() => {
2026-10-25T01:04:53.8136515Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-25T01:04:53.8136566Z  209 │
2026-10-25T01:04:53.8136689Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-25T01:04:53.8136848Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-25T01:04:53.8136952Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-25T01:04:53.8137035Z      ·       ─────┬─────
2026-10-25T01:04:53.8137174Z      ·            ╰── `audioLevels` cannot be modified
2026-10-25T01:04:53.8137229Z  213 │     }
2026-10-25T01:04:53.8137281Z      ╰────
2026-10-25T01:04:53.8137547Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8137849Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8137853Z
2026-10-25T01:04:53.8138049Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-25T01:04:53.8138250Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-25T01:04:53.8138307Z  206 │
2026-10-25T01:04:53.8138376Z  207 │   useEffect(() => {
2026-10-25T01:04:53.8138451Z      ·             ───┬───
2026-10-25T01:04:53.8138668Z      ·                ╰── This function may (indirectly) reassign or modify `audioLevels` after render
2026-10-25T01:04:53.8138801Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-25T01:04:53.8138853Z  209 │
2026-10-25T01:04:53.8138971Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-25T01:04:53.8139121Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-25T01:04:53.8139223Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-25T01:04:53.8139299Z      ·       ─────┬─────
2026-10-25T01:04:53.8139430Z      ·            ╰── This modifies `audioLevels`
2026-10-25T01:04:53.8139491Z  213 │     }
2026-10-25T01:04:53.8139546Z      ╰────
2026-10-25T01:04:53.8139880Z   help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-25T01:04:53.8140180Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8140183Z
2026-10-25T01:04:53.8140340Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8140546Z     ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
2026-10-25T01:04:53.8140600Z  90 │ }) {
2026-10-25T01:04:53.8140710Z  91 │   const rotation = useSharedValue(props.hidden ? 1 : 0);
2026-10-25T01:04:53.8140853Z     ·         ────┬───
2026-10-25T01:04:53.8141021Z     ·             ╰── `rotation` originates here
2026-10-25T01:04:53.8141091Z  92 │   useLayoutEffect(() => {
2026-10-25T01:04:53.8141230Z  93 │     rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
2026-10-25T01:04:53.8141300Z     ·     ────┬───
2026-10-25T01:04:53.8141432Z     ·         ╰── `rotation` cannot be modified
2026-10-25T01:04:53.8141509Z  94 │   }, [props.hidden, rotation]);
2026-10-25T01:04:53.8141557Z     ╰────
2026-10-25T01:04:53.8141819Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8142124Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8142129Z
2026-10-25T01:04:53.8142283Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8142453Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
2026-10-25T01:04:53.8142544Z  266 │   const variant = props.variant ?? "plain";
2026-10-25T01:04:53.8142682Z  267 │   const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
2026-10-25T01:04:53.8142768Z      ·         ────────┬────────
2026-10-25T01:04:53.8142913Z      ·                 ╰── `loadingVisibility` originates here
2026-10-25T01:04:53.8142980Z  268 │   useLayoutEffect(() => {
2026-10-25T01:04:53.8143138Z  269 │     loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
2026-10-25T01:04:53.8143219Z      ·     ────────┬────────
2026-10-25T01:04:53.8143372Z      ·             ╰── `loadingVisibility` cannot be modified
2026-10-25T01:04:53.8143464Z  270 │   }, [loadingVisibility, props.loading]);
2026-10-25T01:04:53.8143516Z      ╰────
2026-10-25T01:04:53.8143775Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8144076Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8144079Z
2026-10-25T01:04:53.8144228Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8144395Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
2026-10-25T01:04:53.8144451Z  325 │ }) {
2026-10-25T01:04:53.8144612Z  326 │   const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
2026-10-25T01:04:53.8144703Z      ·         ─────────┬─────────
2026-10-25T01:04:53.8144851Z      ·                  ╰── `recordingVisibility` originates here
2026-10-25T01:04:53.8144923Z  327 │   useLayoutEffect(() => {
2026-10-25T01:04:53.8145107Z  328 │     recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
2026-10-25T01:04:53.8145192Z      ·     ─────────┬─────────
2026-10-25T01:04:53.8145343Z      ·              ╰── `recordingVisibility` cannot be modified
2026-10-25T01:04:53.8145434Z  329 │   }, [props.phase, recordingVisibility]);
2026-10-25T01:04:53.8145485Z      ╰────
2026-10-25T01:04:53.8145800Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8146125Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8146127Z
2026-10-25T01:04:53.8146278Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8146444Z     ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
2026-10-25T01:04:53.8146547Z  65 │   const [expanded, setExpanded] = useState(false);
2026-10-25T01:04:53.8146629Z  66 │   const progress = useSharedValue(0);
2026-10-25T01:04:53.8146703Z     ·         ────┬───
2026-10-25T01:04:53.8146835Z     ·             ╰── `progress` originates here
2026-10-25T01:04:53.8146901Z  67 │   useEffect(() => {
2026-10-25T01:04:53.8147026Z  68 │     progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
2026-10-25T01:04:53.8147101Z     ·     ────┬───
2026-10-25T01:04:53.8147232Z     ·         ╰── `progress` cannot be modified
2026-10-25T01:04:53.8147306Z  69 │   }, [expanded, progress]);
2026-10-25T01:04:53.8147356Z     ╰────
2026-10-25T01:04:53.8147617Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8147913Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8147916Z
2026-10-25T01:04:53.8148173Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8148348Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7]
2026-10-25T01:04:53.8148404Z  328 │   };
2026-10-25T01:04:53.8148471Z  329 │   useEffect(() => {
2026-10-25T01:04:53.8148541Z      ·   ────┬────
2026-10-25T01:04:53.8148669Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8148772Z  330 │     if (!guidesEnabled && section === "guide") {
2026-10-25T01:04:53.8148867Z  331 │       requestedSection.current = "overview";
2026-10-25T01:04:53.8149030Z  332 │       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-25T01:04:53.8149102Z  333 │       setSection("overview");
2026-10-25T01:04:53.8149177Z      ·       ─────┬────
2026-10-25T01:04:53.8149350Z      ·            ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8149408Z  334 │     }
2026-10-25T01:04:53.8149457Z      ╰────
2026-10-25T01:04:53.8150047Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8150376Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8150378Z
2026-10-25T01:04:53.8150614Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-25T01:04:53.8150781Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6]
2026-10-25T01:04:53.8150928Z  330 │     if (!guidesEnabled && section === "guide") {
2026-10-25T01:04:53.8151050Z  331 │       requestedSection.current = "overview";
2026-10-25T01:04:53.8151132Z      ·       ────────┬───────
2026-10-25T01:04:53.8151574Z      ·               ╰── Missing dependency `requestedSection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T01:04:53.8151735Z  332 │       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-25T01:04:53.8151880Z      ·       ─────────┬─────────           ──────┬──────
2026-10-25T01:04:53.8152379Z      ·                │                          ╰── Missing dependency `scrollOffsets`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T01:04:53.8152822Z      ·                ╰── Missing dependency `currentScrollOffset`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T01:04:53.8152897Z  333 │       setSection("overview");
2026-10-25T01:04:53.8152951Z  334 │     }
2026-10-25T01:04:53.8153041Z  335 │   }, [guidesEnabled, section, insets.top]);
2026-10-25T01:04:53.8153153Z      ·      ──────────────────┬─────────────────
2026-10-25T01:04:53.8153341Z      ·                        ╰── This dependency list is missing values used by the callback
2026-10-25T01:04:53.8153434Z  336 │   const tabContent = activityContent;
2026-10-25T01:04:53.8153486Z      ╰────
2026-10-25T01:04:53.8153651Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-25T01:04:53.8153958Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8153961Z
2026-10-25T01:04:53.8154161Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-25T01:04:53.8154326Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6]
2026-10-25T01:04:53.8154384Z  860 │     if (
2026-10-25T01:04:53.8154501Z  861 │       lastSelection.current.path === route.params.path &&
2026-10-25T01:04:53.8154580Z      ·       ──────┬──────
2026-10-25T01:04:53.8155052Z      ·             ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T01:04:53.8155209Z  862 │       lastSelection.current.id === route.params.fileSelectionId
2026-10-25T01:04:53.8155264Z  863 │     )
2026-10-25T01:04:53.8155325Z  864 │       return;
2026-10-25T01:04:53.8155500Z  865 │     lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
2026-10-25T01:04:53.8155632Z  866 │     if (route.params.focus) navigation.setParams({ focus: undefined });
2026-10-25T01:04:53.8155718Z  867 │     setJumpPath(route.params.path);
2026-10-25T01:04:53.8155791Z  868 │     setSelectedRowId(null);
2026-10-25T01:04:53.8155869Z  869 │     jumpStarted.current = false;
2026-10-25T01:04:53.8156016Z  870 │     const file = data.files.find((entry) => entry.path === route.params.path);
2026-10-25T01:04:53.8156112Z  871 │     if (!file || !nativeView.current) return;
2026-10-25T01:04:53.8156200Z      ·                   ─────┬────
2026-10-25T01:04:53.8156627Z      ·                        ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T01:04:53.8156752Z  872 │     setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
2026-10-25T01:04:53.8156832Z  873 │     jumpStarted.current = true;
2026-10-25T01:04:53.8156973Z  874 │     void nativeView.current.scrollToFile(file.id, false).catch(() => {
2026-10-25T01:04:53.8157053Z  875 │       jumpStarted.current = false;
2026-10-25T01:04:53.8157107Z  876 │     });
2026-10-25T01:04:53.8157306Z  877 │   }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
2026-10-25T01:04:53.8157505Z      ·      ──────────────────────────────────────────────┬──────────────────────────────────────────────
2026-10-25T01:04:53.8157722Z      ·                                                    ╰── This dependency list is missing values used by the callback
2026-10-25T01:04:53.8157829Z  878 │   const appliedFilter = useRef(filter.hideTestFiles);
2026-10-25T01:04:53.8157882Z      ╰────
2026-10-25T01:04:53.8158048Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-25T01:04:53.8158356Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8158358Z
2026-10-25T01:04:53.8158508Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8158674Z     ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
2026-10-25T01:04:53.8158756Z  26 │   const latestInput = useRef(input);
2026-10-25T01:04:53.8158834Z  27 │   latestInput.current = input;
2026-10-25T01:04:53.8158946Z     ·   ─────┬─────────┬───
2026-10-25T01:04:53.8159123Z     ·        │         ╰── Cannot update ref value during render
2026-10-25T01:04:53.8159238Z     ·        ╰── This value is a ref
2026-10-25T01:04:53.8159313Z  28 │   const mounted = useRef(true);
2026-10-25T01:04:53.8159365Z     ╰────
2026-10-25T01:04:53.8159872Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8160187Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8160190Z
2026-10-25T01:04:53.8160332Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8160513Z      ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27]
2026-10-25T01:04:53.8160574Z  493 │         >
2026-10-25T01:04:53.8160650Z  494 │           {props.children(close)}
2026-10-25T01:04:53.8160739Z      ·                           ──┬──
2026-10-25T01:04:53.8160895Z      ·                             ╰── Cannot access ref value during render
2026-10-25T01:04:53.8160977Z  495 │         </ReanimatedSwipeable>
2026-10-25T01:04:53.8161031Z      ╰────
2026-10-25T01:04:53.8161487Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8161771Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8161774Z
2026-10-25T01:04:53.8161957Z   ⚠ react(static-components): Cannot create components during render
2026-10-25T01:04:53.8162114Z      ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
2026-10-25T01:04:53.8162201Z  196 │   const { onInput, onResize } = props;
2026-10-25T01:04:53.8162352Z  197 │   const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
2026-10-25T01:04:53.8162483Z      ·                                     ────────────────┬───────────────
2026-10-25T01:04:53.8162669Z      ·                                                     ╰── The component is created during render here
2026-10-25T01:04:53.8162794Z  198 │   const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
2026-10-25T01:04:53.8162847Z  199 │
2026-10-25T01:04:53.8162913Z  200 │   useEffect(() => {
2026-10-25T01:04:53.8162999Z  201 │     terminalDebugLog("native:surface", {
2026-10-25T01:04:53.8163084Z  202 │       terminalKey: props.terminalKey,
2026-10-25T01:04:53.8163162Z  203 │       native: hasNativeSurface,
2026-10-25T01:04:53.8163297Z  204 │       hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
2026-10-25T01:04:53.8163378Z  205 │       bufferLen: props.buffer.length,
2026-10-25T01:04:53.8163463Z  206 │       isRunning: props.isRunning,
2026-10-25T01:04:53.8163524Z  207 │     });
2026-10-25T01:04:53.8163681Z  208 │   }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
2026-10-25T01:04:53.8163767Z  209 │   const handleNativeInput = useCallback(
2026-10-25T01:04:53.8163883Z  210 │     (event: NativeSyntheticEvent<TerminalInputEvent>) => {
2026-10-25T01:04:53.8163982Z  211 │       if (!props.isRunning || props.readOnly) {
2026-10-25T01:04:53.8164043Z  212 │         return;
2026-10-25T01:04:53.8164096Z  213 │       }
2026-10-25T01:04:53.8164186Z  214 │       terminalDebugLog("native:onInput", {
2026-10-25T01:04:53.8164341Z  215 │         codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
2026-10-25T01:04:53.8164398Z  216 │       });
2026-10-25T01:04:53.8164482Z  217 │       onInput(event.nativeEvent.data);
2026-10-25T01:04:53.8164594Z  218 │     },
2026-10-25T01:04:53.8164811Z  219 │     [onInput, props.isRunning, props.readOnly],
2026-10-25T01:04:53.8164864Z  220 │   );
2026-10-25T01:04:53.8164950Z  221 │   const handleNativeResize = useCallback(
2026-10-25T01:04:53.8165066Z  222 │     (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
2026-10-25T01:04:53.8165127Z  223 │       onResize({
2026-10-25T01:04:53.8165210Z  224 │         cols: event.nativeEvent.cols,
2026-10-25T01:04:53.8165290Z  225 │         rows: event.nativeEvent.rows,
2026-10-25T01:04:53.8165347Z  226 │       });
2026-10-25T01:04:53.8165404Z  227 │     },
2026-10-25T01:04:53.8165461Z  228 │     [onResize],
2026-10-25T01:04:53.8165514Z  229 │   );
2026-10-25T01:04:53.8165566Z  230 │
2026-10-25T01:04:53.8165649Z  231 │   if (NativeTerminalSurfaceView) {
2026-10-25T01:04:53.8165705Z  232 │     return (
2026-10-25T01:04:53.8165792Z  233 │       <View style={props.style}>
2026-10-25T01:04:53.8165874Z  234 │         <NativeTerminalSurfaceView
2026-10-25T01:04:53.8165977Z      ·          ────────────┬────────────
2026-10-25T01:04:53.8166134Z      ·                      ╰── This component is created during render
2026-10-25T01:04:53.8166229Z  235 │           appearanceScheme={themeAppearance}
2026-10-25T01:04:53.8166283Z      ╰────
2026-10-25T01:04:53.8166526Z   help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-25T01:04:53.8166838Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-25T01:04:53.8166843Z
2026-10-25T01:04:53.8167072Z   ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-25T01:04:53.8167248Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2144:15]
2026-10-25T01:04:53.8167318Z  2143 │       assert.equal(
2026-10-25T01:04:53.8167465Z  2144 │         items.filter((item) => item.type === "assistant_message").at(-1)?.text,
2026-10-25T01:04:53.8167542Z       ·               ──────
2026-10-25T01:04:53.8167621Z  2145 │         "authoritative answer",
2026-10-25T01:04:53.8167676Z       ╰────
2026-10-25T01:04:53.8167846Z   help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-25T01:04:53.8167849Z
2026-10-25T01:04:53.8168312Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8168483Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4246:7]
2026-10-25T01:04:53.8168661Z  4245 │           const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
2026-10-25T01:04:53.8168867Z  4246 │ ╭─▶       while (!responseLifecycle.includes("failed")) {
2026-10-25T01:04:53.8168973Z  4247 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8169107Z  4248 │ ╰─▶       }
2026-10-25T01:04:53.8169226Z  4249 │           const responseExit = yield* Fiber.join(responseFiber);
2026-10-25T01:04:53.8169277Z       ╰────
2026-10-25T01:04:53.8169280Z
2026-10-25T01:04:53.8169785Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8169982Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6357:9]
2026-10-25T01:04:53.8170069Z  6356 │               .pipe(Effect.forkScoped);
2026-10-25T01:04:53.8170251Z  6357 │ ╭─▶         while (promptGates.length < 1) {
2026-10-25T01:04:53.8170385Z  6358 │ │             yield* Effect.yieldNow;
2026-10-25T01:04:53.8170517Z  6359 │ ╰─▶         }
2026-10-25T01:04:53.8170686Z  6360 │             assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
2026-10-25T01:04:53.8170737Z       ╰────
2026-10-25T01:04:53.8170740Z
2026-10-25T01:04:53.8171196Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8171363Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6492:9]
2026-10-25T01:04:53.8171447Z  6491 │               .pipe(Effect.forkScoped);
2026-10-25T01:04:53.8171626Z  6492 │ ╭─▶         while (promptGates.length < 2) {
2026-10-25T01:04:53.8171734Z  6493 │ │             yield* Effect.yieldNow;
2026-10-25T01:04:53.8171867Z  6494 │ ╰─▶         }
2026-10-25T01:04:53.8172027Z  6495 │             if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
2026-10-25T01:04:53.8172083Z       ╰────
2026-10-25T01:04:53.8172088Z
2026-10-25T01:04:53.8172314Z   ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used.
2026-10-25T01:04:53.8172441Z     ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8]
2026-10-25T01:04:53.8172509Z  14 │   threadSearchMatchKey,
2026-10-25T01:04:53.8172600Z  15 │   type EnvironmentThreadSearchMatch,
2026-10-25T01:04:53.8172705Z     ·        ──────────────┬─────────────
2026-10-25T01:04:53.8172879Z     ·                      ╰── 'EnvironmentThreadSearchMatch' is imported here
2026-10-25T01:04:53.8172986Z  16 │ } from "@t3tools/client-runtime/state/thread-search";
2026-10-25T01:04:53.8173038Z     ╰────
2026-10-25T01:04:53.8173136Z   help: Consider removing this import.
2026-10-25T01:04:53.8173138Z
2026-10-25T01:04:53.8173342Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8173473Z      ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25]
2026-10-25T01:04:53.8173604Z  526 │     // range) the boundary string is identical and the chain would die.
2026-10-25T01:04:53.8173694Z  527 │   }, [nextSnoozeWakeAt, snoozeWakeTick]);
2026-10-25T01:04:53.8173796Z      ·                         ───────┬──────
2026-10-25T01:04:53.8173959Z      ·                                ╰── Unnecessary dependency `snoozeWakeTick`
2026-10-25T01:04:53.8174095Z  528 │   const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase();
2026-10-25T01:04:53.8174146Z      ╰────
2026-10-25T01:04:53.8174485Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8174818Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8174821Z
2026-10-25T01:04:53.8174984Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8175112Z      ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53]
2026-10-25T01:04:53.8175198Z  517 │     if (Number.isNaN(wakeAtMs)) return;
2026-10-25T01:04:53.8175358Z  518 │     const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
2026-10-25T01:04:53.8175477Z      ·                                                     ─────┬────
2026-10-25T01:04:53.8175646Z      ·                                                          ╰── Cannot call impure function
2026-10-25T01:04:53.8175728Z  519 │     const id = setTimeout(() => {
2026-10-25T01:04:53.8175779Z      ╰────
2026-10-25T01:04:53.8176056Z   help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8176346Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8176348Z
2026-10-25T01:04:53.8176604Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8176760Z      ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
2026-10-25T01:04:53.8178577Z  112 │   const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
2026-10-25T01:04:53.8178656Z  113 │   useEffect(() => {
2026-10-25T01:04:53.8178734Z      ·   ────┬────
2026-10-25T01:04:53.8178866Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8179031Z  114 │     if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
2026-10-25T01:04:53.8179092Z  115 │       return;
2026-10-25T01:04:53.8179147Z  116 │     }
2026-10-25T01:04:53.8179263Z  117 │     setEntry({ key: input.targetKey, location: candidate });
2026-10-25T01:04:53.8179336Z      ·     ────┬───
2026-10-25T01:04:53.8179499Z      ·         ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8179620Z  118 │   }, [candidate, entry.key, entry.location, input.targetKey]);
2026-10-25T01:04:53.8179673Z      ╰────
2026-10-25T01:04:53.8180384Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8180758Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8180761Z
2026-10-25T01:04:53.8181015Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-25T01:04:53.8181184Z        ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10691:7]
2026-10-25T01:04:53.8181240Z  10690 │
2026-10-25T01:04:53.8181314Z  10691 │ const layer: Layer.Layer<
2026-10-25T01:04:53.8181387Z        ·       ──┬──
2026-10-25T01:04:53.8181516Z        ·         ╰── 'layer' is declared here
2026-10-25T01:04:53.8181611Z  10692 │   ProviderAdapter.ProviderAdapterV2,
2026-10-25T01:04:53.8181664Z        ╰────
2026-10-25T01:04:53.8181766Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8181768Z
2026-10-25T01:04:53.8182023Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8182190Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
2026-10-25T01:04:53.8182242Z  638 │
2026-10-25T01:04:53.8182306Z  639 │   useEffect(() => {
2026-10-25T01:04:53.8182375Z      ·   ────┬────
2026-10-25T01:04:53.8182507Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8182617Z  640 │     if (pendingLaunchEntry.key === launchTargetKey) {
2026-10-25T01:04:53.8182676Z  641 │       return;
2026-10-25T01:04:53.8182731Z  642 │     }
2026-10-25T01:04:53.8182804Z  643 │     setPendingLaunchEntry({
2026-10-25T01:04:53.8182892Z      ·     ──────────┬──────────
2026-10-25T01:04:53.8183061Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8183131Z  644 │       key: launchTargetKey,
2026-10-25T01:04:53.8183183Z      ╰────
2026-10-25T01:04:53.8183780Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8184098Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8184101Z
2026-10-25T01:04:53.8184352Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8184519Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
2026-10-25T01:04:53.8184571Z  648 │
2026-10-25T01:04:53.8184637Z  649 │   useEffect(() => {
2026-10-25T01:04:53.8184705Z      ·   ────┬────
2026-10-25T01:04:53.8184831Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8184944Z  650 │     if (initialAttachGridEntry.key === launchTargetKey) {
2026-10-25T01:04:53.8185052Z  651 │       return;
2026-10-25T01:04:53.8185138Z  652 │     }
2026-10-25T01:04:53.8185220Z  653 │     setInitialAttachGridEntry({
2026-10-25T01:04:53.8185314Z      ·     ────────────┬────────────
2026-10-25T01:04:53.8185485Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8185552Z  654 │       key: launchTargetKey,
2026-10-25T01:04:53.8185603Z      ╰────
2026-10-25T01:04:53.8186183Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8186501Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8186507Z
2026-10-25T01:04:53.8186757Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8186920Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
2026-10-25T01:04:53.8186973Z  743 │
2026-10-25T01:04:53.8187036Z  744 │   useEffect(() => {
2026-10-25T01:04:53.8187104Z      ·   ────┬────
2026-10-25T01:04:53.8187230Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8187329Z  745 │     if (!routeEnvironmentId || !routeThreadId) {
2026-10-25T01:04:53.8187397Z  746 │       setLastGridSize({
2026-10-25T01:04:53.8187477Z      ·       ───────┬───────
2026-10-25T01:04:53.8187648Z      ·              ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8187733Z  747 │         cols: DEFAULT_TERMINAL_COLS,
2026-10-25T01:04:53.8187783Z      ╰────
2026-10-25T01:04:53.8188362Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8188673Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8188676Z
2026-10-25T01:04:53.8188873Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8189043Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
2026-10-25T01:04:53.8189100Z  537 │     });
2026-10-25T01:04:53.8189221Z  538 │   }, [terminal.buffer, terminal.buffer.length, terminalKey]);
2026-10-25T01:04:53.8189330Z      ·                        ───────────┬──────────
2026-10-25T01:04:53.8189572Z      ·                                   ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
2026-10-25T01:04:53.8189733Z  539 │   const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
2026-10-25T01:04:53.8189785Z      ╰────
2026-10-25T01:04:53.8190071Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8190455Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8190489Z
2026-10-25T01:04:53.8190692Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8190857Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
2026-10-25T01:04:53.8190951Z  708 │     sentInitialInputKeyRef.current = null;
2026-10-25T01:04:53.8191017Z  709 │   }, [terminalKey]);
2026-10-25T01:04:53.8191093Z      ·       ─────┬─────
2026-10-25T01:04:53.8191233Z      ·            ╰── Unnecessary dependency `terminalKey`
2026-10-25T01:04:53.8191283Z  710 │
2026-10-25T01:04:53.8191334Z      ╰────
2026-10-25T01:04:53.8191625Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8191933Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8191936Z
2026-10-25T01:04:53.8192130Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8192292Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
2026-10-25T01:04:53.8192349Z  799 │     };
2026-10-25T01:04:53.8192524Z  800 │   }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
2026-10-25T01:04:53.8192702Z      ·                                                    ────────────┬────────────  ─────┬─────
2026-10-25T01:04:53.8192935Z      ·                                                                │                   ╰── Unnecessary dependency `terminalKey`
2026-10-25T01:04:53.8193147Z      ·                                                                ╰── Unnecessary dependency `terminal.lifecycleVersion`
2026-10-25T01:04:53.8193199Z  801 │
2026-10-25T01:04:53.8193249Z      ╰────
2026-10-25T01:04:53.8193534Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8193839Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8193842Z
2026-10-25T01:04:53.8193988Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8194158Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
2026-10-25T01:04:53.8194213Z  792 │   }
2026-10-25T01:04:53.8194317Z  793 │   const pasteSession = pasteSessionRef.current;
2026-10-25T01:04:53.8194429Z      ·                        ───────────┬───────────
2026-10-25T01:04:53.8194590Z      ·                                   ╰── Cannot access ref value during render
2026-10-25T01:04:53.8194642Z  794 │
2026-10-25T01:04:53.8194690Z      ╰────
2026-10-25T01:04:53.8195151Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8195488Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8195525Z
2026-10-25T01:04:53.8195719Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T01:04:53.8195874Z     ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
2026-10-25T01:04:53.8195938Z  71 │             <Pressable
2026-10-25T01:04:53.8196005Z  72 │               key={index}
2026-10-25T01:04:53.8196090Z     ·               ───────────
2026-10-25T01:04:53.8196175Z  73 │               accessibilityRole="button"
2026-10-25T01:04:53.8196225Z     ╰────
2026-10-25T01:04:53.8196370Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T01:04:53.8196373Z
2026-10-25T01:04:53.8196633Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8196775Z      ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
2026-10-25T01:04:53.8196825Z  150 │
2026-10-25T01:04:53.8196889Z  151 │   useEffect(() => {
2026-10-25T01:04:53.8196960Z      ·   ────┬────
2026-10-25T01:04:53.8197088Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8197168Z  152 │     if (!controlledSelectedPath) {
2026-10-25T01:04:53.8197229Z  153 │       return;
2026-10-25T01:04:53.8197283Z  154 │     }
2026-10-25T01:04:53.8197362Z  155 │     setExpandedPaths((current) => {
2026-10-25T01:04:53.8197444Z      ·     ────────┬───────
2026-10-25T01:04:53.8197617Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8197741Z  156 │       const ancestors = ancestorPaths(controlledSelectedPath);
2026-10-25T01:04:53.8197791Z      ╰────
2026-10-25T01:04:53.8198376Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8198693Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8198695Z
2026-10-25T01:04:53.8199023Z   ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
2026-10-25T01:04:53.8199190Z       ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7]
2026-10-25T01:04:53.8199245Z  1443 │
2026-10-25T01:04:53.8199359Z  1444 │ const layerCodexAppServerClientFactoryCommand = (
2026-10-25T01:04:53.8199476Z       ·       ───────────────────┬───────────────────
2026-10-25T01:04:53.8199677Z       ·                          ╰── 'layerCodexAppServerClientFactoryCommand' is declared here
2026-10-25T01:04:53.8199796Z  1445 │   options: CodexClient.CodexAppServerClientOptions & {
2026-10-25T01:04:53.8199846Z       ╰────
2026-10-25T01:04:53.8199950Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8199953Z
2026-10-25T01:04:53.8200206Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-25T01:04:53.8200440Z       ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7]
2026-10-25T01:04:53.8200539Z  1679 │
2026-10-25T01:04:53.8200612Z  1680 │ const layer: Layer.Layer<
2026-10-25T01:04:53.8200680Z       ·       ──┬──
2026-10-25T01:04:53.8200804Z       ·         ╰── 'layer' is declared here
2026-10-25T01:04:53.8200896Z  1681 │   ProviderAdapter.ProviderAdapterV2,
2026-10-25T01:04:53.8200949Z       ╰────
2026-10-25T01:04:53.8201052Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8201054Z
2026-10-25T01:04:53.8201250Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8201393Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
2026-10-25T01:04:53.8201490Z  256 │     return () => cancelAnimationFrame(frame);
2026-10-25T01:04:53.8201576Z  257 │   }, [props.path, targetIndex]);
2026-10-25T01:04:53.8201654Z      ·       ─────┬────
2026-10-25T01:04:53.8201794Z      ·            ╰── Unnecessary dependency `props.path`
2026-10-25T01:04:53.8201852Z  258 │
2026-10-25T01:04:53.8201902Z      ╰────
2026-10-25T01:04:53.8202190Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8202493Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8202498Z
2026-10-25T01:04:53.8202687Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T01:04:53.8202836Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
2026-10-25T01:04:53.8202913Z  292 │                     <SourceText
2026-10-25T01:04:53.8203013Z  293 │                       key={`${index}:${tokenIndex}`}
2026-10-25T01:04:53.8203126Z      ·                       ──────────────────────────────
2026-10-25T01:04:53.8203197Z  294 │                       style={{
2026-10-25T01:04:53.8203246Z      ╰────
2026-10-25T01:04:53.8203389Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T01:04:53.8203393Z
2026-10-25T01:04:53.8203579Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T01:04:53.8203722Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
2026-10-25T01:04:53.8203787Z  308 │             return (
2026-10-25T01:04:53.8203920Z  309 │               <SourceText key={index}>
2026-10-25T01:04:53.8204047Z      ·                           ───────────
2026-10-25T01:04:53.8204114Z  310 │                 {body}
2026-10-25T01:04:53.8204165Z      ╰────
2026-10-25T01:04:53.8204308Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T01:04:53.8204310Z
2026-10-25T01:04:53.8204558Z   ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
2026-10-25T01:04:53.8204735Z      ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
2026-10-25T01:04:53.8204787Z  959 │
2026-10-25T01:04:53.8204895Z  960 │ function layerClaudeAgentSdkReplayQueryRunner(
2026-10-25T01:04:53.8205006Z      ·          ──────────────────┬─────────────────
2026-10-25T01:04:53.8205206Z      ·                            ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here
2026-10-25T01:04:53.8205310Z  961 │   transcript: ClaudeAgentSdkReplayTranscript,
2026-10-25T01:04:53.8205361Z      ╰────
2026-10-25T01:04:53.8205460Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8205462Z
2026-10-25T01:04:53.8205716Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8205877Z      ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5]
2026-10-25T01:04:53.8205995Z  277 │   const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
2026-10-25T01:04:53.8206059Z  278 │   useEffect(() => {
2026-10-25T01:04:53.8206129Z      ·   ────┬────
2026-10-25T01:04:53.8206257Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8206346Z  279 │     setNow(new Date().toISOString());
2026-10-25T01:04:53.8206415Z      ·     ───┬──
2026-10-25T01:04:53.8206578Z      ·        ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8206715Z  280 │     const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
2026-10-25T01:04:53.8206766Z      ╰────
2026-10-25T01:04:53.8207349Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8207669Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8207674Z
2026-10-25T01:04:53.8207898Z   ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used.
2026-10-25T01:04:53.8208055Z     ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8]
2026-10-25T01:04:53.8208125Z  12 │   threadSearchMatchKey,
2026-10-25T01:04:53.8208207Z  13 │   type EnvironmentThreadSearchMatch,
2026-10-25T01:04:53.8208309Z     ·        ──────────────┬─────────────
2026-10-25T01:04:53.8208481Z     ·                      ╰── 'EnvironmentThreadSearchMatch' is imported here
2026-10-25T01:04:53.8208588Z  14 │ } from "@t3tools/client-runtime/state/thread-search";
2026-10-25T01:04:53.8208638Z     ╰────
2026-10-25T01:04:53.8208735Z   help: Consider removing this import.
2026-10-25T01:04:53.8208738Z
2026-10-25T01:04:53.8208986Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8209176Z      ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25]
2026-10-25T01:04:53.8209305Z  358 │     // range) the boundary string is identical and the chain would die.
2026-10-25T01:04:53.8209393Z  359 │   }, [nextSnoozeWakeAt, snoozeWakeTick]);
2026-10-25T01:04:53.8209492Z      ·                         ───────┬──────
2026-10-25T01:04:53.8209654Z      ·                                ╰── Unnecessary dependency `snoozeWakeTick`
2026-10-25T01:04:53.8209766Z  360 │   const listItems = ((): readonly SidebarListItem[] => {
2026-10-25T01:04:53.8209815Z      ╰────
2026-10-25T01:04:53.8210108Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8210427Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8210430Z
2026-10-25T01:04:53.8210624Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8210784Z      ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53]
2026-10-25T01:04:53.8210870Z  349 │     if (Number.isNaN(wakeAtMs)) return;
2026-10-25T01:04:53.8211023Z  350 │     const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
2026-10-25T01:04:53.8211142Z      ·                                                     ─────┬────
2026-10-25T01:04:53.8211308Z      ·                                                          ╰── Cannot call impure function
2026-10-25T01:04:53.8211389Z  351 │     const id = setTimeout(() => {
2026-10-25T01:04:53.8211439Z      ╰────
2026-10-25T01:04:53.8211718Z   help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8212005Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8212007Z
2026-10-25T01:04:53.8212275Z   ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
2026-10-25T01:04:53.8212417Z     ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
2026-10-25T01:04:53.8212471Z  60 │ ) {
2026-10-25T01:04:53.8212642Z  61 │   const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
2026-10-25T01:04:53.8212723Z     ·         ──────┬──────
2026-10-25T01:04:53.8212859Z     ·               ╰── 'useDragRegion' is declared here
2026-10-25T01:04:53.8212950Z  62 │   const isInline = props.mode === "inline";
2026-10-25T01:04:53.8213000Z     ╰────
2026-10-25T01:04:53.8213101Z   help: Consider removing this declaration.
2026-10-25T01:04:53.8213104Z
2026-10-25T01:04:53.8213563Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8213710Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
2026-10-25T01:04:53.8213821Z  168 │           });
2026-10-25T01:04:53.8214047Z  169 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-25T01:04:53.8214236Z  170 │ │           if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
2026-10-25T01:04:53.8214342Z  171 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8214472Z  172 │ ╰─▶       }
2026-10-25T01:04:53.8214527Z  173 │
2026-10-25T01:04:53.8214577Z      ╰────
2026-10-25T01:04:53.8214579Z
2026-10-25T01:04:53.8215031Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8215182Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
2026-10-25T01:04:53.8215299Z  177 │           yield* Deferred.succeed(releaseSave, undefined);
2026-10-25T01:04:53.8215487Z  178 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-25T01:04:53.8215619Z  179 │ │           if ((yield* Ref.get(saved)).length > 0) break;
2026-10-25T01:04:53.8215722Z  180 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8215853Z  181 │ ╰─▶       }
2026-10-25T01:04:53.8215907Z  182 │
2026-10-25T01:04:53.8215957Z      ╰────
2026-10-25T01:04:53.8215959Z
2026-10-25T01:04:53.8216414Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8216560Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
2026-10-25T01:04:53.8216685Z  306 │           yield* Deferred.succeed(releaseUnenrichedSave, undefined);
2026-10-25T01:04:53.8216872Z  307 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-25T01:04:53.8216994Z  308 │ │           const values = yield* Ref.get(saved);
2026-10-25T01:04:53.8217185Z  309 │ │           if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
2026-10-25T01:04:53.8217270Z  310 │ │             break;
2026-10-25T01:04:53.8217347Z  311 │ │           }
2026-10-25T01:04:53.8217457Z  312 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8217589Z  313 │ ╰─▶       }
2026-10-25T01:04:53.8217644Z  314 │
2026-10-25T01:04:53.8217693Z      ╰────
2026-10-25T01:04:53.8217695Z
2026-10-25T01:04:53.8217897Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-25T01:04:53.8218061Z    ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
2026-10-25T01:04:53.8218136Z  3 │   AuthProvidersManageScope,
2026-10-25T01:04:53.8218349Z  4 │   type AuthSessionState,
2026-10-25T01:04:53.8218435Z    ·        ────────┬───────
2026-10-25T01:04:53.8218581Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-25T01:04:53.8218649Z  5 │   type EnvironmentId,
2026-10-25T01:04:53.8218768Z    ╰────
2026-10-25T01:04:53.8218910Z   help: Consider removing this import.
2026-10-25T01:04:53.8218912Z
2026-10-25T01:04:53.8219362Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8219515Z       ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7]
2026-10-25T01:04:53.8219607Z  1741 │           yield* harness.replaceSession;
2026-10-25T01:04:53.8219810Z  1742 │ ╭─▶       for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T01:04:53.8219962Z  1743 │ │           if ((yield* Ref.get(harness.subscriptionCount)) >= 2) {
2026-10-25T01:04:53.8220054Z  1744 │ │             break;
2026-10-25T01:04:53.8220135Z  1745 │ │           }
2026-10-25T01:04:53.8220238Z  1746 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8220398Z  1747 │ ╰─▶       }
2026-10-25T01:04:53.8220472Z  1748 │           yield* Queue.offer(
2026-10-25T01:04:53.8220524Z       ╰────
2026-10-25T01:04:53.8220526Z
2026-10-25T01:04:53.8220974Z   ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T01:04:53.8221128Z       ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7]
2026-10-25T01:04:53.8221216Z  1850 │           yield* harness.replaceSession;
2026-10-25T01:04:53.8221421Z  1851 │ ╭─▶       for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T01:04:53.8221581Z  1852 │ │           if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break;
2026-10-25T01:04:53.8221683Z  1853 │ │           yield* Effect.yieldNow;
2026-10-25T01:04:53.8221814Z  1854 │ ╰─▶       }
2026-10-25T01:04:53.8221941Z  1855 │           expect(yield* Ref.get(harness.subscriptionCount)).toBe(2);
2026-10-25T01:04:53.8221994Z       ╰────
2026-10-25T01:04:53.8221996Z
2026-10-25T01:04:53.8222250Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8222409Z      ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
2026-10-25T01:04:53.8222475Z  434 │       : null;
2026-10-25T01:04:53.8222542Z  435 │   useEffect(() => {
2026-10-25T01:04:53.8222614Z      ·   ────┬────
2026-10-25T01:04:53.8222742Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8222800Z  436 │     if (
2026-10-25T01:04:53.8222876Z  437 │       props.active === false ||
2026-10-25T01:04:53.8222951Z  438 │       activeDraftKey !== null ||
2026-10-25T01:04:53.8223032Z  439 │       editingPendingTask !== null ||
2026-10-25T01:04:53.8223107Z  440 │       selectedProject === null
2026-10-25T01:04:53.8223163Z  441 │     ) {
2026-10-25T01:04:53.8223221Z  442 │       return;
2026-10-25T01:04:53.8223275Z  443 │     }
2026-10-25T01:04:53.8223343Z  444 │     setActiveDraftKey(
2026-10-25T01:04:53.8223423Z      ·     ────────┬────────
2026-10-25T01:04:53.8223644Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8223752Z  445 │       createNewTaskDraft({
2026-10-25T01:04:53.8223802Z      ╰────
2026-10-25T01:04:53.8224389Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8224706Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8224709Z
2026-10-25T01:04:53.8224947Z   ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-25T01:04:53.8225114Z       ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
2026-10-25T01:04:53.8225222Z  1243 │     <ActiveNewTaskContext value={activeNewTask}>
2026-10-25T01:04:53.8225412Z  1244 │       <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
2026-10-25T01:04:53.8225521Z       ·                                    ─────────────
2026-10-25T01:04:53.8225595Z  1245 │     </ActiveNewTaskContext>
2026-10-25T01:04:53.8225646Z       ╰────
2026-10-25T01:04:53.8225867Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-25T01:04:53.8226004Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-25T01:04:53.8226007Z
2026-10-25T01:04:53.8226166Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8226312Z      ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5]
2026-10-25T01:04:53.8226455Z  170 │   const expandedAngle = props.collapsedDirection === "right" ? 90 : 180;
2026-10-25T01:04:53.8226588Z  171 │   const rotation = useSharedValue(props.expanded ? expandedAngle : 0);
2026-10-25T01:04:53.8226664Z      ·         ────┬───
2026-10-25T01:04:53.8226796Z      ·             ╰── `rotation` originates here
2026-10-25T01:04:53.8226847Z  172 │
2026-10-25T01:04:53.8226913Z  173 │   useLayoutEffect(() => {
2026-10-25T01:04:53.8227047Z  174 │     rotation.value = withTiming(props.expanded ? expandedAngle : 0, {
2026-10-25T01:04:53.8227118Z      ·     ────┬───
2026-10-25T01:04:53.8227249Z      ·         ╰── `rotation` cannot be modified
2026-10-25T01:04:53.8227393Z  175 │       duration: THREAD_DISCLOSURE_TRANSITION_MS,
2026-10-25T01:04:53.8227476Z      ╰────
2026-10-25T01:04:53.8227738Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8228039Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8228041Z
2026-10-25T01:04:53.8228231Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T01:04:53.8228380Z       ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23]
2026-10-25T01:04:53.8228447Z  1245 │                     <Text
2026-10-25T01:04:53.8228541Z  1246 │                       key={`${index}:${line}`}
2026-10-25T01:04:53.8228658Z       ·                       ────────────────────────
2026-10-25T01:04:53.8228736Z  1247 │                       selectable
2026-10-25T01:04:53.8228787Z       ╰────
2026-10-25T01:04:53.8228936Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T01:04:53.8228938Z
2026-10-25T01:04:53.8229194Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8229351Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-25T01:04:53.8229415Z  259 │     .join("|");
2026-10-25T01:04:53.8229479Z  260 │   useEffect(() => {
2026-10-25T01:04:53.8229549Z      ·   ────┬────
2026-10-25T01:04:53.8229673Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8229740Z  261 │     stop();
2026-10-25T01:04:53.8229813Z      ·     ──┬─
2026-10-25T01:04:53.8229975Z      ·       ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8230042Z  262 │   }, [orderVersion]);
2026-10-25T01:04:53.8230092Z      ╰────
2026-10-25T01:04:53.8230705Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8231021Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8231023Z
2026-10-25T01:04:53.8231236Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T01:04:53.8231398Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-25T01:04:53.8231463Z  260 │   useEffect(() => {
2026-10-25T01:04:53.8231522Z  261 │     stop();
2026-10-25T01:04:53.8231587Z      ·     ──┬─
2026-10-25T01:04:53.8231710Z      ·       ╰── Missing dependency `stop`
2026-10-25T01:04:53.8231775Z  262 │   }, [orderVersion]);
2026-10-25T01:04:53.8231855Z      ·       ──────┬─────
2026-10-25T01:04:53.8232000Z      ·             ╰── Unnecessary dependency `orderVersion`
2026-10-25T01:04:53.8232061Z  263 │   useEffect(
2026-10-25T01:04:53.8232112Z      ╰────
2026-10-25T01:04:53.8232577Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8232916Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8232918Z
2026-10-25T01:04:53.8233059Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8233214Z     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
2026-10-25T01:04:53.8233292Z  95 │   const latest = useRef(props);
2026-10-25T01:04:53.8233361Z  96 │   latest.current = props;
2026-10-25T01:04:53.8233462Z     ·   ───┬──────┬───
2026-10-25T01:04:53.8233644Z     ·      │      ╰── Cannot update ref value during render
2026-10-25T01:04:53.8233762Z     ·      ╰── This value is a ref
2026-10-25T01:04:53.8233830Z  97 │   const gesture = useMemo(
2026-10-25T01:04:53.8233879Z     ╰────
2026-10-25T01:04:53.8234337Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8234627Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8234629Z
2026-10-25T01:04:53.8234770Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8234931Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
2026-10-25T01:04:53.8234997Z  103 │         .runOnJS(true)
2026-10-25T01:04:53.8235096Z  104 │         .onStart(() => latest.current.onStart())
2026-10-25T01:04:53.8235210Z      ·                  ───────────────┬──────────────
2026-10-25T01:04:53.8235408Z      ·                                 ╰── Passing a ref to a function may read its value during render
2026-10-25T01:04:53.8235538Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8235591Z      ╰────
2026-10-25T01:04:53.8236048Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8236338Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8236343Z
2026-10-25T01:04:53.8236485Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8236640Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
2026-10-25T01:04:53.8236737Z  104 │         .onStart(() => latest.current.onStart())
2026-10-25T01:04:53.8236870Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8237012Z      ·                   ──────────────────────────┬─────────────────────────
2026-10-25T01:04:53.8237216Z      ·                                             ╰── Passing a ref to a function may read its value during render
2026-10-25T01:04:53.8237387Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8237469Z      ╰────
2026-10-25T01:04:53.8237923Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8238204Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8238208Z
2026-10-25T01:04:53.8238345Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8238501Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
2026-10-25T01:04:53.8238629Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8238755Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8238894Z      ·                ──────────────────────────┬─────────────────────────
2026-10-25T01:04:53.8239094Z      ·                                          ╰── Passing a ref to a function may read its value during render
2026-10-25T01:04:53.8239219Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-25T01:04:53.8239269Z      ╰────
2026-10-25T01:04:53.8239721Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8240008Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8240012Z
2026-10-25T01:04:53.8240152Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8240308Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
2026-10-25T01:04:53.8240454Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8240573Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-25T01:04:53.8240709Z      ·                     ───────────────────────┬──────────────────────
2026-10-25T01:04:53.8240912Z      ·                                            ╰── Passing a ref to a function may read its value during render
2026-10-25T01:04:53.8240979Z  108 │     [props.disabled],
2026-10-25T01:04:53.8241028Z      ╰────
2026-10-25T01:04:53.8241491Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8241775Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8241778Z
2026-10-25T01:04:53.8241918Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8242073Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9]
2026-10-25T01:04:53.8242183Z  248 │   const latest = useRef({ rows, planners, moveThread });
2026-10-25T01:04:53.8242288Z  249 │   latest.current = { rows, planners, moveThread };
2026-10-25T01:04:53.8242517Z      ·   ───┬──────┬───
2026-10-25T01:04:53.8242723Z      ·      │      ╰── Cannot update ref value during render
2026-10-25T01:04:53.8242836Z      ·      ╰── This value is a ref
2026-10-25T01:04:53.8242889Z  250 │
2026-10-25T01:04:53.8242940Z      ╰────
2026-10-25T01:04:53.8243395Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8243675Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8243680Z
2026-10-25T01:04:53.8243823Z   ⚠ react(refs): Cannot access refs during render
2026-10-25T01:04:53.8243980Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22]
2026-10-25T01:04:53.8244097Z  246 │   const [preview, setPreview] = useState<Drag | null>(null);
2026-10-25T01:04:53.8244209Z  247 │   const translateY = useRef(new Animated.Value(0)).current;
2026-10-25T01:04:53.8244332Z      ·                      ──────────────────┬──────────────────
2026-10-25T01:04:53.8244500Z      ·                                        ╰── Cannot access ref value during render
2026-10-25T01:04:53.8244608Z  248 │   const latest = useRef({ rows, planners, moveThread });
2026-10-25T01:04:53.8244660Z      ╰────
2026-10-25T01:04:53.8245118Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T01:04:53.8245404Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T01:04:53.8245407Z
2026-10-25T01:04:53.8245572Z   ⚠ react(purity): Cannot call impure function during render
2026-10-25T01:04:53.8245729Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16]
2026-10-25T01:04:53.8245793Z  323 │     update(0);
2026-10-25T01:04:53.8245871Z  324 │     let last = performance.now();
2026-10-25T01:04:53.8245968Z      ·                ────────┬────────
2026-10-25T01:04:53.8246105Z      ·                        ╰── Cannot call impure function
2026-10-25T01:04:53.8246174Z  325 │     const tick = () => {
2026-10-25T01:04:53.8246270Z      ╰────
2026-10-25T01:04:53.8246595Z   help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T01:04:53.8246883Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T01:04:53.8246885Z
2026-10-25T01:04:53.8247073Z   ⚠ react(capitalized-calls): Capitalized function called without JSX
2026-10-25T01:04:53.8247227Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
2026-10-25T01:04:53.8247287Z   98 │     () =>
2026-10-25T01:04:53.8247353Z   99 │       Gesture.Pan()
2026-10-25T01:04:53.8247427Z      ·               ─┬─
2026-10-25T01:04:53.8247561Z      ·                ╰── `Pan` may be a component
2026-10-25T01:04:53.8247642Z  100 │         .enabled(!props.disabled)
2026-10-25T01:04:53.8247693Z      ╰────
2026-10-25T01:04:53.8247963Z   help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
2026-10-25T01:04:53.8248397Z   note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-25T01:04:53.8248401Z
2026-10-25T01:04:53.8248584Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-25T01:04:53.8248739Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
2026-10-25T01:04:53.8248810Z  103 │         .runOnJS(true)
2026-10-25T01:04:53.8248912Z  104 │         .onStart(() => latest.current.onStart())
2026-10-25T01:04:53.8248996Z      ·                        ───┬──
2026-10-25T01:04:53.8249423Z      ·                           ╰── Missing dependency `latest`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T01:04:53.8249554Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8249676Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-25T01:04:53.8249795Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-25T01:04:53.8249863Z  108 │     [props.disabled],
2026-10-25T01:04:53.8249944Z      ·     ────────┬───────
2026-10-25T01:04:53.8250134Z      ·             ╰── This dependency list is missing values used by the callback
2026-10-25T01:04:53.8250190Z  109 │   );
2026-10-25T01:04:53.8250242Z      ╰────
2026-10-25T01:04:53.8250483Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-25T01:04:53.8250791Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8250793Z
2026-10-25T01:04:53.8250994Z   ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor.
2026-10-25T01:04:53.8251115Z      ╭─[apps/desktop/src/preview/Manager.test.ts:158:18]
2026-10-25T01:04:53.8251216Z  157 │       BrowserWindow: browserWindowConstructor,
2026-10-25T01:04:53.8251427Z  158 │ ╭─▶   ClipboardItem: class {
2026-10-25T01:04:53.8251588Z  159 │ │       constructor(data: Record<string, unknown>) {
2026-10-25T01:04:53.8251704Z  160 │ │         clipboardItemConstructor(data);
2026-10-25T01:04:53.8251778Z  161 │ │       }
2026-10-25T01:04:53.8251902Z  162 │ ╰─▶   },
2026-10-25T01:04:53.8251967Z  163 │       clipboard: {
2026-10-25T01:04:53.8252016Z      ╰────
2026-10-25T01:04:53.8252182Z   help: Try replacing this class with a standalone function or deleting it entirely
2026-10-25T01:04:53.8252185Z
2026-10-25T01:04:53.8252440Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8252619Z     ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
2026-10-25T01:04:53.8252673Z  58 │
2026-10-25T01:04:53.8252737Z  59 │   useEffect(() => {
2026-10-25T01:04:53.8252808Z     ·   ────┬────
2026-10-25T01:04:53.8252935Z     ·       ╰── This is the containing effect
2026-10-25T01:04:53.8253015Z  60 │     setMountedModes((current) => {
2026-10-25T01:04:53.8253095Z     ·     ───────┬───────
2026-10-25T01:04:53.8253262Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8253342Z  61 │       if (current.has(props.mode)) {
2026-10-25T01:04:53.8253392Z     ╰────
2026-10-25T01:04:53.8253986Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8254304Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8254306Z
2026-10-25T01:04:53.8254559Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8254709Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5]
2026-10-25T01:04:53.8254767Z  568 │   }, []);
2026-10-25T01:04:53.8254832Z  569 │   useEffect(() => {
2026-10-25T01:04:53.8254904Z      ·   ────┬────
2026-10-25T01:04:53.8255037Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8255122Z  570 │     setKeyboardStateSuspect(false);
2026-10-25T01:04:53.8255213Z      ·     ───────────┬───────────
2026-10-25T01:04:53.8255383Z      ·                ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8255484Z  571 │   }, [isKeyboardVisible, liveKeyboardHeight]);
2026-10-25T01:04:53.8255532Z      ╰────
2026-10-25T01:04:53.8256124Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8256492Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8256526Z
2026-10-25T01:04:53.8256778Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8256927Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7]
2026-10-25T01:04:53.8257079Z  963 │   const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
2026-10-25T01:04:53.8257144Z  964 │   useEffect(() => {
2026-10-25T01:04:53.8257215Z      ·   ────┬────
2026-10-25T01:04:53.8257341Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8257496Z  965 │     if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
2026-10-25T01:04:53.8257607Z  966 │       setLastKnownKeyboardHeight(liveKeyboardHeight);
2026-10-25T01:04:53.8257709Z      ·       ─────────────┬────────────
2026-10-25T01:04:53.8257884Z      ·                    ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8257938Z  967 │     }
2026-10-25T01:04:53.8257988Z      ╰────
2026-10-25T01:04:53.8258627Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8258940Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8258942Z
2026-10-25T01:04:53.8259198Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8259351Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5]
2026-10-25T01:04:53.8259405Z  1220 │
2026-10-25T01:04:53.8259470Z  1221 │   useEffect(() => {
2026-10-25T01:04:53.8259543Z       ·   ────┬────
2026-10-25T01:04:53.8259670Z       ·       ╰── This is the containing effect
2026-10-25T01:04:53.8259747Z  1222 │     setAnchorMessageId(null);
2026-10-25T01:04:53.8259830Z       ·     ─────────┬────────
2026-10-25T01:04:53.8260000Z       ·              ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8260079Z  1223 │     setSubmittedMessageId(null);
2026-10-25T01:04:53.8260133Z       ╰────
2026-10-25T01:04:53.8260763Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8261082Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8261084Z
2026-10-25T01:04:53.8261280Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8261426Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7]
2026-10-25T01:04:53.8261511Z  570 │     setKeyboardStateSuspect(false);
2026-10-25T01:04:53.8261609Z  571 │   }, [isKeyboardVisible, liveKeyboardHeight]);
2026-10-25T01:04:53.8261806Z      ·       ────────┬────────  ─────────┬────────
2026-10-25T01:04:53.8262044Z      ·               │                   ╰── Unnecessary dependency `liveKeyboardHeight`
2026-10-25T01:04:53.8262200Z      ·               ╰── Unnecessary dependency `isKeyboardVisible`
2026-10-25T01:04:53.8262326Z  572 │   const handleOwnedInputFocusChange = (focused: boolean) => {
2026-10-25T01:04:53.8262378Z      ╰────
2026-10-25T01:04:53.8262671Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8262974Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8262982Z
2026-10-25T01:04:53.8263181Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8263332Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7]
2026-10-25T01:04:53.8263417Z  1169 │     userInputInsetProgress.set(1);
2026-10-25T01:04:53.8263576Z  1170 │   }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
2026-10-25T01:04:53.8263670Z       ·       ────────────┬───────────
2026-10-25T01:04:53.8263847Z       ·                   ╰── Unnecessary dependency `activeUserInputRequestId`
2026-10-25T01:04:53.8263954Z  1171 │   const showContent = props.showContent ?? true;
2026-10-25T01:04:53.8264003Z       ╰────
2026-10-25T01:04:53.8264294Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8264600Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8264602Z
2026-10-25T01:04:53.8264800Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8264954Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15]
2026-10-25T01:04:53.8265021Z  1227 │     freeze.set(false);
2026-10-25T01:04:53.8265102Z  1228 │   }, [freeze, selectedThreadKey]);
2026-10-25T01:04:53.8265196Z       ·               ────────┬────────
2026-10-25T01:04:53.8265357Z       ·                       ╰── Unnecessary dependency `selectedThreadKey`
2026-10-25T01:04:53.8265408Z  1229 │
2026-10-25T01:04:53.8265464Z       ╰────
2026-10-25T01:04:53.8265756Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8266062Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8266064Z
2026-10-25T01:04:53.8266215Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8266365Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5]
2026-10-25T01:04:53.8266474Z  1053 │   const composerPopoverHeight = useSharedValue(0);
2026-10-25T01:04:53.8266581Z  1054 │   const floatingControlCoverage = useSharedValue(
2026-10-25T01:04:53.8266721Z       ·         ───────────┬───────────
2026-10-25T01:04:53.8266910Z       ·                    ╰── `floatingControlCoverage` originates here
2026-10-25T01:04:53.8267038Z  1055 │     showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
2026-10-25T01:04:53.8267093Z  1056 │   );
2026-10-25T01:04:53.8267157Z  1057 │   useEffect(() => {
2026-10-25T01:04:53.8267262Z  1058 │     floatingControlCoverage.value = withTiming(
2026-10-25T01:04:53.8267352Z       ·     ───────────┬───────────
2026-10-25T01:04:53.8267514Z       ·                ╰── `floatingControlCoverage` cannot be modified
2026-10-25T01:04:53.8267638Z  1059 │       showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
2026-10-25T01:04:53.8267691Z       ╰────
2026-10-25T01:04:53.8267960Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8268262Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8268264Z
2026-10-25T01:04:53.8268418Z   ⚠ react(immutability): This value cannot be modified
2026-10-25T01:04:53.8268565Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7]
2026-10-25T01:04:53.8268750Z  1066 │   const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
2026-10-25T01:04:53.8268874Z  1067 │   const combinedContentInsetEndAdjustment = useSharedValue(
2026-10-25T01:04:53.8268984Z       ·         ────────────────┬────────────────
2026-10-25T01:04:53.8269172Z       ·                         ╰── `combinedContentInsetEndAdjustment` originates here
2026-10-25T01:04:53.8269304Z  1068 │     Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
2026-10-25T01:04:53.8269358Z  1069 │   );
2026-10-25T01:04:53.8269428Z  1070 │   useAnimatedReaction(
2026-10-25T01:04:53.8269486Z  1071 │     () =>
2026-10-25T01:04:53.8269578Z  1072 │       contentInsetEndAdjustment.value +
2026-10-25T01:04:53.8269667Z  1073 │       floatingControlCoverage.value +
2026-10-25T01:04:53.8269859Z  1074 │       (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
2026-10-25T01:04:53.8269921Z  1075 │     (value) => {
2026-10-25T01:04:53.8270034Z  1076 │       combinedContentInsetEndAdjustment.value = value;
2026-10-25T01:04:53.8270142Z       ·       ────────────────┬────────────────
2026-10-25T01:04:53.8270399Z       ·                       ╰── `combinedContentInsetEndAdjustment` cannot be modified
2026-10-25T01:04:53.8270502Z  1077 │     },
2026-10-25T01:04:53.8270558Z       ╰────
2026-10-25T01:04:53.8270818Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T01:04:53.8271119Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T01:04:53.8271122Z
2026-10-25T01:04:53.8271375Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8271510Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2189:5]
2026-10-25T01:04:53.8271565Z  2187 │   );
2026-10-25T01:04:53.8271632Z  2188 │   useEffect(() => {
2026-10-25T01:04:53.8271708Z       ·   ────┬────
2026-10-25T01:04:53.8271838Z       ·       ╰── This is the containing effect
2026-10-25T01:04:53.8271912Z  2189 │     setExpandedVideo(null);
2026-10-25T01:04:53.8271993Z       ·     ────────┬───────
2026-10-25T01:04:53.8272161Z       ·             ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8272233Z  2190 │     setExpandedFile(null);
2026-10-25T01:04:53.8272284Z       ╰────
2026-10-25T01:04:53.8272868Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8273187Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8273192Z
2026-10-25T01:04:53.8273442Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8273576Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2694:9]
2026-10-25T01:04:53.8273712Z  2685 │   const stopFollowingEnd = useEffectEvent(() => setEndFollow(false));
2026-10-25T01:04:53.8273777Z  2686 │   useEffect(() => {
2026-10-25T01:04:53.8273847Z       ·   ────┬────
2026-10-25T01:04:53.8273976Z       ·       ╰── This is the containing effect
2026-10-25T01:04:53.8274103Z  2687 │     if (!jumpToMessageId || loadedListKey !== listMountKey) return;
2026-10-25T01:04:53.8274204Z  2688 │     const index = presentedFeed.findIndex(
2026-10-25T01:04:53.8274338Z  2689 │       (entry) => entry.type === "message" && entry.id === jumpToMessageId,
2026-10-25T01:04:53.8274393Z  2690 │     );
2026-10-25T01:04:53.8274463Z  2691 │     if (index === -1) {
2026-10-25T01:04:53.8274590Z  2692 │       const runId = messageFoldRunId(props.feed, jumpToMessageId);
2026-10-25T01:04:53.8274689Z  2693 │       if (runId && !expandedTurnIds.has(runId)) {
2026-10-25T01:04:53.8274782Z  2694 │         setInteractionState((current) => ({
2026-10-25T01:04:53.8274871Z       ·         ─────────┬─────────
2026-10-25T01:04:53.8275046Z       ·                  ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8275110Z  2695 │           ...current,
2026-10-25T01:04:53.8275161Z       ╰────
2026-10-25T01:04:53.8275798Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8276144Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8276147Z
2026-10-25T01:04:53.8276371Z   ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
2026-10-25T01:04:53.8276501Z     ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10]
2026-10-25T01:04:53.8276637Z  69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
2026-10-25T01:04:53.8276778Z  70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
2026-10-25T01:04:53.8276877Z     ·          ───────────┬───────────
2026-10-25T01:04:53.8277040Z     ·                     ╰── 'isMarkdownFileLinkLabel' is imported here
2026-10-25T01:04:53.8277194Z  71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
2026-10-25T01:04:53.8277245Z     ╰────
2026-10-25T01:04:53.8277342Z   help: Consider removing this import.
2026-10-25T01:04:53.8277345Z
2026-10-25T01:04:53.8277549Z   ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
2026-10-25T01:04:53.8277677Z     ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3]
2026-10-25T01:04:53.8277734Z  95 │ import {
2026-10-25T01:04:53.8277799Z  96 │   createContext,
2026-10-25T01:04:53.8277874Z     ·   ──────┬──────
2026-10-25T01:04:53.8278011Z     ·         ╰── 'createContext' is imported here
2026-10-25T01:04:53.8278072Z  97 │   memo,
2026-10-25T01:04:53.8278122Z     ╰────
2026-10-25T01:04:53.8278217Z   help: Consider removing this import.
2026-10-25T01:04:53.8278221Z
2026-10-25T01:04:53.8278426Z   ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
2026-10-25T01:04:53.8278558Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3]
2026-10-25T01:04:53.8278615Z  111 │ import {
2026-10-25T01:04:53.8278684Z  112 │   ActivityIndicator,
2026-10-25T01:04:53.8278765Z      ·   ────────┬────────
2026-10-25T01:04:53.8278906Z      ·           ╰── 'ActivityIndicator' is imported here
2026-10-25T01:04:53.8278963Z  113 │   Image,
2026-10-25T01:04:53.8279014Z      ╰────
2026-10-25T01:04:53.8279115Z   help: Consider removing this import.
2026-10-25T01:04:53.8279119Z
2026-10-25T01:04:53.8279315Z   ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
2026-10-25T01:04:53.8279446Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3]
2026-10-25T01:04:53.8279508Z  118 │   Pressable,
2026-10-25T01:04:53.8279568Z  119 │   ScrollView,
2026-10-25T01:04:53.8279640Z      ·   ─────┬────
2026-10-25T01:04:53.8279770Z      ·        ╰── 'ScrollView' is imported here
2026-10-25T01:04:53.8279831Z  120 │   StyleSheet,
2026-10-25T01:04:53.8279880Z      ╰────
2026-10-25T01:04:53.8279975Z   help: Consider removing this import.
2026-10-25T01:04:53.8279977Z
2026-10-25T01:04:53.8280225Z   ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
2026-10-25T01:04:53.8280397Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11]
2026-10-25T01:04:53.8280477Z  120 │   StyleSheet,
2026-10-25T01:04:53.8280544Z  121 │   Text as NativeText,
2026-10-25T01:04:53.8280624Z      ·           ─────┬────
2026-10-25T01:04:53.8280761Z      ·                ╰── 'NativeText' is imported here
2026-10-25T01:04:53.8280824Z  122 │   type ColorValue,
2026-10-25T01:04:53.8280874Z      ╰────
2026-10-25T01:04:53.8280968Z   help: Consider removing this import.
2026-10-25T01:04:53.8280970Z
2026-10-25T01:04:53.8281181Z   ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
2026-10-25T01:04:53.8281310Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10]
2026-10-25T01:04:53.8281449Z  143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
2026-10-25T01:04:53.8281577Z  144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
2026-10-25T01:04:53.8281665Z      ·          ─────────┬────────
2026-10-25T01:04:53.8281814Z      ·                   ╰── 'tryOpenExternalUrl' is imported here
2026-10-25T01:04:53.8281958Z  145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
2026-10-25T01:04:53.8282008Z      ╰────
2026-10-25T01:04:53.8282103Z   help: Consider removing this import.
2026-10-25T01:04:53.8282105Z
2026-10-25T01:04:53.8282316Z   ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
2026-10-25T01:04:53.8282447Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10]
2026-10-25T01:04:53.8282583Z  146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
2026-10-25T01:04:53.8282709Z  147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
2026-10-25T01:04:53.8282797Z      ·          ─────────┬─────────
2026-10-25T01:04:53.8282947Z      ·                   ╰── 'faviconUrlForOrigin' is imported here
2026-10-25T01:04:53.8283004Z  148 │ import {
2026-10-25T01:04:53.8283055Z      ╰────
2026-10-25T01:04:53.8283146Z   help: Consider removing this import.
2026-10-25T01:04:53.8283149Z
2026-10-25T01:04:53.8283358Z   ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
2026-10-25T01:04:53.8283488Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10]
2026-10-25T01:04:53.8283631Z  160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
2026-10-25T01:04:53.8283768Z  161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
2026-10-25T01:04:53.8283858Z      ·          ────────┬───────
2026-10-25T01:04:53.8284005Z      ·                  ╰── 'MediaVideoPlayer' is imported here
2026-10-25T01:04:53.8284142Z  162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
2026-10-25T01:04:53.8284190Z      ╰────
2026-10-25T01:04:53.8284284Z   help: Consider removing this import.
2026-10-25T01:04:53.8284286Z
2026-10-25T01:04:53.8284503Z   ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
2026-10-25T01:04:53.8284631Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3]
2026-10-25T01:04:53.8284714Z  164 │   attachmentVideoPreviewSource,
2026-10-25T01:04:53.8284836Z  165 │   mediaVideoPreviewUri,
2026-10-25T01:04:53.8284950Z      ·   ──────────┬─────────
2026-10-25T01:04:53.8285099Z      ·             ╰── 'mediaVideoPreviewUri' is imported here
2026-10-25T01:04:53.8285172Z  166 │   mediaVideoThumbnailKey,
2026-10-25T01:04:53.8285220Z      ╰────
2026-10-25T01:04:53.8285313Z   help: Consider removing this import.
2026-10-25T01:04:53.8285315Z
2026-10-25T01:04:53.8285533Z   ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
2026-10-25T01:04:53.8285664Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3]
2026-10-25T01:04:53.8285731Z  165 │   mediaVideoPreviewUri,
2026-10-25T01:04:53.8285802Z  166 │   mediaVideoThumbnailKey,
2026-10-25T01:04:53.8285888Z      ·   ───────────┬──────────
2026-10-25T01:04:53.8286048Z      ·              ╰── 'mediaVideoThumbnailKey' is imported here
2026-10-25T01:04:53.8286130Z  167 │   type MediaVideoPreviewSource,
2026-10-25T01:04:53.8286181Z      ╰────
2026-10-25T01:04:53.8286273Z   help: Consider removing this import.
2026-10-25T01:04:53.8286276Z
2026-10-25T01:04:53.8286483Z   ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
2026-10-25T01:04:53.8286610Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8]
2026-10-25T01:04:53.8286680Z  166 │   mediaVideoThumbnailKey,
2026-10-25T01:04:53.8286758Z  167 │   type MediaVideoPreviewSource,
2026-10-25T01:04:53.8286852Z      ·        ───────────┬───────────
2026-10-25T01:04:53.8287009Z      ·                   ╰── 'MediaVideoPreviewSource' is imported here
2026-10-25T01:04:53.8287101Z  168 │ } from "../../lib/videoPreviewSource";
2026-10-25T01:04:53.8287153Z      ╰────
2026-10-25T01:04:53.8287248Z   help: Consider removing this import.
2026-10-25T01:04:53.8287250Z
2026-10-25T01:04:53.8287471Z   ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
2026-10-25T01:04:53.8287600Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3]
2026-10-25T01:04:53.8287659Z  188 │ import {
2026-10-25T01:04:53.8287733Z  189 │   resolveMarkdownFontSizes,
2026-10-25T01:04:53.8287820Z      ·   ────────────┬───────────
2026-10-25T01:04:53.8287977Z      ·               ╰── 'resolveMarkdownFontSizes' is imported here
2026-10-25T01:04:53.8288064Z  190 │   resolveNativeMarkdownTypography,
2026-10-25T01:04:53.8288115Z      ╰────
2026-10-25T01:04:53.8288257Z   help: Consider removing this import.
2026-10-25T01:04:53.8288289Z
2026-10-25T01:04:53.8288542Z   ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
2026-10-25T01:04:53.8288671Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:196:3]
2026-10-25T01:04:53.8288748Z  195 │   normalizeNativeMarkdownUrl,
2026-10-25T01:04:53.8288841Z  196 │   resolveMarkdownInlineCodePresentation,
2026-10-25T01:04:53.8288953Z      ·   ──────────────────┬──────────────────
2026-10-25T01:04:53.8289146Z      ·                     ╰── 'resolveMarkdownInlineCodePresentation' is imported here
2026-10-25T01:04:53.8289230Z  197 │   resolveMarkdownLinkPresentation,
2026-10-25T01:04:53.8289279Z      ╰────
2026-10-25T01:04:53.8289373Z   help: Consider removing this import.
2026-10-25T01:04:53.8289375Z
2026-10-25T01:04:53.8289588Z   ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
2026-10-25T01:04:53.8289721Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:244:3]
2026-10-25T01:04:53.8289783Z  243 │   useAssetUrl,
2026-10-25T01:04:53.8289849Z  244 │   useAssetUrlState,
2026-10-25T01:04:53.8289928Z      ·   ────────┬───────
2026-10-25T01:04:53.8290069Z      ·           ╰── 'useAssetUrlState' is imported here
2026-10-25T01:04:53.8290134Z  245 │   useRefreshAssetUrl,
2026-10-25T01:04:53.8290186Z      ╰────
2026-10-25T01:04:53.8290280Z   help: Consider removing this import.
2026-10-25T01:04:53.8290282Z
2026-10-25T01:04:53.8290511Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8290647Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2191:7]
2026-10-25T01:04:53.8290725Z  2190 │     setExpandedFile(null);
2026-10-25T01:04:53.8290880Z  2191 │   }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
2026-10-25T01:04:53.8291099Z       ·       ─────────┬─────────  ───────┬──────  ───────────────┬──────────────
2026-10-25T01:04:53.8291384Z       ·                │                  │                       ╰── Unnecessary dependency `props.contentPresentation.kind`
2026-10-25T01:04:53.8291578Z       ·                │                  ╰── Unnecessary dependency `props.threadId`
2026-10-25T01:04:53.8291742Z       ·                ╰── Unnecessary dependency `props.environmentId`
2026-10-25T01:04:53.8291890Z  2192 │   const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
2026-10-25T01:04:53.8291945Z       ╰────
2026-10-25T01:04:53.8292236Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8292544Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8292546Z
2026-10-25T01:04:53.8292742Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8292877Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2663:7]
2026-10-25T01:04:53.8292973Z  2662 │     reportHeaderMaterialVisibility(false);
2026-10-25T01:04:53.8293135Z  2663 │   }, [feedThreadKey, reportHeaderMaterialVisibility]);
2026-10-25T01:04:53.8293245Z       ·       ──────┬──────
2026-10-25T01:04:53.8293393Z       ·             ╰── Unnecessary dependency `feedThreadKey`
2026-10-25T01:04:53.8293446Z  2664 │
2026-10-25T01:04:53.8293494Z       ╰────
2026-10-25T01:04:53.8293782Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8294084Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8294087Z
2026-10-25T01:04:53.8294282Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8294418Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2679:7]
2026-10-25T01:04:53.8294477Z  2678 │     }
2026-10-25T01:04:53.8294608Z  2679 │   }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
2026-10-25T01:04:53.8294687Z       ·       ──────┬─────
2026-10-25T01:04:53.8294830Z       ·             ╰── Unnecessary dependency `listMountKey`
2026-10-25T01:04:53.8294972Z  2680 │   // Opening at a message: its run unfolds, the list stops following the end
2026-10-25T01:04:53.8295023Z       ╰────
2026-10-25T01:04:53.8295308Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8295610Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8295618Z
2026-10-25T01:04:53.8295816Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8295951Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2875:7]
2026-10-25T01:04:53.8296006Z  2874 │     }
2026-10-25T01:04:53.8296185Z  2875 │   }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
2026-10-25T01:04:53.8296380Z       ·       ───────┬───────  ─────────┬────────  ────────┬───────
2026-10-25T01:04:53.8296628Z       ·              │                  │                  ╰── Unnecessary dependency `expandedWorkRows`
2026-10-25T01:04:53.8296835Z       ·              │                  ╰── Unnecessary dependency `expandedWorkGroups`
2026-10-25T01:04:53.8296988Z       ·              ╰── Unnecessary dependency `expandedTurnIds`
2026-10-25T01:04:53.8297042Z  2876 │
2026-10-25T01:04:53.8297092Z       ╰────
2026-10-25T01:04:53.8297375Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8297678Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8297681Z
2026-10-25T01:04:53.8297860Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-25T01:04:53.8297991Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:626:9]
2026-10-25T01:04:53.8298048Z  625 │       };
2026-10-25T01:04:53.8298274Z  626 │     }, [props.environmentId, attachment.id, httpBaseUrl]),
2026-10-25T01:04:53.8298503Z      ·         ─────────┬─────────  ──────┬──────  ─────┬─────
2026-10-25T01:04:53.8298739Z      ·                  │                 │             ╰── Unnecessary dependency `httpBaseUrl`
2026-10-25T01:04:53.8298932Z      ·                  │                 ╰── Unnecessary dependency `attachment.id`
2026-10-25T01:04:53.8299095Z      ·                  ╰── Unnecessary dependency `props.environmentId`
2026-10-25T01:04:53.8299149Z  627 │   );
2026-10-25T01:04:53.8299202Z      ╰────
2026-10-25T01:04:53.8299514Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T01:04:53.8299822Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8299824Z
2026-10-25T01:04:53.8300081Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8300233Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7]
2026-10-25T01:04:53.8300396Z  355 │   }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
2026-10-25T01:04:53.8300463Z  356 │   useEffect(() => {
2026-10-25T01:04:53.8300534Z      ·   ────┬────
2026-10-25T01:04:53.8300662Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8300755Z  357 │     if (!isReturningToProjectPicker) {
2026-10-25T01:04:53.8300820Z  358 │       return;
2026-10-25T01:04:53.8300874Z  359 │     }
2026-10-25T01:04:53.8300969Z  360 │     if (requestedInitialProjectAvailable) {
2026-10-25T01:04:53.8301059Z  361 │       setIsReturningToProjectPicker(false);
2026-10-25T01:04:53.8301163Z      ·       ──────────────┬──────────────
2026-10-25T01:04:53.8301339Z      ·                     ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8301400Z  362 │       return;
2026-10-25T01:04:53.8301450Z      ╰────
2026-10-25T01:04:53.8302088Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8302436Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8302439Z
2026-10-25T01:04:53.8302693Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8302844Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9]
2026-10-25T01:04:53.8302894Z  447 │
2026-10-25T01:04:53.8302960Z  448 │   useEffect(() => {
2026-10-25T01:04:53.8303031Z      ·   ────┬────
2026-10-25T01:04:53.8303157Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8303257Z  449 │     if (props.pendingTaskId || props.draftId) {
2026-10-25T01:04:53.8303321Z  450 │       return;
2026-10-25T01:04:53.8303383Z  451 │     }
2026-10-25T01:04:53.8303523Z  452 │     if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
2026-10-25T01:04:53.8303652Z  453 │       lastInitialProjectRefRef.current = props.initialProjectRef;
2026-10-25T01:04:53.8303759Z  454 │       appliedInitialProjectKeyRef.current = null;
2026-10-25T01:04:53.8303813Z  455 │     }
2026-10-25T01:04:53.8303952Z  456 │     const initialEnvironmentId = props.initialProjectRef?.environmentId;
2026-10-25T01:04:53.8304075Z  457 │     const initialProjectId = props.initialProjectRef?.projectId;
2026-10-25T01:04:53.8304178Z  458 │     if (initialEnvironmentId && initialProjectId) {
2026-10-25T01:04:53.8304249Z  459 │       const directProject =
2026-10-25T01:04:53.8304317Z  460 │         projects.find(
2026-10-25T01:04:53.8304380Z  461 │           (project) =>
2026-10-25T01:04:53.8304559Z  462 │             project.environmentId === initialEnvironmentId && project.id === initialProjectId,
2026-10-25T01:04:53.8304625Z  463 │         ) ?? null;
2026-10-25T01:04:53.8304677Z  464 │
2026-10-25T01:04:53.8304745Z  465 │       if (directProject) {
2026-10-25T01:04:53.8304882Z  466 │         // Apply the route's project once. Re-applying on every change would
2026-10-25T01:04:53.8305020Z  467 │         // instantly revert environment/project switches made in the picker.
2026-10-25T01:04:53.8305182Z  468 │         const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
2026-10-25T01:04:53.8305314Z  469 │         if (appliedInitialProjectKeyRef.current === directProjectKey) {
2026-10-25T01:04:53.8305378Z  470 │           return;
2026-10-25T01:04:53.8305437Z  471 │         }
2026-10-25T01:04:53.8305536Z  472 │         if (props.initialProjectRef?.branch) {
2026-10-25T01:04:53.8305602Z  473 │           if (
2026-10-25T01:04:53.8305749Z  474 │             selectedProject?.environmentId !== directProject.environmentId ||
2026-10-25T01:04:53.8305850Z  475 │             selectedProject.id !== directProject.id
2026-10-25T01:04:53.8305912Z  476 │           ) {
2026-10-25T01:04:53.8305995Z  477 │             setProject(directProject);
2026-10-25T01:04:53.8306060Z  478 │             return;
2026-10-25T01:04:53.8306120Z  479 │           }
2026-10-25T01:04:53.8306201Z  480 │           if (!flow.draftKey) return;
2026-10-25T01:04:53.8306341Z  481 │           // The route completes checkout before mounting this composer. Local
2026-10-25T01:04:53.8306487Z  482 │           // mode reuses an existing worktree; worktree mode would create another.
2026-10-25T01:04:53.8306597Z  483 │           updateComposerDraftSettings(flow.draftKey, {
2026-10-25T01:04:53.8306674Z  484 │             workspaceSelection: {
2026-10-25T01:04:53.8306794Z  485 │               mode: "local",
2026-10-25T01:04:53.8306929Z  486 │               branch: props.initialProjectRef.branch,
2026-10-25T01:04:53.8307065Z  487 │               worktreePath: props.initialProjectRef.worktreePath ?? null,
2026-10-25T01:04:53.8307146Z  488 │               startFromOrigin: false,
2026-10-25T01:04:53.8307208Z  489 │             },
2026-10-25T01:04:53.8307268Z  490 │           });
2026-10-25T01:04:53.8307326Z  491 │         }
2026-10-25T01:04:53.8307452Z  492 │         appliedInitialProjectKeyRef.current = directProjectKey;
2026-10-25T01:04:53.8307512Z  493 │         if (
2026-10-25T01:04:53.8307653Z  494 │           selectedProject?.environmentId === directProject.environmentId &&
2026-10-25T01:04:53.8307752Z  495 │           selectedProject.id === directProject.id
2026-10-25T01:04:53.8307809Z  496 │         ) {
2026-10-25T01:04:53.8307878Z  497 │           return;
2026-10-25T01:04:53.8307938Z  498 │         }
2026-10-25T01:04:53.8308017Z  499 │         setProject(directProject);
2026-10-25T01:04:53.8308078Z  500 │         return;
2026-10-25T01:04:53.8308134Z  501 │       }
2026-10-25T01:04:53.8308188Z  502 │
2026-10-25T01:04:53.8308265Z  503 │       if (projects.length > 0) {
2026-10-25T01:04:53.8308364Z  504 │         setIsReturningToProjectPicker(true);
2026-10-25T01:04:53.8308474Z      ·         ──────────────┬──────────────
2026-10-25T01:04:53.8308656Z      ·                       ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8308709Z  505 │       }
2026-10-25T01:04:53.8308762Z      ╰────
2026-10-25T01:04:53.8309360Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8309682Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8309685Z
2026-10-25T01:04:53.8309944Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T01:04:53.8310099Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5]
2026-10-25T01:04:53.8310154Z  545 │
2026-10-25T01:04:53.8310221Z  546 │   useEffect(() => {
2026-10-25T01:04:53.8310295Z      ·   ────┬────
2026-10-25T01:04:53.8310437Z      ·       ╰── This is the containing effect
2026-10-25T01:04:53.8310564Z  547 │     const shareId = props.incomingShareId;
2026-10-25T01:04:53.8310649Z  548 │     const draftKey = flow.draftKey;
2026-10-25T01:04:53.8310750Z  549 │     const destinationProject = selectedProject;
2026-10-25T01:04:53.8310888Z  550 │     const initialEnvironmentId = props.initialProjectRef?.environmentId;
2026-10-25T01:04:53.8311018Z  551 │     const initialProjectId = props.initialProjectRef?.projectId;
2026-10-25T01:04:53.8311108Z  552 │     const selectedProjectMatchesRoute =
2026-10-25T01:04:53.8311184Z  553 │       !initialEnvironmentId ||
2026-10-25T01:04:53.8311252Z  554 │       !initialProjectId ||
2026-10-25T01:04:53.8311383Z  555 │       (destinationProject?.environmentId === initialEnvironmentId &&
2026-10-25T01:04:53.8311487Z  556 │         destinationProject.id === initialProjectId);
2026-10-25T01:04:53.8311544Z  557 │     if (
2026-10-25T01:04:53.8311663Z  558 │       !shareId ||
2026-10-25T01:04:53.8311846Z  559 │       !draftKey ||
2026-10-25T01:04:53.8311919Z  560 │       !destinationProject ||
2026-10-25T01:04:53.8312007Z  561 │       !selectedProjectMatchesRoute ||
2026-10-25T01:04:53.8312095Z  562 │       cancelledIncomingShareId === shareId
2026-10-25T01:04:53.8312153Z  563 │     ) {
2026-10-25T01:04:53.8312214Z  564 │       return;
2026-10-25T01:04:53.8312270Z  565 │     }
2026-10-25T01:04:53.8312363Z  566 │     const importKey = `${shareId}:${draftKey}`;
2026-10-25T01:04:53.8312421Z  567 │     if (
2026-10-25T01:04:53.8312534Z  568 │       startedShareImportKeyRef.current === importKey ||
2026-10-25T01:04:53.8312646Z  569 │       cancellingShareImportKeyRef.current === importKey
2026-10-25T01:04:53.8312700Z  570 │     ) {
2026-10-25T01:04:53.8312761Z  571 │       return;
2026-10-25T01:04:53.8312817Z  572 │     }
2026-10-25T01:04:53.8312874Z  573 │
2026-10-25T01:04:53.8312947Z  574 │     if (!incomingShare) {
2026-10-25T01:04:53.8313143Z  575 │       if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
2026-10-25T01:04:53.8313272Z  576 │         alertedUnavailableIncomingShareIdRef.current = shareId;
2026-10-25T01:04:53.8313337Z  577 │         Dialog.alert(
2026-10-25T01:04:53.8313423Z  578 │           "Shared content unavailable",
2026-10-25T01:04:53.8313600Z  579 │           "The shared content is no longer in the inbox. You can continue editing this task draft.",
2026-10-25T01:04:53.8313659Z  580 │         );
2026-10-25T01:04:53.8313712Z  581 │       }
2026-10-25T01:04:53.8313772Z  582 │       return;
2026-10-25T01:04:53.8313829Z  583 │     }
2026-10-25T01:04:53.8313883Z  584 │
2026-10-25T01:04:53.8313939Z  585 │     if (
2026-10-25T01:04:53.8314106Z  586 │       incomingShare.attachments.some((attachment) => attachment.type === "file") &&
2026-10-25T01:04:53.8314208Z  587 │       selectedEnvironmentServerConfig === null
2026-10-25T01:04:53.8314263Z  588 │     ) {
2026-10-25T01:04:53.8314320Z  589 │       return;
2026-10-25T01:04:53.8314374Z  590 │     }
2026-10-25T01:04:53.8314426Z  591 │
2026-10-25T01:04:53.8314560Z  592 │     if (alertedUnavailableIncomingShareIdRef.current === shareId) {
2026-10-25T01:04:53.8314680Z  593 │       alertedUnavailableIncomingShareIdRef.current = null;
2026-10-25T01:04:53.8314736Z  594 │     }
2026-10-25T01:04:53.8314842Z  595 │     startedShareImportKeyRef.current = importKey;
2026-10-25T01:04:53.8314909Z  596 │     const draftBackup =
2026-10-25T01:04:53.8315094Z  597 │       shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
2026-10-25T01:04:53.8315232Z  598 │     shareImportDraftBackupRef.current.set(importKey, draftBackup);
2026-10-25T01:04:53.8315328Z  599 │     const importToken = Symbol(importKey);
2026-10-25T01:04:53.8315408Z  600 │     let didReserveShare = false;
2026-10-25T01:04:53.8315485Z  601 │     let didConsumeShare = false;
2026-10-25T01:04:53.8315566Z  602 │     let needsDraftRestore = false;
2026-10-25T01:04:53.8315676Z  603 │     activeShareImportTokenRef.current = importToken;
2026-10-25T01:04:53.8315760Z  604 │     setImportingShareKey(importKey);
2026-10-25T01:04:53.8315850Z      ·     ──────────┬─────────
2026-10-25T01:04:53.8316024Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-25T01:04:53.8316094Z  605 │     void (async () => {
2026-10-25T01:04:53.8316144Z      ╰────
2026-10-25T01:04:53.8316787Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T01:04:53.8317141Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T01:04:53.8317143Z
2026-10-25T01:04:53.8317344Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8317498Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5]
2026-10-25T01:04:53.8317573Z  523 │     props.initialProjectRef,
2026-10-25T01:04:53.8317648Z  524 │     props.incomingShareId,
2026-10-25T01:04:53.8317737Z      ·     ──────────┬──────────
2026-10-25T01:04:53.8317908Z      ·               ╰── Unnecessary dependency `props.incomingShareId`
2026-10-25T01:04:53.8317980Z  525 │     props.pendingTaskId,
2026-10-25T01:04:53.8318034Z      ╰────
2026-10-25T01:04:53.8318323Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8318630Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8318633Z
2026-10-25T01:04:53.8318845Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T01:04:53.8318994Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5]
2026-10-25T01:04:53.8319110Z  542 │     loadedBranchesProjectKeyRef.current = projectKey;
2026-10-25T01:04:53.8319184Z  543 │     flow.loadBranches();
2026-10-25T01:04:53.8319259Z      ·     ──┬─
2026-10-25T01:04:53.8319381Z      ·       ╰── Missing dependency `flow`
2026-10-25T01:04:53.8319477Z  544 │   }, [flow.loadBranches, selectedProject]);
2026-10-25T01:04:53.8319565Z      ·       ────────┬────────
2026-10-25T01:04:53.8319763Z      ·               ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead
2026-10-25T01:04:53.8319814Z  545 │
2026-10-25T01:04:53.8319867Z      ╰────
2026-10-25T01:04:53.8320286Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8320635Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8320641Z
2026-10-25T01:04:53.8320836Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T01:04:53.8320991Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5]
2026-10-25T01:04:53.8321057Z  765 │     flow.draftKey,
2026-10-25T01:04:53.8321135Z  766 │     hasImportedIncomingShare,
2026-10-25T01:04:53.8321226Z      ·     ────────────┬───────────
2026-10-25T01:04:53.8321404Z      ·                 ╰── Unnecessary dependency `hasImportedIncomingShare`
2026-10-25T01:04:53.8321470Z  767 │     incomingShare,
2026-10-25T01:04:53.8321549Z  768 │     isIncomingShareInboxLoading,
2026-10-25T01:04:53.8321695Z      ·     ─────────────┬─────────────
2026-10-25T01:04:53.8321911Z      ·                  ╰── Unnecessary dependency `isIncomingShareInboxLoading`
2026-10-25T01:04:53.8321992Z  769 │     isIncomingShareUnavailable,
2026-10-25T01:04:53.8322066Z  770 │     props.incomingShareId,
2026-10-25T01:04:53.8322160Z  771 │     props.initialProjectRef?.environmentId,
2026-10-25T01:04:53.8322251Z  772 │     props.initialProjectRef?.projectId,
2026-10-25T01:04:53.8322326Z  773 │     releaseShareReservation,
2026-10-25T01:04:53.8322391Z  774 │     reserveShare,
2026-10-25T01:04:53.8322475Z  775 │     selectedEnvironmentServerConfig,
2026-10-25T01:04:53.8322545Z  776 │     selectedProject,
2026-10-25T01:04:53.8322616Z  777 │     shareImportAttempt,
2026-10-25T01:04:53.8322703Z      ·     ─────────┬────────
2026-10-25T01:04:53.8322870Z      ·              ╰── Unnecessary dependency `shareImportAttempt`
2026-10-25T01:04:53.8322930Z  778 │   ]);
2026-10-25T01:04:53.8322982Z      ╰────
2026-10-25T01:04:53.8323273Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T01:04:53.8323575Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T01:04:53.8323581Z
2026-10-25T01:04:53.8323664Z Found 0 errors and 372 warnings in 5486 files (5.7s, 8 threads)
2026-10-25T01:04:53.8746403Z Post job cleanup.
2026-10-25T01:04:53.9346434Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-25T01:04:53.9411168Z Post job cleanup.
2026-10-25T01:04:54.0313537Z ##[start-action display=Cache full pnpm store;id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.__actions_cache]
2026-10-25T01:04:54.0603218Z Post job cleanup.
2026-10-25T01:04:54.1203520Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c, not saving cache.
2026-10-25T01:04:54.1231462Z ##[end-action id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.__actions_cache;outcome=success;conclusion=success;duration_ms=91]
2026-10-25T01:04:54.1233523Z ##[start-action display=Cache Vite+;id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.vp_cache]
2026-10-25T01:04:54.1256531Z Post job cleanup.
2026-10-25T01:04:54.1848886Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache.
2026-10-25T01:04:54.1875975Z ##[end-action id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.vp_cache;outcome=success;conclusion=success;duration_ms=64]
2026-10-25T01:04:54.1910344Z Post job cleanup.
2026-10-25T01:04:54.2284659Z [command]/usr/local/bin/git version
2026-10-25T01:04:54.2331681Z git version 2.55.0
2026-10-25T01:04:54.2347393Z Temporarily overriding HOME='/home/runner/_work/_temp/81f55779-7a15-4994-8023-edd851863df7' before making global git config changes
2026-10-25T01:04:54.2347743Z Adding repository directory to the temporary git global config as a safe directory
2026-10-25T01:04:54.2349994Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-25T01:04:54.2369209Z Removing SSH command configuration
2026-10-25T01:04:54.2371946Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-25T01:04:54.2393832Z [command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2026-10-25T01:04:54.2501891Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-25T01:04:54.2522016Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-25T01:04:54.2556330Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-25T01:04:54.2577939Z ##[group]Run '/job_completed.sh'
2026-10-25T01:04:54.2589147Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-25T01:04:54.2589315Z env:
2026-10-25T01:04:54.2589429Z   BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153
2026-10-25T01:04:54.2589575Z   BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400
2026-10-25T01:04:54.2589714Z   BLACKSMITH_CHECK_RUN_ID: 121036834290
2026-10-25T01:04:54.2589855Z   BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-25T01:04:54.2589994Z   GITHUB_ACTIONS_CACHE_MODE: write
2026-10-25T01:04:54.2590126Z ##[endgroup]
2026-10-25T01:04:54.2664756Z Docker container cache not activated, skipping hash computation.
2026-10-25T01:04:54.2907380Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-25T01:04:54.2949210Z Cleaning up orphan processes