GitHub check

256 KB of 609 KB loaded Download the full log (609 KB)
353 KB of earlier output not loaded
โ”€
2026-10-25T02:16:39.4726109Z      ยท                                       โ•ฐโ”€โ”€ Unnecessary dependency `bottomSearch`
2026-10-25T02:16:39.4726211Z  115 โ”‚   const composeButton = nativeToolbarCompose ? (
2026-10-25T02:16:39.4726265Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4726558Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4726865Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4726868Z
2026-10-25T02:16:39.4727365Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4727548Z      โ•ญโ”€[packages/client-runtime/src/connection/supervisor.test.ts:135:3]
2026-10-25T02:16:39.4727660Z  134 โ”‚       let lastState = yield* SubscriptionRef.get(state);
2026-10-25T02:16:39.4727871Z  135 โ”‚ โ•ญโ”€โ–ถ   for (let iteration = 0; iteration < 100; iteration += 1) {
2026-10-25T02:16:39.4728006Z  136 โ”‚ โ”‚       lastState = yield* SubscriptionRef.get(state);
2026-10-25T02:16:39.4728110Z  137 โ”‚ โ”‚       if (predicate(lastState)) {
2026-10-25T02:16:39.4728213Z  138 โ”‚ โ”‚         return lastState;
2026-10-25T02:16:39.4728290Z  139 โ”‚ โ”‚       }
2026-10-25T02:16:39.4728392Z  140 โ”‚ โ”‚       yield* Effect.yieldNow;
2026-10-25T02:16:39.4728514Z  141 โ”‚ โ•ฐโ”€โ–ถ   }
2026-10-25T02:16:39.4728594Z  142 โ”‚       return yield* Effect.die(
2026-10-25T02:16:39.4728646Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4728649Z
2026-10-25T02:16:39.4728908Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4729079Z     โ•ญโ”€[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:59:5]
2026-10-25T02:16:39.4729135Z  49 โ”‚
2026-10-25T02:16:39.4729201Z  50 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4729273Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4729403Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4729498Z  51 โ”‚     traceDiffHighlight("viewport-reset", {
2026-10-25T02:16:39.4729589Z  52 โ”‚       reset: diffHighlightTraceId(resetKey),
2026-10-25T02:16:39.4729651Z  53 โ”‚       enabled,
2026-10-25T02:16:39.4729717Z  54 โ”‚       rows: rows.length,
2026-10-25T02:16:39.4729775Z  55 โ”‚     });
2026-10-25T02:16:39.4729865Z  56 โ”‚     const previousRange = scheduler.reset();
2026-10-25T02:16:39.4729958Z  57 โ”‚     highlightedRowIdsRef.current = new Set();
2026-10-25T02:16:39.4730040Z  58 โ”‚     pendingPatchesRef.current = [];
2026-10-25T02:16:39.4730146Z  59 โ”‚     setViewport({ scope: viewportScope, range: null });
2026-10-25T02:16:39.4730220Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4730384Z     ยท          โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4730549Z  60 โ”‚     setTokensPatchJson(createEmptyTokenPatch(resetKey));
2026-10-25T02:16:39.4730632Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4731216Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4731531Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4731533Z
2026-10-25T02:16:39.4731724Z   โš  eslint(no-unused-vars): Identifier 'Image' is imported but never used.
2026-10-25T02:16:39.4731864Z     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10]
2026-10-25T02:16:39.4732002Z  16 โ”‚ import type { NativeSyntheticEvent, ViewProps } from "react-native";
2026-10-25T02:16:39.4732117Z  17 โ”‚ import { Image, Platform, StyleSheet } from "react-native";
2026-10-25T02:16:39.4732187Z     ยท          โ”€โ”€โ”ฌโ”€โ”€
2026-10-25T02:16:39.4732310Z     ยท            โ•ฐโ”€โ”€ 'Image' is imported here
2026-10-25T02:16:39.4732364Z  18 โ”‚
2026-10-25T02:16:39.4732415Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4732508Z   help: Consider removing this import.
2026-10-25T02:16:39.4732511Z
2026-10-25T02:16:39.4732711Z   โš  react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-25T02:16:39.4732851Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6]
2026-10-25T02:16:39.4733012Z  225 โ”‚     nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
2026-10-25T02:16:39.4733107Z  226 โ”‚       nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4733200Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4733650Z      ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4733723Z  227 โ”‚       mostRecentEventCount,
2026-10-25T02:16:39.4733779Z  228 โ”‚     );
2026-10-25T02:16:39.4733900Z  229 โ”‚   }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
2026-10-25T02:16:39.4734035Z      ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4734243Z      ยท                                โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
2026-10-25T02:16:39.4734360Z  230 โ”‚   const assumedValue = props.value;
2026-10-25T02:16:39.4734415Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4734580Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-25T02:16:39.4734885Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4734888Z
2026-10-25T02:16:39.4735096Z   โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T02:16:39.4735235Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7]
2026-10-25T02:16:39.4735375Z  236 โ”‚     nativeEventSnapshotsRef.current = assumeComposerControlledState(
2026-10-25T02:16:39.4735467Z  237 โ”‚       nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4735557Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4736050Z      ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4736150Z  238 โ”‚       controlledEventCount,
2026-10-25T02:16:39.4736216Z  239 โ”‚       assumedValue,
2026-10-25T02:16:39.4736271Z  240 โ”‚     );
2026-10-25T02:16:39.4736427Z  241 โ”‚   }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
2026-10-25T02:16:39.4736560Z      ยท                                                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4736765Z      ยท                                                                    โ•ฐโ”€โ”€ Unnecessary dependency `controlledDocumentJson`
2026-10-25T02:16:39.4736853Z  242 โ”‚   const acceptNativeEvent = useCallback(
2026-10-25T02:16:39.4736911Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4737322Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4737629Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4737631Z
2026-10-25T02:16:39.4737775Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4737917Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29]
2026-10-25T02:16:39.4738038Z  161 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
2026-10-25T02:16:39.4738147Z  162 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-25T02:16:39.4738268Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4738433Z      ยท                                          โ•ฐโ”€โ”€ Cannot access ref value during render
2026-10-25T02:16:39.4738491Z  163 โ”‚     });
2026-10-25T02:16:39.4738541Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4738992Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4739283Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4739286Z
2026-10-25T02:16:39.4739433Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4739575Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29]
2026-10-25T02:16:39.4739692Z  161 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
2026-10-25T02:16:39.4739802Z  162 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-25T02:16:39.4739916Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4740119Z      ยท                                          โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4740175Z  163 โ”‚     });
2026-10-25T02:16:39.4740228Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4740722Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4741031Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4741034Z
2026-10-25T02:16:39.4741177Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4741314Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23]
2026-10-25T02:16:39.4741370Z  163 โ”‚     });
2026-10-25T02:16:39.4741459Z  164 โ”‚     confirmedTokensRef.current = tokens;
2026-10-25T02:16:39.4741581Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4741770Z      ยท              โ”‚            โ•ฐโ”€โ”€ Cannot update ref value during render
2026-10-25T02:16:39.4741891Z      ยท              โ•ฐโ”€โ”€ This value is a ref
2026-10-25T02:16:39.4741965Z  165 โ”‚     return JSON.stringify(
2026-10-25T02:16:39.4742017Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4742467Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4742749Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4742752Z
2026-10-25T02:16:39.4742892Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4743031Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5]
2026-10-25T02:16:39.4743100Z  205 โ”‚     mostRecentEventCount,
2026-10-25T02:16:39.4743191Z  206 โ”‚     nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4743300Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4743484Z      ยท                    โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4743537Z  207 โ”‚   );
2026-10-25T02:16:39.4743590Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4744041Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4744361Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4744363Z
2026-10-25T02:16:39.4744510Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4744648Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5]
2026-10-25T02:16:39.4744718Z  211 โ”‚     mostRecentEventCount,
2026-10-25T02:16:39.4744804Z  212 โ”‚     nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4744907Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4745090Z      ยท                    โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4745145Z  213 โ”‚   );
2026-10-25T02:16:39.4745198Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4745645Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4745974Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4746013Z
2026-10-25T02:16:39.4746197Z   โš  react(memo-dependencies): Found missing memoization dependencies
2026-10-25T02:16:39.4746336Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6]
2026-10-25T02:16:39.4746457Z  161 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
2026-10-25T02:16:39.4746568Z  162 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-25T02:16:39.4746674Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4747134Z      ยท                                      โ•ฐโ”€โ”€ Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4747194Z  163 โ”‚     });
2026-10-25T02:16:39.4747283Z  164 โ”‚     confirmedTokensRef.current = tokens;
2026-10-25T02:16:39.4747351Z  165 โ”‚     return JSON.stringify(
2026-10-25T02:16:39.4747514Z  166 โ”‚       composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
2026-10-25T02:16:39.4747582Z  167 โ”‚         const record =
2026-10-25T02:16:39.4747665Z  168 โ”‚           token.type === "context"
2026-10-25T02:16:39.4747829Z  169 โ”‚             ? props.context?.records.find((record) => record.contextId === token.contextId)
2026-10-25T02:16:39.4747896Z  170 โ”‚             : undefined;
2026-10-25T02:16:39.4748002Z  171 โ”‚         const presentation = contextChipPresentation(
2026-10-25T02:16:39.4748112Z  172 โ”‚           token.type === "context" ? token.kind : token.type,
2026-10-25T02:16:39.4748179Z  173 โ”‚           record,
2026-10-25T02:16:39.4748242Z  174 โ”‚         );
2026-10-25T02:16:39.4748326Z  175 โ”‚         const icon = contextChipIcon(
2026-10-25T02:16:39.4748394Z  176 โ”‚           presentation,
2026-10-25T02:16:39.4748533Z  177 โ”‚           token.type === "mention" ? token.value : contextRecordFileName(record),
2026-10-25T02:16:39.4748592Z  178 โ”‚         );
2026-10-25T02:16:39.4748654Z  179 โ”‚         return {
2026-10-25T02:16:39.4748725Z  180 โ”‚           type: token.type,
2026-10-25T02:16:39.4748797Z  181 โ”‚           source: token.source,
2026-10-25T02:16:39.4748869Z  182 โ”‚           start: token.start,
2026-10-25T02:16:39.4748936Z  183 โ”‚           end: token.end,
2026-10-25T02:16:39.4749083Z  184 โ”‚           accent: contextChipAccent(presentation.accent, theme, chipTextColor),
2026-10-25T02:16:39.4749143Z  185 โ”‚           label:
2026-10-25T02:16:39.4749220Z  186 โ”‚             token.type === "skill"
2026-10-25T02:16:39.4749333Z  187 โ”‚               ? (skillLabels.get(token.value) ?? token.value)
2026-10-25T02:16:39.4749418Z  188 โ”‚               : token.type === "context"
2026-10-25T02:16:39.4749650Z  189 โ”‚                 ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " ยท unavailable"}`
2026-10-25T02:16:39.4749733Z  190 โ”‚                 : basename(token.value),
2026-10-25T02:16:39.4749874Z  191 โ”‚           detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
2026-10-25T02:16:39.4749965Z  192 โ”‚           iconUri: contextChipIconUri(icon),
2026-10-25T02:16:39.4750049Z  193 โ”‚           tintsIcon: icon.kind === "chip",
2026-10-25T02:16:39.4750106Z  194 โ”‚         };
2026-10-25T02:16:39.4750164Z  195 โ”‚       }),
2026-10-25T02:16:39.4750219Z  196 โ”‚     );
2026-10-25T02:16:39.4750395Z  197 โ”‚   }, [props.value, props.context, skillLabels, theme, chipTextColor]);
2026-10-25T02:16:39.4750576Z      ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4750829Z      ยท                                     โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
2026-10-25T02:16:39.4750966Z  198 โ”‚   // Every render resolves against the snapshot history, so a render whose
2026-10-25T02:16:39.4751017Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4751221Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-25T02:16:39.4751528Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4751531Z
2026-10-25T02:16:39.4751719Z   โš  react(memo-dependencies): Found missing memoization dependencies
2026-10-25T02:16:39.4751862Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5]
2026-10-25T02:16:39.4751995Z  251 โ”‚       mostRecentEventCountRef.current = acknowledgedEventCount;
2026-10-25T02:16:39.4752095Z  252 โ”‚       nativeEventSnapshotsRef.current.push({
2026-10-25T02:16:39.4752186Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4752636Z      ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4752726Z  253 โ”‚         eventCount: acknowledgedEventCount,
2026-10-25T02:16:39.4752789Z  254 โ”‚         value,
2026-10-25T02:16:39.4752866Z  255 โ”‚         selection: nextSelection,
2026-10-25T02:16:39.4752924Z  256 โ”‚       });
2026-10-25T02:16:39.4753012Z  257 โ”‚       return acknowledgedEventCount;
2026-10-25T02:16:39.4753069Z  258 โ”‚     },
2026-10-25T02:16:39.4753125Z  259 โ”‚     [],
2026-10-25T02:16:39.4753191Z      ยท     โ”€โ”ฌ
2026-10-25T02:16:39.4753373Z      ยท      โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
2026-10-25T02:16:39.4753428Z  260 โ”‚   );
2026-10-25T02:16:39.4753482Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4753682Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-25T02:16:39.4753988Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4753991Z
2026-10-25T02:16:39.4754147Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4754384Z      โ•ญโ”€[apps/mobile/src/features/threads/thread-work-log.tsx:174:5]
2026-10-25T02:16:39.4754566Z  170 โ”‚   const expandedAngle = props.collapsedDirection === "right" ? 90 : 180;
2026-10-25T02:16:39.4754699Z  171 โ”‚   const rotation = useSharedValue(props.expanded ? expandedAngle : 0);
2026-10-25T02:16:39.4754774Z      ยท         โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4754905Z      ยท             โ•ฐโ”€โ”€ `rotation` originates here
2026-10-25T02:16:39.4754960Z  172 โ”‚
2026-10-25T02:16:39.4755028Z  173 โ”‚   useLayoutEffect(() => {
2026-10-25T02:16:39.4755162Z  174 โ”‚     rotation.value = withTiming(props.expanded ? expandedAngle : 0, {
2026-10-25T02:16:39.4755235Z      ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4755365Z      ยท         โ•ฐโ”€โ”€ `rotation` cannot be modified
2026-10-25T02:16:39.4755467Z  175 โ”‚       duration: THREAD_DISCLOSURE_TRANSITION_MS,
2026-10-25T02:16:39.4755524Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4755784Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4756084Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4756087Z
2026-10-25T02:16:39.4756276Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4756426Z       โ•ญโ”€[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23]
2026-10-25T02:16:39.4756494Z  1245 โ”‚                     <Text
2026-10-25T02:16:39.4756589Z  1246 โ”‚                       key={`${index}:${line}`}
2026-10-25T02:16:39.4756704Z       ยท                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4756785Z  1247 โ”‚                       selectable
2026-10-25T02:16:39.4756840Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4756986Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4756989Z
2026-10-25T02:16:39.4757241Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4757378Z      โ•ญโ”€[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
2026-10-25T02:16:39.4757432Z  150 โ”‚
2026-10-25T02:16:39.4757498Z  151 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4757567Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4757693Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4757777Z  152 โ”‚     if (!controlledSelectedPath) {
2026-10-25T02:16:39.4757845Z  153 โ”‚       return;
2026-10-25T02:16:39.4757902Z  154 โ”‚     }
2026-10-25T02:16:39.4757985Z  155 โ”‚     setExpandedPaths((current) => {
2026-10-25T02:16:39.4758064Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4758232Z      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4758354Z  156 โ”‚       const ancestors = ancestorPaths(controlledSelectedPath);
2026-10-25T02:16:39.4758407Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4758995Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4759361Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4759393Z
2026-10-25T02:16:39.4759584Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4759730Z      โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
2026-10-25T02:16:39.4759836Z  222 โ”‚               ? snippetTokens.map((line, lineIndex) => (
2026-10-25T02:16:39.4759929Z  223 โ”‚                   <NativeText key={lineIndex}>
2026-10-25T02:16:39.4760035Z      ยท                               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4760123Z  224 โ”‚                     {lineIndex > 0 ? "\n" : ""}
2026-10-25T02:16:39.4760176Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4760320Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4760322Z
2026-10-25T02:16:39.4760515Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4760663Z      โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
2026-10-25T02:16:39.4760736Z  226 โ”‚                       <NativeText
2026-10-25T02:16:39.4760819Z  227 โ”‚                         key={tokenIndex}
2026-10-25T02:16:39.4760920Z      ยท                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4760992Z  228 โ”‚                         style={{
2026-10-25T02:16:39.4761046Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4761186Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4761189Z
2026-10-25T02:16:39.4761442Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4761631Z      โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
2026-10-25T02:16:39.4761685Z  104 โ”‚
2026-10-25T02:16:39.4761752Z  105 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4761823Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4761950Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4762027Z  106 โ”‚     clearReviewCommentTarget();
2026-10-25T02:16:39.4762122Z  107 โ”‚     setPendingNativeCommentSelection(null);
2026-10-25T02:16:39.4762224Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4762396Z      ยท                     โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4762467Z  108 โ”‚   }, [selectedSection?.id]);
2026-10-25T02:16:39.4762518Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4763105Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4763421Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4763424Z
2026-10-25T02:16:39.4763673Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4763855Z      โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
2026-10-25T02:16:39.4763908Z  109 โ”‚
2026-10-25T02:16:39.4763971Z  110 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4764041Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4764218Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4764370Z  111 โ”‚     if (activeCommentTarget === null) {
2026-10-25T02:16:39.4764469Z  112 โ”‚       setPendingNativeCommentSelection(null);
2026-10-25T02:16:39.4764573Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4764749Z      ยท                       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4764805Z  113 โ”‚     }
2026-10-25T02:16:39.4764855Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4765436Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4765751Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4765756Z
2026-10-25T02:16:39.4765950Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4766129Z      โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
2026-10-25T02:16:39.4766224Z  107 โ”‚     setPendingNativeCommentSelection(null);
2026-10-25T02:16:39.4766295Z  108 โ”‚   }, [selectedSection?.id]);
2026-10-25T02:16:39.4766379Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4766538Z      ยท                โ•ฐโ”€โ”€ Unnecessary dependency `selectedSection?.id`
2026-10-25T02:16:39.4766590Z  109 โ”‚
2026-10-25T02:16:39.4766640Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4766930Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4767236Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4767238Z
2026-10-25T02:16:39.4767435Z   โš  react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-25T02:16:39.4767569Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6]
2026-10-25T02:16:39.4767729Z  227 โ”‚     nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
2026-10-25T02:16:39.4767817Z  228 โ”‚       nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4767906Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4768358Z      ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4768432Z  229 โ”‚       mostRecentEventCount,
2026-10-25T02:16:39.4768485Z  230 โ”‚     );
2026-10-25T02:16:39.4768607Z  231 โ”‚   }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
2026-10-25T02:16:39.4768739Z      ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4768933Z      ยท                                โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
2026-10-25T02:16:39.4769013Z  232 โ”‚   const assumedValue = props.value;
2026-10-25T02:16:39.4769064Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4769275Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-25T02:16:39.4769608Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4769611Z
2026-10-25T02:16:39.4769817Z   โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T02:16:39.4769949Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7]
2026-10-25T02:16:39.4770091Z  238 โ”‚     nativeEventSnapshotsRef.current = assumeComposerControlledState(
2026-10-25T02:16:39.4770178Z  239 โ”‚       nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4770267Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4770715Z      ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4770789Z  240 โ”‚       controlledEventCount,
2026-10-25T02:16:39.4770852Z  241 โ”‚       assumedValue,
2026-10-25T02:16:39.4770905Z  242 โ”‚     );
2026-10-25T02:16:39.4771058Z  243 โ”‚   }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
2026-10-25T02:16:39.4771190Z      ยท                                                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4771392Z      ยท                                                                    โ•ฐโ”€โ”€ Unnecessary dependency `controlledDocumentJson`
2026-10-25T02:16:39.4771479Z  244 โ”‚   const acceptNativeEvent = useCallback(
2026-10-25T02:16:39.4771528Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4771940Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4772245Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4772247Z
2026-10-25T02:16:39.4772388Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4772521Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29]
2026-10-25T02:16:39.4772641Z  163 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
2026-10-25T02:16:39.4772750Z  164 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-25T02:16:39.4772865Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4773070Z      ยท                                          โ•ฐโ”€โ”€ Cannot access ref value during render
2026-10-25T02:16:39.4773154Z  165 โ”‚     });
2026-10-25T02:16:39.4773204Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4773663Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4773947Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4773950Z
2026-10-25T02:16:39.4774092Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4774254Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29]
2026-10-25T02:16:39.4774380Z  163 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
2026-10-25T02:16:39.4774491Z  164 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-25T02:16:39.4774603Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4774804Z      ยท                                          โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4774859Z  165 โ”‚     });
2026-10-25T02:16:39.4774909Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4775357Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4775645Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4775650Z
2026-10-25T02:16:39.4775792Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4775922Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23]
2026-10-25T02:16:39.4775977Z  165 โ”‚     });
2026-10-25T02:16:39.4776064Z  166 โ”‚     confirmedTokensRef.current = tokens;
2026-10-25T02:16:39.4776184Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4776373Z      ยท              โ”‚            โ•ฐโ”€โ”€ Cannot update ref value during render
2026-10-25T02:16:39.4776486Z      ยท              โ•ฐโ”€โ”€ This value is a ref
2026-10-25T02:16:39.4776556Z  167 โ”‚     return JSON.stringify(
2026-10-25T02:16:39.4776608Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4777064Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4777353Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4777355Z
2026-10-25T02:16:39.4777497Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4777627Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5]
2026-10-25T02:16:39.4777696Z  207 โ”‚     mostRecentEventCount,
2026-10-25T02:16:39.4777783Z  208 โ”‚     nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4777932Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4778141Z      ยท                    โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4778200Z  209 โ”‚   );
2026-10-25T02:16:39.4778252Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4778705Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4778986Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4778991Z
2026-10-25T02:16:39.4779131Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4779267Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5]
2026-10-25T02:16:39.4779339Z  213 โ”‚     mostRecentEventCount,
2026-10-25T02:16:39.4779426Z  214 โ”‚     nativeEventSnapshotsRef.current,
2026-10-25T02:16:39.4779525Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4779709Z      ยท                    โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4779764Z  215 โ”‚   );
2026-10-25T02:16:39.4779816Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4780262Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4780552Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4780557Z
2026-10-25T02:16:39.4780740Z   โš  react(memo-dependencies): Found missing memoization dependencies
2026-10-25T02:16:39.4780872Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6]
2026-10-25T02:16:39.4780991Z  163 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
2026-10-25T02:16:39.4781102Z  164 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-25T02:16:39.4781210Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4781663Z      ยท                                      โ•ฐโ”€โ”€ Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4781720Z  165 โ”‚     });
2026-10-25T02:16:39.4781810Z  166 โ”‚     confirmedTokensRef.current = tokens;
2026-10-25T02:16:39.4781884Z  167 โ”‚     return JSON.stringify(
2026-10-25T02:16:39.4782046Z  168 โ”‚       composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
2026-10-25T02:16:39.4782113Z  169 โ”‚         const record =
2026-10-25T02:16:39.4782190Z  170 โ”‚           token.type === "context"
2026-10-25T02:16:39.4782355Z  171 โ”‚             ? props.context?.records.find((record) => record.contextId === token.contextId)
2026-10-25T02:16:39.4782421Z  172 โ”‚             : undefined;
2026-10-25T02:16:39.4782527Z  173 โ”‚         const presentation = contextChipPresentation(
2026-10-25T02:16:39.4782634Z  174 โ”‚           token.type === "context" ? token.kind : token.type,
2026-10-25T02:16:39.4782697Z  175 โ”‚           record,
2026-10-25T02:16:39.4782756Z  176 โ”‚         );
2026-10-25T02:16:39.4782892Z  177 โ”‚         const icon = contextChipIcon(
2026-10-25T02:16:39.4782985Z  178 โ”‚           presentation,
2026-10-25T02:16:39.4783126Z  179 โ”‚           token.type === "mention" ? token.value : contextRecordFileName(record),
2026-10-25T02:16:39.4783184Z  180 โ”‚         );
2026-10-25T02:16:39.4783245Z  181 โ”‚         return {
2026-10-25T02:16:39.4783315Z  182 โ”‚           type: token.type,
2026-10-25T02:16:39.4783390Z  183 โ”‚           source: token.source,
2026-10-25T02:16:39.4783460Z  184 โ”‚           start: token.start,
2026-10-25T02:16:39.4783524Z  185 โ”‚           end: token.end,
2026-10-25T02:16:39.4783670Z  186 โ”‚           accent: contextChipAccent(presentation.accent, theme, chipTextColor),
2026-10-25T02:16:39.4783731Z  187 โ”‚           label:
2026-10-25T02:16:39.4783808Z  188 โ”‚             token.type === "skill"
2026-10-25T02:16:39.4783912Z  189 โ”‚               ? (skillLabels.get(token.value) ?? token.value)
2026-10-25T02:16:39.4783998Z  190 โ”‚               : token.type === "context"
2026-10-25T02:16:39.4784243Z  191 โ”‚                 ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " ยท unavailable"}`
2026-10-25T02:16:39.4784352Z  192 โ”‚                 : basename(token.value),
2026-10-25T02:16:39.4784492Z  193 โ”‚           detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
2026-10-25T02:16:39.4784584Z  194 โ”‚           iconUri: contextChipIconUri(icon),
2026-10-25T02:16:39.4784675Z  195 โ”‚           tintsIcon: icon.kind === "chip",
2026-10-25T02:16:39.4784733Z  196 โ”‚         };
2026-10-25T02:16:39.4784788Z  197 โ”‚       }),
2026-10-25T02:16:39.4784843Z  198 โ”‚     );
2026-10-25T02:16:39.4784974Z  199 โ”‚   }, [props.value, props.context, skillLabels, theme, chipTextColor]);
2026-10-25T02:16:39.4785124Z      ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4785329Z      ยท                                     โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
2026-10-25T02:16:39.4785470Z  200 โ”‚   // Every render resolves against the snapshot history, so a render whose
2026-10-25T02:16:39.4785522Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4785725Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-25T02:16:39.4786029Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4786032Z
2026-10-25T02:16:39.4786212Z   โš  react(memo-dependencies): Found missing memoization dependencies
2026-10-25T02:16:39.4786344Z      โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5]
2026-10-25T02:16:39.4786478Z  253 โ”‚       mostRecentEventCountRef.current = acknowledgedEventCount;
2026-10-25T02:16:39.4786578Z  254 โ”‚       nativeEventSnapshotsRef.current.push({
2026-10-25T02:16:39.4786667Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4787114Z      ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-25T02:16:39.4787204Z  255 โ”‚         eventCount: acknowledgedEventCount,
2026-10-25T02:16:39.4787264Z  256 โ”‚         value,
2026-10-25T02:16:39.4787340Z  257 โ”‚         selection: nextSelection,
2026-10-25T02:16:39.4787397Z  258 โ”‚       });
2026-10-25T02:16:39.4787478Z  259 โ”‚       return acknowledgedEventCount;
2026-10-25T02:16:39.4787532Z  260 โ”‚     },
2026-10-25T02:16:39.4787632Z  261 โ”‚     [],
2026-10-25T02:16:39.4787755Z      ยท     โ”€โ”ฌ
2026-10-25T02:16:39.4787935Z      ยท      โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
2026-10-25T02:16:39.4787988Z  262 โ”‚   );
2026-10-25T02:16:39.4788038Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4788238Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-25T02:16:39.4788541Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4788543Z
2026-10-25T02:16:39.4788685Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4788800Z      โ•ญโ”€[apps/mobile/src/native/StackHeader.tsx:210:9]
2026-10-25T02:16:39.4788865Z  209 โ”‚         "options",
2026-10-25T02:16:39.4788962Z  210 โ”‚         latestOptionFunctionsRef.current,
2026-10-25T02:16:39.4789073Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4789259Z      ยท                         โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4789352Z  211 โ”‚         optionFunctionWrappersRef.current,
2026-10-25T02:16:39.4789402Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4789854Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4790138Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4790140Z
2026-10-25T02:16:39.4790284Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4790403Z      โ•ญโ”€[apps/mobile/src/native/StackHeader.tsx:211:9]
2026-10-25T02:16:39.4790495Z  210 โ”‚         latestOptionFunctionsRef.current,
2026-10-25T02:16:39.4790587Z  211 โ”‚         optionFunctionWrappersRef.current,
2026-10-25T02:16:39.4790750Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4790939Z      ยท                         โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4791030Z  212 โ”‚       ) as NativeStackNavigationOptions)
2026-10-25T02:16:39.4791082Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4791589Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4791911Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4791914Z
2026-10-25T02:16:39.4792112Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4792245Z      โ•ญโ”€[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
2026-10-25T02:16:39.4792328Z  453 โ”‚     showAuxiliaryPane("inspector");
2026-10-25T02:16:39.4792433Z  454 โ”‚   }, [environmentId, showAuxiliaryPane, threadId]);
2026-10-25T02:16:39.4792576Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€                     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4792778Z      ยท             โ”‚                               โ•ฐโ”€โ”€ Unnecessary dependency `threadId`
2026-10-25T02:16:39.4792928Z      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `environmentId`
2026-10-25T02:16:39.4792986Z  455 โ”‚   const {
2026-10-25T02:16:39.4793037Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4793324Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4793626Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4793628Z
2026-10-25T02:16:39.4793809Z   โš  react(static-components): Cannot create components during render
2026-10-25T02:16:39.4793939Z      โ•ญโ”€[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
2026-10-25T02:16:39.4794007Z  492 โ”‚   // same check.
2026-10-25T02:16:39.4794136Z  493 โ”‚   const NativeReviewDiffView = resolveNativeReviewDiffView();
2026-10-25T02:16:39.4794264Z      ยท                                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4794473Z      ยท                                             โ•ฐโ”€โ”€ The component is created during render here
2026-10-25T02:16:39.4794624Z  494 โ”‚   const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
2026-10-25T02:16:39.4794743Z  495 โ”‚   const showcasedReviewDrawRef = useRef<string | null>(null);
2026-10-25T02:16:39.4794872Z  496 โ”‚   const [isPullRefreshing, setIsPullRefreshing] = useState(false);
2026-10-25T02:16:39.4794961Z  497 โ”‚   const handlePullToRefresh = async () => {
2026-10-25T02:16:39.4795038Z  498 โ”‚     setIsPullRefreshing(true);
2026-10-25T02:16:39.4795121Z  499 โ”‚     await refreshSelectedSection();
2026-10-25T02:16:39.4795201Z  500 โ”‚     setIsPullRefreshing(false);
2026-10-25T02:16:39.4795255Z  501 โ”‚   };
2026-10-25T02:16:39.4795398Z  502 โ”‚   const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
2026-10-25T02:16:39.4795539Z  503 โ”‚   const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
2026-10-25T02:16:39.4795644Z  504 โ”‚   const fileVisibility = useReviewFileVisibility({
2026-10-25T02:16:39.4795727Z  505 โ”‚     threadKey: reviewCache.threadKey,
2026-10-25T02:16:39.4795817Z  506 โ”‚     sectionId: selectedSection?.id ?? null,
2026-10-25T02:16:39.4795885Z  507 โ”‚     files: reviewFiles,
2026-10-25T02:16:39.4795983Z  508 โ”‚     cachedExpandedFileIds: selectedSection?.id
2026-10-25T02:16:39.4796111Z  509 โ”‚       ? reviewCache.expandedFileIdsBySection[selectedSection.id]
2026-10-25T02:16:39.4796174Z  510 โ”‚       : undefined,
2026-10-25T02:16:39.4796315Z  511 โ”‚     cachedViewedFileIds: selectedSection?.id
2026-10-25T02:16:39.4796464Z  512 โ”‚       ? reviewCache.viewedFileIdsBySection[selectedSection.id]
2026-10-25T02:16:39.4796525Z  513 โ”‚       : undefined,
2026-10-25T02:16:39.4796580Z  514 โ”‚   });
2026-10-25T02:16:39.4796767Z  515 โ”‚   const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
2026-10-25T02:16:39.4796899Z  516 โ”‚   const commentSelection = useReviewCommentSelectionController({
2026-10-25T02:16:39.4796960Z  517 โ”‚     environmentId,
2026-10-25T02:16:39.4797022Z  518 โ”‚     threadId,
2026-10-25T02:16:39.4797087Z  519 โ”‚     selectedSection,
2026-10-25T02:16:39.4797155Z  520 โ”‚     nativeReviewDiffData,
2026-10-25T02:16:39.4797211Z  521 โ”‚   });
2026-10-25T02:16:39.4797316Z  522 โ”‚   const nativeBridge = useNativeReviewDiffBridge({
2026-10-25T02:16:39.4797401Z  523 โ”‚     threadKey: reviewCache.threadKey,
2026-10-25T02:16:39.4797492Z  524 โ”‚     sectionId: selectedSection?.id ?? null,
2026-10-25T02:16:39.4797572Z  525 โ”‚     diff: selectedSection?.diff,
2026-10-25T02:16:39.4797649Z  526 โ”‚     data: nativeReviewDiffData,
2026-10-25T02:16:39.4797716Z  527 โ”‚     collapsedFileIds,
2026-10-25T02:16:39.4797776Z  528 โ”‚     viewedFileIds,
2026-10-25T02:16:39.4797886Z  529 โ”‚     selectedRowIds: commentSelection.selectedRowIds,
2026-10-25T02:16:39.4800032Z  530 โ”‚     canHighlight: parsedDiff.kind === "files",
2026-10-25T02:16:39.4800096Z  531 โ”‚   });
2026-10-25T02:16:39.4800170Z  532 โ”‚   const showcaseReviewKey =
2026-10-25T02:16:39.4800302Z  533 โ”‚     SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
2026-10-25T02:16:39.4800507Z  534 โ”‚       ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
2026-10-25T02:16:39.4800568Z  535 โ”‚       : null;
2026-10-25T02:16:39.4800739Z  536 โ”‚   const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
2026-10-25T02:16:39.4800818Z  537 โ”‚     nativeBridge.onDebug(event);
2026-10-25T02:16:39.4800873Z  538 โ”‚     if (
2026-10-25T02:16:39.4800952Z  539 โ”‚       showcaseReviewKey === null ||
2026-10-25T02:16:39.4801072Z  540 โ”‚       showcasedReviewDrawRef.current === showcaseReviewKey ||
2026-10-25T02:16:39.4801179Z  541 โ”‚       !isNativeReviewDiffDrawEvent(event.nativeEvent)
2026-10-25T02:16:39.4801232Z  542 โ”‚     ) {
2026-10-25T02:16:39.4801292Z  543 โ”‚       return;
2026-10-25T02:16:39.4801345Z  544 โ”‚     }
2026-10-25T02:16:39.4801454Z  545 โ”‚     showcasedReviewDrawRef.current = showcaseReviewKey;
2026-10-25T02:16:39.4801613Z  546 โ”‚     reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
2026-10-25T02:16:39.4801666Z  547 โ”‚   };
2026-10-25T02:16:39.4801717Z  548 โ”‚
2026-10-25T02:16:39.4801837Z  549 โ”‚   const handleSelectFile = async (fileId: string | null) => {
2026-10-25T02:16:39.4801918Z  550 โ”‚     loadVisibleFile(fileId, true);
2026-10-25T02:16:39.4802005Z  551 โ”‚     commentSelection.clearSelection();
2026-10-25T02:16:39.4802122Z  552 โ”‚     if (fileId !== null && collapsedFileIds.includes(fileId)) {
2026-10-25T02:16:39.4802198Z  553 โ”‚       toggleExpandedFile(fileId);
2026-10-25T02:16:39.4802251Z  554 โ”‚     }
2026-10-25T02:16:39.4802360Z  555 โ”‚     const nativeView = nativeReviewDiffViewRef.current;
2026-10-25T02:16:39.4802429Z  556 โ”‚     if (!nativeView) return;
2026-10-25T02:16:39.4802519Z  557 โ”‚     const result = await settlePromise(() =>
2026-10-25T02:16:39.4802690Z  558 โ”‚       fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
2026-10-25T02:16:39.4802745Z  559 โ”‚     );
2026-10-25T02:16:39.4802833Z  560 โ”‚     if (AsyncResult.isFailure(result)) {
2026-10-25T02:16:39.4803093Z  561 โ”‚       console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
2026-10-25T02:16:39.4803177Z  562 โ”‚     }
2026-10-25T02:16:39.4803230Z  563 โ”‚   };
2026-10-25T02:16:39.4803311Z  564 โ”‚   const handleVisibleFileChange = (
2026-10-25T02:16:39.4803439Z  565 โ”‚     event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
2026-10-25T02:16:39.4803496Z  566 โ”‚   ) => {
2026-10-25T02:16:39.4803604Z  567 โ”‚     loadVisibleFile(event.nativeEvent.fileId ?? null);
2026-10-25T02:16:39.4803773Z  568 โ”‚     reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
2026-10-25T02:16:39.4803824Z  569 โ”‚   };
2026-10-25T02:16:39.4803902Z  570 โ”‚   const renderInspector = () => (
2026-10-25T02:16:39.4803972Z  571 โ”‚     <ReviewFileNavigator
2026-10-25T02:16:39.4804051Z  572 โ”‚       ref={reviewFileNavigatorRef}
2026-10-25T02:16:39.4804142Z  573 โ”‚       files={nativeReviewDiffData.files}
2026-10-25T02:16:39.4804230Z  574 โ”‚       headerInset={insets.top}
2026-10-25T02:16:39.4804350Z  575 โ”‚       sectionId={selectedSection?.id ?? null}
2026-10-25T02:16:39.4804468Z  576 โ”‚       onSelectFile={(fileId) => void handleSelectFile(fileId)}
2026-10-25T02:16:39.4804521Z  577 โ”‚     />
2026-10-25T02:16:39.4804574Z  578 โ”‚   );
2026-10-25T02:16:39.4804626Z  579 โ”‚
2026-10-25T02:16:39.4804806Z  580 โ”‚   const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
2026-10-25T02:16:39.4804891Z  581 โ”‚     const { fileId } = event.nativeEvent;
2026-10-25T02:16:39.4804954Z  582 โ”‚     if (fileId) {
2026-10-25T02:16:39.4805033Z  583 โ”‚       loadVisibleFile(fileId, true);
2026-10-25T02:16:39.4805109Z  584 โ”‚       toggleExpandedFile(fileId);
2026-10-25T02:16:39.4805162Z  585 โ”‚     }
2026-10-25T02:16:39.4805218Z  586 โ”‚   };
2026-10-25T02:16:39.4805270Z  587 โ”‚
2026-10-25T02:16:39.4805361Z  588 โ”‚   const handleNativeToggleViewedFile = (
2026-10-25T02:16:39.4805480Z  589 โ”‚     event: NativeSyntheticEvent<{ readonly fileId?: string }>,
2026-10-25T02:16:39.4805536Z  590 โ”‚   ) => {
2026-10-25T02:16:39.4805620Z  591 โ”‚     const { fileId } = event.nativeEvent;
2026-10-25T02:16:39.4805680Z  592 โ”‚     if (fileId) {
2026-10-25T02:16:39.4805754Z  593 โ”‚       toggleViewedFile(fileId);
2026-10-25T02:16:39.4805808Z  594 โ”‚     }
2026-10-25T02:16:39.4805861Z  595 โ”‚   };
2026-10-25T02:16:39.4805911Z  596 โ”‚
2026-10-25T02:16:39.4805980Z  597 โ”‚   const parsedDiffNotice =
2026-10-25T02:16:39.4806139Z  598 โ”‚     parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
2026-10-25T02:16:39.4806260Z  599 โ”‚   const hasCachedSelectedDiff = selectedSection?.diff != null;
2026-10-25T02:16:39.4806419Z  600 โ”‚   const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
2026-10-25T02:16:39.4806541Z  601 โ”‚   const sectionMenu = buildReviewSectionMenu(reviewSections);
2026-10-25T02:16:39.4806697Z  602 โ”‚   const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
2026-10-25T02:16:39.4806806Z  603 โ”‚     hasEnvironmentPresentation: environment.isReady,
2026-10-25T02:16:39.4806904Z  604 โ”‚     isEnvironmentConnected: isEnvironmentReady,
2026-10-25T02:16:39.4806974Z  605 โ”‚     hasCachedSelectedDiff,
2026-10-25T02:16:39.4807039Z  606 โ”‚     hasAnyCachedDiff,
2026-10-25T02:16:39.4807091Z  607 โ”‚   });
2026-10-25T02:16:39.4807179Z  608 โ”‚   const handleRetryEnvironment = () => {
2026-10-25T02:16:39.4807264Z  609 โ”‚     void retryEnvironment(environmentId);
2026-10-25T02:16:39.4807317Z  610 โ”‚   };
2026-10-25T02:16:39.4807398Z  611 โ”‚   const handleReturnToThread = () => {
2026-10-25T02:16:39.4807474Z  612 โ”‚     if (navigation.canGoBack()) {
2026-10-25T02:16:39.4807590Z  613 โ”‚       navigation.goBack();
2026-10-25T02:16:39.4807680Z  614 โ”‚       return;
2026-10-25T02:16:39.4807730Z  615 โ”‚     }
2026-10-25T02:16:39.4807809Z  616 โ”‚     navigation.navigate("Thread", {
2026-10-25T02:16:39.4807895Z  617 โ”‚       environmentId: String(environmentId),
2026-10-25T02:16:39.4807970Z  618 โ”‚       threadId: String(threadId),
2026-10-25T02:16:39.4808024Z  619 โ”‚     });
2026-10-25T02:16:39.4808076Z  620 โ”‚   };
2026-10-25T02:16:39.4808156Z  621 โ”‚   const androidHeaderSubtitle = [
2026-10-25T02:16:39.4808228Z  622 โ”‚     selectedSection?.title,
2026-10-25T02:16:39.4808305Z  623 โ”‚     headerDiffSummary.additions,
2026-10-25T02:16:39.4808383Z  624 โ”‚     headerDiffSummary.deletions,
2026-10-25T02:16:39.4808434Z  625 โ”‚   ]
2026-10-25T02:16:39.4808536Z  626 โ”‚     .filter((part): part is string => Boolean(part))
2026-10-25T02:16:39.4808606Z  627 โ”‚     .join(" ยท ");
2026-10-25T02:16:39.4808660Z  628 โ”‚
2026-10-25T02:16:39.4808737Z  629 โ”‚   const showChangedFilesPane =
2026-10-25T02:16:39.4808807Z  630 โ”‚     !showConnectionNotice &&
2026-10-25T02:16:39.4808879Z  631 โ”‚     selectedSection !== null &&
2026-10-25T02:16:39.4808956Z  632 โ”‚     parsedDiff.kind === "files" &&
2026-10-25T02:16:39.4809033Z  633 โ”‚     NativeReviewDiffView !== null;
2026-10-25T02:16:39.4809198Z  634 โ”‚   useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
2026-10-25T02:16:39.4809367Z  635 โ”‚   const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
2026-10-25T02:16:39.4809418Z  636 โ”‚
2026-10-25T02:16:39.4809488Z  637 โ”‚   const listHeader = (() => {
2026-10-25T02:16:39.4809570Z  638 โ”‚     const children: ReactElement[] = [];
2026-10-25T02:16:39.4809623Z  639 โ”‚
2026-10-25T02:16:39.4809685Z  640 โ”‚     if (error) {
2026-10-25T02:16:39.4809757Z  641 โ”‚       children.push(
2026-10-25T02:16:39.4809817Z  642 โ”‚         <View
2026-10-25T02:16:39.4809888Z  643 โ”‚           key="review-error"
2026-10-25T02:16:39.4809952Z  644 โ”‚           className={cn(
2026-10-25T02:16:39.4810027Z  645 โ”‚             "bg-card px-4 py-3",
2026-10-25T02:16:39.4810177Z  646 โ”‚             Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
2026-10-25T02:16:39.4810237Z  647 โ”‚           )}
2026-10-25T02:16:39.4810292Z  648 โ”‚         >
2026-10-25T02:16:39.4810449Z  649 โ”‚           <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
2026-10-25T02:16:39.4810604Z  650 โ”‚           <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
2026-10-25T02:16:39.4810664Z  651 โ”‚         </View>,
2026-10-25T02:16:39.4810719Z  652 โ”‚       );
2026-10-25T02:16:39.4810770Z  653 โ”‚     }
2026-10-25T02:16:39.4810828Z  654 โ”‚
2026-10-25T02:16:39.4810902Z  655 โ”‚     if (parsedDiffNotice) {
2026-10-25T02:16:39.4811058Z  656 โ”‚       children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
2026-10-25T02:16:39.4811110Z  657 โ”‚     }
2026-10-25T02:16:39.4811162Z  658 โ”‚
2026-10-25T02:16:39.4811238Z  659 โ”‚     if (children.length === 0) {
2026-10-25T02:16:39.4811302Z  660 โ”‚       return null;
2026-10-25T02:16:39.4811353Z  661 โ”‚     }
2026-10-25T02:16:39.4811405Z  662 โ”‚
2026-10-25T02:16:39.4811473Z  663 โ”‚     return <>{children}</>;
2026-10-25T02:16:39.4811528Z  664 โ”‚   })();
2026-10-25T02:16:39.4811595Z  665 โ”‚   const headerSubtitle = [
2026-10-25T02:16:39.4811672Z  666 โ”‚     headerDiffSummary.additions,
2026-10-25T02:16:39.4811748Z  667 โ”‚     headerDiffSummary.deletions,
2026-10-25T02:16:39.4811825Z  668 โ”‚     pendingReviewCommentCount > 0
2026-10-25T02:16:39.4812046Z  669 โ”‚       ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
2026-10-25T02:16:39.4812137Z  670 โ”‚       : null,
2026-10-25T02:16:39.4812189Z  671 โ”‚   ]
2026-10-25T02:16:39.4812253Z  672 โ”‚     .filter(Boolean)
2026-10-25T02:16:39.4812315Z  673 โ”‚     .join(" ยท ");
2026-10-25T02:16:39.4812447Z  674 โ”‚   const headerTitleText = selectedSection?.title ?? "Review changes";
2026-10-25T02:16:39.4812498Z  675 โ”‚
2026-10-25T02:16:39.4812555Z  676 โ”‚   return (
2026-10-25T02:16:39.4812610Z  677 โ”‚     <>
2026-10-25T02:16:39.4812674Z  678 โ”‚       <ReviewHeader
2026-10-25T02:16:39.4812761Z  679 โ”‚         environmentId={environmentId}
2026-10-25T02:16:39.4812829Z  680 โ”‚         threadId={threadId}
2026-10-25T02:16:39.4812902Z  681 โ”‚         title={headerTitleText}
2026-10-25T02:16:39.4812976Z  682 โ”‚         subtitle={headerSubtitle}
2026-10-25T02:16:39.4813079Z  683 โ”‚         androidSubtitle={androidHeaderSubtitle}
2026-10-25T02:16:39.4813152Z  684 โ”‚         iconColor={headerIcon}
2026-10-25T02:16:39.4813245Z  685 โ”‚         selectedThreadCwd={selectedThreadCwd}
2026-10-25T02:16:39.4813321Z  686 โ”‚         sectionMenu={sectionMenu}
2026-10-25T02:16:39.4813403Z  687 โ”‚         selectedSection={selectedSection}
2026-10-25T02:16:39.4813498Z  688 โ”‚         showSectionToolbar={showSectionToolbar}
2026-10-25T02:16:39.4813606Z  689 โ”‚         showChangedFilesToggle={showChangedFilesToggle}
2026-10-25T02:16:39.4813690Z  690 โ”‚         onRefresh={handlePullToRefresh}
2026-10-25T02:16:39.4813768Z  691 โ”‚         onSelectSection={selectSection}
2026-10-25T02:16:39.4813863Z  692 โ”‚         onReturnToThread={handleReturnToThread}
2026-10-25T02:16:39.4813919Z  693 โ”‚       />
2026-10-25T02:16:39.4813971Z  694 โ”‚
2026-10-25T02:16:39.4814034Z  695 โ”‚       <ScreenContent>
2026-10-25T02:16:39.4814159Z  696 โ”‚         <View className="flex-1 bg-sheet android:bg-sheet-solid">
2026-10-25T02:16:39.4814273Z  697 โ”‚           {showConnectionNotice ? (
2026-10-25T02:16:39.4814410Z  698 โ”‚             <View className="flex-1" style={{ paddingTop: topContentInset }}>
2026-10-25T02:16:39.4814496Z  699 โ”‚               <EnvironmentConnectionNotice
2026-10-25T02:16:39.4814669Z  700 โ”‚                 environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
2026-10-25T02:16:39.4814737Z  701 โ”‚                 connection={
2026-10-25T02:16:39.4814841Z  702 โ”‚                   environment.presentation?.connection ?? {
2026-10-25T02:16:39.4814919Z  703 โ”‚                     phase: "available",
2026-10-25T02:16:39.4814990Z  704 โ”‚                     error: null,
2026-10-25T02:16:39.4815062Z  705 โ”‚                     traceId: null,
2026-10-25T02:16:39.4815125Z  706 โ”‚                   }
2026-10-25T02:16:39.4815182Z  707 โ”‚                 }
2026-10-25T02:16:39.4815265Z  708 โ”‚                 resourceName="review"
2026-10-25T02:16:39.4815361Z  709 โ”‚                 onRetry={handleRetryEnvironment}
2026-10-25T02:16:39.4815420Z  710 โ”‚               />
2026-10-25T02:16:39.4815480Z  711 โ”‚             </View>
2026-10-25T02:16:39.4815631Z  712 โ”‚           ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
2026-10-25T02:16:39.4815694Z  713 โ”‚             <View
2026-10-25T02:16:39.4815765Z  714 โ”‚               className="flex-1"
2026-10-25T02:16:39.4815828Z  715 โ”‚               style={{
2026-10-25T02:16:39.4815943Z  716 โ”‚                 backgroundColor: nativeBridge.theme.background,
2026-10-25T02:16:39.4816002Z  717 โ”‚               }}
2026-10-25T02:16:39.4816061Z  718 โ”‚             >
2026-10-25T02:16:39.4816120Z  719 โ”‚               <View
2026-10-25T02:16:39.4816205Z  720 โ”‚                 className="min-w-0 flex-1"
2026-10-25T02:16:39.4816390Z  721 โ”‚                 style={listHeader ? { paddingTop: topContentInset } : undefined}
2026-10-25T02:16:39.4816485Z  722 โ”‚               >
2026-10-25T02:16:39.4816552Z  723 โ”‚                 {listHeader}
2026-10-25T02:16:39.4816671Z  724 โ”‚                 <View className="min-w-0 flex-1" collapsable={false}>
2026-10-25T02:16:39.4816753Z  725 โ”‚                   <NativeReviewDiffView
2026-10-25T02:16:39.4816858Z      ยท                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4817028Z      ยท                              โ•ฐโ”€โ”€ This component is created during render
2026-10-25T02:16:39.4817108Z  726 โ”‚                     collapsable={false}
2026-10-25T02:16:39.4817161Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4817406Z   help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-25T02:16:39.4817729Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-25T02:16:39.4817735Z
2026-10-25T02:16:39.4817965Z   โš  unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily.
2026-10-25T02:16:39.4818103Z     โ•ญโ”€[apps/mobile/src/native/native-layout-metrics.tsx:43:27]
2026-10-25T02:16:39.4818171Z  42 โ”‚     latestMetrics = next;
2026-10-25T02:16:39.4818279Z  43 โ”‚     for (const settle of [...metricsWaiters]) settle(next);
2026-10-25T02:16:39.4818364Z     ยท                           โ”€โ”€โ”€
2026-10-25T02:16:39.4818431Z  44 โ”‚     setMetrics(next);
2026-10-25T02:16:39.4818484Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4818663Z   help: `forโ€ฆof` can iterate over iterable, it's unnecessary to convert to an array.
2026-10-25T02:16:39.4818672Z
2026-10-25T02:16:39.4819134Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4819310Z      โ•ญโ”€[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
2026-10-25T02:16:39.4819380Z  222 โ”‚         let idlePasses = 0;
2026-10-25T02:16:39.4819524Z  223 โ”‚ โ•ญโ”€โ–ถ     for (;;) {
2026-10-25T02:16:39.4819659Z  224 โ”‚ โ”‚         yield* Effect.promise(() => Promise.resolve());
2026-10-25T02:16:39.4819803Z  225 โ”‚ โ”‚         const pending = backgroundRuntime.pending.shift();
2026-10-25T02:16:39.4819901Z  226 โ”‚ โ”‚         if (!pending) {
2026-10-25T02:16:39.4819998Z  227 โ”‚ โ”‚           idlePasses++;
2026-10-25T02:16:39.4820103Z  228 โ”‚ โ”‚           if (idlePasses >= 3) {
2026-10-25T02:16:39.4820187Z  229 โ”‚ โ”‚             return;
2026-10-25T02:16:39.4820263Z  230 โ”‚ โ”‚           }
2026-10-25T02:16:39.4820347Z  231 โ”‚ โ”‚           continue;
2026-10-25T02:16:39.4820421Z  232 โ”‚ โ”‚         }
2026-10-25T02:16:39.4820513Z  233 โ”‚ โ”‚         idlePasses = 0;
2026-10-25T02:16:39.4820626Z  234 โ”‚ โ”‚         const exit = yield* Effect.exit(
2026-10-25T02:16:39.4820836Z  235 โ”‚ โ”‚           pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
2026-10-25T02:16:39.4820910Z  236 โ”‚ โ”‚         );
2026-10-25T02:16:39.4821061Z  237 โ”‚ โ”‚         yield* Effect.sync(() => {
2026-10-25T02:16:39.4821193Z  238 โ”‚ โ”‚           pending.resolve(exit);
2026-10-25T02:16:39.4821268Z  239 โ”‚ โ”‚         });
2026-10-25T02:16:39.4821393Z  240 โ”‚ โ•ฐโ”€โ–ถ     }
2026-10-25T02:16:39.4821449Z  241 โ”‚       },
2026-10-25T02:16:39.4821501Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4821504Z
2026-10-25T02:16:39.4821703Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4821845Z      โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
2026-10-25T02:16:39.4821939Z  256 โ”‚     return () => cancelAnimationFrame(frame);
2026-10-25T02:16:39.4822017Z  257 โ”‚   }, [props.path, targetIndex]);
2026-10-25T02:16:39.4822093Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4822241Z      ยท            โ•ฐโ”€โ”€ Unnecessary dependency `props.path`
2026-10-25T02:16:39.4822296Z  258 โ”‚
2026-10-25T02:16:39.4822350Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4822642Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4822948Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4822951Z
2026-10-25T02:16:39.4823143Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4823287Z      โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
2026-10-25T02:16:39.4823358Z  292 โ”‚                     <SourceText
2026-10-25T02:16:39.4823457Z  293 โ”‚                       key={`${index}:${tokenIndex}`}
2026-10-25T02:16:39.4823576Z      ยท                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4823644Z  294 โ”‚                       style={{
2026-10-25T02:16:39.4823694Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4823837Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4823840Z
2026-10-25T02:16:39.4824026Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4824168Z      โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
2026-10-25T02:16:39.4824244Z  308 โ”‚             return (
2026-10-25T02:16:39.4824353Z  309 โ”‚               <SourceText key={index}>
2026-10-25T02:16:39.4824451Z      ยท                           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4824563Z  310 โ”‚                 {body}
2026-10-25T02:16:39.4824643Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4824783Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4824788Z
2026-10-25T02:16:39.4825040Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4825214Z     โ•ญโ”€[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
2026-10-25T02:16:39.4825267Z  58 โ”‚
2026-10-25T02:16:39.4825329Z  59 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4825397Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4825526Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4825606Z  60 โ”‚     setMountedModes((current) => {
2026-10-25T02:16:39.4825682Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4825856Z     ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4825939Z  61 โ”‚       if (current.has(props.mode)) {
2026-10-25T02:16:39.4825991Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4826580Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4826895Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4826897Z
2026-10-25T02:16:39.4827357Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4827490Z      โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:131:9]
2026-10-25T02:16:39.4827551Z  130 โ”‚           ) {
2026-10-25T02:16:39.4827758Z  131 โ”‚ โ•ญโ”€โ–ถ         for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T02:16:39.4827879Z  132 โ”‚ โ”‚             if (subscriptions.length >= count) {
2026-10-25T02:16:39.4827969Z  133 โ”‚ โ”‚               return;
2026-10-25T02:16:39.4828052Z  134 โ”‚ โ”‚             }
2026-10-25T02:16:39.4828159Z  135 โ”‚ โ”‚             yield* Effect.yieldNow;
2026-10-25T02:16:39.4828289Z  136 โ”‚ โ•ฐโ”€โ–ถ         }
2026-10-25T02:16:39.4828456Z  137 โ”‚             return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`));
2026-10-25T02:16:39.4828511Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4828514Z
2026-10-25T02:16:39.4828967Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4829097Z      โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:252:7]
2026-10-25T02:16:39.4829255Z  251 โ”‚           yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient)));
2026-10-25T02:16:39.4829504Z  252 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) {
2026-10-25T02:16:39.4829653Z  253 โ”‚ โ”‚           yield* Effect.yieldNow;
2026-10-25T02:16:39.4829811Z  254 โ”‚ โ•ฐโ”€โ–ถ       }
2026-10-25T02:16:39.4829931Z  255 โ”‚           yield* SubscriptionRef.set(activeSession, Option.none());
2026-10-25T02:16:39.4829982Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4829984Z
2026-10-25T02:16:39.4830428Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4830555Z      โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:258:7]
2026-10-25T02:16:39.4830611Z  257 โ”‚
2026-10-25T02:16:39.4830921Z  258 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-25T02:16:39.4831026Z  259 โ”‚ โ”‚           yield* Effect.yieldNow;
2026-10-25T02:16:39.4831156Z  260 โ”‚ โ•ฐโ”€โ–ถ       }
2026-10-25T02:16:39.4831258Z  261 โ”‚           yield* Fiber.interrupt(subscriptionFiber);
2026-10-25T02:16:39.4831308Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4831311Z
2026-10-25T02:16:39.4831757Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4831882Z      โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:322:7]
2026-10-25T02:16:39.4831942Z  321 โ”‚           );
2026-10-25T02:16:39.4832196Z  322 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
2026-10-25T02:16:39.4832299Z  323 โ”‚ โ”‚           yield* Effect.yieldNow;
2026-10-25T02:16:39.4832424Z  324 โ”‚ โ•ฐโ”€โ–ถ       }
2026-10-25T02:16:39.4832477Z  325 โ”‚
2026-10-25T02:16:39.4832526Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4832529Z
2026-10-25T02:16:39.4832970Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4833096Z      โ•ญโ”€[packages/client-runtime/src/rpc/client.test.ts:330:7]
2026-10-25T02:16:39.4833256Z  329 โ”‚           yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
2026-10-25T02:16:39.4833500Z  330 โ”‚ โ•ญโ”€โ–ถ       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-25T02:16:39.4833728Z  331 โ”‚ โ”‚           yield* Effect.yieldNow;
2026-10-25T02:16:39.4833853Z  332 โ”‚ โ•ฐโ”€โ–ถ       }
2026-10-25T02:16:39.4833953Z  333 โ”‚           yield* Fiber.interrupt(subscriptionFiber);
2026-10-25T02:16:39.4834003Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4834005Z
2026-10-25T02:16:39.4834481Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4834612Z      โ•ญโ”€[packages/client-runtime/src/rpc/session.test.ts:226:3]
2026-10-25T02:16:39.4834668Z  225 โ”‚     ) {
2026-10-25T02:16:39.4834926Z  226 โ”‚ โ•ญโ”€โ–ถ   for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T02:16:39.4835077Z  227 โ”‚ โ”‚       const socket = sockets[index];
2026-10-25T02:16:39.4835162Z  228 โ”‚ โ”‚       if (socket) {
2026-10-25T02:16:39.4835256Z  229 โ”‚ โ”‚         return socket;
2026-10-25T02:16:39.4835326Z  230 โ”‚ โ”‚       }
2026-10-25T02:16:39.4835426Z  231 โ”‚ โ”‚       yield* Effect.yieldNow;
2026-10-25T02:16:39.4835547Z  232 โ”‚ โ•ฐโ”€โ–ถ   }
2026-10-25T02:16:39.4835720Z  233 โ”‚       return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
2026-10-25T02:16:39.4835769Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4835772Z
2026-10-25T02:16:39.4836221Z   โš  t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-25T02:16:39.4836353Z      โ•ญโ”€[packages/client-runtime/src/rpc/session.test.ts:240:3]
2026-10-25T02:16:39.4836407Z  239 โ”‚     ) {
2026-10-25T02:16:39.4836601Z  240 โ”‚ โ•ญโ”€โ–ถ   for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-25T02:16:39.4836809Z  241 โ”‚ โ”‚       const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
2026-10-25T02:16:39.4836899Z  242 โ”‚ โ”‚       if (request) {
2026-10-25T02:16:39.4836990Z  243 โ”‚ โ”‚         return request;
2026-10-25T02:16:39.4837060Z  244 โ”‚ โ”‚       }
2026-10-25T02:16:39.4837164Z  245 โ”‚ โ”‚       yield* Effect.yieldNow;
2026-10-25T02:16:39.4837288Z  246 โ”‚ โ•ฐโ”€โ–ถ   }
2026-10-25T02:16:39.4837452Z  247 โ”‚       return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
2026-10-25T02:16:39.4837501Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4837505Z
2026-10-25T02:16:39.4837693Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4837835Z     โ•ญโ”€[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
2026-10-25T02:16:39.4837921Z  35 โ”‚       <T3SourceTextRunNativeComponent
2026-10-25T02:16:39.4837983Z  36 โ”‚         key={index}
2026-10-25T02:16:39.4838059Z     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4838132Z  37 โ”‚         style={flattenedStyle}
2026-10-25T02:16:39.4838182Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4838331Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4838337Z
2026-10-25T02:16:39.4838490Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4838644Z     โ•ญโ”€[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
2026-10-25T02:16:39.4838737Z  53 โ”‚ function usePulseAnimation(pulse: boolean) {
2026-10-25T02:16:39.4838826Z  54 โ”‚   const pulseProgress = useSharedValue(0);
2026-10-25T02:16:39.4838903Z     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4839042Z     ยท               โ•ฐโ”€โ”€ `pulseProgress` originates here
2026-10-25T02:16:39.4839093Z  55 โ”‚
2026-10-25T02:16:39.4839156Z  56 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4839216Z  57 โ”‚     if (pulse) {
2026-10-25T02:16:39.4839301Z  58 โ”‚       pulseProgress.value = withRepeat(
2026-10-25T02:16:39.4839425Z     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4839594Z     ยท             โ•ฐโ”€โ”€ `pulseProgress` cannot be modified
2026-10-25T02:16:39.4839661Z  59 โ”‚         withTiming(1, {
2026-10-25T02:16:39.4839711Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4839971Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4840273Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4840276Z
2026-10-25T02:16:39.4840528Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4840700Z      โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:124:7]
2026-10-25T02:16:39.4840753Z  119 โ”‚
2026-10-25T02:16:39.4840817Z  120 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4840886Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4841012Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4841094Z  121 โ”‚     if (orientationSettled) return;
2026-10-25T02:16:39.4841205Z  122 โ”‚     const orientation = getNativeShowcaseOrientation();
2026-10-25T02:16:39.4841277Z  123 โ”‚     if (orientation === null) {
2026-10-25T02:16:39.4841355Z  124 โ”‚       setOrientationSettled(true);
2026-10-25T02:16:39.4841443Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4841612Z      ยท                 โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4841672Z  125 โ”‚       return;
2026-10-25T02:16:39.4841722Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4842310Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4842628Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4842631Z
2026-10-25T02:16:39.4842882Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4843045Z      โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:300:7]
2026-10-25T02:16:39.4843097Z  288 โ”‚
2026-10-25T02:16:39.4843166Z  289 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4843238Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4843361Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4843418Z  290 โ”‚     if (
2026-10-25T02:16:39.4843483Z  291 โ”‚       scene === null ||
2026-10-25T02:16:39.4843558Z  292 โ”‚       requestedScene === null ||
2026-10-25T02:16:39.4843631Z  293 โ”‚       scene !== requestedScene ||
2026-10-25T02:16:39.4843694Z  294 โ”‚       !hasFixture ||
2026-10-25T02:16:39.4843764Z  295 โ”‚       !orientationSettled ||
2026-10-25T02:16:39.4843829Z  296 โ”‚       !themeApplied ||
2026-10-25T02:16:39.4843943Z  297 โ”‚       (scene === "agent-activity" && !agentActivityStaged) ||
2026-10-25T02:16:39.4844075Z  298 โ”‚       !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
2026-10-25T02:16:39.4844130Z  299 โ”‚     ) {
2026-10-25T02:16:39.4844253Z  300 โ”‚       setReadyScene(null);
2026-10-25T02:16:39.4844389Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4844557Z      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4844617Z  301 โ”‚       return;
2026-10-25T02:16:39.4844666Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4845246Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4845560Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4845563Z
2026-10-25T02:16:39.4845832Z   โš  eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
2026-10-25T02:16:39.4846001Z      โ•ญโ”€[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:129:9]
2026-10-25T02:16:39.4846068Z  128 โ”‚     let cancelled = false;
2026-10-25T02:16:39.4846157Z  129 โ”‚     let lastOutcome: string | null = null;
2026-10-25T02:16:39.4846234Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4846366Z      ยท              โ•ฐโ”€โ”€ 'lastOutcome' is declared here
2026-10-25T02:16:39.4846540Z  130 โ”‚     void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
2026-10-25T02:16:39.4846591Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4846693Z   help: Consider removing this declaration.
2026-10-25T02:16:39.4846695Z
2026-10-25T02:16:39.4846899Z   โš  eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-25T02:16:39.4847032Z    โ•ญโ”€[packages/client-runtime/src/state/usageAccess.ts:3:8]
2026-10-25T02:16:39.4847103Z  2 โ”‚   AuthDiagnosticsReadScope,
2026-10-25T02:16:39.4847171Z  3 โ”‚   type AuthSessionState,
2026-10-25T02:16:39.4847252Z    ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4847392Z    ยท                โ•ฐโ”€โ”€ 'AuthSessionState' is imported here
2026-10-25T02:16:39.4847459Z  4 โ”‚   sessionGrantsScope,
2026-10-25T02:16:39.4847509Z    โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4847605Z   help: Consider removing this import.
2026-10-25T02:16:39.4847607Z
2026-10-25T02:16:39.4847858Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4848070Z     โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:82:5]
2026-10-25T02:16:39.4848149Z  79 โ”‚
2026-10-25T02:16:39.4848212Z  80 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4848281Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4848407Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4848532Z  81 โ”‚     const { host, code } = parsePairingUrl(connectionPairingUrl);
2026-10-25T02:16:39.4848597Z  82 โ”‚     setHostInput(host);
2026-10-25T02:16:39.4848670Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4848833Z     ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4848898Z  83 โ”‚     setCodeInput(code);
2026-10-25T02:16:39.4848948Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4849538Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4849854Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4849856Z
2026-10-25T02:16:39.4850117Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4850283Z     โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:92:5]
2026-10-25T02:16:39.4850335Z  85 โ”‚
2026-10-25T02:16:39.4850395Z  86 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4850464Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4850591Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4850681Z  87 โ”‚     if (routePairingUrl.length === 0) {
2026-10-25T02:16:39.4850739Z  88 โ”‚       return;
2026-10-25T02:16:39.4850792Z  89 โ”‚     }
2026-10-25T02:16:39.4850842Z  90 โ”‚
2026-10-25T02:16:39.4850956Z  91 โ”‚     const { host, code } = parsePairingUrl(routePairingUrl);
2026-10-25T02:16:39.4851019Z  92 โ”‚     setHostInput(host);
2026-10-25T02:16:39.4851093Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4851256Z     ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4851320Z  93 โ”‚     setCodeInput(code);
2026-10-25T02:16:39.4851369Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4851954Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4852270Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4852272Z
2026-10-25T02:16:39.4852521Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4852684Z     โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:98:7]
2026-10-25T02:16:39.4852734Z  95 โ”‚
2026-10-25T02:16:39.4852795Z  96 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4852863Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4852985Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4853115Z  97 โ”‚     if (pairingConnectionError) {
2026-10-25T02:16:39.4853213Z  98 โ”‚       setIsSubmitting(false);
2026-10-25T02:16:39.4853293Z     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4853461Z     ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4853515Z  99 โ”‚     }
2026-10-25T02:16:39.4853565Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4854139Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4854488Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4854493Z
2026-10-25T02:16:39.4854694Z   โš  eslint(no-unused-vars): Identifier 'openSettings' is imported but never used.
2026-10-25T02:16:39.4854860Z     โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10]
2026-10-25T02:16:39.4854994Z  34 โ”‚ import { splitEnvironmentSections } from "./environmentSections";
2026-10-25T02:16:39.4855116Z  35 โ”‚ import { openSettings } from "../settings/settings-navigation";
2026-10-25T02:16:39.4855194Z     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4855329Z     ยท                โ•ฐโ”€โ”€ 'openSettings' is imported here
2026-10-25T02:16:39.4855460Z  36 โ”‚ import { leaveSettingsPage } from "../settings/settings-navigation";
2026-10-25T02:16:39.4855512Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4855614Z   help: Consider removing this import.
2026-10-25T02:16:39.4855619Z
2026-10-25T02:16:39.4855868Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4856018Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7]
2026-10-25T02:16:39.4856153Z  355 โ”‚   }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
2026-10-25T02:16:39.4856217Z  356 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4856286Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4856412Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4856500Z  357 โ”‚     if (!isReturningToProjectPicker) {
2026-10-25T02:16:39.4856560Z  358 โ”‚       return;
2026-10-25T02:16:39.4856613Z  359 โ”‚     }
2026-10-25T02:16:39.4856709Z  360 โ”‚     if (requestedInitialProjectAvailable) {
2026-10-25T02:16:39.4856806Z  361 โ”‚       setIsReturningToProjectPicker(false);
2026-10-25T02:16:39.4856910Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4857082Z      ยท                     โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4857141Z  362 โ”‚       return;
2026-10-25T02:16:39.4857191Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4857770Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4858086Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4858134Z
2026-10-25T02:16:39.4858411Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4858559Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9]
2026-10-25T02:16:39.4858611Z  447 โ”‚
2026-10-25T02:16:39.4858674Z  448 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4858742Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4858866Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4858967Z  449 โ”‚     if (props.pendingTaskId || props.draftId) {
2026-10-25T02:16:39.4859024Z  450 โ”‚       return;
2026-10-25T02:16:39.4859076Z  451 โ”‚     }
2026-10-25T02:16:39.4859214Z  452 โ”‚     if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
2026-10-25T02:16:39.4859353Z  453 โ”‚       lastInitialProjectRefRef.current = props.initialProjectRef;
2026-10-25T02:16:39.4859461Z  454 โ”‚       appliedInitialProjectKeyRef.current = null;
2026-10-25T02:16:39.4859513Z  455 โ”‚     }
2026-10-25T02:16:39.4859649Z  456 โ”‚     const initialEnvironmentId = props.initialProjectRef?.environmentId;
2026-10-25T02:16:39.4859773Z  457 โ”‚     const initialProjectId = props.initialProjectRef?.projectId;
2026-10-25T02:16:39.4859874Z  458 โ”‚     if (initialEnvironmentId && initialProjectId) {
2026-10-25T02:16:39.4859944Z  459 โ”‚       const directProject =
2026-10-25T02:16:39.4860009Z  460 โ”‚         projects.find(
2026-10-25T02:16:39.4860072Z  461 โ”‚           (project) =>
2026-10-25T02:16:39.4860243Z  462 โ”‚             project.environmentId === initialEnvironmentId && project.id === initialProjectId,
2026-10-25T02:16:39.4860302Z  463 โ”‚         ) ?? null;
2026-10-25T02:16:39.4860352Z  464 โ”‚
2026-10-25T02:16:39.4860419Z  465 โ”‚       if (directProject) {
2026-10-25T02:16:39.4860561Z  466 โ”‚         // Apply the route's project once. Re-applying on every change would
2026-10-25T02:16:39.4860700Z  467 โ”‚         // instantly revert environment/project switches made in the picker.
2026-10-25T02:16:39.4860859Z  468 โ”‚         const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
2026-10-25T02:16:39.4860992Z  469 โ”‚         if (appliedInitialProjectKeyRef.current === directProjectKey) {
2026-10-25T02:16:39.4861053Z  470 โ”‚           return;
2026-10-25T02:16:39.4861108Z  471 โ”‚         }
2026-10-25T02:16:39.4861204Z  472 โ”‚         if (props.initialProjectRef?.branch) {
2026-10-25T02:16:39.4861265Z  473 โ”‚           if (
2026-10-25T02:16:39.4861404Z  474 โ”‚             selectedProject?.environmentId !== directProject.environmentId ||
2026-10-25T02:16:39.4861502Z  475 โ”‚             selectedProject.id !== directProject.id
2026-10-25T02:16:39.4861565Z  476 โ”‚           ) {
2026-10-25T02:16:39.4861649Z  477 โ”‚             setProject(directProject);
2026-10-25T02:16:39.4861710Z  478 โ”‚             return;
2026-10-25T02:16:39.4861769Z  479 โ”‚           }
2026-10-25T02:16:39.4861850Z  480 โ”‚           if (!flow.draftKey) return;
2026-10-25T02:16:39.4861987Z  481 โ”‚           // The route completes checkout before mounting this composer. Local
2026-10-25T02:16:39.4862125Z  482 โ”‚           // mode reuses an existing worktree; worktree mode would create another.
2026-10-25T02:16:39.4862234Z  483 โ”‚           updateComposerDraftSettings(flow.draftKey, {
2026-10-25T02:16:39.4862310Z  484 โ”‚             workspaceSelection: {
2026-10-25T02:16:39.4862378Z  485 โ”‚               mode: "local",
2026-10-25T02:16:39.4862478Z  486 โ”‚               branch: props.initialProjectRef.branch,
2026-10-25T02:16:39.4862611Z  487 โ”‚               worktreePath: props.initialProjectRef.worktreePath ?? null,
2026-10-25T02:16:39.4862738Z  488 โ”‚               startFromOrigin: false,
2026-10-25T02:16:39.4862873Z  489 โ”‚             },
2026-10-25T02:16:39.4862929Z  490 โ”‚           });
2026-10-25T02:16:39.4862986Z  491 โ”‚         }
2026-10-25T02:16:39.4863110Z  492 โ”‚         appliedInitialProjectKeyRef.current = directProjectKey;
2026-10-25T02:16:39.4863167Z  493 โ”‚         if (
2026-10-25T02:16:39.4863305Z  494 โ”‚           selectedProject?.environmentId === directProject.environmentId &&
2026-10-25T02:16:39.4863401Z  495 โ”‚           selectedProject.id === directProject.id
2026-10-25T02:16:39.4863459Z  496 โ”‚         ) {
2026-10-25T02:16:39.4863520Z  497 โ”‚           return;
2026-10-25T02:16:39.4863574Z  498 โ”‚         }
2026-10-25T02:16:39.4863652Z  499 โ”‚         setProject(directProject);
2026-10-25T02:16:39.4863711Z  500 โ”‚         return;
2026-10-25T02:16:39.4863764Z  501 โ”‚       }
2026-10-25T02:16:39.4863815Z  502 โ”‚
2026-10-25T02:16:39.4863896Z  503 โ”‚       if (projects.length > 0) {
2026-10-25T02:16:39.4863993Z  504 โ”‚         setIsReturningToProjectPicker(true);
2026-10-25T02:16:39.4864097Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4864298Z      ยท                       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4864353Z  505 โ”‚       }
2026-10-25T02:16:39.4864404Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4864984Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4865302Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4865308Z
2026-10-25T02:16:39.4865565Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4865715Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5]
2026-10-25T02:16:39.4865766Z  545 โ”‚
2026-10-25T02:16:39.4865828Z  546 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4865898Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4866022Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4866115Z  547 โ”‚     const shareId = props.incomingShareId;
2026-10-25T02:16:39.4866192Z  548 โ”‚     const draftKey = flow.draftKey;
2026-10-25T02:16:39.4866291Z  549 โ”‚     const destinationProject = selectedProject;
2026-10-25T02:16:39.4866432Z  550 โ”‚     const initialEnvironmentId = props.initialProjectRef?.environmentId;
2026-10-25T02:16:39.4866561Z  551 โ”‚     const initialProjectId = props.initialProjectRef?.projectId;
2026-10-25T02:16:39.4866648Z  552 โ”‚     const selectedProjectMatchesRoute =
2026-10-25T02:16:39.4866723Z  553 โ”‚       !initialEnvironmentId ||
2026-10-25T02:16:39.4866791Z  554 โ”‚       !initialProjectId ||
2026-10-25T02:16:39.4866920Z  555 โ”‚       (destinationProject?.environmentId === initialEnvironmentId &&
2026-10-25T02:16:39.4867021Z  556 โ”‚         destinationProject.id === initialProjectId);
2026-10-25T02:16:39.4867078Z  557 โ”‚     if (
2026-10-25T02:16:39.4867140Z  558 โ”‚       !shareId ||
2026-10-25T02:16:39.4867201Z  559 โ”‚       !draftKey ||
2026-10-25T02:16:39.4867271Z  560 โ”‚       !destinationProject ||
2026-10-25T02:16:39.4867355Z  561 โ”‚       !selectedProjectMatchesRoute ||
2026-10-25T02:16:39.4867490Z  562 โ”‚       cancelledIncomingShareId === shareId
2026-10-25T02:16:39.4867572Z  563 โ”‚     ) {
2026-10-25T02:16:39.4867630Z  564 โ”‚       return;
2026-10-25T02:16:39.4867684Z  565 โ”‚     }
2026-10-25T02:16:39.4867777Z  566 โ”‚     const importKey = `${shareId}:${draftKey}`;
2026-10-25T02:16:39.4867832Z  567 โ”‚     if (
2026-10-25T02:16:39.4867944Z  568 โ”‚       startedShareImportKeyRef.current === importKey ||
2026-10-25T02:16:39.4868054Z  569 โ”‚       cancellingShareImportKeyRef.current === importKey
2026-10-25T02:16:39.4868108Z  570 โ”‚     ) {
2026-10-25T02:16:39.4868165Z  571 โ”‚       return;
2026-10-25T02:16:39.4868219Z  572 โ”‚     }
2026-10-25T02:16:39.4868271Z  573 โ”‚
2026-10-25T02:16:39.4868337Z  574 โ”‚     if (!incomingShare) {
2026-10-25T02:16:39.4868529Z  575 โ”‚       if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
2026-10-25T02:16:39.4868661Z  576 โ”‚         alertedUnavailableIncomingShareIdRef.current = shareId;
2026-10-25T02:16:39.4868733Z  577 โ”‚         Dialog.alert(
2026-10-25T02:16:39.4868818Z  578 โ”‚           "Shared content unavailable",
2026-10-25T02:16:39.4868988Z  579 โ”‚           "The shared content is no longer in the inbox. You can continue editing this task draft.",
2026-10-25T02:16:39.4869046Z  580 โ”‚         );
2026-10-25T02:16:39.4869099Z  581 โ”‚       }
2026-10-25T02:16:39.4869158Z  582 โ”‚       return;
2026-10-25T02:16:39.4869210Z  583 โ”‚     }
2026-10-25T02:16:39.4869260Z  584 โ”‚
2026-10-25T02:16:39.4869315Z  585 โ”‚     if (
2026-10-25T02:16:39.4869470Z  586 โ”‚       incomingShare.attachments.some((attachment) => attachment.type === "file") &&
2026-10-25T02:16:39.4869567Z  587 โ”‚       selectedEnvironmentServerConfig === null
2026-10-25T02:16:39.4869623Z  588 โ”‚     ) {
2026-10-25T02:16:39.4869681Z  589 โ”‚       return;
2026-10-25T02:16:39.4869732Z  590 โ”‚     }
2026-10-25T02:16:39.4869788Z  591 โ”‚
2026-10-25T02:16:39.4869925Z  592 โ”‚     if (alertedUnavailableIncomingShareIdRef.current === shareId) {
2026-10-25T02:16:39.4870044Z  593 โ”‚       alertedUnavailableIncomingShareIdRef.current = null;
2026-10-25T02:16:39.4870096Z  594 โ”‚     }
2026-10-25T02:16:39.4870199Z  595 โ”‚     startedShareImportKeyRef.current = importKey;
2026-10-25T02:16:39.4870267Z  596 โ”‚     const draftBackup =
2026-10-25T02:16:39.4870450Z  597 โ”‚       shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
2026-10-25T02:16:39.4870583Z  598 โ”‚     shareImportDraftBackupRef.current.set(importKey, draftBackup);
2026-10-25T02:16:39.4870732Z  599 โ”‚     const importToken = Symbol(importKey);
2026-10-25T02:16:39.4870808Z  600 โ”‚     let didReserveShare = false;
2026-10-25T02:16:39.4870883Z  601 โ”‚     let didConsumeShare = false;
2026-10-25T02:16:39.4870965Z  602 โ”‚     let needsDraftRestore = false;
2026-10-25T02:16:39.4871076Z  603 โ”‚     activeShareImportTokenRef.current = importToken;
2026-10-25T02:16:39.4871159Z  604 โ”‚     setImportingShareKey(importKey);
2026-10-25T02:16:39.4871244Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4871413Z      ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4871480Z  605 โ”‚     void (async () => {
2026-10-25T02:16:39.4871532Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4872112Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4872496Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4872535Z
2026-10-25T02:16:39.4872732Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4872883Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5]
2026-10-25T02:16:39.4872959Z  523 โ”‚     props.initialProjectRef,
2026-10-25T02:16:39.4873031Z  524 โ”‚     props.incomingShareId,
2026-10-25T02:16:39.4873116Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4873279Z      ยท               โ•ฐโ”€โ”€ Unnecessary dependency `props.incomingShareId`
2026-10-25T02:16:39.4873348Z  525 โ”‚     props.pendingTaskId,
2026-10-25T02:16:39.4873400Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4873691Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4873998Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4874000Z
2026-10-25T02:16:39.4874220Z   โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T02:16:39.4874396Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5]
2026-10-25T02:16:39.4874510Z  542 โ”‚     loadedBranchesProjectKeyRef.current = projectKey;
2026-10-25T02:16:39.4874576Z  543 โ”‚     flow.loadBranches();
2026-10-25T02:16:39.4874643Z      ยท     โ”€โ”€โ”ฌโ”€
2026-10-25T02:16:39.4874764Z      ยท       โ•ฐโ”€โ”€ Missing dependency `flow`
2026-10-25T02:16:39.4874860Z  544 โ”‚   }, [flow.loadBranches, selectedProject]);
2026-10-25T02:16:39.4874945Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4875141Z      ยท               โ•ฐโ”€โ”€ Overly precise dependency `flow.loadBranches`, use `flow` instead
2026-10-25T02:16:39.4875193Z  545 โ”‚
2026-10-25T02:16:39.4875242Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4875654Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4875958Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4875960Z
2026-10-25T02:16:39.4876199Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4876374Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5]
2026-10-25T02:16:39.4876437Z  765 โ”‚     flow.draftKey,
2026-10-25T02:16:39.4876513Z  766 โ”‚     hasImportedIncomingShare,
2026-10-25T02:16:39.4876602Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4876776Z      ยท                 โ•ฐโ”€โ”€ Unnecessary dependency `hasImportedIncomingShare`
2026-10-25T02:16:39.4876839Z  767 โ”‚     incomingShare,
2026-10-25T02:16:39.4876918Z  768 โ”‚     isIncomingShareInboxLoading,
2026-10-25T02:16:39.4877012Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4877190Z      ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `isIncomingShareInboxLoading`
2026-10-25T02:16:39.4877268Z  769 โ”‚     isIncomingShareUnavailable,
2026-10-25T02:16:39.4877344Z  770 โ”‚     props.incomingShareId,
2026-10-25T02:16:39.4877439Z  771 โ”‚     props.initialProjectRef?.environmentId,
2026-10-25T02:16:39.4877525Z  772 โ”‚     props.initialProjectRef?.projectId,
2026-10-25T02:16:39.4877596Z  773 โ”‚     releaseShareReservation,
2026-10-25T02:16:39.4877658Z  774 โ”‚     reserveShare,
2026-10-25T02:16:39.4877742Z  775 โ”‚     selectedEnvironmentServerConfig,
2026-10-25T02:16:39.4877809Z  776 โ”‚     selectedProject,
2026-10-25T02:16:39.4877876Z  777 โ”‚     shareImportAttempt,
2026-10-25T02:16:39.4877961Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4878122Z      ยท              โ•ฐโ”€โ”€ Unnecessary dependency `shareImportAttempt`
2026-10-25T02:16:39.4878177Z  778 โ”‚   ]);
2026-10-25T02:16:39.4878227Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4878518Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4878823Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4878825Z
2026-10-25T02:16:39.4879020Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4879172Z      โ•ญโ”€[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:267:35]
2026-10-25T02:16:39.4879228Z  266 โ”‚     };
2026-10-25T02:16:39.4879357Z  267 โ”‚   }, [method, nativeRef, payload, resetKey, onFailure, onDelivered]);
2026-10-25T02:16:39.4879457Z      ยท                                   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4879613Z      ยท                                       โ•ฐโ”€โ”€ Unnecessary dependency `resetKey`
2026-10-25T02:16:39.4879669Z  268 โ”‚ }
2026-10-25T02:16:39.4879724Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4880006Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4880308Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4880310Z
2026-10-25T02:16:39.4880452Z   โš  react(refs): Cannot access refs during render
2026-10-25T02:16:39.4880606Z      โ•ญโ”€[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:391:39]
2026-10-25T02:16:39.4880659Z  390 โ”‚
2026-10-25T02:16:39.4880838Z  391 โ”‚ โ•ญโ”€โ–ถ   return createElement(RawNativeView, {
2026-10-25T02:16:39.4880977Z  392 โ”‚ โ”‚       ...nativeProps,
2026-10-25T02:16:39.4881147Z  393 โ”‚ โ”‚       refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-25T02:16:39.4881246Z  394 โ”‚ โ”‚       onDebug: (event) => {
2026-10-25T02:16:39.4881397Z  395 โ”‚ โ”‚         if (event.nativeEvent.message === "rows-decode-failed") {
2026-10-25T02:16:39.4881596Z  396 โ”‚ โ”‚           console.error("[native-review-diff] rows decode failed", event.nativeEvent.error);
2026-10-25T02:16:39.4881694Z  397 โ”‚ โ”‚           onRowsFailure();
2026-10-25T02:16:39.4881769Z  398 โ”‚ โ”‚         }
2026-10-25T02:16:39.4881862Z  399 โ”‚ โ”‚         onDebug?.(event);
2026-10-25T02:16:39.4881934Z  400 โ”‚ โ”‚       },
2026-10-25T02:16:39.4882023Z  401 โ”‚ โ”‚       ref: nativeRef,
2026-10-25T02:16:39.4882156Z  402 โ”‚ โ”œโ”€โ–ถ   });
2026-10-25T02:16:39.4882392Z      ยท โ•ฐโ”€โ”€โ”€โ”€ Passing a ref to a function may read its value during render
2026-10-25T02:16:39.4882444Z  403 โ”‚     }
2026-10-25T02:16:39.4882497Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4882956Z   help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-25T02:16:39.4883247Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-25T02:16:39.4883249Z
2026-10-25T02:16:39.4883507Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4883665Z      โ•ญโ”€[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
2026-10-25T02:16:39.4883726Z  434 โ”‚       : null;
2026-10-25T02:16:39.4883792Z  435 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4883861Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4883986Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4884042Z  436 โ”‚     if (
2026-10-25T02:16:39.4884117Z  437 โ”‚       props.active === false ||
2026-10-25T02:16:39.4884222Z  438 โ”‚       activeDraftKey !== null ||
2026-10-25T02:16:39.4884301Z  439 โ”‚       editingPendingTask !== null ||
2026-10-25T02:16:39.4884374Z  440 โ”‚       selectedProject === null
2026-10-25T02:16:39.4884428Z  441 โ”‚     ) {
2026-10-25T02:16:39.4884485Z  442 โ”‚       return;
2026-10-25T02:16:39.4884543Z  443 โ”‚     }
2026-10-25T02:16:39.4884614Z  444 โ”‚     setActiveDraftKey(
2026-10-25T02:16:39.4884694Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4884864Z      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4884932Z  445 โ”‚       createNewTaskDraft({
2026-10-25T02:16:39.4884983Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4885567Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4885926Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4885962Z
2026-10-25T02:16:39.4886198Z   โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-25T02:16:39.4886360Z       โ•ญโ”€[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
2026-10-25T02:16:39.4886464Z  1243 โ”‚     <ActiveNewTaskContext value={activeNewTask}>
2026-10-25T02:16:39.4886656Z  1244 โ”‚       <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
2026-10-25T02:16:39.4886767Z       ยท                                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4886838Z  1245 โ”‚     </ActiveNewTaskContext>
2026-10-25T02:16:39.4886891Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4887109Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-25T02:16:39.4887251Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-25T02:16:39.4887257Z
2026-10-25T02:16:39.4887491Z   โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-25T02:16:39.4887644Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50]
2026-10-25T02:16:39.4887704Z  289 โ”‚   return (
2026-10-25T02:16:39.4887837Z  290 โ”‚     <ExistingThreadSettingsRouteContext.Provider value={value}>
2026-10-25T02:16:39.4887952Z      ยท                                                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4888021Z  291 โ”‚       {props.children}
2026-10-25T02:16:39.4888071Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4888284Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-25T02:16:39.4888423Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-25T02:16:39.4888428Z
2026-10-25T02:16:39.4888659Z   โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-25T02:16:39.4888810Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44]
2026-10-25T02:16:39.4888867Z  653 โ”‚   return (
2026-10-25T02:16:39.4888986Z  654 โ”‚     <ThreadSettingsSessionContext.Provider value={value}>
2026-10-25T02:16:39.4889099Z      ยท                                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4889163Z  655 โ”‚       {props.children}
2026-10-25T02:16:39.4889213Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4889425Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-25T02:16:39.4889561Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-25T02:16:39.4889566Z
2026-10-25T02:16:39.4889795Z   โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-25T02:16:39.4889950Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55]
2026-10-25T02:16:39.4890010Z  1461 โ”‚   return (
2026-10-25T02:16:39.4890168Z  1462 โ”‚     <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
2026-10-25T02:16:39.4890297Z       ยท                                                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4890393Z  1463 โ”‚       <ThreadSettingsPickerStack.Navigator
2026-10-25T02:16:39.4890444Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4890707Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-25T02:16:39.4890870Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-25T02:16:39.4890872Z
2026-10-25T02:16:39.4891126Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4891259Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2236:5]
2026-10-25T02:16:39.4891313Z  2234 โ”‚   );
2026-10-25T02:16:39.4891378Z  2235 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4891448Z       ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4891576Z       ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4891648Z  2236 โ”‚     setExpandedVideo(null);
2026-10-25T02:16:39.4891728Z       ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4891903Z       ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4891979Z  2237 โ”‚     setExpandedFile(null);
2026-10-25T02:16:39.4892029Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4892610Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4892927Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4892929Z
2026-10-25T02:16:39.4893182Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4893317Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2744:9]
2026-10-25T02:16:39.4893454Z  2735 โ”‚   const stopFollowingEnd = useEffectEvent(() => setEndFollow(false));
2026-10-25T02:16:39.4893518Z  2736 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4893591Z       ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4893718Z       ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4893844Z  2737 โ”‚     if (!jumpToMessageId || loadedListKey !== listMountKey) return;
2026-10-25T02:16:39.4893938Z  2738 โ”‚     const index = presentedFeed.findIndex(
2026-10-25T02:16:39.4894067Z  2739 โ”‚       (entry) => entry.type === "message" && entry.id === jumpToMessageId,
2026-10-25T02:16:39.4894122Z  2740 โ”‚     );
2026-10-25T02:16:39.4894200Z  2741 โ”‚     if (index === -1) {
2026-10-25T02:16:39.4894356Z  2742 โ”‚       const runId = messageFoldRunId(props.feed, jumpToMessageId);
2026-10-25T02:16:39.4894458Z  2743 โ”‚       if (runId && !expandedTurnIds.has(runId)) {
2026-10-25T02:16:39.4894549Z  2744 โ”‚         setInteractionState((current) => ({
2026-10-25T02:16:39.4894636Z       ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4894811Z       ยท                  โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4894877Z  2745 โ”‚           ...current,
2026-10-25T02:16:39.4894930Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4895508Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4895867Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4895898Z
2026-10-25T02:16:39.4896125Z   โš  eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
2026-10-25T02:16:39.4896255Z     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:72:10]
2026-10-25T02:16:39.4896389Z  71 โ”‚ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
2026-10-25T02:16:39.4896523Z  72 โ”‚ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
2026-10-25T02:16:39.4896617Z     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4896780Z     ยท                     โ•ฐโ”€โ”€ 'isMarkdownFileLinkLabel' is imported here
2026-10-25T02:16:39.4896940Z  73 โ”‚ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
2026-10-25T02:16:39.4896992Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4897088Z   help: Consider removing this import.
2026-10-25T02:16:39.4897090Z
2026-10-25T02:16:39.4897291Z   โš  eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
2026-10-25T02:16:39.4897419Z     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:98:3]
2026-10-25T02:16:39.4897476Z  97 โ”‚ import {
2026-10-25T02:16:39.4897538Z  98 โ”‚   createContext,
2026-10-25T02:16:39.4897611Z     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4897744Z     ยท         โ•ฐโ”€โ”€ 'createContext' is imported here
2026-10-25T02:16:39.4897797Z  99 โ”‚   memo,
2026-10-25T02:16:39.4897848Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4897941Z   help: Consider removing this import.
2026-10-25T02:16:39.4897944Z
2026-10-25T02:16:39.4898156Z   โš  eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
2026-10-25T02:16:39.4898287Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:114:3]
2026-10-25T02:16:39.4898343Z  113 โ”‚ import {
2026-10-25T02:16:39.4898408Z  114 โ”‚   ActivityIndicator,
2026-10-25T02:16:39.4898487Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4898627Z      ยท           โ•ฐโ”€โ”€ 'ActivityIndicator' is imported here
2026-10-25T02:16:39.4898686Z  115 โ”‚   Image,
2026-10-25T02:16:39.4898737Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4898830Z   help: Consider removing this import.
2026-10-25T02:16:39.4898832Z
2026-10-25T02:16:39.4899026Z   โš  eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
2026-10-25T02:16:39.4899200Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:121:3]
2026-10-25T02:16:39.4899289Z  120 โ”‚   Pressable,
2026-10-25T02:16:39.4899351Z  121 โ”‚   ScrollView,
2026-10-25T02:16:39.4899421Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4899549Z      ยท        โ•ฐโ”€โ”€ 'ScrollView' is imported here
2026-10-25T02:16:39.4899614Z  122 โ”‚   StyleSheet,
2026-10-25T02:16:39.4899665Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4899755Z   help: Consider removing this import.
2026-10-25T02:16:39.4899758Z
2026-10-25T02:16:39.4899950Z   โš  eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
2026-10-25T02:16:39.4900079Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11]
2026-10-25T02:16:39.4900138Z  122 โ”‚   StyleSheet,
2026-10-25T02:16:39.4900203Z  123 โ”‚   Text as NativeText,
2026-10-25T02:16:39.4900287Z      ยท           โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4900422Z      ยท                โ•ฐโ”€โ”€ 'NativeText' is imported here
2026-10-25T02:16:39.4900486Z  124 โ”‚   type ColorValue,
2026-10-25T02:16:39.4900535Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4900626Z   help: Consider removing this import.
2026-10-25T02:16:39.4900628Z
2026-10-25T02:16:39.4900837Z   โš  eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
2026-10-25T02:16:39.4900966Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:146:10]
2026-10-25T02:16:39.4901099Z  145 โ”‚ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
2026-10-25T02:16:39.4901221Z  146 โ”‚ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
2026-10-25T02:16:39.4901308Z      ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4901464Z      ยท                   โ•ฐโ”€โ”€ 'tryOpenExternalUrl' is imported here
2026-10-25T02:16:39.4901612Z  147 โ”‚ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
2026-10-25T02:16:39.4901661Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4901754Z   help: Consider removing this import.
2026-10-25T02:16:39.4901757Z
2026-10-25T02:16:39.4901968Z   โš  eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
2026-10-25T02:16:39.4902095Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:149:10]
2026-10-25T02:16:39.4902226Z  148 โ”‚ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
2026-10-25T02:16:39.4902348Z  149 โ”‚ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
2026-10-25T02:16:39.4902436Z      ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4902593Z      ยท                   โ•ฐโ”€โ”€ 'faviconUrlForOrigin' is imported here
2026-10-25T02:16:39.4902653Z  150 โ”‚ import {
2026-10-25T02:16:39.4902704Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4902794Z   help: Consider removing this import.
2026-10-25T02:16:39.4902797Z
2026-10-25T02:16:39.4903003Z   โš  eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
2026-10-25T02:16:39.4903129Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10]
2026-10-25T02:16:39.4903273Z  162 โ”‚ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
2026-10-25T02:16:39.4903405Z  163 โ”‚ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
2026-10-25T02:16:39.4903491Z      ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4903634Z      ยท                  โ•ฐโ”€โ”€ 'MediaVideoPlayer' is imported here
2026-10-25T02:16:39.4903818Z  164 โ”‚ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
2026-10-25T02:16:39.4903904Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4903995Z   help: Consider removing this import.
2026-10-25T02:16:39.4903998Z
2026-10-25T02:16:39.4904234Z   โš  eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
2026-10-25T02:16:39.4904364Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:167:3]
2026-10-25T02:16:39.4904445Z  166 โ”‚   attachmentVideoPreviewSource,
2026-10-25T02:16:39.4904514Z  167 โ”‚   mediaVideoPreviewUri,
2026-10-25T02:16:39.4904595Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4904747Z      ยท             โ•ฐโ”€โ”€ 'mediaVideoPreviewUri' is imported here
2026-10-25T02:16:39.4904818Z  168 โ”‚   mediaVideoThumbnailKey,
2026-10-25T02:16:39.4904869Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4904966Z   help: Consider removing this import.
2026-10-25T02:16:39.4904973Z
2026-10-25T02:16:39.4905188Z   โš  eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
2026-10-25T02:16:39.4905317Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3]
2026-10-25T02:16:39.4905386Z  167 โ”‚   mediaVideoPreviewUri,
2026-10-25T02:16:39.4905455Z  168 โ”‚   mediaVideoThumbnailKey,
2026-10-25T02:16:39.4905539Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4905694Z      ยท              โ•ฐโ”€โ”€ 'mediaVideoThumbnailKey' is imported here
2026-10-25T02:16:39.4905772Z  169 โ”‚   type MediaVideoPreviewSource,
2026-10-25T02:16:39.4905823Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4905914Z   help: Consider removing this import.
2026-10-25T02:16:39.4905916Z
2026-10-25T02:16:39.4906128Z   โš  eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
2026-10-25T02:16:39.4906260Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:169:8]
2026-10-25T02:16:39.4906329Z  168 โ”‚   mediaVideoThumbnailKey,
2026-10-25T02:16:39.4906404Z  169 โ”‚   type MediaVideoPreviewSource,
2026-10-25T02:16:39.4906498Z      ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4906661Z      ยท                   โ•ฐโ”€โ”€ 'MediaVideoPreviewSource' is imported here
2026-10-25T02:16:39.4906746Z  170 โ”‚ } from "../../lib/videoPreviewSource";
2026-10-25T02:16:39.4906796Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4906888Z   help: Consider removing this import.
2026-10-25T02:16:39.4906890Z
2026-10-25T02:16:39.4907118Z   โš  eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
2026-10-25T02:16:39.4907248Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:191:3]
2026-10-25T02:16:39.4907305Z  190 โ”‚ import {
2026-10-25T02:16:39.4907379Z  191 โ”‚   resolveMarkdownFontSizes,
2026-10-25T02:16:39.4907468Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4907623Z      ยท               โ•ฐโ”€โ”€ 'resolveMarkdownFontSizes' is imported here
2026-10-25T02:16:39.4907707Z  192 โ”‚   resolveNativeMarkdownTypography,
2026-10-25T02:16:39.4907758Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4907851Z   help: Consider removing this import.
2026-10-25T02:16:39.4907853Z
2026-10-25T02:16:39.4908103Z   โš  eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
2026-10-25T02:16:39.4908279Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:198:3]
2026-10-25T02:16:39.4908386Z  197 โ”‚   normalizeNativeMarkdownUrl,
2026-10-25T02:16:39.4908478Z  198 โ”‚   resolveMarkdownInlineCodePresentation,
2026-10-25T02:16:39.4908585Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4908774Z      ยท                     โ•ฐโ”€โ”€ 'resolveMarkdownInlineCodePresentation' is imported here
2026-10-25T02:16:39.4908857Z  199 โ”‚   resolveMarkdownLinkPresentation,
2026-10-25T02:16:39.4908908Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4908999Z   help: Consider removing this import.
2026-10-25T02:16:39.4909001Z
2026-10-25T02:16:39.4909206Z   โš  eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used.
2026-10-25T02:16:39.4909335Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8]
2026-10-25T02:16:39.4909412Z  236 โ”‚   isCompactionCommandFeedEntry,
2026-10-25T02:16:39.4909495Z  237 โ”‚   type PendingThreadFeedEntry,
2026-10-25T02:16:39.4909586Z      ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4909742Z      ยท                   โ•ฐโ”€โ”€ 'PendingThreadFeedEntry' is imported here
2026-10-25T02:16:39.4909809Z  238 โ”‚   type ThreadFeedRow,
2026-10-25T02:16:39.4909861Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4909950Z   help: Consider removing this import.
2026-10-25T02:16:39.4909953Z
2026-10-25T02:16:39.4910159Z   โš  eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
2026-10-25T02:16:39.4910287Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:248:3]
2026-10-25T02:16:39.4910349Z  247 โ”‚   useAssetUrl,
2026-10-25T02:16:39.4910414Z  248 โ”‚   useAssetUrlState,
2026-10-25T02:16:39.4910493Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4910636Z      ยท           โ•ฐโ”€โ”€ 'useAssetUrlState' is imported here
2026-10-25T02:16:39.4910752Z  249 โ”‚   useRefreshAssetUrl,
2026-10-25T02:16:39.4910801Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4910892Z   help: Consider removing this import.
2026-10-25T02:16:39.4910895Z
2026-10-25T02:16:39.4911090Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4911224Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2238:7]
2026-10-25T02:16:39.4911295Z  2237 โ”‚     setExpandedFile(null);
2026-10-25T02:16:39.4911450Z  2238 โ”‚   }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
2026-10-25T02:16:39.4911671Z       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4912015Z       ยท                โ”‚                  โ”‚                       โ•ฐโ”€โ”€ Unnecessary dependency `props.contentPresentation.kind`
2026-10-25T02:16:39.4912257Z       ยท                โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `props.threadId`
2026-10-25T02:16:39.4912415Z       ยท                โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
2026-10-25T02:16:39.4912556Z  2239 โ”‚   const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
2026-10-25T02:16:39.4912609Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4912900Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4913214Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4913220Z
2026-10-25T02:16:39.4913416Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4913549Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2710:7]
2026-10-25T02:16:39.4913645Z  2709 โ”‚     reportHeaderMaterialVisibility(false);
2026-10-25T02:16:39.4913758Z  2710 โ”‚   }, [feedThreadKey, reportHeaderMaterialVisibility]);
2026-10-25T02:16:39.4913837Z       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4913984Z       ยท             โ•ฐโ”€โ”€ Unnecessary dependency `feedThreadKey`
2026-10-25T02:16:39.4914039Z  2711 โ”‚
2026-10-25T02:16:39.4914091Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4914412Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4914721Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4914723Z
2026-10-25T02:16:39.4914918Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4915049Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2729:7]
2026-10-25T02:16:39.4915104Z  2728 โ”‚     }
2026-10-25T02:16:39.4915235Z  2729 โ”‚   }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
2026-10-25T02:16:39.4915313Z       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4915457Z       ยท             โ•ฐโ”€โ”€ Unnecessary dependency `listMountKey`
2026-10-25T02:16:39.4915603Z  2730 โ”‚   // Opening at a message: its run unfolds, the list stops following the end
2026-10-25T02:16:39.4915659Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4915942Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4916245Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4916248Z
2026-10-25T02:16:39.4916443Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4916571Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2925:7]
2026-10-25T02:16:39.4916627Z  2924 โ”‚     }
2026-10-25T02:16:39.4916805Z  2925 โ”‚   }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
2026-10-25T02:16:39.4917047Z       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4917320Z       ยท              โ”‚                  โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkRows`
2026-10-25T02:16:39.4917520Z       ยท              โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkGroups`
2026-10-25T02:16:39.4917670Z       ยท              โ•ฐโ”€โ”€ Unnecessary dependency `expandedTurnIds`
2026-10-25T02:16:39.4917723Z  2926 โ”‚
2026-10-25T02:16:39.4917773Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4918054Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4918367Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4918372Z
2026-10-25T02:16:39.4918547Z   โš  react(memo-dependencies): Found extra memoization dependencies
2026-10-25T02:16:39.4918678Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:630:9]
2026-10-25T02:16:39.4918734Z  629 โ”‚       };
2026-10-25T02:16:39.4918849Z  630 โ”‚     }, [props.environmentId, attachment.id, httpBaseUrl]),
2026-10-25T02:16:39.4919035Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4919272Z      ยท                  โ”‚                 โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `httpBaseUrl`
2026-10-25T02:16:39.4919469Z      ยท                  โ”‚                 โ•ฐโ”€โ”€ Unnecessary dependency `attachment.id`
2026-10-25T02:16:39.4919631Z      ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
2026-10-25T02:16:39.4919687Z  631 โ”‚   );
2026-10-25T02:16:39.4919738Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4920042Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T02:16:39.4920344Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4920346Z
2026-10-25T02:16:39.4920613Z   โš  eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'.
2026-10-25T02:16:39.4920778Z     โ•ญโ”€[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9]
2026-10-25T02:16:39.4920872Z  22 โ”‚   const selectTab = useSelectWorkspaceTab();
2026-10-25T02:16:39.4920954Z  23 โ”‚   const navigation = useNavigation();
2026-10-25T02:16:39.4921030Z     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4921163Z     ยท              โ•ฐโ”€โ”€ 'navigation' is declared here
2026-10-25T02:16:39.4921253Z  24 โ”‚   const selected = selectedNavigationTab(
2026-10-25T02:16:39.4921303Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4921406Z   help: Consider removing this declaration.
2026-10-25T02:16:39.4921409Z
2026-10-25T02:16:39.4921661Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4921869Z     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
2026-10-25T02:16:39.4922012Z  37 โ”‚   const [initialized, setInitialized] = useState(false);
2026-10-25T02:16:39.4922080Z  38 โ”‚   useLayoutEffect(() => {
2026-10-25T02:16:39.4922156Z     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4922284Z     ยท          โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4922344Z  39 โ”‚     reset();
2026-10-25T02:16:39.4922410Z  40 โ”‚     setInitialized(true);
2026-10-25T02:16:39.4922485Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4922649Z     ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4922709Z  41 โ”‚   }, [reset]);
2026-10-25T02:16:39.4922761Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4923351Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4923670Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4923672Z
2026-10-25T02:16:39.4923924Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4924080Z     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5]
2026-10-25T02:16:39.4924131Z  88 โ”‚
2026-10-25T02:16:39.4924207Z  89 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4924276Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4924431Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4924589Z  90 โ”‚     if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
2026-10-25T02:16:39.4924690Z  91 โ”‚     const branchName = initialProjectRef.branch;
2026-10-25T02:16:39.4924755Z  92 โ”‚     let active = true;
2026-10-25T02:16:39.4924849Z  93 โ”‚     setPendingCheckouts((count) => count + 1);
2026-10-25T02:16:39.4924932Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4925101Z     ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4925251Z  94 โ”‚     // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
2026-10-25T02:16:39.4925300Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4925883Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4926202Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4926204Z
2026-10-25T02:16:39.4926368Z   โš  react(purity): Cannot call impure function during render
2026-10-25T02:16:39.4926521Z      โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:704:76]
2026-10-25T02:16:39.4926699Z  703 โ”‚   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
2026-10-25T02:16:39.4926915Z  704 โ”‚   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
2026-10-25T02:16:39.4927081Z      ยท                                                                            โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4927260Z      ยท                                                                                 โ•ฐโ”€โ”€ Cannot call impure function
2026-10-25T02:16:39.4927395Z  705 โ”‚   const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
2026-10-25T02:16:39.4927445Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4927725Z   help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T02:16:39.4928014Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T02:16:39.4928017Z
2026-10-25T02:16:39.4928185Z   โš  react(purity): Cannot call impure function during render
2026-10-25T02:16:39.4928341Z      โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:725:71]
2026-10-25T02:16:39.4928419Z  724 โ”‚   const snoozePresets = useMemo(
2026-10-25T02:16:39.4928596Z  725 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-25T02:16:39.4928728Z      ยท                                                                       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4928902Z      ยท                                                                            โ•ฐโ”€โ”€ Cannot call impure function
2026-10-25T02:16:39.4929016Z  726 โ”‚     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-25T02:16:39.4929067Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4929343Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-25T02:16:39.4929634Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-25T02:16:39.4929637Z
2026-10-25T02:16:39.4929812Z   โš  react(memo-dependencies): Found extra memoization dependencies
2026-10-25T02:16:39.4929962Z      โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:726:6]
2026-10-25T02:16:39.4930136Z  725 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-25T02:16:39.4930249Z  726 โ”‚     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-25T02:16:39.4930342Z      ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4930516Z      ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.snoozePresetMinute`
2026-10-25T02:16:39.4930573Z  727 โ”‚   );
2026-10-25T02:16:39.4930625Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4930934Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T02:16:39.4931237Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4931239Z
2026-10-25T02:16:39.4931413Z   โš  react(memo-dependencies): Found extra memoization dependencies
2026-10-25T02:16:39.4931564Z      โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:772:7]
2026-10-25T02:16:39.4931634Z  771 โ”‚       thread.pinnedAt,
2026-10-25T02:16:39.4931693Z  772 โ”‚       variant,
2026-10-25T02:16:39.4931809Z      ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4931971Z      ยท          โ•ฐโ”€โ”€ Unnecessary dependency `variant`
2026-10-25T02:16:39.4932026Z  773 โ”‚     ],
2026-10-25T02:16:39.4932075Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4932382Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T02:16:39.4932683Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4932685Z
2026-10-25T02:16:39.4932874Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.4933030Z       โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1222:21]
2026-10-25T02:16:39.4933160Z  1221 โ”‚             {providerDrivers.slice(0, -1).map((driver, index) => (
2026-10-25T02:16:39.4933294Z  1222 โ”‚               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
2026-10-25T02:16:39.4933407Z       ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4933515Z  1223 โ”‚                 <ProviderIcon provider={driver} size={12} />
2026-10-25T02:16:39.4933566Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4933712Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.4933715Z
2026-10-25T02:16:39.4933969Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4934115Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:410:5]
2026-10-25T02:16:39.4934166Z  408 โ”‚
2026-10-25T02:16:39.4934243Z  409 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4934344Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4934475Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4934564Z  410 โ”‚     setInspectorSelection((current) => {
2026-10-25T02:16:39.4934648Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4934817Z      ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4934918Z  411 โ”‚       if (props.renderInspector === undefined) {
2026-10-25T02:16:39.4934967Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4935549Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4935945Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4935991Z
2026-10-25T02:16:39.4936199Z   โš  react(no-unstable-nested-components): Do not define components during render.
2026-10-25T02:16:39.4936348Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:538:24]
2026-10-25T02:16:39.4936503Z  537 โ”‚       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
2026-10-25T02:16:39.4936669Z  538 โ”‚ โ•ญโ”€โ–ถ   const GitInspector = () => (
2026-10-25T02:16:39.4936766Z  539 โ”‚ โ”‚       <GitOverviewSheet
2026-10-25T02:16:39.4936885Z  540 โ”‚ โ”‚         headerInset={inspectorHeaderInset}
2026-10-25T02:16:39.4936994Z  541 โ”‚ โ”‚         presentation="inspector"
2026-10-25T02:16:39.4937171Z  542 โ”‚ โ”‚         route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
2026-10-25T02:16:39.4937246Z  543 โ”‚ โ”‚       />
2026-10-25T02:16:39.4937370Z  544 โ”‚ โ•ฐโ”€โ–ถ   );
2026-10-25T02:16:39.4937447Z  545 โ”‚       const FilesInspector = () =>
2026-10-25T02:16:39.4937500Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4937714Z   help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-25T02:16:39.4937717Z
2026-10-25T02:16:39.4937924Z   โš  react(no-unstable-nested-components): Do not define components during render.
2026-10-25T02:16:39.4938077Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:545:26]
2026-10-25T02:16:39.4938134Z  544 โ”‚       );
2026-10-25T02:16:39.4938295Z  545 โ”‚ โ•ญโ”€โ–ถ   const FilesInspector = () =>
2026-10-25T02:16:39.4938442Z  546 โ”‚ โ”‚       selectedThread !== null && selectedThreadCwd !== null ? (
2026-10-25T02:16:39.4938546Z  547 โ”‚ โ”‚         <ThreadFileNavigatorPane
2026-10-25T02:16:39.4938648Z  548 โ”‚ โ”‚           cwd={selectedThreadCwd}
2026-10-25T02:16:39.4938783Z  549 โ”‚ โ”‚           environmentId={selectedThread.environmentId}
2026-10-25T02:16:39.4938903Z  550 โ”‚ โ”‚           headerInset={inspectorHeaderInset}
2026-10-25T02:16:39.4939047Z  551 โ”‚ โ”‚           projectName={selectedThreadProject?.title ?? "Files"}
2026-10-25T02:16:39.4939147Z  552 โ”‚ โ”‚           selectedPath={null}
2026-10-25T02:16:39.4939281Z  553 โ”‚ โ”‚           onSelectFile={handleSelectInspectorFile}
2026-10-25T02:16:39.4939360Z  554 โ”‚ โ”‚         />
2026-10-25T02:16:39.4939495Z  555 โ”‚ โ•ฐโ”€โ–ถ     ) : null;
2026-10-25T02:16:39.4939642Z  556 โ”‚       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
2026-10-25T02:16:39.4939693Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4939903Z   help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-25T02:16:39.4939906Z
2026-10-25T02:16:39.4940115Z   โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T02:16:39.4940253Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7]
2026-10-25T02:16:39.4940404Z  772 โ”‚     if (settingsSheetPresentation.isActive) {
2026-10-25T02:16:39.4940560Z  773 โ”‚       settingsRoutePresentation.present(settingsRouteSession);
2026-10-25T02:16:39.4940652Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4940822Z      ยท                   โ•ฐโ”€โ”€ Missing dependency `settingsRoutePresentation`
2026-10-25T02:16:39.4940876Z  774 โ”‚     }
2026-10-25T02:16:39.4941075Z  775 โ”‚   }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
2026-10-25T02:16:39.4941181Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4941459Z      ยท                       โ•ฐโ”€โ”€ Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
2026-10-25T02:16:39.4941512Z  776 โ”‚
2026-10-25T02:16:39.4941562Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4941982Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4942292Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4942295Z
2026-10-25T02:16:39.4942446Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4942585Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5]
2026-10-25T02:16:39.4942742Z  387 โ”‚     typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
2026-10-25T02:16:39.4942876Z  388 โ”‚   const animatedBorderRadius = useSharedValue(targetBorderRadius);
2026-10-25T02:16:39.4942969Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4943123Z      ยท                   โ•ฐโ”€โ”€ `animatedBorderRadius` originates here
2026-10-25T02:16:39.4943278Z  389 โ”‚   const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
2026-10-25T02:16:39.4943346Z  390 โ”‚   useLayoutEffect(() => {
2026-10-25T02:16:39.4943444Z  391 โ”‚     animatedBorderRadius.value = shouldAnimate
2026-10-25T02:16:39.4943529Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4943682Z      ยท               โ•ฐโ”€โ”€ `animatedBorderRadius` cannot be modified
2026-10-25T02:16:39.4943770Z  392 โ”‚       ? withTiming(targetBorderRadius, {
2026-10-25T02:16:39.4943819Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4944078Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4944422Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4944428Z
2026-10-25T02:16:39.4944680Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4944842Z      โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7]
2026-10-25T02:16:39.4944894Z  213 โ”‚   };
2026-10-25T02:16:39.4944961Z  214 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4945031Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4945157Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4945326Z  215 โ”‚     const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
2026-10-25T02:16:39.4945392Z  216 โ”‚     if (inserted) {
2026-10-25T02:16:39.4945514Z  217 โ”‚       setSelection((current) =>
2026-10-25T02:16:39.4945620Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4945785Z      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4947965Z  218 โ”‚         current.start === inserted.start && current.end === inserted.end ? current : inserted,
2026-10-25T02:16:39.4948025Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4948619Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4948942Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4948947Z
2026-10-25T02:16:39.4949203Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4949365Z      โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7]
2026-10-25T02:16:39.4949441Z  286 โ”‚   }, [hasWorkspaceSnapshot]);
2026-10-25T02:16:39.4949505Z  287 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4949574Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4949702Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4949848Z  288 โ”‚     if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
2026-10-25T02:16:39.4949993Z  289 โ”‚     const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
2026-10-25T02:16:39.4950068Z  290 โ”‚     const now = Date.now();
2026-10-25T02:16:39.4950182Z  291 โ”‚     const lastRequest = workspaceRefreshKeyRef.current;
2026-10-25T02:16:39.4950238Z  292 โ”‚     if (
2026-10-25T02:16:39.4950314Z  293 โ”‚       lastRequest?.key === key &&
2026-10-25T02:16:39.4950449Z  294 โ”‚       now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
2026-10-25T02:16:39.4950503Z  295 โ”‚     )
2026-10-25T02:16:39.4950561Z  296 โ”‚       return;
2026-10-25T02:16:39.4950800Z  297 โ”‚     if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
2026-10-25T02:16:39.4950886Z  298 โ”‚       setWorkspaceRefreshRetry(null);
2026-10-25T02:16:39.4950979Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4951152Z      ยท                   โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4951211Z  299 โ”‚       return;
2026-10-25T02:16:39.4951269Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4951852Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4952167Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4952172Z
2026-10-25T02:16:39.4952368Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4952528Z      โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5]
2026-10-25T02:16:39.4952584Z  327 โ”‚   }, [
2026-10-25T02:16:39.4952721Z  328 โ”‚     draftMessage,
2026-10-25T02:16:39.4952834Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4952977Z      ยท           โ•ฐโ”€โ”€ Unnecessary dependency `draftMessage`
2026-10-25T02:16:39.4953042Z  329 โ”‚     environmentId,
2026-10-25T02:16:39.4953091Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4953380Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4953684Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4953687Z
2026-10-25T02:16:39.4953839Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4954001Z      โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
2026-10-25T02:16:39.4954056Z  107 โ”‚   );
2026-10-25T02:16:39.4954240Z  108 โ”‚   const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
2026-10-25T02:16:39.4954331Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4954478Z      ยท                  โ•ฐโ”€โ”€ `separationProgress` originates here
2026-10-25T02:16:39.4954530Z  109 โ”‚
2026-10-25T02:16:39.4954596Z  110 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4954766Z  111 โ”‚     separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
2026-10-25T02:16:39.4954848Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4954996Z      ยท              โ•ฐโ”€โ”€ `separationProgress` cannot be modified
2026-10-25T02:16:39.4955103Z  112 โ”‚   }, [props.showScrollToEnd, separationProgress]);
2026-10-25T02:16:39.4955154Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4955420Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4955723Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4955727Z
2026-10-25T02:16:39.4955878Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4956036Z      โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
2026-10-25T02:16:39.4956145Z  128 โ”‚   // and repeatedly retargets the animation as it grows.
2026-10-25T02:16:39.4956258Z  129 โ”‚   const capsuleWidth = useSharedValue<number | null>(null);
2026-10-25T02:16:39.4956336Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4956473Z      ยท               โ•ฐโ”€โ”€ `capsuleWidth` originates here
2026-10-25T02:16:39.4956584Z  130 โ”‚   const measuredWidthRef = useRef<number | null>(null);
2026-10-25T02:16:39.4956696Z  131 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4956800Z  132 โ”‚     const width = event.nativeEvent.layout.width;
2026-10-25T02:16:39.4956893Z  133 โ”‚     if (width === measuredWidthRef.current) {
2026-10-25T02:16:39.4956952Z  134 โ”‚       return;
2026-10-25T02:16:39.4957006Z  135 โ”‚     }
2026-10-25T02:16:39.4957108Z  136 โ”‚     const first = measuredWidthRef.current === null;
2026-10-25T02:16:39.4957192Z  137 โ”‚     measuredWidthRef.current = width;
2026-10-25T02:16:39.4957330Z  138 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-25T02:16:39.4957406Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4957592Z      ยท           โ•ฐโ”€โ”€ `capsuleWidth` cannot be modified
2026-10-25T02:16:39.4957682Z  139 โ”‚   };
2026-10-25T02:16:39.4957733Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4957991Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4958288Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4958291Z
2026-10-25T02:16:39.4958445Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4958603Z      โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-25T02:16:39.4958710Z  128 โ”‚   // and repeatedly retargets the animation as it grows.
2026-10-25T02:16:39.4958824Z  129 โ”‚   const capsuleWidth = useSharedValue<number | null>(null);
2026-10-25T02:16:39.4958905Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4959038Z      ยท               โ•ฐโ”€โ”€ `capsuleWidth` originates here
2026-10-25T02:16:39.4959145Z  130 โ”‚   const measuredWidthRef = useRef<number | null>(null);
2026-10-25T02:16:39.4959255Z  131 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4959357Z  132 โ”‚     const width = event.nativeEvent.layout.width;
2026-10-25T02:16:39.4959449Z  133 โ”‚     if (width === measuredWidthRef.current) {
2026-10-25T02:16:39.4959507Z  134 โ”‚       return;
2026-10-25T02:16:39.4959559Z  135 โ”‚     }
2026-10-25T02:16:39.4959664Z  136 โ”‚     const first = measuredWidthRef.current === null;
2026-10-25T02:16:39.4959748Z  137 โ”‚     measuredWidthRef.current = width;
2026-10-25T02:16:39.4959886Z  138 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-25T02:16:39.4959942Z  139 โ”‚   };
2026-10-25T02:16:39.4960032Z  140 โ”‚   const hasStatus = props.status !== null;
2026-10-25T02:16:39.4960164Z  141 โ”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-25T02:16:39.4960229Z  142 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4960292Z  143 โ”‚     if (!hasStatus) {
2026-10-25T02:16:39.4960376Z  144 โ”‚       measuredWidthRef.current = null;
2026-10-25T02:16:39.4960453Z  145 โ”‚       capsuleWidth.value = null;
2026-10-25T02:16:39.4960529Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4960663Z      ยท             โ•ฐโ”€โ”€ `capsuleWidth` cannot be modified
2026-10-25T02:16:39.4960717Z  146 โ”‚     }
2026-10-25T02:16:39.4960769Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4961075Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4961398Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4961401Z
2026-10-25T02:16:39.4961598Z   โš  react(immutability): Cannot modify local variables after render completes
2026-10-25T02:16:39.4961758Z      โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-25T02:16:39.4961889Z  141 โ”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-25T02:16:39.4961951Z  142 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4962028Z      ยท             โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4962244Z      ยท                โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-25T02:16:39.4962314Z  143 โ”‚     if (!hasStatus) {
2026-10-25T02:16:39.4962400Z  144 โ”‚       measuredWidthRef.current = null;
2026-10-25T02:16:39.4962475Z  145 โ”‚       capsuleWidth.value = null;
2026-10-25T02:16:39.4962549Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4962682Z      ยท             โ•ฐโ”€โ”€ This modifies `capsuleWidth`
2026-10-25T02:16:39.4962735Z  146 โ”‚     }
2026-10-25T02:16:39.4962787Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4963124Z   help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-25T02:16:39.4963421Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4963424Z
2026-10-25T02:16:39.4963624Z   โš  react(immutability): Cannot modify local variables after render completes
2026-10-25T02:16:39.4963782Z      โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
2026-10-25T02:16:39.4963891Z  130 โ”‚   const measuredWidthRef = useRef<number | null>(null);
2026-10-25T02:16:39.4964004Z  131 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4964126Z      ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4964387Z      ยท                                            โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-25T02:16:39.4964492Z  132 โ”‚     const width = event.nativeEvent.layout.width;
2026-10-25T02:16:39.4964585Z  133 โ”‚     if (width === measuredWidthRef.current) {
2026-10-25T02:16:39.4964644Z  134 โ”‚       return;
2026-10-25T02:16:39.4964695Z  135 โ”‚     }
2026-10-25T02:16:39.4964806Z  136 โ”‚     const first = measuredWidthRef.current === null;
2026-10-25T02:16:39.4964891Z  137 โ”‚     measuredWidthRef.current = width;
2026-10-25T02:16:39.4965029Z  138 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-25T02:16:39.4965102Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4965232Z      ยท           โ•ฐโ”€โ”€ This modifies `capsuleWidth`
2026-10-25T02:16:39.4965284Z  139 โ”‚   };
2026-10-25T02:16:39.4965339Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4965669Z   help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-25T02:16:39.4966016Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4966045Z
2026-10-25T02:16:39.4966254Z   โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-25T02:16:39.4966422Z      โ•ญโ”€[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7]
2026-10-25T02:16:39.4966499Z  248 โ”‚       mountedRef.current = false;
2026-10-25T02:16:39.4966572Z  249 โ”‚       flow.setBranchQuery("");
2026-10-25T02:16:39.4966640Z      ยท       โ”€โ”€โ”ฌโ”€
2026-10-25T02:16:39.4966763Z      ยท         โ•ฐโ”€โ”€ Missing dependency `flow`
2026-10-25T02:16:39.4966816Z  250 โ”‚     };
2026-10-25T02:16:39.4966889Z  251 โ”‚   }, [flow.setBranchQuery]);
2026-10-25T02:16:39.4966974Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4967179Z      ยท                โ•ฐโ”€โ”€ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
2026-10-25T02:16:39.4967233Z  252 โ”‚
2026-10-25T02:16:39.4967284Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4967695Z   help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4968003Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4968006Z
2026-10-25T02:16:39.4968261Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4968406Z     โ•ญโ”€[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40]
2026-10-25T02:16:39.4968568Z  28 โ”‚   const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live);
2026-10-25T02:16:39.4968635Z  29 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4968704Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4968828Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4968950Z  30 โ”‚     if (snapshot && snapshot !== live) setHeld({ key, snapshot });
2026-10-25T02:16:39.4969054Z     ยท                                        โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4969241Z     ยท                                           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4969310Z  31 โ”‚   }, [key, live, snapshot]);
2026-10-25T02:16:39.4969360Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4969947Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4970265Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4970267Z
2026-10-25T02:16:39.4970519Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4970668Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:5]
2026-10-25T02:16:39.4970726Z  569 โ”‚   }, []);
2026-10-25T02:16:39.4970790Z  570 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4970860Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4971029Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4971140Z  571 โ”‚     setKeyboardStateSuspect(false);
2026-10-25T02:16:39.4971229Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4971396Z      ยท                โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4971496Z  572 โ”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
2026-10-25T02:16:39.4971547Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4972122Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4972439Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4972444Z
2026-10-25T02:16:39.4972693Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4972840Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:967:7]
2026-10-25T02:16:39.4972994Z  964 โ”‚   const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
2026-10-25T02:16:39.4973058Z  965 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4973127Z      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4973249Z      ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4973405Z  966 โ”‚     if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
2026-10-25T02:16:39.4973515Z  967 โ”‚       setLastKnownKeyboardHeight(liveKeyboardHeight);
2026-10-25T02:16:39.4973616Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4973788Z      ยท                    โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4973843Z  968 โ”‚     }
2026-10-25T02:16:39.4973893Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4974508Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4974820Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4974823Z
2026-10-25T02:16:39.4975076Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4975228Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1223:5]
2026-10-25T02:16:39.4975281Z  1221 โ”‚
2026-10-25T02:16:39.4975346Z  1222 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4975417Z       ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4975545Z       ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.4975620Z  1223 โ”‚     setAnchorMessageId(null);
2026-10-25T02:16:39.4975703Z       ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4975869Z       ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.4975949Z  1224 โ”‚     setSubmittedMessageId(null);
2026-10-25T02:16:39.4976002Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4976626Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.4976971Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.4976974Z
2026-10-25T02:16:39.4977168Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4977316Z      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:572:7]
2026-10-25T02:16:39.4977399Z  571 โ”‚     setKeyboardStateSuspect(false);
2026-10-25T02:16:39.4977496Z  572 โ”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
2026-10-25T02:16:39.4977638Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4977845Z      ยท               โ”‚                   โ•ฐโ”€โ”€ Unnecessary dependency `liveKeyboardHeight`
2026-10-25T02:16:39.4978000Z      ยท               โ•ฐโ”€โ”€ Unnecessary dependency `isKeyboardVisible`
2026-10-25T02:16:39.4978125Z  573 โ”‚   const handleOwnedInputFocusChange = (focused: boolean) => {
2026-10-25T02:16:39.4978174Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4978461Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4978764Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4978772Z
2026-10-25T02:16:39.4978971Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4979126Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1171:7]
2026-10-25T02:16:39.4979209Z  1170 โ”‚     userInputInsetProgress.set(1);
2026-10-25T02:16:39.4979369Z  1171 โ”‚   }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
2026-10-25T02:16:39.4979462Z       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4979637Z       ยท                   โ•ฐโ”€โ”€ Unnecessary dependency `activeUserInputRequestId`
2026-10-25T02:16:39.4979740Z  1172 โ”‚   const showContent = props.showContent ?? true;
2026-10-25T02:16:39.4979793Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4980082Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4980387Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4980390Z
2026-10-25T02:16:39.4980583Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.4980735Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1229:15]
2026-10-25T02:16:39.4980804Z  1228 โ”‚     freeze.set(false);
2026-10-25T02:16:39.4980884Z  1229 โ”‚   }, [freeze, selectedThreadKey]);
2026-10-25T02:16:39.4980977Z       ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4981134Z       ยท                       โ•ฐโ”€โ”€ Unnecessary dependency `selectedThreadKey`
2026-10-25T02:16:39.4981234Z  1230 โ”‚
2026-10-25T02:16:39.4981315Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4981599Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.4981900Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.4981902Z
2026-10-25T02:16:39.4982056Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4982204Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1059:5]
2026-10-25T02:16:39.4982313Z  1054 โ”‚   const composerPopoverHeight = useSharedValue(0);
2026-10-25T02:16:39.4982419Z  1055 โ”‚   const floatingControlCoverage = useSharedValue(
2026-10-25T02:16:39.4982518Z       ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4982677Z       ยท                    โ•ฐโ”€โ”€ `floatingControlCoverage` originates here
2026-10-25T02:16:39.4982804Z  1056 โ”‚     showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
2026-10-25T02:16:39.4982857Z  1057 โ”‚   );
2026-10-25T02:16:39.4982921Z  1058 โ”‚   useEffect(() => {
2026-10-25T02:16:39.4983022Z  1059 โ”‚     floatingControlCoverage.value = withTiming(
2026-10-25T02:16:39.4983112Z       ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4983272Z       ยท                โ•ฐโ”€โ”€ `floatingControlCoverage` cannot be modified
2026-10-25T02:16:39.4983396Z  1060 โ”‚       showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
2026-10-25T02:16:39.4983447Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4983710Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4984012Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4984015Z
2026-10-25T02:16:39.4984165Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4984352Z       โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1077:7]
2026-10-25T02:16:39.4984535Z  1067 โ”‚   const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
2026-10-25T02:16:39.4984657Z  1068 โ”‚   const combinedContentInsetEndAdjustment = useSharedValue(
2026-10-25T02:16:39.4984766Z       ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4984997Z       ยท                         โ•ฐโ”€โ”€ `combinedContentInsetEndAdjustment` originates here
2026-10-25T02:16:39.4985153Z  1069 โ”‚     Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
2026-10-25T02:16:39.4985207Z  1070 โ”‚   );
2026-10-25T02:16:39.4985274Z  1071 โ”‚   useAnimatedReaction(
2026-10-25T02:16:39.4985332Z  1072 โ”‚     () =>
2026-10-25T02:16:39.4985424Z  1073 โ”‚       contentInsetEndAdjustment.value +
2026-10-25T02:16:39.4985511Z  1074 โ”‚       floatingControlCoverage.value +
2026-10-25T02:16:39.4985704Z  1075 โ”‚       (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
2026-10-25T02:16:39.4985768Z  1076 โ”‚     (value) => {
2026-10-25T02:16:39.4985881Z  1077 โ”‚       combinedContentInsetEndAdjustment.value = value;
2026-10-25T02:16:39.4985987Z       ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4986179Z       ยท                       โ•ฐโ”€โ”€ `combinedContentInsetEndAdjustment` cannot be modified
2026-10-25T02:16:39.4986238Z  1078 โ”‚     },
2026-10-25T02:16:39.4986289Z       โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4986546Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4986842Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4986846Z
2026-10-25T02:16:39.4986996Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4987147Z     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5]
2026-10-25T02:16:39.4987199Z  83 โ”‚
2026-10-25T02:16:39.4987289Z  84 โ”‚   const cardCoverage = props.cardCoverage;
2026-10-25T02:16:39.4987366Z     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4987502Z     ยท               โ•ฐโ”€โ”€ `cardCoverage` originates here
2026-10-25T02:16:39.4987582Z  85 โ”‚   const barHeightRef = useRef(0);
2026-10-25T02:16:39.4987659Z  86 โ”‚   const cardHeightRef = useRef(0);
2026-10-25T02:16:39.4987742Z  87 โ”‚   const cardHeight = useSharedValue(0);
2026-10-25T02:16:39.4987831Z  88 โ”‚   const notifyCoverage = useCallback(() => {
2026-10-25T02:16:39.4987896Z  89 โ”‚     if (!cardCoverage) {
2026-10-25T02:16:39.4987954Z  90 โ”‚       return;
2026-10-25T02:16:39.4988007Z  91 โ”‚     }
2026-10-25T02:16:39.4988170Z  92 โ”‚     // The card resizes with the keyboard every frame, so easing each sample would leave the
2026-10-25T02:16:39.4988269Z  93 โ”‚     // feed inset and floating controls trailing it.
2026-10-25T02:16:39.4988426Z  94 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-25T02:16:39.4988506Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4988642Z     ยท           โ•ฐโ”€โ”€ `cardCoverage` cannot be modified
2026-10-25T02:16:39.4988706Z  95 โ”‚   }, [cardCoverage]);
2026-10-25T02:16:39.4988757Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4989044Z   help: Do not mutate component props or hook arguments. If the value should change, update it where it is owned and pass an update callback, or use local state
2026-10-25T02:16:39.4989341Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4989344Z
2026-10-25T02:16:39.4989494Z   โš  react(immutability): This value cannot be modified
2026-10-25T02:16:39.4989647Z      โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7]
2026-10-25T02:16:39.4989775Z   86 โ”‚   const cardHeightRef = useRef(0);
2026-10-25T02:16:39.4989889Z   87 โ”‚   const cardHeight = useSharedValue(0);
2026-10-25T02:16:39.4989964Z      ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4990093Z      ยท              โ•ฐโ”€โ”€ `cardHeight` originates here
2026-10-25T02:16:39.4990185Z   88 โ”‚   const notifyCoverage = useCallback(() => {
2026-10-25T02:16:39.4990251Z   89 โ”‚     if (!cardCoverage) {
2026-10-25T02:16:39.4990310Z   90 โ”‚       return;
2026-10-25T02:16:39.4990362Z   91 โ”‚     }
2026-10-25T02:16:39.4990523Z   92 โ”‚     // The card resizes with the keyboard every frame, so easing each sample would leave the
2026-10-25T02:16:39.4990622Z   93 โ”‚     // feed inset and floating controls trailing it.
2026-10-25T02:16:39.4990827Z   94 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-25T02:16:39.4990892Z   95 โ”‚   }, [cardCoverage]);
2026-10-25T02:16:39.4990978Z   96 โ”‚   const handleBarLayout = useCallback(
2026-10-25T02:16:39.4991059Z   97 โ”‚     (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4991177Z   98 โ”‚       barHeightRef.current = event.nativeEvent.layout.height;
2026-10-25T02:16:39.4991243Z   99 โ”‚       notifyCoverage();
2026-10-25T02:16:39.4991296Z  100 โ”‚     },
2026-10-25T02:16:39.4991360Z  101 โ”‚     [notifyCoverage],
2026-10-25T02:16:39.4991417Z  102 โ”‚   );
2026-10-25T02:16:39.4991502Z  103 โ”‚   const handleCardLayout = useCallback(
2026-10-25T02:16:39.4991580Z  104 โ”‚     (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4991704Z  105 โ”‚       cardHeightRef.current = event.nativeEvent.layout.height;
2026-10-25T02:16:39.4991815Z  106 โ”‚       cardHeight.value = event.nativeEvent.layout.height;
2026-10-25T02:16:39.4991891Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4992030Z      ยท            โ•ฐโ”€โ”€ `cardHeight` cannot be modified
2026-10-25T02:16:39.4992097Z  107 โ”‚       notifyCoverage();
2026-10-25T02:16:39.4992148Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4992406Z   help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-25T02:16:39.4992703Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4992706Z
2026-10-25T02:16:39.4992902Z   โš  react(immutability): Cannot modify local variables after render completes
2026-10-25T02:16:39.4993051Z     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5]
2026-10-25T02:16:39.4993135Z  87 โ”‚   const cardHeight = useSharedValue(0);
2026-10-25T02:16:39.4993228Z  88 โ”‚   const notifyCoverage = useCallback(() => {
2026-10-25T02:16:39.4993332Z     ยท                                      โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.4993562Z     ยท                                         โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardCoverage` after render
2026-10-25T02:16:39.4993627Z  89 โ”‚     if (!cardCoverage) {
2026-10-25T02:16:39.4993685Z  90 โ”‚       return;
2026-10-25T02:16:39.4993737Z  91 โ”‚     }
2026-10-25T02:16:39.4993896Z  92 โ”‚     // The card resizes with the keyboard every frame, so easing each sample would leave the
2026-10-25T02:16:39.4993994Z  93 โ”‚     // feed inset and floating controls trailing it.
2026-10-25T02:16:39.4994148Z  94 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-25T02:16:39.4994254Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4994451Z     ยท           โ•ฐโ”€โ”€ This modifies `cardCoverage`
2026-10-25T02:16:39.4994555Z  95 โ”‚   }, [cardCoverage]);
2026-10-25T02:16:39.4994607Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4994938Z   help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-25T02:16:39.4995234Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4995238Z
2026-10-25T02:16:39.4995433Z   โš  react(immutability): Cannot modify local variables after render completes
2026-10-25T02:16:39.4995582Z     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5]
2026-10-25T02:16:39.4995680Z  93 โ”‚     // feed inset and floating controls trailing it.
2026-10-25T02:16:39.4995837Z  94 โ”‚     cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-25T02:16:39.4995911Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4996039Z     ยท           โ•ฐโ”€โ”€ This modifies `cardCoverage`
2026-10-25T02:16:39.4996102Z  95 โ”‚   }, [cardCoverage]);
2026-10-25T02:16:39.4996185Z  96 โ”‚   const handleBarLayout = useCallback(
2026-10-25T02:16:39.4996262Z  97 โ”‚     (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4996363Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4996580Z     ยท                    โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardCoverage` after render
2026-10-25T02:16:39.4996699Z  98 โ”‚       barHeightRef.current = event.nativeEvent.layout.height;
2026-10-25T02:16:39.4996749Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4997083Z   help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-25T02:16:39.4997382Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4997384Z
2026-10-25T02:16:39.4997577Z   โš  react(immutability): Cannot modify local variables after render completes
2026-10-25T02:16:39.4997729Z      โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7]
2026-10-25T02:16:39.4997814Z  103 โ”‚   const handleCardLayout = useCallback(
2026-10-25T02:16:39.4997895Z  104 โ”‚     (event: LayoutChangeEvent) => {
2026-10-25T02:16:39.4997997Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4998213Z      ยท                    โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardHeight` after render
2026-10-25T02:16:39.4998342Z  105 โ”‚       cardHeightRef.current = event.nativeEvent.layout.height;
2026-10-25T02:16:39.4998454Z  106 โ”‚       cardHeight.value = event.nativeEvent.layout.height;
2026-10-25T02:16:39.4998527Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4998655Z      ยท            โ•ฐโ”€โ”€ This modifies `cardHeight`
2026-10-25T02:16:39.4998720Z  107 โ”‚       notifyCoverage();
2026-10-25T02:16:39.4998771Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.4999098Z   help: This argument is a function which may reassign or mutate `cardHeight` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-25T02:16:39.4999443Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-25T02:16:39.4999475Z
2026-10-25T02:16:39.4999728Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.4999878Z     โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
2026-10-25T02:16:39.4999930Z  55 โ”‚
2026-10-25T02:16:39.4999994Z  56 โ”‚   useEffect(() => {
2026-10-25T02:16:39.5000062Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5000187Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.5000254Z  57 โ”‚     setDecodedSize(null);
2026-10-25T02:16:39.5000330Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5000492Z     ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.5000559Z  58 โ”‚   }, [props.sourceKey]);
2026-10-25T02:16:39.5000616Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5001198Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.5001511Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.5001513Z
2026-10-25T02:16:39.5001764Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.5001911Z     โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
2026-10-25T02:16:39.5001963Z  59 โ”‚
2026-10-25T02:16:39.5002029Z  60 โ”‚   useEffect(() => {
2026-10-25T02:16:39.5002097Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5002220Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.5002287Z  61 โ”‚     setFailedUri(null);
2026-10-25T02:16:39.5002360Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5002522Z     ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.5002585Z  62 โ”‚   }, [props.uri]);
2026-10-25T02:16:39.5002635Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5003212Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.5003567Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.5003599Z
2026-10-25T02:16:39.5003808Z   โš  eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
2026-10-25T02:16:39.5003954Z    โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
2026-10-25T02:16:39.5004076Z  6 โ”‚ import { parse, SvgAst, type JsxAST } from "react-native-svg";
2026-10-25T02:16:39.5004277Z  7 โ”‚ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
2026-10-25T02:16:39.5004363Z    ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5004508Z    ยท                  โ•ฐโ”€โ”€ 'ActivityIndicator' is imported here
2026-10-25T02:16:39.5004566Z  8 โ”‚
2026-10-25T02:16:39.5004619Z    โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5004715Z   help: Consider removing this import.
2026-10-25T02:16:39.5004717Z
2026-10-25T02:16:39.5004913Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.5005058Z     โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
2026-10-25T02:16:39.5005124Z  57 โ”‚     setDecodedSize(null);
2026-10-25T02:16:39.5005190Z  58 โ”‚   }, [props.sourceKey]);
2026-10-25T02:16:39.5005269Z     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5005420Z     ยท              โ•ฐโ”€โ”€ Unnecessary dependency `props.sourceKey`
2026-10-25T02:16:39.5005472Z  59 โ”‚
2026-10-25T02:16:39.5005521Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5005813Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.5006121Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.5006123Z
2026-10-25T02:16:39.5006317Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.5006461Z     โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
2026-10-25T02:16:39.5006526Z  61 โ”‚     setFailedUri(null);
2026-10-25T02:16:39.5006589Z  62 โ”‚   }, [props.uri]);
2026-10-25T02:16:39.5006661Z     ยท       โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5006796Z     ยท           โ•ฐโ”€โ”€ Unnecessary dependency `props.uri`
2026-10-25T02:16:39.5006846Z  63 โ”‚
2026-10-25T02:16:39.5006896Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5007184Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.5007487Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.5007489Z
2026-10-25T02:16:39.5007739Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.5007869Z      โ•ญโ”€[apps/mobile/src/components/ProjectFavicon.tsx:172:5]
2026-10-25T02:16:39.5008057Z  167 โ”‚   const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
2026-10-25T02:16:39.5008126Z  168 โ”‚   useLayoutEffect(() => {
2026-10-25T02:16:39.5008201Z      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5008379Z      ยท          โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.5008495Z  169 โ”‚     if (faviconRequest === null) return;
2026-10-25T02:16:39.5008547Z  170 โ”‚
2026-10-25T02:16:39.5008675Z  171 โ”‚     const endRequest = beginProjectFaviconRequest(faviconRequest);
2026-10-25T02:16:39.5008770Z  172 โ”‚     setActiveFaviconRequest(faviconRequest);
2026-10-25T02:16:39.5008859Z      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5009027Z      ยท                โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.5009093Z  173 โ”‚     return endRequest;
2026-10-25T02:16:39.5009144Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5009728Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.5010043Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.5010045Z
2026-10-25T02:16:39.5010241Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.5010367Z     โ•ญโ”€[apps/mobile/src/components/ComposerEditor.tsx:82:6]
2026-10-25T02:16:39.5010421Z  81 โ”‚     },
2026-10-25T02:16:39.5010481Z  82 โ”‚     [draftKey],
2026-10-25T02:16:39.5010553Z     ยท      โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.5010684Z     ยท          โ•ฐโ”€โ”€ Unnecessary dependency `draftKey`
2026-10-25T02:16:39.5010738Z  83 โ”‚   );
2026-10-25T02:16:39.5010793Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5011081Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.5011384Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.5011386Z
2026-10-25T02:16:39.5011637Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.5011781Z     โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55]
2026-10-25T02:16:39.5011839Z  61 โ”‚   }, []);
2026-10-25T02:16:39.5011901Z  62 โ”‚   useEffect(() => {
2026-10-25T02:16:39.5011969Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5012098Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.5012246Z  63 โ”‚     if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
2026-10-25T02:16:39.5012367Z     ยท                                                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5012567Z     ยท                                                              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.5012644Z  64 โ”‚   }, [playbackUrl, resolvedUrl]);
2026-10-25T02:16:39.5012693Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5013377Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.5013716Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.5013719Z
2026-10-25T02:16:39.5013969Z   โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-25T02:16:39.5014100Z     โ•ญโ”€[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5]
2026-10-25T02:16:39.5014151Z  57 โ”‚
2026-10-25T02:16:39.5014233Z  58 โ”‚   useEffect(() => {
2026-10-25T02:16:39.5014302Z     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5014425Z     ยท       โ•ฐโ”€โ”€ This is the containing effect
2026-10-25T02:16:39.5014517Z  59 โ”‚     const controller = new AbortController();
2026-10-25T02:16:39.5014587Z  60 โ”‚     setLoadState("pending");
2026-10-25T02:16:39.5014665Z     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5014828Z     ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
2026-10-25T02:16:39.5014983Z  61 โ”‚     // A renewed signature is used on Retry, not as a reason to reset the native player.
2026-10-25T02:16:39.5015032Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5015605Z   help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-25T02:16:39.5015919Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-25T02:16:39.5015921Z
2026-10-25T02:16:39.5016119Z   โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-25T02:16:39.5016251Z     โ•ญโ”€[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7]
2026-10-25T02:16:39.5016329Z  70 โ”‚     return () => controller.abort();
2026-10-25T02:16:39.5016423Z  71 โ”‚   }, [player, props.playRequested, attempt]);
2026-10-25T02:16:39.5016592Z     ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
2026-10-25T02:16:39.5016811Z     ยท          โ”‚             โ”‚              โ•ฐโ”€โ”€ Unnecessary dependency `attempt`
2026-10-25T02:16:39.5017006Z     ยท          โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `props.playRequested`
2026-10-25T02:16:39.5017144Z     ยท          โ•ฐโ”€โ”€ Unnecessary dependency `player_0`
2026-10-25T02:16:39.5017199Z  72 โ”‚
2026-10-25T02:16:39.5017248Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5017535Z   help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-25T02:16:39.5017838Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.5017840Z
2026-10-25T02:16:39.5018028Z   โš  react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-25T02:16:39.5018172Z      โ•ญโ”€[apps/mobile/src/components/ComposerContextSheet.tsx:272:25]
2026-10-25T02:16:39.5018280Z  271 โ”‚                 {record.elements?.map((element, index) => (
2026-10-25T02:16:39.5018488Z  272 โ”‚                   <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
2026-10-25T02:16:39.5018667Z      ยท                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5018742Z  273 โ”‚                     <ContextField
2026-10-25T02:16:39.5018792Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5018934Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-25T02:16:39.5018938Z
2026-10-25T02:16:39.5019139Z   โš  eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used.
2026-10-25T02:16:39.5019290Z     โ•ญโ”€[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8]
2026-10-25T02:16:39.5019369Z   9 โ”‚   hasScheduledTaskDraftChanges,
2026-10-25T02:16:39.5019439Z  10 โ”‚   type ScheduledTaskDraft,
2026-10-25T02:16:39.5019523Z     ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5019678Z     ยท                 โ•ฐโ”€โ”€ 'ScheduledTaskDraft' is imported here
2026-10-25T02:16:39.5019755Z  11 โ”‚ } from "./scheduledTaskDraft";
2026-10-25T02:16:39.5019804Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5019899Z   help: Consider removing this import.
2026-10-25T02:16:39.5019902Z
2026-10-25T02:16:39.5020078Z   โš  react(memo-dependencies): Found extra memoization dependencies
2026-10-25T02:16:39.5020232Z     โ•ญโ”€[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85]
2026-10-25T02:16:39.5020332Z  80 โ”‚   const startEditor = startScheduledTaskEditor;
2026-10-25T02:16:39.5020508Z  81 โ”‚   const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
2026-10-25T02:16:39.5020649Z     ยท                                                                                     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5020851Z     ยท                                                                                          โ•ฐโ”€โ”€ Unnecessary dependency `startEditor`
2026-10-25T02:16:39.5020930Z  82 โ”‚   const readEditor = useCallback(
2026-10-25T02:16:39.5020979Z     โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5021288Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T02:16:39.5021593Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.5021595Z
2026-10-25T02:16:39.5021770Z   โš  react(memo-dependencies): Found extra memoization dependencies
2026-10-25T02:16:39.5021930Z      โ•ญโ”€[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7]
2026-10-25T02:16:39.5021994Z  101 โ”‚       setEditor,
2026-10-25T02:16:39.5022057Z  102 โ”‚       startEditor,
2026-10-25T02:16:39.5022133Z      ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5022272Z      ยท            โ•ฐโ”€โ”€ Unnecessary dependency `startEditor`
2026-10-25T02:16:39.5022334Z  103 โ”‚       hasChanges,
2026-10-25T02:16:39.5022384Z      โ•ฐโ”€โ”€โ”€โ”€
2026-10-25T02:16:39.5022690Z   help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-25T02:16:39.5022993Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-25T02:16:39.5022995Z
2026-10-25T02:16:39.5023123Z Found 0 errors and 377 warnings in 5539 files (4.9s, 8 threads)
2026-10-25T02:16:39.5427088Z Post job cleanup.
2026-10-25T02:16:39.6021135Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-25T02:16:39.6083689Z Post job cleanup.
2026-10-25T02:16:39.6096883Z ##[start-action display=Cache full pnpm store;id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.__actions_cache]
2026-10-25T02:16:39.6379988Z Post job cleanup.
2026-10-25T02:16:39.6970869Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-3343c3b1388f61a61de99ade7ddf42400f9622aebf34bf75a63eccbd0dde8e3d, not saving cache.
2026-10-25T02:16:39.6999190Z ##[end-action id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.__actions_cache;outcome=success;conclusion=success;duration_ms=90]
2026-10-25T02:16:39.7001026Z ##[start-action display=Cache Vite+;id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.vp_cache]
2026-10-25T02:16:39.7031237Z Post job cleanup.
2026-10-25T02:16:39.7638512Z 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-25T02:16:39.7672069Z ##[end-action id=__7957b473-12f9-4ac0-82ad-42d52cd1ef70.vp_cache;outcome=success;conclusion=success;duration_ms=67]
2026-10-25T02:16:39.7707024Z Post job cleanup.
2026-10-25T02:16:39.8101847Z [command]/usr/local/bin/git version
2026-10-25T02:16:39.8128733Z git version 2.55.0
2026-10-25T02:16:39.8176474Z Temporarily overriding HOME='/home/runner/_work/_temp/c1b72717-1831-4a45-ad0a-eccde49b26eb' before making global git config changes
2026-10-25T02:16:39.8176820Z Adding repository directory to the temporary git global config as a safe directory
2026-10-25T02:16:39.8179225Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-25T02:16:39.8199067Z Removing SSH command configuration
2026-10-25T02:16:39.8201727Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-25T02:16:39.8222433Z [command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2026-10-25T02:16:39.8330997Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-25T02:16:39.8353239Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-25T02:16:39.8385184Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-25T02:16:39.8403818Z ##[group]Run '/job_completed.sh'
2026-10-25T02:16:39.8413629Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-25T02:16:39.8413805Z env:
2026-10-25T02:16:39.8413918Z   BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 162
2026-10-25T02:16:39.8414070Z   BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 401
2026-10-25T02:16:39.8414233Z   BLACKSMITH_CHECK_RUN_ID: 121050673687
2026-10-25T02:16:39.8414385Z   BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-25T02:16:39.8414520Z   GITHUB_ACTIONS_CACHE_MODE: write
2026-10-25T02:16:39.8414651Z ##[endgroup]
2026-10-25T02:16:39.8486251Z Docker container cache not activated, skipping hash computation.
2026-10-25T02:16:39.8728044Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-25T02:16:39.8767044Z Cleaning up orphan processes