GitHub check

256 KB of 598 KB loaded Download the full log (598 KB)
342 KB of earlier output not loaded
6Z  195 │     for (let index = 0; index < count; index += 1) {
2026-10-24T10:35:58.0681795Z      ╰────
2026-10-24T10:35:58.0682335Z   help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
2026-10-24T10:35:58.0682758Z
2026-10-24T10:35:58.0683018Z   ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-24T10:35:58.0683656Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15]
2026-10-24T10:35:58.0683979Z  1997 │       assert.equal(
2026-10-24T10:35:58.0684306Z  1998 │         items.filter((item) => item.type === "assistant_message").at(-1)?.text,
2026-10-24T10:35:58.0684596Z       ·               ──────
2026-10-24T10:35:58.0684848Z  1999 │         "authoritative answer",
2026-10-24T10:35:58.0685050Z       ╰────
2026-10-24T10:35:58.0685356Z   help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-24T10:35:58.0685556Z
2026-10-24T10:35:58.0686078Z   ⚠ 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-24T10:35:58.0686746Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7]
2026-10-24T10:35:58.0687258Z  3950 │           const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
2026-10-24T10:35:58.0687719Z  3951 │ ╭─▶       while (!responseLifecycle.includes("failed")) {
2026-10-24T10:35:58.0688098Z  3952 │ │           yield* Effect.yieldNow;
2026-10-24T10:35:58.0688418Z  3953 │ ╰─▶       }
2026-10-24T10:35:58.0688742Z  3954 │           const responseExit = yield* Fiber.join(responseFiber);
2026-10-24T10:35:58.0688996Z       ╰────
2026-10-24T10:35:58.0689076Z
2026-10-24T10:35:58.0689588Z   ⚠ 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-24T10:35:58.0690260Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9]
2026-10-24T10:35:58.0690563Z  6061 │               .pipe(Effect.forkScoped);
2026-10-24T10:35:58.0691047Z  6062 │ ╭─▶         while (promptGates.length < 1) {
2026-10-24T10:35:58.0691418Z  6063 │ │             yield* Effect.yieldNow;
2026-10-24T10:35:58.0691760Z  6064 │ ╰─▶         }
2026-10-24T10:35:58.0692117Z  6065 │             assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
2026-10-24T10:35:58.0692428Z       ╰────
2026-10-24T10:35:58.0692517Z
2026-10-24T10:35:58.0693013Z   ⚠ 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-24T10:35:58.0693678Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9]
2026-10-24T10:35:58.0694013Z  6196 │               .pipe(Effect.forkScoped);
2026-10-24T10:35:58.0694349Z  6197 │ ╭─▶         while (promptGates.length < 2) {
2026-10-24T10:35:58.0694815Z  6198 │ │             yield* Effect.yieldNow;
2026-10-24T10:35:58.0695137Z  6199 │ ╰─▶         }
2026-10-24T10:35:58.0695532Z  6200 │             if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
2026-10-24T10:35:58.0695808Z       ╰────
2026-10-24T10:35:58.0695890Z
2026-10-24T10:35:58.0696236Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T10:35:58.0696673Z      ╭─[scripts/lib/cli-external-packages.test.ts:114:11]
2026-10-24T10:35:58.0696922Z  113 │         const declared = {
2026-10-24T10:35:58.0697202Z  114 │           ...(manifest.dependencies ?? {}),
2026-10-24T10:35:58.0697560Z      ·           ────────────────────────────────
2026-10-24T10:35:58.0697867Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-24T10:35:58.0698085Z      ╰────
2026-10-24T10:35:58.0698496Z   help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-24T10:35:58.0698792Z
2026-10-24T10:35:58.0699040Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T10:35:58.0699463Z      ╭─[scripts/lib/cli-external-packages.test.ts:115:11]
2026-10-24T10:35:58.0699756Z  114 │           ...(manifest.dependencies ?? {}),
2026-10-24T10:35:58.0700028Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-24T10:35:58.0700342Z      ·           ────────────────────────────────────────
2026-10-24T10:35:58.0700726Z  116 │           ...(manifest.peerDependencies ?? {}),
2026-10-24T10:35:58.0700958Z      ╰────
2026-10-24T10:35:58.0701382Z   help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-24T10:35:58.0701670Z
2026-10-24T10:35:58.0701939Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T10:35:58.0702367Z      ╭─[scripts/lib/cli-external-packages.test.ts:116:11]
2026-10-24T10:35:58.0706528Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-24T10:35:58.0706775Z  116 │           ...(manifest.peerDependencies ?? {}),
2026-10-24T10:35:58.0707011Z      ·           ────────────────────────────────────
2026-10-24T10:35:58.0707195Z  117 │         };
2026-10-24T10:35:58.0707318Z      ╰────
2026-10-24T10:35:58.0707642Z   help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-24T10:35:58.0707901Z
2026-10-24T10:35:58.0708053Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0708374Z     ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
2026-10-24T10:35:58.0708630Z  26 │   const latestInput = useRef(input);
2026-10-24T10:35:58.0708921Z  27 │   latestInput.current = input;
2026-10-24T10:35:58.0709179Z     ·   ─────┬─────────┬───
2026-10-24T10:35:58.0709487Z     ·        │         ╰── Cannot update ref value during render
2026-10-24T10:35:58.0709783Z     ·        ╰── This value is a ref
2026-10-24T10:35:58.0709983Z  28 │   const mounted = useRef(true);
2026-10-24T10:35:58.0710128Z     ╰────
2026-10-24T10:35:58.0710657Z   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-24T10:35:58.0711435Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0711728Z
2026-10-24T10:35:58.0711942Z   ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed
2026-10-24T10:35:58.0712256Z      ╭─[packages/contracts/src/rpc.ts:297:8]
2026-10-24T10:35:58.0712445Z  296 │ } from "./device.ts";
2026-10-24T10:35:58.0712622Z  297 │ import {} from "./previewAutomation.ts";
2026-10-24T10:35:58.0712804Z      ·        ──
2026-10-24T10:35:58.0712945Z  298 │ import {
2026-10-24T10:35:58.0713065Z      ╰────
2026-10-24T10:35:58.0713200Z   help: Remove empty braces
2026-10-24T10:35:58.0713302Z
2026-10-24T10:35:58.0713566Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T10:35:58.0713992Z        ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10597:7]
2026-10-24T10:35:58.0714222Z  10596 │
2026-10-24T10:35:58.0714355Z  10597 │ const layer: Layer.Layer<
2026-10-24T10:35:58.0714519Z        ·       ──┬──
2026-10-24T10:35:58.0714731Z        ·         ╰── 'layer' is declared here
2026-10-24T10:35:58.0714958Z  10598 │   ProviderAdapter.ProviderAdapterV2,
2026-10-24T10:35:58.0715121Z        ╰────
2026-10-24T10:35:58.0715283Z   help: Consider removing this declaration.
2026-10-24T10:35:58.0715403Z
2026-10-24T10:35:58.0715561Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0715888Z     ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
2026-10-24T10:35:58.0716114Z  90 │ }) {
2026-10-24T10:35:58.0716288Z  91 │   const rotation = useSharedValue(props.hidden ? 1 : 0);
2026-10-24T10:35:58.0716498Z     ·         ────┬───
2026-10-24T10:35:58.0716724Z     ·             ╰── `rotation` originates here
2026-10-24T10:35:58.0716931Z  92 │   useLayoutEffect(() => {
2026-10-24T10:35:58.0717164Z  93 │     rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
2026-10-24T10:35:58.0717387Z     ·     ────┬───
2026-10-24T10:35:58.0717604Z     ·         ╰── `rotation` cannot be modified
2026-10-24T10:35:58.0717815Z  94 │   }, [props.hidden, rotation]);
2026-10-24T10:35:58.0717960Z     ╰────
2026-10-24T10:35:58.0718283Z   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-24T10:35:58.0718918Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0719252Z
2026-10-24T10:35:58.0719437Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0719767Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
2026-10-24T10:35:58.0720033Z  266 │   const variant = props.variant ?? "plain";
2026-10-24T10:35:58.0720277Z  267 │   const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
2026-10-24T10:35:58.0720505Z      ·         ────────┬────────
2026-10-24T10:35:58.0720752Z      ·                 ╰── `loadingVisibility` originates here
2026-10-24T10:35:58.0720968Z  268 │   useLayoutEffect(() => {
2026-10-24T10:35:58.0721243Z  269 │     loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
2026-10-24T10:35:58.0721496Z      ·     ────────┬────────
2026-10-24T10:35:58.0721744Z      ·             ╰── `loadingVisibility` cannot be modified
2026-10-24T10:35:58.0721983Z  270 │   }, [loadingVisibility, props.loading]);
2026-10-24T10:35:58.0722151Z      ╰────
2026-10-24T10:35:58.0722469Z   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-24T10:35:58.0723031Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0723322Z
2026-10-24T10:35:58.0723479Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0723806Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
2026-10-24T10:35:58.0724050Z  325 │ }) {
2026-10-24T10:35:58.0724279Z  326 │   const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
2026-10-24T10:35:58.0724533Z      ·         ─────────┬─────────
2026-10-24T10:35:58.0724787Z      ·                  ╰── `recordingVisibility` originates here
2026-10-24T10:35:58.0725006Z  327 │   useLayoutEffect(() => {
2026-10-24T10:35:58.0725281Z  328 │     recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
2026-10-24T10:35:58.0725564Z      ·     ─────────┬─────────
2026-10-24T10:35:58.0725811Z      ·              ╰── `recordingVisibility` cannot be modified
2026-10-24T10:35:58.0726053Z  329 │   }, [props.phase, recordingVisibility]);
2026-10-24T10:35:58.0726208Z      ╰────
2026-10-24T10:35:58.0726534Z   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-24T10:35:58.0727114Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0727406Z
2026-10-24T10:35:58.0727564Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0727885Z     ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
2026-10-24T10:35:58.0728158Z  65 │   const [expanded, setExpanded] = useState(false);
2026-10-24T10:35:58.0728359Z  66 │   const progress = useSharedValue(0);
2026-10-24T10:35:58.0728535Z     ·         ────┬───
2026-10-24T10:35:58.0728753Z     ·             ╰── `progress` originates here
2026-10-24T10:35:58.0729015Z  67 │   useEffect(() => {
2026-10-24T10:35:58.0729255Z  68 │     progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
2026-10-24T10:35:58.0729459Z     ·     ────┬───
2026-10-24T10:35:58.0729673Z     ·         ╰── `progress` cannot be modified
2026-10-24T10:35:58.0729877Z  69 │   }, [expanded, progress]);
2026-10-24T10:35:58.0730018Z     ╰────
2026-10-24T10:35:58.0730336Z   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-24T10:35:58.0730899Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0731223Z
2026-10-24T10:35:58.0731369Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0731686Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
2026-10-24T10:35:58.0732015Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T10:35:58.0732304Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T10:35:58.0732562Z      ·                                      ───────────┬──────────
2026-10-24T10:35:58.0732863Z      ·                                                 ╰── Cannot access ref value during render
2026-10-24T10:35:58.0733146Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T10:35:58.0733329Z      ╰────
2026-10-24T10:35:58.0733861Z   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-24T10:35:58.0734586Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0734864Z
2026-10-24T10:35:58.0735007Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0735316Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
2026-10-24T10:35:58.0735527Z  125 │
2026-10-24T10:35:58.0735698Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T10:35:58.0735902Z      ·        ─────────┬────────
2026-10-24T10:35:58.0736148Z      ·                 ╰── Cannot access ref value during render
2026-10-24T10:35:58.0736396Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T10:35:58.0736567Z      ╰────
2026-10-24T10:35:58.0737092Z   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-24T10:35:58.0737806Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0738085Z
2026-10-24T10:35:58.0738228Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0738538Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
2026-10-24T10:35:58.0738750Z  125 │
2026-10-24T10:35:58.0738914Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T10:35:58.0739176Z      ·       ─────────┬─────────
2026-10-24T10:35:58.0739459Z      ·                ╰── Cannot access ref value during render
2026-10-24T10:35:58.0739703Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T10:35:58.0739868Z      ╰────
2026-10-24T10:35:58.0740390Z   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-24T10:35:58.0741132Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0741417Z
2026-10-24T10:35:58.0741562Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0741879Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
2026-10-24T10:35:58.0742097Z  125 │
2026-10-24T10:35:58.0742261Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T10:35:58.0742490Z      ·                               ─────────┬─────────
2026-10-24T10:35:58.0742777Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T10:35:58.0743036Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T10:35:58.0743197Z      ╰────
2026-10-24T10:35:58.0743717Z   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-24T10:35:58.0744435Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0744714Z
2026-10-24T10:35:58.0744858Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0745164Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
2026-10-24T10:35:58.0745608Z  125 │
2026-10-24T10:35:58.0745773Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T10:35:58.0746005Z      ·                              ──────────┬─────────
2026-10-24T10:35:58.0746290Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T10:35:58.0746554Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T10:35:58.0746718Z      ╰────
2026-10-24T10:35:58.0747328Z   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-24T10:35:58.0748105Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0748389Z
2026-10-24T10:35:58.0748533Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0748840Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
2026-10-24T10:35:58.0749117Z  126 │       if (!sessionRef.current || !recorderRef.current) {
2026-10-24T10:35:58.0749436Z  127 │ ╭─▶     const recorder = createLazyVoiceRecorder({
2026-10-24T10:35:58.0749810Z  128 │ │         create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T10:35:58.0750117Z  129 │ │         onStatus: (status: RecordingStatus) => {
2026-10-24T10:35:58.0750414Z  130 │ │           sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T10:35:58.0750697Z  131 │ │             isFinished: status.isFinished,
2026-10-24T10:35:58.0751007Z  132 │ │             hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T10:35:58.0751312Z  133 │ │             error: status.error,
2026-10-24T10:35:58.0751525Z  134 │ │             url: status.url,
2026-10-24T10:35:58.0751716Z  135 │ │           });
2026-10-24T10:35:58.0751890Z  136 │ │         },
2026-10-24T10:35:58.0752191Z  137 │ │         // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T10:35:58.0752494Z  138 │ │         selectInput: (inputs) => {
2026-10-24T10:35:58.0752766Z  139 │ │           const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T10:35:58.0753069Z  140 │ │           if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T10:35:58.0753384Z  141 │ │           const known = microphoneOrder(preferences.value.microphones);
2026-10-24T10:35:58.0753688Z  142 │ │           const order = rememberMicrophones(known, inputs);
2026-10-24T10:35:58.0753936Z  143 │ │           if (order !== known) {
2026-10-24T10:35:58.0754190Z  144 │ │             registry.set(updateMobilePreferencesAtom, {
2026-10-24T10:35:58.0754453Z  145 │ │               transform: (current) => ({
2026-10-24T10:35:58.0754789Z  146 │ │                 microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T10:35:58.0755074Z  147 │ │               }),
2026-10-24T10:35:58.0755256Z  148 │ │             });
2026-10-24T10:35:58.0755427Z  149 │ │           }
2026-10-24T10:35:58.0755660Z  150 │ │           return preferredMicrophoneInput(inputs, order);
2026-10-24T10:35:58.0755883Z  151 │ │         },
2026-10-24T10:35:58.0756106Z  152 │ ├─▶     });
2026-10-24T10:35:58.0756482Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.0756941Z  153 │         recorderRef.current = recorder;
2026-10-24T10:35:58.0757134Z      ╰────
2026-10-24T10:35:58.0757656Z   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-24T10:35:58.0758374Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0758653Z
2026-10-24T10:35:58.0758796Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0759105Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
2026-10-24T10:35:58.0759325Z  152 │     });
2026-10-24T10:35:58.0759471Z  153 │     recorderRef.current = recorder;
2026-10-24T10:35:58.0759690Z      ·     ─────┬─────────┬───
2026-10-24T10:35:58.0759994Z      ·          │         ╰── Cannot update ref value during render
2026-10-24T10:35:58.0760284Z      ·          ╰── This value is a ref
2026-10-24T10:35:58.0760512Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T10:35:58.0760680Z      ╰────
2026-10-24T10:35:58.0761227Z   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-24T10:35:58.0761946Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0762227Z
2026-10-24T10:35:58.0762372Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0762678Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
2026-10-24T10:35:58.0762927Z  153 │         recorderRef.current = recorder;
2026-10-24T10:35:58.0763224Z  154 │ ╭─▶     sessionRef.current = new VoiceInputSession({
2026-10-24T10:35:58.0763494Z  155 │ │         recorder,
2026-10-24T10:35:58.0763721Z  156 │ │         getTranscriber: getLocalVoiceTranscriber,
2026-10-24T10:35:58.0763978Z  157 │ │         requestPermission: async () => {
2026-10-24T10:35:58.0764269Z  158 │ │           const permission = await requestRecordingPermissionsAsync();
2026-10-24T10:35:58.0764636Z  159 │ │           return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T10:35:58.0764912Z  160 │ │         },
2026-10-24T10:35:58.0765151Z  161 │ │         configureRecording: configureVoiceRecordingAudio,
2026-10-24T10:35:58.0765439Z  162 │ │         releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T10:35:58.0765720Z  163 │ │         deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T10:35:58.0765974Z  164 │ │         onStateChange: (nextState) =>
2026-10-24T10:35:58.0766189Z  165 │ │           setState({
2026-10-24T10:35:58.0766394Z  166 │ │             state: nextState,
2026-10-24T10:35:58.0766647Z  167 │ │             ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T10:35:58.0766987Z  168 │ │             label: sessionRef.current?.label ?? null,
2026-10-24T10:35:58.0767233Z  169 │ │           }),
2026-10-24T10:35:58.0767458Z  170 │ ├─▶     });
2026-10-24T10:35:58.0767790Z      · ╰──── Cannot access ref value during render
2026-10-24T10:35:58.0768032Z  171 │       }
2026-10-24T10:35:58.0768146Z      ╰────
2026-10-24T10:35:58.0768670Z   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-24T10:35:58.0769394Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0769675Z
2026-10-24T10:35:58.0769819Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0770127Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
2026-10-24T10:35:58.0770372Z  153 │     recorderRef.current = recorder;
2026-10-24T10:35:58.0770576Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T10:35:58.0770802Z      ·     ─────┬────────┬───
2026-10-24T10:35:58.0771128Z      ·          │        ╰── Cannot update ref value during render
2026-10-24T10:35:58.0771415Z      ·          ╰── This value is a ref
2026-10-24T10:35:58.0771599Z  155 │       recorder,
2026-10-24T10:35:58.0771724Z      ╰────
2026-10-24T10:35:58.0772251Z   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-24T10:35:58.0772966Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0773242Z
2026-10-24T10:35:58.0773384Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0773690Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
2026-10-24T10:35:58.0773936Z  184 │     return () => subscription.remove();
2026-10-24T10:35:58.0774104Z  185 │   }, [controller]);
2026-10-24T10:35:58.0774260Z      ·       ─────┬────
2026-10-24T10:35:58.0774499Z      ·            ╰── Cannot access ref value during render
2026-10-24T10:35:58.0774698Z  186 │
2026-10-24T10:35:58.0774805Z      ╰────
2026-10-24T10:35:58.0775325Z   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-24T10:35:58.0776054Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0776337Z
2026-10-24T10:35:58.0776482Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0776789Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
2026-10-24T10:35:58.0777092Z  184 │     return () => subscription.remove();
2026-10-24T10:35:58.0777294Z  185 │   }, [controller]);
2026-10-24T10:35:58.0777450Z      ·      ──────┬─────
2026-10-24T10:35:58.0777685Z      ·            ╰── Cannot access ref value during render
2026-10-24T10:35:58.0777879Z  186 │
2026-10-24T10:35:58.0777985Z      ╰────
2026-10-24T10:35:58.0778506Z   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-24T10:35:58.0779225Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0779508Z
2026-10-24T10:35:58.0779662Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0779969Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
2026-10-24T10:35:58.0780185Z  191 │     },
2026-10-24T10:35:58.0780318Z  192 │     [controller, recorder],
2026-10-24T10:35:58.0780481Z      ·      ─────┬────
2026-10-24T10:35:58.0780711Z      ·           ╰── Cannot access ref value during render
2026-10-24T10:35:58.0780905Z  193 │   );
2026-10-24T10:35:58.0781014Z      ╰────
2026-10-24T10:35:58.0781702Z   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-24T10:35:58.0782436Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0782725Z
2026-10-24T10:35:58.0782869Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0783175Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
2026-10-24T10:35:58.0783430Z  174 │   const controller = session.controller;
2026-10-24T10:35:58.0783623Z  175 │   const recorder = recorderRef.current;
2026-10-24T10:35:58.0783830Z      ·                    ─────────┬─────────
2026-10-24T10:35:58.0784096Z      ·                             ╰── Cannot access ref value during render
2026-10-24T10:35:58.0784302Z  176 │
2026-10-24T10:35:58.0784407Z      ╰────
2026-10-24T10:35:58.0784936Z   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-24T10:35:58.0785726Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0786002Z
2026-10-24T10:35:58.0786145Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0786449Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
2026-10-24T10:35:58.0786669Z  191 │     },
2026-10-24T10:35:58.0786801Z  192 │     [controller, recorder],
2026-10-24T10:35:58.0786979Z      ·     ───────────┬──────────
2026-10-24T10:35:58.0787300Z      ·                ╰── Cannot access ref value during render
2026-10-24T10:35:58.0787541Z  193 │   );
2026-10-24T10:35:58.0787650Z      ╰────
2026-10-24T10:35:58.0788169Z   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-24T10:35:58.0788882Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0789161Z
2026-10-24T10:35:58.0789306Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0789611Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
2026-10-24T10:35:58.0789864Z  245 │     return () => clearInterval(intervalId);
2026-10-24T10:35:58.0790086Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T10:35:58.0790302Z      ·                    ─────┬────
2026-10-24T10:35:58.0790563Z      ·                         ╰── Cannot access ref value during render
2026-10-24T10:35:58.0790767Z  247 │
2026-10-24T10:35:58.0790875Z      ╰────
2026-10-24T10:35:58.0791432Z   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-24T10:35:58.0792165Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0792448Z
2026-10-24T10:35:58.0792595Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0792905Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
2026-10-24T10:35:58.0793153Z  245 │     return () => clearInterval(intervalId);
2026-10-24T10:35:58.0793368Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T10:35:58.0793621Z      ·      ────────────────────────┬───────────────────────
2026-10-24T10:35:58.0793911Z      ·                              ╰── Cannot access ref value during render
2026-10-24T10:35:58.0794116Z  247 │
2026-10-24T10:35:58.0794223Z      ╰────
2026-10-24T10:35:58.0794755Z   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-24T10:35:58.0795545Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0795865Z
2026-10-24T10:35:58.0796009Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0796314Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
2026-10-24T10:35:58.0796542Z  260 │     setOwnerFocused,
2026-10-24T10:35:58.0796687Z  261 │     session,
2026-10-24T10:35:58.0796827Z      ·     ───┬───
2026-10-24T10:35:58.0797051Z      ·        ╰── Cannot access ref value during render
2026-10-24T10:35:58.0797250Z  262 │     stop,
2026-10-24T10:35:58.0797367Z      ╰────
2026-10-24T10:35:58.0797900Z   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-24T10:35:58.0798634Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0798915Z
2026-10-24T10:35:58.0799065Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0799378Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
2026-10-24T10:35:58.0799596Z  250 │
2026-10-24T10:35:58.0799798Z  251 │ ╭─▶   return {
2026-10-24T10:35:58.0800154Z  252 │ │       isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
2026-10-24T10:35:58.0800448Z  253 │ │       state,
2026-10-24T10:35:58.0800636Z  254 │ │       audioLevels,
2026-10-24T10:35:58.0800836Z  255 │ │       elapsedSeconds,
2026-10-24T10:35:58.0801102Z  256 │ │       isBusy: voiceInputBlocksSubmission(state),
2026-10-24T10:35:58.0801324Z  257 │ │       ownerKey,
2026-10-24T10:35:58.0801499Z  258 │ │       label,
2026-10-24T10:35:58.0801681Z  259 │ │       focusedOwners,
2026-10-24T10:35:58.0801883Z  260 │ │       setOwnerFocused,
2026-10-24T10:35:58.0802072Z  261 │ │       session,
2026-10-24T10:35:58.0802245Z  262 │ │       stop,
2026-10-24T10:35:58.0802419Z  263 │ │       cancel,
2026-10-24T10:35:58.0802649Z  264 │ ├─▶   };
2026-10-24T10:35:58.0802983Z      · ╰──── Cannot access ref value during render
2026-10-24T10:35:58.0803222Z  265 │     }
2026-10-24T10:35:58.0803333Z      ╰────
2026-10-24T10:35:58.0803855Z   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-24T10:35:58.0804569Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0804848Z
2026-10-24T10:35:58.0805006Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0805378Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T10:35:58.0805739Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T10:35:58.0806032Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T10:35:58.0806249Z      ·         ─────┬─────
2026-10-24T10:35:58.0806489Z      ·              ╰── `audioLevels` originates here
2026-10-24T10:35:58.0806742Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T10:35:58.0807020Z  124 │   const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
2026-10-24T10:35:58.0807226Z  125 │
2026-10-24T10:35:58.0807392Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T10:35:58.0807608Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T10:35:58.0807869Z  128 │       create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T10:35:58.0808114Z  129 │       onStatus: (status: RecordingStatus) => {
2026-10-24T10:35:58.0808344Z  130 │         sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T10:35:58.0808564Z  131 │           isFinished: status.isFinished,
2026-10-24T10:35:58.0808811Z  132 │           hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T10:35:58.0809037Z  133 │           error: status.error,
2026-10-24T10:35:58.0809197Z  134 │           url: status.url,
2026-10-24T10:35:58.0809340Z  135 │         });
2026-10-24T10:35:58.0809464Z  136 │       },
2026-10-24T10:35:58.0809693Z  137 │       // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T10:35:58.0809936Z  138 │       selectInput: (inputs) => {
2026-10-24T10:35:58.0810162Z  139 │         const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T10:35:58.0810410Z  140 │         if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T10:35:58.0810670Z  141 │         const known = microphoneOrder(preferences.value.microphones);
2026-10-24T10:35:58.0810922Z  142 │         const order = rememberMicrophones(known, inputs);
2026-10-24T10:35:58.0811145Z  143 │         if (order !== known) {
2026-10-24T10:35:58.0811341Z  144 │           registry.set(updateMobilePreferencesAtom, {
2026-10-24T10:35:58.0811543Z  145 │             transform: (current) => ({
2026-10-24T10:35:58.0811816Z  146 │               microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T10:35:58.0812051Z  147 │             }),
2026-10-24T10:35:58.0812187Z  148 │           });
2026-10-24T10:35:58.0812313Z  149 │         }
2026-10-24T10:35:58.0812497Z  150 │         return preferredMicrophoneInput(inputs, order);
2026-10-24T10:35:58.0812679Z  151 │       },
2026-10-24T10:35:58.0812798Z  152 │     });
2026-10-24T10:35:58.0812942Z  153 │     recorderRef.current = recorder;
2026-10-24T10:35:58.0813144Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T10:35:58.0813319Z  155 │       recorder,
2026-10-24T10:35:58.0813490Z  156 │       getTranscriber: getLocalVoiceTranscriber,
2026-10-24T10:35:58.0813689Z  157 │       requestPermission: async () => {
2026-10-24T10:35:58.0813922Z  158 │         const permission = await requestRecordingPermissionsAsync();
2026-10-24T10:35:58.0814221Z  159 │         return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T10:35:58.0814441Z  160 │       },
2026-10-24T10:35:58.0814617Z  161 │       configureRecording: configureVoiceRecordingAudio,
2026-10-24T10:35:58.0814844Z  162 │       releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T10:35:58.0815123Z  163 │       deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T10:35:58.0815355Z  164 │       onStateChange: (nextState) =>
2026-10-24T10:35:58.0815518Z  165 │         setState({
2026-10-24T10:35:58.0815665Z  166 │           state: nextState,
2026-10-24T10:35:58.0815855Z  167 │           ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T10:35:58.0816073Z  168 │           label: sessionRef.current?.label ?? null,
2026-10-24T10:35:58.0816240Z  169 │         }),
2026-10-24T10:35:58.0816364Z  170 │     });
2026-10-24T10:35:58.0816478Z  171 │   }
2026-10-24T10:35:58.0816586Z  172 │
2026-10-24T10:35:58.0816725Z  173 │   const session = sessionRef.current;
2026-10-24T10:35:58.0816914Z  174 │   const controller = session.controller;
2026-10-24T10:35:58.0817102Z  175 │   const recorder = recorderRef.current;
2026-10-24T10:35:58.0817252Z  176 │
2026-10-24T10:35:58.0817379Z  177 │   useEffect(() => {
2026-10-24T10:35:58.0817613Z  178 │     const subscription = AppState.addEventListener("change", (nextState) => {
2026-10-24T10:35:58.0817914Z  179 │       // iOS reports `inactive` while its permission dialog is open. Only the
2026-10-24T10:35:58.0818202Z  180 │       // real background state cancels preparation; recorder status handles
2026-10-24T10:35:58.0818451Z  181 │       // calls and route interruptions during capture.
2026-10-24T10:35:58.0818706Z  182 │       if (nextState === "background") controller.appMovedToBackground();
2026-10-24T10:35:58.0818910Z  183 │     });
2026-10-24T10:35:58.0819057Z  184 │     return () => subscription.remove();
2026-10-24T10:35:58.0819225Z  185 │   }, [controller]);
2026-10-24T10:35:58.0819356Z  186 │
2026-10-24T10:35:58.0819471Z  187 │   useEffect(
2026-10-24T10:35:58.0819604Z  188 │     () => () => {
2026-10-24T10:35:58.0819761Z  189 │       controller.dispose();
2026-10-24T10:35:58.0819923Z  190 │       recorder.release();
2026-10-24T10:35:58.0820063Z  191 │     },
2026-10-24T10:35:58.0820195Z  192 │     [controller, recorder],
2026-10-24T10:35:58.0820336Z  193 │   );
2026-10-24T10:35:58.0820445Z  194 │
2026-10-24T10:35:58.0820565Z  195 │   useEffect(() => {
2026-10-24T10:35:58.0820737Z  196 │     if (state.phase !== "recording") return;
2026-10-24T10:35:58.0820898Z  197 │
2026-10-24T10:35:58.0821133Z  198 │     const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
2026-10-24T10:35:58.0821399Z  199 │     const activation = activateKeepAwakeAsync(tag);
2026-10-24T10:35:58.0821601Z  200 │     void activation.catch(() => {});
2026-10-24T10:35:58.0821764Z  201 │     return () => {
2026-10-24T10:35:58.0821993Z  202 │       // Release after activation settles, even if the recording ends immediately.
2026-10-24T10:35:58.0822294Z  203 │       void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
2026-10-24T10:35:58.0822500Z  204 │     };
2026-10-24T10:35:58.0822642Z  205 │   }, [keepAwakeId, state.phase]);
2026-10-24T10:35:58.0822793Z  206 │
2026-10-24T10:35:58.0822910Z  207 │   useEffect(() => {
2026-10-24T10:35:58.0823131Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T10:35:58.0823183Z  209 │
2026-10-24T10:35:58.0823303Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T10:35:58.0823459Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T10:35:58.0823561Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-24T10:35:58.0823639Z      ·       ─────┬─────
2026-10-24T10:35:58.0823844Z      ·            ╰── `audioLevels` cannot be modified
2026-10-24T10:35:58.0823933Z  213 │     }
2026-10-24T10:35:58.0823986Z      ╰────
2026-10-24T10:35:58.0824255Z   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-24T10:35:58.0824572Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0824575Z
2026-10-24T10:35:58.0824782Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T10:35:58.0824944Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T10:35:58.0824996Z  206 │
2026-10-24T10:35:58.0825059Z  207 │   useEffect(() => {
2026-10-24T10:35:58.0825137Z      ·             ───┬───
2026-10-24T10:35:58.0825575Z      ·                ╰── This function may (indirectly) reassign or modify `audioLevels` after render
2026-10-24T10:35:58.0825718Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T10:35:58.0825768Z  209 │
2026-10-24T10:35:58.0825888Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T10:35:58.0826043Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T10:35:58.0826144Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-24T10:35:58.0826220Z      ·       ─────┬─────
2026-10-24T10:35:58.0826353Z      ·            ╰── This modifies `audioLevels`
2026-10-24T10:35:58.0826408Z  213 │     }
2026-10-24T10:35:58.0826458Z      ╰────
2026-10-24T10:35:58.0826808Z   help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-24T10:35:58.0827124Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0827126Z
2026-10-24T10:35:58.0827392Z   ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
2026-10-24T10:35:58.0827578Z      ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
2026-10-24T10:35:58.0827630Z  959 │
2026-10-24T10:35:58.0827739Z  960 │ function layerClaudeAgentSdkReplayQueryRunner(
2026-10-24T10:35:58.0827855Z      ·          ──────────────────┬─────────────────
2026-10-24T10:35:58.0828063Z      ·                            ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here
2026-10-24T10:35:58.0828172Z  961 │   transcript: ClaudeAgentSdkReplayTranscript,
2026-10-24T10:35:58.0828221Z      ╰────
2026-10-24T10:35:58.0828325Z   help: Consider removing this declaration.
2026-10-24T10:35:58.0828327Z
2026-10-24T10:35:58.0828559Z   ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-24T10:35:58.0828704Z      ╭─[packages/client-runtime/src/operations/projects.ts:228:51]
2026-10-24T10:35:58.0828764Z  227 │ ): string {
2026-10-24T10:35:58.0828919Z  228 │   const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
2026-10-24T10:35:58.0829033Z      ·                                                   ──────
2026-10-24T10:35:58.0829239Z  229 │   return target.owner ? `${target.owner}/${folderName}` : folderName;
2026-10-24T10:35:58.0829331Z      ╰────
2026-10-24T10:35:58.0829505Z   help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-24T10:35:58.0829508Z
2026-10-24T10:35:58.0829815Z   ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'.
2026-10-24T10:35:58.0829978Z      ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7]
2026-10-24T10:35:58.0830029Z  345 │
2026-10-24T10:35:58.0830133Z  346 │ const layerFromProviderAdapter: Layer.Layer<
2026-10-24T10:35:58.0830227Z      ·       ────────────┬───────────
2026-10-24T10:35:58.0830397Z      ·                   ╰── 'layerFromProviderAdapter' is declared here
2026-10-24T10:35:58.0830480Z  347 │   ProviderAdapterRegistryV2,
2026-10-24T10:35:58.0830535Z      ╰────
2026-10-24T10:35:58.0830641Z   help: Consider removing this declaration.
2026-10-24T10:35:58.0830643Z
2026-10-24T10:35:58.0830930Z   ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
2026-10-24T10:35:58.0831116Z     ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
2026-10-24T10:35:58.0831168Z  14 │
2026-10-24T10:35:58.0831243Z  15 │ const legacyCredentials = {
2026-10-24T10:35:58.0831327Z     ·       ────────┬────────
2026-10-24T10:35:58.0831475Z     ·               ╰── 'legacyCredentials' is declared here
2026-10-24T10:35:58.0831542Z  16 │   version: 1 as const,
2026-10-24T10:35:58.0831592Z     ╰────
2026-10-24T10:35:58.0831702Z   help: Consider removing this declaration.
2026-10-24T10:35:58.0831708Z
2026-10-24T10:35:58.0831904Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T10:35:58.0832054Z      ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25]
2026-10-24T10:35:58.0832163Z  266 │                 {record.elements?.map((element, index) => (
2026-10-24T10:35:58.0832335Z  267 │                   <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
2026-10-24T10:35:58.0832489Z      ·                         ───────────────────────────────────────────────────────
2026-10-24T10:35:58.0832564Z  268 │                     <ContextField
2026-10-24T10:35:58.0832615Z      ╰────
2026-10-24T10:35:58.0832763Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T10:35:58.0832765Z
2026-10-24T10:35:58.0833118Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T10:35:58.0833240Z     ╭─[packages/effect-acp/src/schema.test.ts:18:12]
2026-10-24T10:35:58.0833404Z  17 │     const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
2026-10-24T10:35:58.0833526Z  18 │     expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
2026-10-24T10:35:58.0833605Z     ·            ─────────
2026-10-24T10:35:58.0833662Z  19 │     expect(
2026-10-24T10:35:58.0833713Z     ╰────
2026-10-24T10:35:58.0833715Z
2026-10-24T10:35:58.0834056Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T10:35:58.0834232Z     ╭─[packages/effect-acp/src/schema.test.ts:20:7]
2026-10-24T10:35:58.0834327Z  19 │     expect(
2026-10-24T10:35:58.0834497Z  20 │       Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
2026-10-24T10:35:58.0834570Z     ·       ─────────
2026-10-24T10:35:58.0834632Z  21 │     ).toBe(true);
2026-10-24T10:35:58.0834682Z     ╰────
2026-10-24T10:35:58.0834686Z
2026-10-24T10:35:58.0834944Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0835080Z     ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5]
2026-10-24T10:35:58.0835131Z  57 │
2026-10-24T10:35:58.0835196Z  58 │   useEffect(() => {
2026-10-24T10:35:58.0835265Z     ·   ────┬────
2026-10-24T10:35:58.0835403Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0835501Z  59 │     const controller = new AbortController();
2026-10-24T10:35:58.0835573Z  60 │     setLoadState("pending");
2026-10-24T10:35:58.0835647Z     ·     ──────┬─────
2026-10-24T10:35:58.0835815Z     ·           ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0835978Z  61 │     // A renewed signature is used on Retry, not as a reason to reset the native player.
2026-10-24T10:35:58.0836027Z     ╰────
2026-10-24T10:35:58.0836647Z   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-24T10:35:58.0836985Z   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-24T10:35:58.0836990Z
2026-10-24T10:35:58.0837195Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0837331Z     ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7]
2026-10-24T10:35:58.0837413Z  70 │     return () => controller.abort();
2026-10-24T10:35:58.0837508Z  71 │   }, [player, props.playRequested, attempt]);
2026-10-24T10:35:58.0837682Z     ·       ───┬──  ─────────┬─────────  ───┬───
2026-10-24T10:35:58.0837911Z     ·          │             │              ╰── Unnecessary dependency `attempt`
2026-10-24T10:35:58.0838189Z     ·          │             ╰── Unnecessary dependency `props.playRequested`
2026-10-24T10:35:58.0838361Z     ·          ╰── Unnecessary dependency `player_0`
2026-10-24T10:35:58.0838412Z  72 │
2026-10-24T10:35:58.0838465Z     ╰────
2026-10-24T10:35:58.0838765Z   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-24T10:35:58.0839085Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0839088Z
2026-10-24T10:35:58.0839347Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0839499Z     ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55]
2026-10-24T10:35:58.0839560Z  61 │   }, []);
2026-10-24T10:35:58.0839623Z  62 │   useEffect(() => {
2026-10-24T10:35:58.0839695Z     ·   ────┬────
2026-10-24T10:35:58.0839821Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0839972Z  63 │     if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
2026-10-24T10:35:58.0840097Z     ·                                                       ───────┬──────
2026-10-24T10:35:58.0840302Z     ·                                                              ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0840382Z  64 │   }, [playbackUrl, resolvedUrl]);
2026-10-24T10:35:58.0840433Z     ╰────
2026-10-24T10:35:58.0841059Z   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-24T10:35:58.0841416Z   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-24T10:35:58.0841421Z
2026-10-24T10:35:58.0841706Z   ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
2026-10-24T10:35:58.0841841Z      ╭─[packages/provider-cursor/src/server/auth.ts:249:20]
2026-10-24T10:35:58.0841896Z  248 │     },
2026-10-24T10:35:58.0841978Z  249 │     (effect, flow, stopSessions) =>
2026-10-24T10:35:58.0842075Z      ·                    ──────┬─────
2026-10-24T10:35:58.0842228Z      ·                          ╰── 'stopSessions' is declared here
2026-10-24T10:35:58.0842294Z  250 │       effect.pipe(
2026-10-24T10:35:58.0842345Z      ╰────
2026-10-24T10:35:58.0842447Z   help: Consider removing this parameter.
2026-10-24T10:35:58.0842449Z
2026-10-24T10:35:58.0842707Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0842839Z      ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5]
2026-10-24T10:35:58.0843033Z  167 │   const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
2026-10-24T10:35:58.0843102Z  168 │   useLayoutEffect(() => {
2026-10-24T10:35:58.0843181Z      ·   ───────┬───────
2026-10-24T10:35:58.0843382Z      ·          ╰── This is the containing effect
2026-10-24T10:35:58.0843511Z  169 │     if (faviconRequest === null) return;
2026-10-24T10:35:58.0843562Z  170 │
2026-10-24T10:35:58.0843697Z  171 │     const endRequest = beginProjectFaviconRequest(faviconRequest);
2026-10-24T10:35:58.0843794Z  172 │     setActiveFaviconRequest(faviconRequest);
2026-10-24T10:35:58.0843884Z      ·     ───────────┬───────────
2026-10-24T10:35:58.0844057Z      ·                ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0844127Z  173 │     return endRequest;
2026-10-24T10:35:58.0844178Z      ╰────
2026-10-24T10:35:58.0844798Z   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-24T10:35:58.0845129Z   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-24T10:35:58.0845133Z
2026-10-24T10:35:58.0845598Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-24T10:35:58.0845720Z      ╭─[packages/effect-acp/src/errors.test.ts:129:28]
2026-10-24T10:35:58.0845814Z  128 │       const secret = "acp-summary-secret";
2026-10-24T10:35:58.0845926Z  129 │       const cause = yield* Schema.decodeUnknownEffect(
2026-10-24T10:35:58.0846049Z      ·                            ──────────────────────────
2026-10-24T10:35:58.0846120Z  130 │         Schema.Struct({
2026-10-24T10:35:58.0846171Z      ╰────
2026-10-24T10:35:58.0846173Z
2026-10-24T10:35:58.0846556Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T10:35:58.0846671Z       ╭─[packages/effect-acp/src/client.ts:1269:11]
2026-10-24T10:35:58.0846823Z  1268 │         extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
2026-10-24T10:35:58.0847003Z  1269 │           Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
2026-10-24T10:35:58.0847108Z       ·           ──────────────────────────
2026-10-24T10:35:58.0847264Z  1270 │             Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
2026-10-24T10:35:58.0847319Z       ╰────
2026-10-24T10:35:58.0847322Z
2026-10-24T10:35:58.0847786Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-24T10:35:58.0847911Z      ╭─[packages/effect-acp/src/protocol.test.ts:500:31]
2026-10-24T10:35:58.0847964Z  499 │
2026-10-24T10:35:58.0848077Z  500 │       const response = yield* Schema.decodeUnknownEffect(
2026-10-24T10:35:58.0848195Z      ·                               ──────────────────────────
2026-10-24T10:35:58.0848308Z  501 │         Schema.fromJsonString(JsonRpcErrorResponse),
2026-10-24T10:35:58.0848359Z      ╰────
2026-10-24T10:35:58.0848361Z
2026-10-24T10:35:58.0848690Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0848858Z     ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5]
2026-10-24T10:35:58.0848963Z  66 │   const { id: attachmentId, fileUri } = attachment;
2026-10-24T10:35:58.0849031Z  67 │   useEffect(() => {
2026-10-24T10:35:58.0849100Z     ·   ────┬────
2026-10-24T10:35:58.0849229Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0849293Z  68 │     setUri(null);
2026-10-24T10:35:58.0849365Z     ·     ───┬──
2026-10-24T10:35:58.0849530Z     ·        ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0849593Z  69 │     setError(null);
2026-10-24T10:35:58.0849643Z     ╰────
2026-10-24T10:35:58.0850264Z   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-24T10:35:58.0850598Z   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-24T10:35:58.0850600Z
2026-10-24T10:35:58.0850805Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0850941Z     ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7]
2026-10-24T10:35:58.0850995Z  90 │     };
2026-10-24T10:35:58.0851069Z  91 │   }, [attachmentId, fileUri]);
2026-10-24T10:35:58.0851217Z     ·       ──────┬─────  ───┬───
2026-10-24T10:35:58.0851403Z     ·             │          ╰── Unnecessary dependency `fileUri`
2026-10-24T10:35:58.0851553Z     ·             ╰── Unnecessary dependency `attachmentId`
2026-10-24T10:35:58.0851689Z  92 │   const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
2026-10-24T10:35:58.0851739Z     ╰────
2026-10-24T10:35:58.0852033Z   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-24T10:35:58.0852355Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0852357Z
2026-10-24T10:35:58.0852582Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T10:35:58.0852726Z      ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34]
2026-10-24T10:35:58.0852790Z  212 │   useEffect(() => {
2026-10-24T10:35:58.0852904Z  213 │     if (!isFocused && hasSource) props.onRequestClose();
2026-10-24T10:35:58.0853002Z      ·                                  ──┬──
2026-10-24T10:35:58.0853155Z      ·                                    ╰── Missing dependency `props`
2026-10-24T10:35:58.0853262Z  214 │   }, [isFocused, hasSource, props.onRequestClose]);
2026-10-24T10:35:58.0853377Z      ·                             ──────────┬─────────
2026-10-24T10:35:58.0853610Z      ·                                       ╰── Overly precise dependency `props.onRequestClose`, use `props` instead
2026-10-24T10:35:58.0853754Z  215 │   const { source } = props;
2026-10-24T10:35:58.0853837Z      ╰────
2026-10-24T10:35:58.0854259Z   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-24T10:35:58.0854578Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0854581Z
2026-10-24T10:35:58.0854753Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.0854876Z      ╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
2026-10-24T10:35:58.0854979Z  820 │     const resolved = resolveThreadTarget(target);
2026-10-24T10:35:58.0855146Z  821 │     if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
2026-10-24T10:35:58.0855271Z      ·                                                        ─────┬────
2026-10-24T10:35:58.0855440Z      ·                                                             ╰── Cannot call impure function
2026-10-24T10:35:58.0855521Z  822 │       return AsyncResult.failure(
2026-10-24T10:35:58.0855573Z      ╰────
2026-10-24T10:35:58.0855859Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.0856165Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.0856168Z
2026-10-24T10:35:58.0856344Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.0856466Z      ╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
2026-10-24T10:35:58.0856537Z  708 │     const wokeAt = resolved
2026-10-24T10:35:58.0856672Z  709 │       ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
2026-10-24T10:35:58.0856784Z      ·                                              ─────┬────
2026-10-24T10:35:58.0856945Z      ·                                                   ╰── Cannot call impure function
2026-10-24T10:35:58.0857008Z  710 │       : null;
2026-10-24T10:35:58.0857059Z      ╰────
2026-10-24T10:35:58.0857343Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.0857647Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.0857652Z
2026-10-24T10:35:58.0857865Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T10:35:58.0857990Z      ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28]
2026-10-24T10:35:58.0858092Z  258 │   visit(parser.parse(markdown), false, false);
2026-10-24T10:35:58.0858177Z  259 │   for (const edit of edits.reverse())
2026-10-24T10:35:58.0858272Z      ·                            ───────
2026-10-24T10:35:58.0858439Z  260 │     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
2026-10-24T10:35:58.0858490Z      ╰────
2026-10-24T10:35:58.0858749Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T10:35:58.0858825Z
2026-10-24T10:35:58.0859071Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T10:35:58.0859195Z      ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28]
2026-10-24T10:35:58.0859277Z  289 │   visit(parser.parse(markdown));
2026-10-24T10:35:58.0859360Z  290 │   for (const edit of edits.reverse())
2026-10-24T10:35:58.0859453Z      ·                            ───────
2026-10-24T10:35:58.0859615Z  291 │     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
2026-10-24T10:35:58.0859666Z      ╰────
2026-10-24T10:35:58.0859925Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T10:35:58.0859928Z
2026-10-24T10:35:58.0860144Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T10:35:58.0860269Z      ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38]
2026-10-24T10:35:58.0860348Z  343 │   visit(parser.parse(markdown));
2026-10-24T10:35:58.0860452Z  344 │   for (const lineStart of lineStarts.reverse()) {
2026-10-24T10:35:58.0860553Z      ·                                      ───────
2026-10-24T10:35:58.0860718Z  345 │     // The header row may be a lazy line without its container markers (`>` or list indent),
2026-10-24T10:35:58.0860770Z      ╰────
2026-10-24T10:35:58.0861027Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T10:35:58.0861029Z
2026-10-24T10:35:58.0861205Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0861368Z      ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
2026-10-24T10:35:58.0861426Z  276 │
2026-10-24T10:35:58.0861610Z  277 │ ╭─▶   return createElement(RawNativeView, {
2026-10-24T10:35:58.0861704Z  278 │ │       ...nativeProps,
2026-10-24T10:35:58.0861855Z  279 │ │       refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-24T10:35:58.0861949Z  280 │ │       ref: nativeRef,
2026-10-24T10:35:58.0862081Z  281 │ ├─▶   });
2026-10-24T10:35:58.0862322Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.0862375Z  282 │     }
2026-10-24T10:35:58.0862430Z      ╰────
2026-10-24T10:35:58.0862986Z   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-24T10:35:58.0863425Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0863427Z
2026-10-24T10:35:58.0863573Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0863728Z      ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27]
2026-10-24T10:35:58.0863786Z  493 │         >
2026-10-24T10:35:58.0863865Z  494 │           {props.children(close)}
2026-10-24T10:35:58.0863952Z      ·                           ──┬──
2026-10-24T10:35:58.0864119Z      ·                             ╰── Cannot access ref value during render
2026-10-24T10:35:58.0864200Z  495 │         </ReanimatedSwipeable>
2026-10-24T10:35:58.0864250Z      ╰────
2026-10-24T10:35:58.0864726Z   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-24T10:35:58.0865026Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0865028Z
2026-10-24T10:35:58.0865356Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0865537Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:7]
2026-10-24T10:35:58.0865593Z  324 │   };
2026-10-24T10:35:58.0865659Z  325 │   useEffect(() => {
2026-10-24T10:35:58.0865733Z      ·   ────┬────
2026-10-24T10:35:58.0865864Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0865964Z  326 │     if (!guidesEnabled && section === "guide") {
2026-10-24T10:35:58.0866059Z  327 │       requestedSection.current = "overview";
2026-10-24T10:35:58.0866233Z  328 │       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-24T10:35:58.0866307Z  329 │       setSection("overview");
2026-10-24T10:35:58.0866384Z      ·       ─────┬────
2026-10-24T10:35:58.0866553Z      ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0866614Z  330 │     }
2026-10-24T10:35:58.0866667Z      ╰────
2026-10-24T10:35:58.0867270Z   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-24T10:35:58.0867601Z   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-24T10:35:58.0867603Z
2026-10-24T10:35:58.0867813Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T10:35:58.0867990Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:331:6]
2026-10-24T10:35:58.0868168Z  326 │     if (!guidesEnabled && section === "guide") {
2026-10-24T10:35:58.0868300Z  327 │       requestedSection.current = "overview";
2026-10-24T10:35:58.0868382Z      ·       ────────┬───────
2026-10-24T10:35:58.0868832Z      ·               ╰── Missing dependency `requestedSection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T10:35:58.0868995Z  328 │       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-24T10:35:58.0869143Z      ·       ─────────┬─────────           ──────┬──────
2026-10-24T10:35:58.0869663Z      ·                │                          ╰── Missing dependency `scrollOffsets`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T10:35:58.0870126Z      ·                ╰── Missing dependency `currentScrollOffset`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T10:35:58.0870201Z  329 │       setSection("overview");
2026-10-24T10:35:58.0870255Z  330 │     }
2026-10-24T10:35:58.0870348Z  331 │   }, [guidesEnabled, section, insets.top]);
2026-10-24T10:35:58.0870458Z      ·      ──────────────────┬─────────────────
2026-10-24T10:35:58.0870656Z      ·                        ╰── This dependency list is missing values used by the callback
2026-10-24T10:35:58.0870744Z  332 │   const tabContent = activityContent;
2026-10-24T10:35:58.0870804Z      ╰────
2026-10-24T10:35:58.0870975Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T10:35:58.0871325Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0871328Z
2026-10-24T10:35:58.0871536Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T10:35:58.0871710Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:868:6]
2026-10-24T10:35:58.0871767Z  851 │     if (
2026-10-24T10:35:58.0871884Z  852 │       lastSelection.current.path === route.params.path &&
2026-10-24T10:35:58.0871964Z      ·       ──────┬──────
2026-10-24T10:35:58.0872416Z      ·             ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T10:35:58.0872546Z  853 │       lastSelection.current.id === route.params.fileSelectionId
2026-10-24T10:35:58.0872601Z  854 │     )
2026-10-24T10:35:58.0872663Z  855 │       return;
2026-10-24T10:35:58.0872844Z  856 │     lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
2026-10-24T10:35:58.0872981Z  857 │     if (route.params.focus) navigation.setParams({ focus: undefined });
2026-10-24T10:35:58.0873067Z  858 │     setJumpPath(route.params.path);
2026-10-24T10:35:58.0873140Z  859 │     setSelectedRowId(null);
2026-10-24T10:35:58.0873221Z  860 │     jumpStarted.current = false;
2026-10-24T10:35:58.0873440Z  861 │     const file = data.files.find((entry) => entry.path === route.params.path);
2026-10-24T10:35:58.0873564Z  862 │     if (!file || !nativeView.current) return;
2026-10-24T10:35:58.0873654Z      ·                   ─────┬────
2026-10-24T10:35:58.0874098Z      ·                        ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T10:35:58.0874227Z  863 │     setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
2026-10-24T10:35:58.0874305Z  864 │     jumpStarted.current = true;
2026-10-24T10:35:58.0874442Z  865 │     void nativeView.current.scrollToFile(file.id, false).catch(() => {
2026-10-24T10:35:58.0874524Z  866 │       jumpStarted.current = false;
2026-10-24T10:35:58.0874581Z  867 │     });
2026-10-24T10:35:58.0874785Z  868 │   }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
2026-10-24T10:35:58.0874990Z      ·      ──────────────────────────────────────────────┬──────────────────────────────────────────────
2026-10-24T10:35:58.0875215Z      ·                                                    ╰── This dependency list is missing values used by the callback
2026-10-24T10:35:58.0875327Z  869 │   const appliedFilter = useRef(filter.hideTestFiles);
2026-10-24T10:35:58.0875380Z      ╰────
2026-10-24T10:35:58.0875548Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T10:35:58.0875870Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0875872Z
2026-10-24T10:35:58.0876140Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0876297Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:523:5]
2026-10-24T10:35:58.0877971Z  521 │   }, []);
2026-10-24T10:35:58.0878048Z  522 │   useEffect(() => {
2026-10-24T10:35:58.0878123Z      ·   ────┬────
2026-10-24T10:35:58.0878259Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0878344Z  523 │     setKeyboardStateSuspect(false);
2026-10-24T10:35:58.0878435Z      ·     ───────────┬───────────
2026-10-24T10:35:58.0878608Z      ·                ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0878710Z  524 │   }, [isKeyboardVisible, liveKeyboardHeight]);
2026-10-24T10:35:58.0878760Z      ╰────
2026-10-24T10:35:58.0879369Z   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-24T10:35:58.0879702Z   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-24T10:35:58.0879704Z
2026-10-24T10:35:58.0879965Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0880118Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:888:7]
2026-10-24T10:35:58.0880276Z  885 │   const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
2026-10-24T10:35:58.0880426Z  886 │   useEffect(() => {
2026-10-24T10:35:58.0880528Z      ·   ────┬────
2026-10-24T10:35:58.0880656Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0880817Z  887 │     if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
2026-10-24T10:35:58.0880930Z  888 │       setLastKnownKeyboardHeight(liveKeyboardHeight);
2026-10-24T10:35:58.0881028Z      ·       ─────────────┬────────────
2026-10-24T10:35:58.0881235Z      ·                    ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0881288Z  889 │     }
2026-10-24T10:35:58.0881338Z      ╰────
2026-10-24T10:35:58.0881958Z   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-24T10:35:58.0882294Z   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-24T10:35:58.0882296Z
2026-10-24T10:35:58.0882554Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0882708Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1135:5]
2026-10-24T10:35:58.0882762Z  1133 │
2026-10-24T10:35:58.0882828Z  1134 │   useEffect(() => {
2026-10-24T10:35:58.0882900Z       ·   ────┬────
2026-10-24T10:35:58.0883036Z       ·       ╰── This is the containing effect
2026-10-24T10:35:58.0883115Z  1135 │     setAnchorMessageId(null);
2026-10-24T10:35:58.0883200Z       ·     ─────────┬────────
2026-10-24T10:35:58.0883375Z       ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0883455Z  1136 │     setSubmittedMessageId(null);
2026-10-24T10:35:58.0883506Z       ╰────
2026-10-24T10:35:58.0884102Z   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-24T10:35:58.0884500Z   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-24T10:35:58.0884538Z
2026-10-24T10:35:58.0884743Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0884895Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:524:7]
2026-10-24T10:35:58.0884979Z  523 │     setKeyboardStateSuspect(false);
2026-10-24T10:35:58.0885078Z  524 │   }, [isKeyboardVisible, liveKeyboardHeight]);
2026-10-24T10:35:58.0885217Z      ·       ────────┬────────  ─────────┬────────
2026-10-24T10:35:58.0885430Z      ·               │                   ╰── Unnecessary dependency `liveKeyboardHeight`
2026-10-24T10:35:58.0885591Z      ·               ╰── Unnecessary dependency `isKeyboardVisible`
2026-10-24T10:35:58.0885727Z  525 │   const handleOwnedInputFocusChange = (focused: boolean) => {
2026-10-24T10:35:58.0885781Z      ╰────
2026-10-24T10:35:58.0886076Z   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-24T10:35:58.0886389Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0886392Z
2026-10-24T10:35:58.0886597Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0886752Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1083:7]
2026-10-24T10:35:58.0886838Z  1082 │     userInputInsetProgress.set(1);
2026-10-24T10:35:58.0887002Z  1083 │   }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
2026-10-24T10:35:58.0887104Z       ·       ────────────┬───────────
2026-10-24T10:35:58.0887290Z       ·                   ╰── Unnecessary dependency `activeUserInputRequestId`
2026-10-24T10:35:58.0887398Z  1084 │   const showContent = props.showContent ?? true;
2026-10-24T10:35:58.0887448Z       ╰────
2026-10-24T10:35:58.0887746Z   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-24T10:35:58.0888063Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0888065Z
2026-10-24T10:35:58.0888267Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0888430Z       ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1141:15]
2026-10-24T10:35:58.0888500Z  1140 │     freeze.set(false);
2026-10-24T10:35:58.0888581Z  1141 │   }, [freeze, selectedThreadKey]);
2026-10-24T10:35:58.0888675Z       ·               ────────┬────────
2026-10-24T10:35:58.0888840Z       ·                       ╰── Unnecessary dependency `selectedThreadKey`
2026-10-24T10:35:58.0888892Z  1142 │
2026-10-24T10:35:58.0888943Z       ╰────
2026-10-24T10:35:58.0889234Z   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-24T10:35:58.0889549Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0889552Z
2026-10-24T10:35:58.0889784Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0889973Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:971:5]
2026-10-24T10:35:58.0890084Z  966 │   const composerPopoverHeight = useSharedValue(0);
2026-10-24T10:35:58.0890189Z  967 │   const floatingControlCoverage = useSharedValue(
2026-10-24T10:35:58.0890283Z      ·         ───────────┬───────────
2026-10-24T10:35:58.0890447Z      ·                    ╰── `floatingControlCoverage` originates here
2026-10-24T10:35:58.0890573Z  968 │     showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
2026-10-24T10:35:58.0890627Z  969 │   );
2026-10-24T10:35:58.0890691Z  970 │   useEffect(() => {
2026-10-24T10:35:58.0890793Z  971 │     floatingControlCoverage.value = withTiming(
2026-10-24T10:35:58.0890890Z      ·     ───────────┬───────────
2026-10-24T10:35:58.0891055Z      ·                ╰── `floatingControlCoverage` cannot be modified
2026-10-24T10:35:58.0891211Z  972 │       showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
2026-10-24T10:35:58.0891261Z      ╰────
2026-10-24T10:35:58.0891528Z   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-24T10:35:58.0891841Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0891843Z
2026-10-24T10:35:58.0892002Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0892158Z      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:989:7]
2026-10-24T10:35:58.0892349Z  979 │   const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
2026-10-24T10:35:58.0892472Z  980 │   const combinedContentInsetEndAdjustment = useSharedValue(
2026-10-24T10:35:58.0892581Z      ·         ────────────────┬────────────────
2026-10-24T10:35:58.0892770Z      ·                         ╰── `combinedContentInsetEndAdjustment` originates here
2026-10-24T10:35:58.0892897Z  981 │     Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
2026-10-24T10:35:58.0892951Z  982 │   );
2026-10-24T10:35:58.0893021Z  983 │   useAnimatedReaction(
2026-10-24T10:35:58.0893077Z  984 │     () =>
2026-10-24T10:35:58.0893168Z  985 │       contentInsetEndAdjustment.value +
2026-10-24T10:35:58.0893255Z  986 │       floatingControlCoverage.value +
2026-10-24T10:35:58.0893459Z  987 │       (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
2026-10-24T10:35:58.0893524Z  988 │     (value) => {
2026-10-24T10:35:58.0893637Z  989 │       combinedContentInsetEndAdjustment.value = value;
2026-10-24T10:35:58.0893746Z      ·       ────────────────┬────────────────
2026-10-24T10:35:58.0893940Z      ·                       ╰── `combinedContentInsetEndAdjustment` cannot be modified
2026-10-24T10:35:58.0893995Z  990 │     },
2026-10-24T10:35:58.0894045Z      ╰────
2026-10-24T10:35:58.0894310Z   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-24T10:35:58.0894623Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0894625Z
2026-10-24T10:35:58.0894903Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0895067Z      ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:25]
2026-10-24T10:35:58.0895198Z  532 │     // range) the boundary string is identical and the chain would die.
2026-10-24T10:35:58.0895288Z  533 │   }, [nextSnoozeWakeAt, snoozeWakeTick]);
2026-10-24T10:35:58.0895389Z      ·                         ───────┬──────
2026-10-24T10:35:58.0895556Z      ·                                ╰── Unnecessary dependency `snoozeWakeTick`
2026-10-24T10:35:58.0895696Z  534 │   const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase();
2026-10-24T10:35:58.0895746Z      ╰────
2026-10-24T10:35:58.0896053Z   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-24T10:35:58.0896371Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0896373Z
2026-10-24T10:35:58.0896544Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.0896671Z      ╭─[apps/mobile/src/features/home/HomeScreen.tsx:524:53]
2026-10-24T10:35:58.0896758Z  523 │     if (Number.isNaN(wakeAtMs)) return;
2026-10-24T10:35:58.0896915Z  524 │     const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
2026-10-24T10:35:58.0897035Z      ·                                                     ─────┬────
2026-10-24T10:35:58.0897209Z      ·                                                          ╰── Cannot call impure function
2026-10-24T10:35:58.0897291Z  525 │     const id = setTimeout(() => {
2026-10-24T10:35:58.0897340Z      ╰────
2026-10-24T10:35:58.0897632Z   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-24T10:35:58.0897939Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.0897942Z
2026-10-24T10:35:58.0898203Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0898375Z     ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
2026-10-24T10:35:58.0898426Z  76 │
2026-10-24T10:35:58.0898496Z  77 │   useEffect(() => {
2026-10-24T10:35:58.0898572Z     ·   ────┬────
2026-10-24T10:35:58.0898701Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0898829Z  78 │     const { host, code } = parsePairingUrl(connectionPairingUrl);
2026-10-24T10:35:58.0898896Z  79 │     setHostInput(host);
2026-10-24T10:35:58.0898972Z     ·     ──────┬─────
2026-10-24T10:35:58.0899139Z     ·           ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0899204Z  80 │     setCodeInput(code);
2026-10-24T10:35:58.0899255Z     ╰────
2026-10-24T10:35:58.0899928Z   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-24T10:35:58.0900292Z   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-24T10:35:58.0900294Z
2026-10-24T10:35:58.0900557Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0900727Z     ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
2026-10-24T10:35:58.0900779Z  82 │
2026-10-24T10:35:58.0900842Z  83 │   useEffect(() => {
2026-10-24T10:35:58.0900912Z     ·   ────┬────
2026-10-24T10:35:58.0901038Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0901156Z  84 │     if (routePairingUrl.length === 0) {
2026-10-24T10:35:58.0901220Z  85 │       return;
2026-10-24T10:35:58.0901276Z  86 │     }
2026-10-24T10:35:58.0901326Z  87 │
2026-10-24T10:35:58.0901442Z  88 │     const { host, code } = parsePairingUrl(routePairingUrl);
2026-10-24T10:35:58.0901507Z  89 │     setHostInput(host);
2026-10-24T10:35:58.0901582Z     ·     ──────┬─────
2026-10-24T10:35:58.0901748Z     ·           ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0901812Z  90 │     setCodeInput(code);
2026-10-24T10:35:58.0901863Z     ╰────
2026-10-24T10:35:58.0902474Z   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-24T10:35:58.0902805Z   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-24T10:35:58.0902810Z
2026-10-24T10:35:58.0903068Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0903238Z     ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
2026-10-24T10:35:58.0903289Z  92 │
2026-10-24T10:35:58.0903350Z  93 │   useEffect(() => {
2026-10-24T10:35:58.0903418Z     ·   ────┬────
2026-10-24T10:35:58.0903545Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0903628Z  94 │     if (pairingConnectionError) {
2026-10-24T10:35:58.0903698Z  95 │       setIsSubmitting(false);
2026-10-24T10:35:58.0903783Z     ·       ───────┬───────
2026-10-24T10:35:58.0903959Z     ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0904012Z  96 │     }
2026-10-24T10:35:58.0904061Z     ╰────
2026-10-24T10:35:58.0904674Z   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-24T10:35:58.0904998Z   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-24T10:35:58.0905001Z
2026-10-24T10:35:58.0905296Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0905500Z      ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27]
2026-10-24T10:35:58.0905688Z  151 │         <View ref={anchorRef} collapsable={false} className={props.className} style={props.style}>
2026-10-24T10:35:58.0905767Z  152 │           {props.children(open)}
2026-10-24T10:35:58.0905858Z      ·                           ──┬─
2026-10-24T10:35:58.0906017Z      ·                             ╰── Cannot access ref value during render
2026-10-24T10:35:58.0906078Z  153 │         </View>
2026-10-24T10:35:58.0906128Z      ╰────
2026-10-24T10:35:58.0906617Z   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-24T10:35:58.0906916Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0906919Z
2026-10-24T10:35:58.0907120Z   ⚠ react(memo-dependencies): Found missing/extra memoization dependencies
2026-10-24T10:35:58.0907271Z      ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9]
2026-10-24T10:35:58.0907353Z  139 │       if (action.id !== undefined) {
2026-10-24T10:35:58.0907431Z  140 │         props.onPressAction?.({
2026-10-24T10:35:58.0907502Z      ·         ──┬──
2026-10-24T10:35:58.0907634Z      ·           ╰── Missing dependency `props`
2026-10-24T10:35:58.0907727Z  141 │           nativeEvent: { event: action.id },
2026-10-24T10:35:58.0907883Z  142 │         } as Parameters<NonNullable<MenuComponentProps["onPressAction"]>>[0]);
2026-10-24T10:35:58.0907941Z  143 │       }
2026-10-24T10:35:58.0907994Z  144 │     },
2026-10-24T10:35:58.0908074Z  145 │     [close, props.onPressAction],
2026-10-24T10:35:58.0908166Z      ·             ─────────┬─────────
2026-10-24T10:35:58.0908386Z      ·                      ╰── Overly precise dependency `props.onPressAction`, use `props` instead
2026-10-24T10:35:58.0908438Z  146 │   );
2026-10-24T10:35:58.0908488Z      ╰────
2026-10-24T10:35:58.0908970Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI. Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-24T10:35:58.0909358Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0909398Z
2026-10-24T10:35:58.0909554Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0909710Z     ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
2026-10-24T10:35:58.0909805Z  53 │ function usePulseAnimation(pulse: boolean) {
2026-10-24T10:35:58.0909896Z  54 │   const pulseProgress = useSharedValue(0);
2026-10-24T10:35:58.0909978Z     ·         ──────┬──────
2026-10-24T10:35:58.0910117Z     ·               ╰── `pulseProgress` originates here
2026-10-24T10:35:58.0910169Z  55 │
2026-10-24T10:35:58.0910232Z  56 │   useEffect(() => {
2026-10-24T10:35:58.0910293Z  57 │     if (pulse) {
2026-10-24T10:35:58.0910379Z  58 │       pulseProgress.value = withRepeat(
2026-10-24T10:35:58.0910464Z     ·       ──────┬──────
2026-10-24T10:35:58.0910613Z     ·             ╰── `pulseProgress` cannot be modified
2026-10-24T10:35:58.0910679Z  59 │         withTiming(1, {
2026-10-24T10:35:58.0910729Z     ╰────
2026-10-24T10:35:58.0911000Z   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-24T10:35:58.0911339Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0911342Z
2026-10-24T10:35:58.0911538Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T10:35:58.0911714Z     ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15]
2026-10-24T10:35:58.0911778Z  87 │             <li
2026-10-24T10:35:58.0911865Z  88 │               key={`${index}:${check.name}`}
2026-10-24T10:35:58.0911975Z     ·               ──────────────────────────────
2026-10-24T10:35:58.0912123Z  89 │               className="col-span-full grid grid-cols-subgrid items-center text-xs"
2026-10-24T10:35:58.0912174Z     ╰────
2026-10-24T10:35:58.0912320Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T10:35:58.0912322Z
2026-10-24T10:35:58.0912581Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0912730Z     ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
2026-10-24T10:35:58.0912781Z  55 │
2026-10-24T10:35:58.0912845Z  56 │   useEffect(() => {
2026-10-24T10:35:58.0912921Z     ·   ────┬────
2026-10-24T10:35:58.0913053Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0913120Z  57 │     setDecodedSize(null);
2026-10-24T10:35:58.0913197Z     ·     ───────┬──────
2026-10-24T10:35:58.0913364Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0913432Z  58 │   }, [props.sourceKey]);
2026-10-24T10:35:58.0913482Z     ╰────
2026-10-24T10:35:58.0914099Z   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-24T10:35:58.0914498Z   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-24T10:35:58.0914531Z
2026-10-24T10:35:58.0914790Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0914937Z     ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
2026-10-24T10:35:58.0914989Z  59 │
2026-10-24T10:35:58.0915051Z  60 │   useEffect(() => {
2026-10-24T10:35:58.0915119Z     ·   ────┬────
2026-10-24T10:35:58.0915244Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0915310Z  61 │     setFailedUri(null);
2026-10-24T10:35:58.0915384Z     ·     ──────┬─────
2026-10-24T10:35:58.0915556Z     ·           ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0915622Z  62 │   }, [props.uri]);
2026-10-24T10:35:58.0915672Z     ╰────
2026-10-24T10:35:58.0916282Z   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-24T10:35:58.0916609Z   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-24T10:35:58.0916611Z
2026-10-24T10:35:58.0916829Z   ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
2026-10-24T10:35:58.0916983Z    ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
2026-10-24T10:35:58.0917112Z  6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg";
2026-10-24T10:35:58.0917295Z  7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
2026-10-24T10:35:58.0917382Z    ·          ────────┬────────
2026-10-24T10:35:58.0917533Z    ·                  ╰── 'ActivityIndicator' is imported here
2026-10-24T10:35:58.0917584Z  8 │
2026-10-24T10:35:58.0917634Z    ╰────
2026-10-24T10:35:58.0917731Z   help: Consider removing this import.
2026-10-24T10:35:58.0917734Z
2026-10-24T10:35:58.0917938Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0918089Z     ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
2026-10-24T10:35:58.0918162Z  57 │     setDecodedSize(null);
2026-10-24T10:35:58.0918233Z  58 │   }, [props.sourceKey]);
2026-10-24T10:35:58.0918312Z     ·       ───────┬───────
2026-10-24T10:35:58.0918468Z     ·              ╰── Unnecessary dependency `props.sourceKey`
2026-10-24T10:35:58.0918519Z  59 │
2026-10-24T10:35:58.0918568Z     ╰────
2026-10-24T10:35:58.0918866Z   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-24T10:35:58.0919185Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0919187Z
2026-10-24T10:35:58.0919392Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0919609Z     ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
2026-10-24T10:35:58.0919718Z  61 │     setFailedUri(null);
2026-10-24T10:35:58.0919780Z  62 │   }, [props.uri]);
2026-10-24T10:35:58.0919852Z     ·       ────┬────
2026-10-24T10:35:58.0919994Z     ·           ╰── Unnecessary dependency `props.uri`
2026-10-24T10:35:58.0920043Z  63 │
2026-10-24T10:35:58.0920093Z     ╰────
2026-10-24T10:35:58.0920385Z   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-24T10:35:58.0920700Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0920703Z
2026-10-24T10:35:58.0920966Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0921155Z     ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
2026-10-24T10:35:58.0921268Z  37 │   const [initialized, setInitialized] = useState(false);
2026-10-24T10:35:58.0921335Z  38 │   useLayoutEffect(() => {
2026-10-24T10:35:58.0921412Z     ·   ───────┬───────
2026-10-24T10:35:58.0921541Z     ·          ╰── This is the containing effect
2026-10-24T10:35:58.0921601Z  39 │     reset();
2026-10-24T10:35:58.0921667Z  40 │     setInitialized(true);
2026-10-24T10:35:58.0921742Z     ·     ───────┬──────
2026-10-24T10:35:58.0921909Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0921976Z  41 │   }, [reset]);
2026-10-24T10:35:58.0922030Z     ╰────
2026-10-24T10:35:58.0922644Z   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-24T10:35:58.0922973Z   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-24T10:35:58.0922975Z
2026-10-24T10:35:58.0923234Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0923395Z     ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5]
2026-10-24T10:35:58.0923449Z  88 │
2026-10-24T10:35:58.0923514Z  89 │   useEffect(() => {
2026-10-24T10:35:58.0923580Z     ·   ────┬────
2026-10-24T10:35:58.0923707Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0923869Z  90 │     if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
2026-10-24T10:35:58.0923971Z  91 │     const branchName = initialProjectRef.branch;
2026-10-24T10:35:58.0924035Z  92 │     let active = true;
2026-10-24T10:35:58.0924130Z  93 │     setPendingCheckouts((count) => count + 1);
2026-10-24T10:35:58.0924213Z     ·     ─────────┬─────────
2026-10-24T10:35:58.0924384Z     ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0924538Z  94 │     // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
2026-10-24T10:35:58.0924659Z     ╰────
2026-10-24T10:35:58.0925299Z   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-24T10:35:58.0925629Z   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-24T10:35:58.0925631Z
2026-10-24T10:35:58.0925839Z   ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
2026-10-24T10:35:58.0925961Z     ╭─[apps/web/src/contextMenuFallback.test.ts:38:9]
2026-10-24T10:35:58.0926027Z  37 │   get isConnected() {
2026-10-24T10:35:58.0926122Z  38 │     let current: FakeElement | null = this;
2026-10-24T10:35:58.0926195Z     ·         ───────
2026-10-24T10:35:58.0926266Z  39 │     while (current?.parent) {
2026-10-24T10:35:58.0926318Z     ╰────
2026-10-24T10:35:58.0926601Z   help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
2026-10-24T10:35:58.0926603Z
2026-10-24T10:35:58.0926761Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0926919Z      ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
2026-10-24T10:35:58.0926973Z   86 │
2026-10-24T10:35:58.0927065Z   87 │   const cardCoverage = props.cardCoverage;
2026-10-24T10:35:58.0927145Z      ·         ──────┬─────
2026-10-24T10:35:58.0927288Z      ·               ╰── `cardCoverage` originates here
2026-10-24T10:35:58.0927371Z   88 │   const barHeightRef = useRef(0);
2026-10-24T10:35:58.0927449Z   89 │   const cardHeightRef = useRef(0);
2026-10-24T10:35:58.0927535Z   90 │   const cardHeight = useSharedValue(0);
2026-10-24T10:35:58.0927626Z   91 │   const notifyCoverage = useCallback(() => {
2026-10-24T10:35:58.0927692Z   92 │     if (!cardCoverage) {
2026-10-24T10:35:58.0927751Z   93 │       return;
2026-10-24T10:35:58.0927804Z   94 │     }
2026-10-24T10:35:58.0927953Z   95 │     const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-24T10:35:58.0928039Z   96 │     if (coverage === cardCoverage.value) {
2026-10-24T10:35:58.0928097Z   97 │       return;
2026-10-24T10:35:58.0928151Z   98 │     }
2026-10-24T10:35:58.0928230Z   99 │     if (cardCoverage.value === 0) {
2026-10-24T10:35:58.0928312Z  100 │       cardCoverage.value = coverage;
2026-10-24T10:35:58.0928394Z      ·       ──────┬─────
2026-10-24T10:35:58.0928539Z      ·             ╰── `cardCoverage` cannot be modified
2026-10-24T10:35:58.0928597Z  101 │       return;
2026-10-24T10:35:58.0928649Z      ╰────
2026-10-24T10:35:58.0928951Z   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-24T10:35:58.0929267Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0929270Z
2026-10-24T10:35:58.0929424Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0929581Z      ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
2026-10-24T10:35:58.0929731Z   89 │   const cardHeightRef = useRef(0);
2026-10-24T10:35:58.0929849Z   90 │   const cardHeight = useSharedValue(0);
2026-10-24T10:35:58.0929925Z      ·         ─────┬────
2026-10-24T10:35:58.0930060Z      ·              ╰── `cardHeight` originates here
2026-10-24T10:35:58.0930154Z   91 │   const notifyCoverage = useCallback(() => {
2026-10-24T10:35:58.0930220Z   92 │     if (!cardCoverage) {
2026-10-24T10:35:58.0930277Z   93 │       return;
2026-10-24T10:35:58.0930329Z   94 │     }
2026-10-24T10:35:58.0930478Z   95 │     const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-24T10:35:58.0930565Z   96 │     if (coverage === cardCoverage.value) {
2026-10-24T10:35:58.0930621Z   97 │       return;
2026-10-24T10:35:58.0930673Z   98 │     }
2026-10-24T10:35:58.0930758Z   99 │     if (cardCoverage.value === 0) {
2026-10-24T10:35:58.0930842Z  100 │       cardCoverage.value = coverage;
2026-10-24T10:35:58.0930898Z  101 │       return;
2026-10-24T10:35:58.0930950Z  102 │     }
2026-10-24T10:35:58.0931051Z  103 │     cardCoverage.value = withTiming(coverage, {
2026-10-24T10:35:58.0931173Z  104 │       duration: USER_INPUT_TOGGLE_DURATION_MS,
2026-10-24T10:35:58.0931258Z  105 │       easing: Easing.out(Easing.cubic),
2026-10-24T10:35:58.0931313Z  106 │     });
2026-10-24T10:35:58.0931378Z  107 │   }, [cardCoverage]);
2026-10-24T10:35:58.0931461Z  108 │   const handleBarLayout = useCallback(
2026-10-24T10:35:58.0931541Z  109 │     (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0931667Z  110 │       barHeightRef.current = event.nativeEvent.layout.height;
2026-10-24T10:35:58.0931734Z  111 │       notifyCoverage();
2026-10-24T10:35:58.0931787Z  112 │     },
2026-10-24T10:35:58.0931859Z  113 │     [notifyCoverage],
2026-10-24T10:35:58.0931914Z  114 │   );
2026-10-24T10:35:58.0931997Z  115 │   const handleCardLayout = useCallback(
2026-10-24T10:35:58.0932076Z  116 │     (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0932201Z  117 │       cardHeightRef.current = event.nativeEvent.layout.height;
2026-10-24T10:35:58.0932314Z  118 │       cardHeight.value = event.nativeEvent.layout.height;
2026-10-24T10:35:58.0932392Z      ·       ─────┬────
2026-10-24T10:35:58.0932531Z      ·            ╰── `cardHeight` cannot be modified
2026-10-24T10:35:58.0932597Z  119 │       notifyCoverage();
2026-10-24T10:35:58.0932648Z      ╰────
2026-10-24T10:35:58.0932919Z   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-24T10:35:58.0933301Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0933339Z
2026-10-24T10:35:58.0933545Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T10:35:58.0933702Z      ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
2026-10-24T10:35:58.0933788Z   90 │   const cardHeight = useSharedValue(0);
2026-10-24T10:35:58.0933881Z   91 │   const notifyCoverage = useCallback(() => {
2026-10-24T10:35:58.0933985Z      ·                                      ───┬───
2026-10-24T10:35:58.0934228Z      ·                                         ╰── This function may (indirectly) reassign or modify `cardCoverage` after render
2026-10-24T10:35:58.0934294Z   92 │     if (!cardCoverage) {
2026-10-24T10:35:58.0934358Z   93 │       return;
2026-10-24T10:35:58.0934412Z   94 │     }
2026-10-24T10:35:58.0934561Z   95 │     const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
2026-10-24T10:35:58.0934646Z   96 │     if (coverage === cardCoverage.value) {
2026-10-24T10:35:58.0934703Z   97 │       return;
2026-10-24T10:35:58.0934756Z   98 │     }
2026-10-24T10:35:58.0934835Z   99 │     if (cardCoverage.value === 0) {
2026-10-24T10:35:58.0934917Z  100 │       cardCoverage.value = coverage;
2026-10-24T10:35:58.0934993Z      ·       ──────┬─────
2026-10-24T10:35:58.0935130Z      ·             ╰── This modifies `cardCoverage`
2026-10-24T10:35:58.0935189Z  101 │       return;
2026-10-24T10:35:58.0935240Z      ╰────
2026-10-24T10:35:58.0935595Z   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-24T10:35:58.0935910Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0935912Z
2026-10-24T10:35:58.0936115Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T10:35:58.0936271Z      ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
2026-10-24T10:35:58.0936351Z   99 │     if (cardCoverage.value === 0) {
2026-10-24T10:35:58.0936430Z  100 │       cardCoverage.value = coverage;
2026-10-24T10:35:58.0936507Z      ·       ──────┬─────
2026-10-24T10:35:58.0936641Z      ·             ╰── This modifies `cardCoverage`
2026-10-24T10:35:58.0936699Z  101 │       return;
2026-10-24T10:35:58.0936756Z  102 │     }
2026-10-24T10:35:58.0936860Z  103 │     cardCoverage.value = withTiming(coverage, {
2026-10-24T10:35:58.0936957Z  104 │       duration: USER_INPUT_TOGGLE_DURATION_MS,
2026-10-24T10:35:58.0937041Z  105 │       easing: Easing.out(Easing.cubic),
2026-10-24T10:35:58.0937096Z  106 │     });
2026-10-24T10:35:58.0937161Z  107 │   }, [cardCoverage]);
2026-10-24T10:35:58.0937243Z  108 │   const handleBarLayout = useCallback(
2026-10-24T10:35:58.0937321Z  109 │     (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0937427Z      ·     ───────────────┬───────────────
2026-10-24T10:35:58.0937654Z      ·                    ╰── This function may (indirectly) reassign or modify `cardCoverage` after render
2026-10-24T10:35:58.0937779Z  110 │       barHeightRef.current = event.nativeEvent.layout.height;
2026-10-24T10:35:58.0937828Z      ╰────
2026-10-24T10:35:58.0938251Z   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-24T10:35:58.0938597Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0938600Z
2026-10-24T10:35:58.0938803Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T10:35:58.0938959Z      ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
2026-10-24T10:35:58.0939043Z  115 │   const handleCardLayout = useCallback(
2026-10-24T10:35:58.0939124Z  116 │     (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0939227Z      ·     ───────────────┬───────────────
2026-10-24T10:35:58.0939456Z      ·                    ╰── This function may (indirectly) reassign or modify `cardHeight` after render
2026-10-24T10:35:58.0939584Z  117 │       cardHeightRef.current = event.nativeEvent.layout.height;
2026-10-24T10:35:58.0939700Z  118 │       cardHeight.value = event.nativeEvent.layout.height;
2026-10-24T10:35:58.0939775Z      ·       ─────┬────
2026-10-24T10:35:58.0939905Z      ·            ╰── This modifies `cardHeight`
2026-10-24T10:35:58.0939971Z  119 │       notifyCoverage();
2026-10-24T10:35:58.0940023Z      ╰────
2026-10-24T10:35:58.0940358Z   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-24T10:35:58.0940675Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0940680Z
2026-10-24T10:35:58.0940940Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0941116Z     ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40]
2026-10-24T10:35:58.0941280Z  28 │   const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live);
2026-10-24T10:35:58.0941344Z  29 │   useEffect(() => {
2026-10-24T10:35:58.0941414Z     ·   ────┬────
2026-10-24T10:35:58.0941542Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0941667Z  30 │     if (snapshot && snapshot !== live) setHeld({ key, snapshot });
2026-10-24T10:35:58.0941771Z     ·                                        ───┬───
2026-10-24T10:35:58.0941969Z     ·                                           ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0942043Z  31 │   }, [key, live, snapshot]);
2026-10-24T10:35:58.0942093Z     ╰────
2026-10-24T10:35:58.0942708Z   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-24T10:35:58.0943037Z   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-24T10:35:58.0943040Z
2026-10-24T10:35:58.0943397Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T10:35:58.0943600Z     ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
2026-10-24T10:35:58.0943689Z  35 │       <T3SourceTextRunNativeComponent
2026-10-24T10:35:58.0943752Z  36 │         key={index}
2026-10-24T10:35:58.0943829Z     ·         ───────────
2026-10-24T10:35:58.0943902Z  37 │         style={flattenedStyle}
2026-10-24T10:35:58.0943952Z     ╰────
2026-10-24T10:35:58.0944097Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T10:35:58.0944100Z
2026-10-24T10:35:58.0944246Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.0944361Z     ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36]
2026-10-24T10:35:58.0944550Z  53 │         const child = children as ReactElement<Pick<PressableProps, "onTouchStart" | "onPress">>;
2026-10-24T10:35:58.0944727Z  54 │ ╭─▶     children = cloneElement(child, {
2026-10-24T10:35:58.0944831Z  55 │ │         onTouchStart: (event) => {
2026-10-24T10:35:58.0944992Z  56 │ │           // Reset for a new touch, not onPressIn, which also fires when a
2026-10-24T10:35:58.0945150Z  57 │ │           // finger moves out of the row and back during the same gesture.
2026-10-24T10:35:58.0945344Z  58 │ │           menuPress.current.isPreparing = false;
2026-10-24T10:35:58.0945513Z  59 │ │           menuPress.current.suppressPress = menuPress.current.isOpen;
2026-10-24T10:35:58.0945626Z  60 │ │           pendingPress.current = null;
2026-10-24T10:35:58.0945746Z  61 │ │           child.props.onTouchStart?.(event);
2026-10-24T10:35:58.0945828Z  62 │ │         },
2026-10-24T10:35:58.0945933Z  63 │ │         onPress: (event) => {
2026-10-24T10:35:58.0946104Z  64 │ │           // Accessibility clicks have no touch identifier and must not inherit
2026-10-24T10:35:58.0946240Z  65 │ │           // cancellation from a previous physical gesture.
2026-10-24T10:35:58.0946407Z  66 │ │           const isTouch = typeof event.nativeEvent.identifier === "number";
2026-10-24T10:35:58.0946600Z  67 │ │           if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) {
2026-10-24T10:35:58.0946686Z  68 │ │             return;
2026-10-24T10:35:58.0946762Z  69 │ │           }
2026-10-24T10:35:58.0946901Z  70 │ │           if (isTouch && menuPress.current.isPreparing) {
2026-10-24T10:35:58.0947079Z  71 │ │             // A release can arrive between native menu preparation and display.
2026-10-24T10:35:58.0947249Z  72 │ │             // Let UIKit's display/cancel callback decide this press's outcome.
2026-10-24T10:35:58.0947349Z  73 │ │             event.persist();
2026-10-24T10:35:58.0947510Z  74 │ │             pendingPress.current = () => child.props.onPress?.(event);
2026-10-24T10:35:58.0947596Z  75 │ │             return;
2026-10-24T10:35:58.0947671Z  76 │ │           }
2026-10-24T10:35:58.0947783Z  77 │ │           child.props.onPress?.(event);
2026-10-24T10:35:58.0947858Z  78 │ │         },
2026-10-24T10:35:58.0947987Z  79 │ ├─▶     });
2026-10-24T10:35:58.0948305Z     · ╰──── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.0948449Z  80 │         menuProps.onMenuInteractionStart = () => {
2026-10-24T10:35:58.0948501Z     ╰────
2026-10-24T10:35:58.0948972Z   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-24T10:35:58.0949265Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.0949267Z
2026-10-24T10:35:58.0949425Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0949595Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
2026-10-24T10:35:58.0949652Z  107 │   );
2026-10-24T10:35:58.0949805Z  108 │   const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
2026-10-24T10:35:58.0949894Z      ·         ─────────┬────────
2026-10-24T10:35:58.0950048Z      ·                  ╰── `separationProgress` originates here
2026-10-24T10:35:58.0950101Z  109 │
2026-10-24T10:35:58.0950166Z  110 │   useEffect(() => {
2026-10-24T10:35:58.0950340Z  111 │     separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
2026-10-24T10:35:58.0950423Z      ·     ─────────┬────────
2026-10-24T10:35:58.0950578Z      ·              ╰── `separationProgress` cannot be modified
2026-10-24T10:35:58.0950693Z  112 │   }, [props.showScrollToEnd, separationProgress]);
2026-10-24T10:35:58.0950747Z      ╰────
2026-10-24T10:35:58.0951018Z   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-24T10:35:58.0951350Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0951353Z
2026-10-24T10:35:58.0951509Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0951674Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
2026-10-24T10:35:58.0951786Z  128 │   // and repeatedly retargets the animation as it grows.
2026-10-24T10:35:58.0951902Z  129 │   const capsuleWidth = useSharedValue<number | null>(null);
2026-10-24T10:35:58.0951988Z      ·         ──────┬─────
2026-10-24T10:35:58.0952128Z      ·               ╰── `capsuleWidth` originates here
2026-10-24T10:35:58.0952239Z  130 │   const measuredWidthRef = useRef<number | null>(null);
2026-10-24T10:35:58.0952354Z  131 │   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0952458Z  132 │     const width = event.nativeEvent.layout.width;
2026-10-24T10:35:58.0952555Z  133 │     if (width === measuredWidthRef.current) {
2026-10-24T10:35:58.0952614Z  134 │       return;
2026-10-24T10:35:58.0952666Z  135 │     }
2026-10-24T10:35:58.0952772Z  136 │     const first = measuredWidthRef.current === null;
2026-10-24T10:35:58.0952857Z  137 │     measuredWidthRef.current = width;
2026-10-24T10:35:58.0952999Z  138 │     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T10:35:58.0953074Z      ·     ──────┬─────
2026-10-24T10:35:58.0953283Z      ·           ╰── `capsuleWidth` cannot be modified
2026-10-24T10:35:58.0953367Z  139 │   };
2026-10-24T10:35:58.0953416Z      ╰────
2026-10-24T10:35:58.0953686Z   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-24T10:35:58.0953997Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0953999Z
2026-10-24T10:35:58.0954155Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0954317Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-24T10:35:58.0954427Z  128 │   // and repeatedly retargets the animation as it grows.
2026-10-24T10:35:58.0954547Z  129 │   const capsuleWidth = useSharedValue<number | null>(null);
2026-10-24T10:35:58.0954627Z      ·         ──────┬─────
2026-10-24T10:35:58.0954764Z      ·               ╰── `capsuleWidth` originates here
2026-10-24T10:35:58.0954873Z  130 │   const measuredWidthRef = useRef<number | null>(null);
2026-10-24T10:35:58.0954987Z  131 │   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0955092Z  132 │     const width = event.nativeEvent.layout.width;
2026-10-24T10:35:58.0955187Z  133 │     if (width === measuredWidthRef.current) {
2026-10-24T10:35:58.0955244Z  134 │       return;
2026-10-24T10:35:58.0955297Z  135 │     }
2026-10-24T10:35:58.0955401Z  136 │     const first = measuredWidthRef.current === null;
2026-10-24T10:35:58.0955486Z  137 │     measuredWidthRef.current = width;
2026-10-24T10:35:58.0955631Z  138 │     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T10:35:58.0955686Z  139 │   };
2026-10-24T10:35:58.0955776Z  140 │   const hasStatus = props.status !== null;
2026-10-24T10:35:58.0955910Z  141 │   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-24T10:35:58.0955973Z  142 │   useEffect(() => {
2026-10-24T10:35:58.0956039Z  143 │     if (!hasStatus) {
2026-10-24T10:35:58.0956124Z  144 │       measuredWidthRef.current = null;
2026-10-24T10:35:58.0956201Z  145 │       capsuleWidth.value = null;
2026-10-24T10:35:58.0956276Z      ·       ──────┬─────
2026-10-24T10:35:58.0956419Z      ·             ╰── `capsuleWidth` cannot be modified
2026-10-24T10:35:58.0956473Z  146 │     }
2026-10-24T10:35:58.0956521Z      ╰────
2026-10-24T10:35:58.0956862Z   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-24T10:35:58.0957202Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0957204Z
2026-10-24T10:35:58.0957408Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T10:35:58.0957573Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-24T10:35:58.0957707Z  141 │   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-24T10:35:58.0957772Z  142 │   useEffect(() => {
2026-10-24T10:35:58.0957849Z      ·             ───┬───
2026-10-24T10:35:58.0958076Z      ·                ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-24T10:35:58.0958141Z  143 │     if (!hasStatus) {
2026-10-24T10:35:58.0958228Z  144 │       measuredWidthRef.current = null;
2026-10-24T10:35:58.0958304Z  145 │       capsuleWidth.value = null;
2026-10-24T10:35:58.0958381Z      ·       ──────┬─────
2026-10-24T10:35:58.0958515Z      ·             ╰── This modifies `capsuleWidth`
2026-10-24T10:35:58.0958568Z  146 │     }
2026-10-24T10:35:58.0958619Z      ╰────
2026-10-24T10:35:58.0958967Z   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-24T10:35:58.0959276Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0959280Z
2026-10-24T10:35:58.0959486Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T10:35:58.0959652Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
2026-10-24T10:35:58.0959765Z  130 │   const measuredWidthRef = useRef<number | null>(null);
2026-10-24T10:35:58.0959880Z  131 │   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T10:35:58.0960002Z      ·                             ───────────────┬───────────────
2026-10-24T10:35:58.0960248Z      ·                                            ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-24T10:35:58.0960353Z  132 │     const width = event.nativeEvent.layout.width;
2026-10-24T10:35:58.0960448Z  133 │     if (width === measuredWidthRef.current) {
2026-10-24T10:35:58.0960511Z  134 │       return;
2026-10-24T10:35:58.0960568Z  135 │     }
2026-10-24T10:35:58.0960673Z  136 │     const first = measuredWidthRef.current === null;
2026-10-24T10:35:58.0960759Z  137 │     measuredWidthRef.current = width;
2026-10-24T10:35:58.0960898Z  138 │     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T10:35:58.0960974Z      ·     ──────┬─────
2026-10-24T10:35:58.0961135Z      ·           ╰── This modifies `capsuleWidth`
2026-10-24T10:35:58.0961188Z  139 │   };
2026-10-24T10:35:58.0961237Z      ╰────
2026-10-24T10:35:58.0961577Z   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-24T10:35:58.0961959Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0961994Z
2026-10-24T10:35:58.0962150Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T10:35:58.0962297Z      ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5]
2026-10-24T10:35:58.0962442Z  170 │   const expandedAngle = props.collapsedDirection === "right" ? 90 : 180;
2026-10-24T10:35:58.0962579Z  171 │   const rotation = useSharedValue(props.expanded ? expandedAngle : 0);
2026-10-24T10:35:58.0962654Z      ·         ────┬───
2026-10-24T10:35:58.0962784Z      ·             ╰── `rotation` originates here
2026-10-24T10:35:58.0962835Z  172 │
2026-10-24T10:35:58.0962906Z  173 │   useLayoutEffect(() => {
2026-10-24T10:35:58.0963040Z  174 │     rotation.value = withTiming(props.expanded ? expandedAngle : 0, {
2026-10-24T10:35:58.0963116Z      ·     ────┬───
2026-10-24T10:35:58.0963250Z      ·         ╰── `rotation` cannot be modified
2026-10-24T10:35:58.0963349Z  175 │       duration: THREAD_DISCLOSURE_TRANSITION_MS,
2026-10-24T10:35:58.0963399Z      ╰────
2026-10-24T10:35:58.0963662Z   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-24T10:35:58.0963965Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T10:35:58.0963968Z
2026-10-24T10:35:58.0964162Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T10:35:58.0964320Z       ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23]
2026-10-24T10:35:58.0964388Z  1245 │                     <Text
2026-10-24T10:35:58.0964482Z  1246 │                       key={`${index}:${line}`}
2026-10-24T10:35:58.0964595Z       ·                       ────────────────────────
2026-10-24T10:35:58.0964671Z  1247 │                       selectable
2026-10-24T10:35:58.0964723Z       ╰────
2026-10-24T10:35:58.0964868Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T10:35:58.0964870Z
2026-10-24T10:35:58.0965131Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T10:35:58.0965273Z       ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7]
2026-10-24T10:35:58.0965326Z  3754 │
2026-10-24T10:35:58.0965535Z  3755 │ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, OpenCodeAdapterV2DriverEnv> =
2026-10-24T10:35:58.0965608Z       ·       ──┬──
2026-10-24T10:35:58.0965734Z       ·         ╰── 'layer' is declared here
2026-10-24T10:35:58.0965797Z  3756 │   Layer.effect(
2026-10-24T10:35:58.0965846Z       ╰────
2026-10-24T10:35:58.0965951Z   help: Consider removing this declaration.
2026-10-24T10:35:58.0965953Z
2026-10-24T10:35:58.0966211Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0966372Z      ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
2026-10-24T10:35:58.0966431Z  434 │       : null;
2026-10-24T10:35:58.0966496Z  435 │   useEffect(() => {
2026-10-24T10:35:58.0966566Z      ·   ────┬────
2026-10-24T10:35:58.0966767Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0966863Z  436 │     if (
2026-10-24T10:35:58.0966940Z  437 │       props.active === false ||
2026-10-24T10:35:58.0967016Z  438 │       activeDraftKey !== null ||
2026-10-24T10:35:58.0967098Z  439 │       editingPendingTask !== null ||
2026-10-24T10:35:58.0967171Z  440 │       selectedProject === null
2026-10-24T10:35:58.0967226Z  441 │     ) {
2026-10-24T10:35:58.0967285Z  442 │       return;
2026-10-24T10:35:58.0967338Z  443 │     }
2026-10-24T10:35:58.0967405Z  444 │     setActiveDraftKey(
2026-10-24T10:35:58.0967487Z      ·     ────────┬────────
2026-10-24T10:35:58.0967658Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0967729Z  445 │       createNewTaskDraft({
2026-10-24T10:35:58.0967778Z      ╰────
2026-10-24T10:35:58.0968390Z   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-24T10:35:58.0968724Z   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-24T10:35:58.0968727Z
2026-10-24T10:35:58.0968975Z   ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T10:35:58.0969141Z       ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
2026-10-24T10:35:58.0969245Z  1243 │     <ActiveNewTaskContext value={activeNewTask}>
2026-10-24T10:35:58.0969448Z  1244 │       <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
2026-10-24T10:35:58.0969562Z       ·                                    ─────────────
2026-10-24T10:35:58.0969636Z  1245 │     </ActiveNewTaskContext>
2026-10-24T10:35:58.0969687Z       ╰────
2026-10-24T10:35:58.0969913Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T10:35:58.0970051Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T10:35:58.0970053Z
2026-10-24T10:35:58.0970313Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0970477Z      ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
2026-10-24T10:35:58.0970536Z  211 │   };
2026-10-24T10:35:58.0970601Z  212 │   useEffect(() => {
2026-10-24T10:35:58.0970672Z      ·   ────┬────
2026-10-24T10:35:58.0970800Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0970976Z  213 │     const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
2026-10-24T10:35:58.0971039Z  214 │     if (inserted) {
2026-10-24T10:35:58.0971148Z  215 │       setSelection((current) =>
2026-10-24T10:35:58.0971224Z      ·       ──────┬─────
2026-10-24T10:35:58.0971393Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0971564Z  216 │         current.start === inserted.start && current.end === inserted.end ? current : inserted,
2026-10-24T10:35:58.0971614Z      ╰────
2026-10-24T10:35:58.0972302Z   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-24T10:35:58.0972670Z   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-24T10:35:58.0972672Z
2026-10-24T10:35:58.0972936Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0973101Z      ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
2026-10-24T10:35:58.0973178Z  284 │   }, [hasWorkspaceSnapshot]);
2026-10-24T10:35:58.0973240Z  285 │   useEffect(() => {
2026-10-24T10:35:58.0973315Z      ·   ────┬────
2026-10-24T10:35:58.0973445Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0973594Z  286 │     if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
2026-10-24T10:35:58.0973745Z  287 │     const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
2026-10-24T10:35:58.0973815Z  288 │     const now = Date.now();
2026-10-24T10:35:58.0973931Z  289 │     const lastRequest = workspaceRefreshKeyRef.current;
2026-10-24T10:35:58.0973988Z  290 │     if (
2026-10-24T10:35:58.0974063Z  291 │       lastRequest?.key === key &&
2026-10-24T10:35:58.0974202Z  292 │       now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
2026-10-24T10:35:58.0974255Z  293 │     )
2026-10-24T10:35:58.0974314Z  294 │       return;
2026-10-24T10:35:58.0974497Z  295 │     if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
2026-10-24T10:35:58.0974586Z  296 │       setWorkspaceRefreshRetry(null);
2026-10-24T10:35:58.0974680Z      ·       ────────────┬───────────
2026-10-24T10:35:58.0974857Z      ·                   ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0974915Z  297 │       return;
2026-10-24T10:35:58.0974967Z      ╰────
2026-10-24T10:35:58.0975584Z   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-24T10:35:58.0975919Z   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-24T10:35:58.0975925Z
2026-10-24T10:35:58.0976130Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.0976293Z      ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
2026-10-24T10:35:58.0976347Z  325 │   }, [
2026-10-24T10:35:58.0976411Z  326 │     draftMessage,
2026-10-24T10:35:58.0976487Z      ·     ──────┬─────
2026-10-24T10:35:58.0976632Z      ·           ╰── Unnecessary dependency `draftMessage`
2026-10-24T10:35:58.0976697Z  327 │     environmentId,
2026-10-24T10:35:58.0976747Z      ╰────
2026-10-24T10:35:58.0977048Z   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-24T10:35:58.0977433Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0977464Z
2026-10-24T10:35:58.0977653Z   ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
2026-10-24T10:35:58.0977828Z      ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70]
2026-10-24T10:35:58.0977909Z  554 │           assert.deepStrictEqual(
2026-10-24T10:35:58.0978075Z  555 │             (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest),
2026-10-24T10:35:58.0978197Z      ·                                                                      ┬
2026-10-24T10:35:58.0978366Z      ·                                                                      ╰── '_' is declared here
2026-10-24T10:35:58.0978427Z  556 │             [
2026-10-24T10:35:58.0978477Z      ╰────
2026-10-24T10:35:58.0978579Z   help: Consider removing this parameter.
2026-10-24T10:35:58.0978581Z
2026-10-24T10:35:58.0978770Z   ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
2026-10-24T10:35:58.0978946Z       ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70]
2026-10-24T10:35:58.0979028Z  1154 │           assert.deepStrictEqual(
2026-10-24T10:35:58.0979195Z  1155 │             (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest),
2026-10-24T10:35:58.0979318Z       ·                                                                      ┬
2026-10-24T10:35:58.0979489Z       ·                                                                      ╰── '_' is declared here
2026-10-24T10:35:58.0979553Z  1156 │             [
2026-10-24T10:35:58.0979603Z       ╰────
2026-10-24T10:35:58.0979707Z   help: Consider removing this parameter.
2026-10-24T10:35:58.0979710Z
2026-10-24T10:35:58.0979972Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0980148Z     ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
2026-10-24T10:35:58.0980198Z  58 │
2026-10-24T10:35:58.0980262Z  59 │   useEffect(() => {
2026-10-24T10:35:58.0980332Z     ·   ────┬────
2026-10-24T10:35:58.0980462Z     ·       ╰── This is the containing effect
2026-10-24T10:35:58.0980541Z  60 │     setMountedModes((current) => {
2026-10-24T10:35:58.0980620Z     ·     ───────┬───────
2026-10-24T10:35:58.0980794Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0980878Z  61 │       if (current.has(props.mode)) {
2026-10-24T10:35:58.0980928Z     ╰────
2026-10-24T10:35:58.0981576Z   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-24T10:35:58.0981904Z   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-24T10:35:58.0981906Z
2026-10-24T10:35:58.0982143Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T10:35:58.0982362Z     ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14]
2026-10-24T10:35:58.0982413Z  52 │
2026-10-24T10:35:58.0982477Z  53 │   for (const {} of [
2026-10-24T10:35:58.0982548Z     ·              ──
2026-10-24T10:35:58.0982613Z  54 │     { healthy: true },
2026-10-24T10:35:58.0982663Z     ╰────
2026-10-24T10:35:58.0982893Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T10:35:58.0982896Z
2026-10-24T10:35:58.0983116Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T10:35:58.0983291Z      ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7]
2026-10-24T10:35:58.0983369Z  248 │       mountedRef.current = false;
2026-10-24T10:35:58.0983452Z  249 │       flow.setBranchQuery("");
2026-10-24T10:35:58.0983523Z      ·       ──┬─
2026-10-24T10:35:58.0983648Z      ·         ╰── Missing dependency `flow`
2026-10-24T10:35:58.0983702Z  250 │     };
2026-10-24T10:35:58.0983774Z  251 │   }, [flow.setBranchQuery]);
2026-10-24T10:35:58.0983862Z      ·       ─────────┬─────────
2026-10-24T10:35:58.0984070Z      ·                ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead
2026-10-24T10:35:58.0984121Z  252 │
2026-10-24T10:35:58.0984171Z      ╰────
2026-10-24T10:35:58.0984601Z   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-24T10:35:58.0984928Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0984933Z
2026-10-24T10:35:58.0985102Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.0985313Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76]
2026-10-24T10:35:58.0985495Z  696 │   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
2026-10-24T10:35:58.0985663Z  697 │   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
2026-10-24T10:35:58.0985801Z      ·                                                                            ─────┬────
2026-10-24T10:35:58.0986086Z      ·                                                                                 ╰── Cannot call impure function
2026-10-24T10:35:58.0986265Z  698 │   const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
2026-10-24T10:35:58.0986316Z      ╰────
2026-10-24T10:35:58.0986608Z   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-24T10:35:58.0986910Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.0986913Z
2026-10-24T10:35:58.0987080Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.0987237Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71]
2026-10-24T10:35:58.0987316Z  717 │   const snoozePresets = useMemo(
2026-10-24T10:35:58.0987505Z  718 │     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-24T10:35:58.0987638Z      ·                                                                       ─────┬────
2026-10-24T10:35:58.0987821Z      ·                                                                            ╰── Cannot call impure function
2026-10-24T10:35:58.0987938Z  719 │     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-24T10:35:58.0987988Z      ╰────
2026-10-24T10:35:58.0988268Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.0988569Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.0988576Z
2026-10-24T10:35:58.0988762Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T10:35:58.0988918Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6]
2026-10-24T10:35:58.0989097Z  718 │     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-24T10:35:58.0989210Z  719 │     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-24T10:35:58.0989304Z      ·      ────────────┬───────────
2026-10-24T10:35:58.0989484Z      ·                  ╰── Unnecessary dependency `props.snoozePresetMinute`
2026-10-24T10:35:58.0989537Z  720 │   );
2026-10-24T10:35:58.0989586Z      ╰────
2026-10-24T10:35:58.0989907Z   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-24T10:35:58.0990223Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0990226Z
2026-10-24T10:35:58.0990407Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T10:35:58.0990561Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7]
2026-10-24T10:35:58.0990630Z  764 │       thread.pinnedAt,
2026-10-24T10:35:58.0990692Z  765 │       variant,
2026-10-24T10:35:58.0990764Z      ·       ───┬───
2026-10-24T10:35:58.0990900Z      ·          ╰── Unnecessary dependency `variant`
2026-10-24T10:35:58.0990955Z  766 │     ],
2026-10-24T10:35:58.0991005Z      ╰────
2026-10-24T10:35:58.0991420Z   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-24T10:35:58.0991776Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.0991779Z
2026-10-24T10:35:58.0991974Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T10:35:58.0992135Z       ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21]
2026-10-24T10:35:58.0992265Z  1214 │             {providerDrivers.slice(0, -1).map((driver, index) => (
2026-10-24T10:35:58.0992401Z  1215 │               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
2026-10-24T10:35:58.0992520Z       ·                     ──────────────────────────
2026-10-24T10:35:58.0992635Z  1216 │                 <ProviderIcon provider={driver} size={12} />
2026-10-24T10:35:58.0992687Z       ╰────
2026-10-24T10:35:58.0992832Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T10:35:58.0992835Z
2026-10-24T10:35:58.0993095Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0993246Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7]
2026-10-24T10:35:58.0993384Z  355 │   }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
2026-10-24T10:35:58.0993450Z  356 │   useEffect(() => {
2026-10-24T10:35:58.0993520Z      ·   ────┬────
2026-10-24T10:35:58.0993649Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0993744Z  357 │     if (!isReturningToProjectPicker) {
2026-10-24T10:35:58.0993807Z  358 │       return;
2026-10-24T10:35:58.0993860Z  359 │     }
2026-10-24T10:35:58.0993957Z  360 │     if (requestedInitialProjectAvailable) {
2026-10-24T10:35:58.0994050Z  361 │       setIsReturningToProjectPicker(false);
2026-10-24T10:35:58.0994154Z      ·       ──────────────┬──────────────
2026-10-24T10:35:58.0994330Z      ·                     ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.0994389Z  362 │       return;
2026-10-24T10:35:58.0994440Z      ╰────
2026-10-24T10:35:58.0995064Z   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-24T10:35:58.0995395Z   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-24T10:35:58.0995398Z
2026-10-24T10:35:58.0995660Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.0995813Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9]
2026-10-24T10:35:58.0995865Z  447 │
2026-10-24T10:35:58.0995929Z  448 │   useEffect(() => {
2026-10-24T10:35:58.0995999Z      ·   ────┬────
2026-10-24T10:35:58.0996127Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.0996228Z  449 │     if (props.pendingTaskId || props.draftId) {
2026-10-24T10:35:58.0996359Z  450 │       return;
2026-10-24T10:35:58.0996444Z  451 │     }
2026-10-24T10:35:58.0996589Z  452 │     if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
2026-10-24T10:35:58.0996722Z  453 │       lastInitialProjectRefRef.current = props.initialProjectRef;
2026-10-24T10:35:58.0996829Z  454 │       appliedInitialProjectKeyRef.current = null;
2026-10-24T10:35:58.0996881Z  455 │     }
2026-10-24T10:35:58.0997024Z  456 │     const initialEnvironmentId = props.initialProjectRef?.environmentId;
2026-10-24T10:35:58.0997153Z  457 │     const initialProjectId = props.initialProjectRef?.projectId;
2026-10-24T10:35:58.0997257Z  458 │     if (initialEnvironmentId && initialProjectId) {
2026-10-24T10:35:58.0997328Z  459 │       const directProject =
2026-10-24T10:35:58.0997395Z  460 │         projects.find(
2026-10-24T10:35:58.0997460Z  461 │           (project) =>
2026-10-24T10:35:58.0997643Z  462 │             project.environmentId === initialEnvironmentId && project.id === initialProjectId,
2026-10-24T10:35:58.0997705Z  463 │         ) ?? null;
2026-10-24T10:35:58.0997758Z  464 │
2026-10-24T10:35:58.0997827Z  465 │       if (directProject) {
2026-10-24T10:35:58.0997966Z  466 │         // Apply the route's project once. Re-applying on every change would
2026-10-24T10:35:58.0998102Z  467 │         // instantly revert environment/project switches made in the picker.
2026-10-24T10:35:58.0998263Z  468 │         const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
2026-10-24T10:35:58.0998402Z  469 │         if (appliedInitialProjectKeyRef.current === directProjectKey) {
2026-10-24T10:35:58.0998463Z  470 │           return;
2026-10-24T10:35:58.0998519Z  471 │         }
2026-10-24T10:35:58.0998616Z  472 │         if (props.initialProjectRef?.branch) {
2026-10-24T10:35:58.0998683Z  473 │           if (
2026-10-24T10:35:58.0998830Z  474 │             selectedProject?.environmentId !== directProject.environmentId ||
2026-10-24T10:35:58.0998929Z  475 │             selectedProject.id !== directProject.id
2026-10-24T10:35:58.0998986Z  476 │           ) {
2026-10-24T10:35:58.0999071Z  477 │             setProject(directProject);
2026-10-24T10:35:58.0999131Z  478 │             return;
2026-10-24T10:35:58.0999188Z  479 │           }
2026-10-24T10:35:58.0999270Z  480 │           if (!flow.draftKey) return;
2026-10-24T10:35:58.0999411Z  481 │           // The route completes checkout before mounting this composer. Local
2026-10-24T10:35:58.0999554Z  482 │           // mode reuses an existing worktree; worktree mode would create another.
2026-10-24T10:35:58.0999664Z  483 │           updateComposerDraftSettings(flow.draftKey, {
2026-10-24T10:35:58.0999741Z  484 │             workspaceSelection: {
2026-10-24T10:35:58.0999816Z  485 │               mode: "local",
2026-10-24T10:35:58.0999923Z  486 │               branch: props.initialProjectRef.branch,
2026-10-24T10:35:58.1000060Z  487 │               worktreePath: props.initialProjectRef.worktreePath ?? null,
2026-10-24T10:35:58.1000143Z  488 │               startFromOrigin: false,
2026-10-24T10:35:58.1000201Z  489 │             },
2026-10-24T10:35:58.1000258Z  490 │           });
2026-10-24T10:35:58.1000315Z  491 │         }
2026-10-24T10:35:58.1000443Z  492 │         appliedInitialProjectKeyRef.current = directProjectKey;
2026-10-24T10:35:58.1000501Z  493 │         if (
2026-10-24T10:35:58.1000640Z  494 │           selectedProject?.environmentId === directProject.environmentId &&
2026-10-24T10:35:58.1000740Z  495 │           selectedProject.id === directProject.id
2026-10-24T10:35:58.1000797Z  496 │         ) {
2026-10-24T10:35:58.1000859Z  497 │           return;
2026-10-24T10:35:58.1000984Z  498 │         }
2026-10-24T10:35:58.1001126Z  499 │         setProject(directProject);
2026-10-24T10:35:58.1001187Z  500 │         return;
2026-10-24T10:35:58.1001242Z  501 │       }
2026-10-24T10:35:58.1001291Z  502 │
2026-10-24T10:35:58.1001370Z  503 │       if (projects.length > 0) {
2026-10-24T10:35:58.1001467Z  504 │         setIsReturningToProjectPicker(true);
2026-10-24T10:35:58.1001574Z      ·         ──────────────┬──────────────
2026-10-24T10:35:58.1001759Z      ·                       ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.1001816Z  505 │       }
2026-10-24T10:35:58.1001868Z      ╰────
2026-10-24T10:35:58.1002489Z   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-24T10:35:58.1002823Z   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-24T10:35:58.1002826Z
2026-10-24T10:35:58.1003086Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.1003241Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5]
2026-10-24T10:35:58.1003294Z  545 │
2026-10-24T10:35:58.1003357Z  546 │   useEffect(() => {
2026-10-24T10:35:58.1003428Z      ·   ────┬────
2026-10-24T10:35:58.1003556Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.1003655Z  547 │     const shareId = props.incomingShareId;
2026-10-24T10:35:58.1003737Z  548 │     const draftKey = flow.draftKey;
2026-10-24T10:35:58.1003837Z  549 │     const destinationProject = selectedProject;
2026-10-24T10:35:58.1003981Z  550 │     const initialEnvironmentId = props.initialProjectRef?.environmentId;
2026-10-24T10:35:58.1004110Z  551 │     const initialProjectId = props.initialProjectRef?.projectId;
2026-10-24T10:35:58.1004197Z  552 │     const selectedProjectMatchesRoute =
2026-10-24T10:35:58.1004273Z  553 │       !initialEnvironmentId ||
2026-10-24T10:35:58.1004343Z  554 │       !initialProjectId ||
2026-10-24T10:35:58.1004476Z  555 │       (destinationProject?.environmentId === initialEnvironmentId &&
2026-10-24T10:35:58.1004580Z  556 │         destinationProject.id === initialProjectId);
2026-10-24T10:35:58.1004638Z  557 │     if (
2026-10-24T10:35:58.1004707Z  558 │       !shareId ||
2026-10-24T10:35:58.1004773Z  559 │       !draftKey ||
2026-10-24T10:35:58.1004845Z  560 │       !destinationProject ||
2026-10-24T10:35:58.1004932Z  561 │       !selectedProjectMatchesRoute ||
2026-10-24T10:35:58.1005022Z  562 │       cancelledIncomingShareId === shareId
2026-10-24T10:35:58.1005077Z  563 │     ) {
2026-10-24T10:35:58.1005135Z  564 │       return;
2026-10-24T10:35:58.1005188Z  565 │     }
2026-10-24T10:35:58.1005284Z  566 │     const importKey = `${shareId}:${draftKey}`;
2026-10-24T10:35:58.1005339Z  567 │     if (
2026-10-24T10:35:58.1005450Z  568 │       startedShareImportKeyRef.current === importKey ||
2026-10-24T10:35:58.1005562Z  569 │       cancellingShareImportKeyRef.current === importKey
2026-10-24T10:35:58.1005617Z  570 │     ) {
2026-10-24T10:35:58.1005675Z  571 │       return;
2026-10-24T10:35:58.1005729Z  572 │     }
2026-10-24T10:35:58.1005779Z  573 │
2026-10-24T10:35:58.1005928Z  574 │     if (!incomingShare) {
2026-10-24T10:35:58.1006160Z  575 │       if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
2026-10-24T10:35:58.1006291Z  576 │         alertedUnavailableIncomingShareIdRef.current = shareId;
2026-10-24T10:35:58.1006357Z  577 │         Dialog.alert(
2026-10-24T10:35:58.1006442Z  578 │           "Shared content unavailable",
2026-10-24T10:35:58.1006615Z  579 │           "The shared content is no longer in the inbox. You can continue editing this task draft.",
2026-10-24T10:35:58.1006673Z  580 │         );
2026-10-24T10:35:58.1006728Z  581 │       }
2026-10-24T10:35:58.1006787Z  582 │       return;
2026-10-24T10:35:58.1006839Z  583 │     }
2026-10-24T10:35:58.1006890Z  584 │
2026-10-24T10:35:58.1006945Z  585 │     if (
2026-10-24T10:35:58.1007112Z  586 │       incomingShare.attachments.some((attachment) => attachment.type === "file") &&
2026-10-24T10:35:58.1007216Z  587 │       selectedEnvironmentServerConfig === null
2026-10-24T10:35:58.1007273Z  588 │     ) {
2026-10-24T10:35:58.1007330Z  589 │       return;
2026-10-24T10:35:58.1007384Z  590 │     }
2026-10-24T10:35:58.1007435Z  591 │
2026-10-24T10:35:58.1007573Z  592 │     if (alertedUnavailableIncomingShareIdRef.current === shareId) {
2026-10-24T10:35:58.1007695Z  593 │       alertedUnavailableIncomingShareIdRef.current = null;
2026-10-24T10:35:58.1007747Z  594 │     }
2026-10-24T10:35:58.1007855Z  595 │     startedShareImportKeyRef.current = importKey;
2026-10-24T10:35:58.1007923Z  596 │     const draftBackup =
2026-10-24T10:35:58.1008112Z  597 │       shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
2026-10-24T10:35:58.1008249Z  598 │     shareImportDraftBackupRef.current.set(importKey, draftBackup);
2026-10-24T10:35:58.1008345Z  599 │     const importToken = Symbol(importKey);
2026-10-24T10:35:58.1008427Z  600 │     let didReserveShare = false;
2026-10-24T10:35:58.1008504Z  601 │     let didConsumeShare = false;
2026-10-24T10:35:58.1008582Z  602 │     let needsDraftRestore = false;
2026-10-24T10:35:58.1008694Z  603 │     activeShareImportTokenRef.current = importToken;
2026-10-24T10:35:58.1008779Z  604 │     setImportingShareKey(importKey);
2026-10-24T10:35:58.1008866Z      ·     ──────────┬─────────
2026-10-24T10:35:58.1009041Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.1009109Z  605 │     void (async () => {
2026-10-24T10:35:58.1009161Z      ╰────
2026-10-24T10:35:58.1009782Z   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-24T10:35:58.1010117Z   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-24T10:35:58.1010120Z
2026-10-24T10:35:58.1010325Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.1010479Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5]
2026-10-24T10:35:58.1010555Z  523 │     props.initialProjectRef,
2026-10-24T10:35:58.1010628Z  524 │     props.incomingShareId,
2026-10-24T10:35:58.1010714Z      ·     ──────────┬──────────
2026-10-24T10:35:58.1010964Z      ·               ╰── Unnecessary dependency `props.incomingShareId`
2026-10-24T10:35:58.1011095Z  525 │     props.pendingTaskId,
2026-10-24T10:35:58.1011147Z      ╰────
2026-10-24T10:35:58.1011444Z   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-24T10:35:58.1011766Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1011769Z
2026-10-24T10:35:58.1011990Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T10:35:58.1012143Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5]
2026-10-24T10:35:58.1012258Z  542 │     loadedBranchesProjectKeyRef.current = projectKey;
2026-10-24T10:35:58.1012331Z  543 │     flow.loadBranches();
2026-10-24T10:35:58.1012403Z      ·     ──┬─
2026-10-24T10:35:58.1012527Z      ·       ╰── Missing dependency `flow`
2026-10-24T10:35:58.1012621Z  544 │   }, [flow.loadBranches, selectedProject]);
2026-10-24T10:35:58.1012705Z      ·       ────────┬────────
2026-10-24T10:35:58.1012909Z      ·               ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead
2026-10-24T10:35:58.1012963Z  545 │
2026-10-24T10:35:58.1013014Z      ╰────
2026-10-24T10:35:58.1013446Z   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-24T10:35:58.1013772Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1013778Z
2026-10-24T10:35:58.1013984Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.1014138Z      ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5]
2026-10-24T10:35:58.1014201Z  765 │     flow.draftKey,
2026-10-24T10:35:58.1014278Z  766 │     hasImportedIncomingShare,
2026-10-24T10:35:58.1014371Z      ·     ────────────┬───────────
2026-10-24T10:35:58.1014553Z      ·                 ╰── Unnecessary dependency `hasImportedIncomingShare`
2026-10-24T10:35:58.1014615Z  767 │     incomingShare,
2026-10-24T10:35:58.1014697Z  768 │     isIncomingShareInboxLoading,
2026-10-24T10:35:58.1014867Z      ·     ─────────────┬─────────────
2026-10-24T10:35:58.1015092Z      ·                  ╰── Unnecessary dependency `isIncomingShareInboxLoading`
2026-10-24T10:35:58.1015171Z  769 │     isIncomingShareUnavailable,
2026-10-24T10:35:58.1015244Z  770 │     props.incomingShareId,
2026-10-24T10:35:58.1015338Z  771 │     props.initialProjectRef?.environmentId,
2026-10-24T10:35:58.1015427Z  772 │     props.initialProjectRef?.projectId,
2026-10-24T10:35:58.1015499Z  773 │     releaseShareReservation,
2026-10-24T10:35:58.1015561Z  774 │     reserveShare,
2026-10-24T10:35:58.1015646Z  775 │     selectedEnvironmentServerConfig,
2026-10-24T10:35:58.1015713Z  776 │     selectedProject,
2026-10-24T10:35:58.1015781Z  777 │     shareImportAttempt,
2026-10-24T10:35:58.1015867Z      ·     ─────────┬────────
2026-10-24T10:35:58.1016043Z      ·              ╰── Unnecessary dependency `shareImportAttempt`
2026-10-24T10:35:58.1016101Z  778 │   ]);
2026-10-24T10:35:58.1016149Z      ╰────
2026-10-24T10:35:58.1016448Z   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-24T10:35:58.1016766Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1016769Z
2026-10-24T10:35:58.1017035Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.1017196Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-24T10:35:58.1017257Z  259 │     .join("|");
2026-10-24T10:35:58.1017325Z  260 │   useEffect(() => {
2026-10-24T10:35:58.1017399Z      ·   ────┬────
2026-10-24T10:35:58.1017529Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.1017588Z  261 │     stop();
2026-10-24T10:35:58.1017657Z      ·     ──┬─
2026-10-24T10:35:58.1017820Z      ·       ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.1017885Z  262 │   }, [orderVersion]);
2026-10-24T10:35:58.1017935Z      ╰────
2026-10-24T10:35:58.1018536Z   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-24T10:35:58.1018870Z   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-24T10:35:58.1018876Z
2026-10-24T10:35:58.1019097Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T10:35:58.1019257Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-24T10:35:58.1019319Z  260 │   useEffect(() => {
2026-10-24T10:35:58.1019379Z  261 │     stop();
2026-10-24T10:35:58.1019447Z      ·     ──┬─
2026-10-24T10:35:58.1019570Z      ·       ╰── Missing dependency `stop`
2026-10-24T10:35:58.1019636Z  262 │   }, [orderVersion]);
2026-10-24T10:35:58.1019714Z      ·       ──────┬─────
2026-10-24T10:35:58.1020026Z      ·             ╰── Unnecessary dependency `orderVersion`
2026-10-24T10:35:58.1020124Z  263 │   useEffect(
2026-10-24T10:35:58.1020175Z      ╰────
2026-10-24T10:35:58.1020601Z   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-24T10:35:58.1020911Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1020913Z
2026-10-24T10:35:58.1021059Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1021249Z     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
2026-10-24T10:35:58.1021327Z  95 │   const latest = useRef(props);
2026-10-24T10:35:58.1021402Z  96 │   latest.current = props;
2026-10-24T10:35:58.1021510Z     ·   ───┬──────┬───
2026-10-24T10:35:58.1021689Z     ·      │      ╰── Cannot update ref value during render
2026-10-24T10:35:58.1021804Z     ·      ╰── This value is a ref
2026-10-24T10:35:58.1021873Z  97 │   const gesture = useMemo(
2026-10-24T10:35:58.1021924Z     ╰────
2026-10-24T10:35:58.1022391Z   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-24T10:35:58.1022685Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1022693Z
2026-10-24T10:35:58.1022842Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1023006Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
2026-10-24T10:35:58.1023071Z  103 │         .runOnJS(true)
2026-10-24T10:35:58.1023170Z  104 │         .onStart(() => latest.current.onStart())
2026-10-24T10:35:58.1023288Z      ·                  ───────────────┬──────────────
2026-10-24T10:35:58.1023495Z      ·                                 ╰── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.1023631Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1023680Z      ╰────
2026-10-24T10:35:58.1024163Z   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-24T10:35:58.1024468Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1024470Z
2026-10-24T10:35:58.1024615Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1024776Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
2026-10-24T10:35:58.1024874Z  104 │         .onStart(() => latest.current.onStart())
2026-10-24T10:35:58.1025008Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1025151Z      ·                   ──────────────────────────┬─────────────────────────
2026-10-24T10:35:58.1025497Z      ·                                             ╰── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.1025668Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1025718Z      ╰────
2026-10-24T10:35:58.1026194Z   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-24T10:35:58.1026490Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1026493Z
2026-10-24T10:35:58.1026636Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1026800Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
2026-10-24T10:35:58.1026932Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1027056Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1027196Z      ·                ──────────────────────────┬─────────────────────────
2026-10-24T10:35:58.1027405Z      ·                                          ╰── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.1027530Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T10:35:58.1027582Z      ╰────
2026-10-24T10:35:58.1028053Z   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-24T10:35:58.1028352Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1028354Z
2026-10-24T10:35:58.1028499Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1028660Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
2026-10-24T10:35:58.1028783Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1028906Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T10:35:58.1029043Z      ·                     ───────────────────────┬──────────────────────
2026-10-24T10:35:58.1029260Z      ·                                            ╰── Passing a ref to a function may read its value during render
2026-10-24T10:35:58.1029332Z  108 │     [props.disabled],
2026-10-24T10:35:58.1029384Z      ╰────
2026-10-24T10:35:58.1029862Z   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-24T10:35:58.1030159Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1030161Z
2026-10-24T10:35:58.1030305Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1030466Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9]
2026-10-24T10:35:58.1030652Z  248 │   const latest = useRef({ rows, planners, moveThread });
2026-10-24T10:35:58.1030792Z  249 │   latest.current = { rows, planners, moveThread };
2026-10-24T10:35:58.1030898Z      ·   ───┬──────┬───
2026-10-24T10:35:58.1031108Z      ·      │      ╰── Cannot update ref value during render
2026-10-24T10:35:58.1031223Z      ·      ╰── This value is a ref
2026-10-24T10:35:58.1031274Z  250 │
2026-10-24T10:35:58.1031325Z      ╰────
2026-10-24T10:35:58.1031789Z   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-24T10:35:58.1032091Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1032096Z
2026-10-24T10:35:58.1032239Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T10:35:58.1032395Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22]
2026-10-24T10:35:58.1032514Z  246 │   const [preview, setPreview] = useState<Drag | null>(null);
2026-10-24T10:35:58.1032633Z  247 │   const translateY = useRef(new Animated.Value(0)).current;
2026-10-24T10:35:58.1032759Z      ·                      ──────────────────┬──────────────────
2026-10-24T10:35:58.1032927Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T10:35:58.1033040Z  248 │   const latest = useRef({ rows, planners, moveThread });
2026-10-24T10:35:58.1033097Z      ╰────
2026-10-24T10:35:58.1033572Z   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-24T10:35:58.1033866Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T10:35:58.1033870Z
2026-10-24T10:35:58.1034039Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.1034201Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16]
2026-10-24T10:35:58.1034265Z  323 │     update(0);
2026-10-24T10:35:58.1034346Z  324 │     let last = performance.now();
2026-10-24T10:35:58.1034507Z      ·                ────────┬────────
2026-10-24T10:35:58.1034677Z      ·                        ╰── Cannot call impure function
2026-10-24T10:35:58.1034746Z  325 │     const tick = () => {
2026-10-24T10:35:58.1034796Z      ╰────
2026-10-24T10:35:58.1035096Z   help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.1035390Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.1035393Z
2026-10-24T10:35:58.1035585Z   ⚠ react(capitalized-calls): Capitalized function called without JSX
2026-10-24T10:35:58.1035747Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
2026-10-24T10:35:58.1035810Z   98 │     () =>
2026-10-24T10:35:58.1035878Z   99 │       Gesture.Pan()
2026-10-24T10:35:58.1035953Z      ·               ─┬─
2026-10-24T10:35:58.1036085Z      ·                ╰── `Pan` may be a component
2026-10-24T10:35:58.1036163Z  100 │         .enabled(!props.disabled)
2026-10-24T10:35:58.1036215Z      ╰────
2026-10-24T10:35:58.1036493Z   help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
2026-10-24T10:35:58.1036948Z   note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T10:35:58.1036950Z
2026-10-24T10:35:58.1037145Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T10:35:58.1037305Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
2026-10-24T10:35:58.1037372Z  103 │         .runOnJS(true)
2026-10-24T10:35:58.1037473Z  104 │         .onStart(() => latest.current.onStart())
2026-10-24T10:35:58.1037561Z      ·                        ───┬──
2026-10-24T10:35:58.1038006Z      ·                           ╰── Missing dependency `latest`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T10:35:58.1038139Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1038263Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T10:35:58.1038392Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T10:35:58.1038460Z  108 │     [props.disabled],
2026-10-24T10:35:58.1038541Z      ·     ────────┬───────
2026-10-24T10:35:58.1038731Z      ·             ╰── This dependency list is missing values used by the callback
2026-10-24T10:35:58.1038786Z  109 │   );
2026-10-24T10:35:58.1038835Z      ╰────
2026-10-24T10:35:58.1039043Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T10:35:58.1039363Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1039365Z
2026-10-24T10:35:58.1039538Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.1039759Z      ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47]
2026-10-24T10:35:58.1039920Z  371 │   const { open, onOpenChange, onSnooze, timestampFormat } = props;
2026-10-24T10:35:58.1040078Z  372 │   const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
2026-10-24T10:35:58.1040195Z      ·                                               ─────┬────
2026-10-24T10:35:58.1040361Z      ·                                                    ╰── Cannot call impure function
2026-10-24T10:35:58.1040420Z  373 │   return (
2026-10-24T10:35:58.1040471Z      ╰────
2026-10-24T10:35:58.1040755Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.1041061Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.1041066Z
2026-10-24T10:35:58.1041261Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.1041408Z      ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39]
2026-10-24T10:35:58.1041502Z  852 │   if (snoozeGateClock.thread !== thread) {
2026-10-24T10:35:58.1041631Z  853 │     setSnoozeGateClock({ thread, now: new Date().toISOString() });
2026-10-24T10:35:58.1041742Z      ·                                       ─────┬────
2026-10-24T10:35:58.1041899Z      ·                                            ╰── Cannot call impure function
2026-10-24T10:35:58.1041954Z  854 │   }
2026-10-24T10:35:58.1042004Z      ╰────
2026-10-24T10:35:58.1042290Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.1042590Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.1042592Z
2026-10-24T10:35:58.1042852Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.1044186Z      ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5]
2026-10-24T10:35:58.1044313Z  283 │   const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
2026-10-24T10:35:58.1044377Z  284 │   useEffect(() => {
2026-10-24T10:35:58.1044451Z      ·   ────┬────
2026-10-24T10:35:58.1044589Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.1044681Z  285 │     setNow(new Date().toISOString());
2026-10-24T10:35:58.1044750Z      ·     ───┬──
2026-10-24T10:35:58.1044916Z      ·        ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.1045054Z  286 │     const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
2026-10-24T10:35:58.1045105Z      ╰────
2026-10-24T10:35:58.1045707Z   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-24T10:35:58.1046120Z   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-24T10:35:58.1046162Z
2026-10-24T10:35:58.1046369Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.1046538Z      ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25]
2026-10-24T10:35:58.1046670Z  364 │     // range) the boundary string is identical and the chain would die.
2026-10-24T10:35:58.1046759Z  365 │   }, [nextSnoozeWakeAt, snoozeWakeTick]);
2026-10-24T10:35:58.1046862Z      ·                         ───────┬──────
2026-10-24T10:35:58.1047028Z      ·                                ╰── Unnecessary dependency `snoozeWakeTick`
2026-10-24T10:35:58.1047141Z  366 │   const listItems = ((): readonly SidebarListItem[] => {
2026-10-24T10:35:58.1047191Z      ╰────
2026-10-24T10:35:58.1047493Z   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-24T10:35:58.1047814Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1047816Z
2026-10-24T10:35:58.1047984Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.1048150Z      ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53]
2026-10-24T10:35:58.1048236Z  355 │     if (Number.isNaN(wakeAtMs)) return;
2026-10-24T10:35:58.1048394Z  356 │     const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
2026-10-24T10:35:58.1048516Z      ·                                                     ─────┬────
2026-10-24T10:35:58.1048690Z      ·                                                          ╰── Cannot call impure function
2026-10-24T10:35:58.1048771Z  357 │     const id = setTimeout(() => {
2026-10-24T10:35:58.1048821Z      ╰────
2026-10-24T10:35:58.1049108Z   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-24T10:35:58.1049402Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.1049404Z
2026-10-24T10:35:58.1049648Z   ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
2026-10-24T10:35:58.1049812Z      ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9]
2026-10-24T10:35:58.1049878Z  264 │ ): boolean {
2026-10-24T10:35:58.1050034Z  265 │   const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
2026-10-24T10:35:58.1050201Z      ·         ─────────────────────────────────────────────────────────────────────
2026-10-24T10:35:58.1050346Z  266 │   const holds = (label: string) => labels.includes(label.trim().toLowerCase());
2026-10-24T10:35:58.1050397Z      ╰────
2026-10-24T10:35:58.1050473Z   help: Switch to `Set`
2026-10-24T10:35:58.1050475Z
2026-10-24T10:35:58.1050670Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T10:35:58.1050835Z      ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17]
2026-10-24T10:35:58.1050898Z  813 │               <div
2026-10-24T10:35:58.1051012Z  814 │                 key={`${index}:${check.name}:${check.url ?? ""}`}
2026-10-24T10:35:58.1051246Z      ·                 ─────────────────────────────────────────────────
2026-10-24T10:35:58.1051445Z  815 │                 className="group flex items-center gap-2 rounded-md pr-1 hover:bg-accent/60"
2026-10-24T10:35:58.1051496Z      ╰────
2026-10-24T10:35:58.1051643Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T10:35:58.1051645Z
2026-10-24T10:35:58.1051851Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T10:35:58.1051966Z     ╭─[apps/mobile/src/state/thread-order.ts:29:7]
2026-10-24T10:35:58.1052041Z  28 │     getPendingThreadOrder();
2026-10-24T10:35:58.1052122Z  29 │   }, [nowMinute, snoozeWakeTick]);
2026-10-24T10:35:58.1052245Z     ·       ────┬────  ───────┬──────
2026-10-24T10:35:58.1052447Z     ·           │             ╰── Unnecessary dependency `snoozeWakeTick`
2026-10-24T10:35:58.1052591Z     ·           ╰── Unnecessary dependency `nowMinute`
2026-10-24T10:35:58.1052656Z  30 │   return pending;
2026-10-24T10:35:58.1052707Z     ╰────
2026-10-24T10:35:58.1053006Z   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-24T10:35:58.1053324Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T10:35:58.1053326Z
2026-10-24T10:35:58.1053588Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T10:35:58.1053746Z      ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5]
2026-10-24T10:35:58.1053801Z  398 │
2026-10-24T10:35:58.1053865Z  399 │   useEffect(() => {
2026-10-24T10:35:58.1053938Z      ·   ────┬────
2026-10-24T10:35:58.1054067Z      ·       ╰── This is the containing effect
2026-10-24T10:35:58.1054160Z  400 │     setInspectorSelection((current) => {
2026-10-24T10:35:58.1054246Z      ·     ──────────┬──────────
2026-10-24T10:35:58.1054421Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-24T10:35:58.1054524Z  401 │       if (props.renderInspector === undefined) {
2026-10-24T10:35:58.1054575Z      ╰────
2026-10-24T10:35:58.1055243Z   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-24T10:35:58.1055603Z   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-24T10:35:58.1055606Z
2026-10-24T10:35:58.1055826Z   ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T10:35:58.1055978Z      ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24]
2026-10-24T10:35:58.1056141Z  527 │       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
2026-10-24T10:35:58.1056312Z  528 │ ╭─▶   const GitInspector = () => (
2026-10-24T10:35:58.1056416Z  529 │ │       <GitOverviewSheet
2026-10-24T10:35:58.1056539Z  530 │ │         headerInset={inspectorHeaderInset}
2026-10-24T10:35:58.1056647Z  531 │ │         presentation="inspector"
2026-10-24T10:35:58.1056829Z  532 │ │         route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
2026-10-24T10:35:58.1056904Z  533 │ │       />
2026-10-24T10:35:58.1057032Z  534 │ ╰─▶   );
2026-10-24T10:35:58.1057113Z  535 │       const FilesInspector = () =>
2026-10-24T10:35:58.1057163Z      ╰────
2026-10-24T10:35:58.1057383Z   help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-24T10:35:58.1057386Z
2026-10-24T10:35:58.1057608Z   ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T10:35:58.1057762Z      ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26]
2026-10-24T10:35:58.1057819Z  534 │       );
2026-10-24T10:35:58.1057985Z  535 │ ╭─▶   const FilesInspector = () =>
2026-10-24T10:35:58.1058137Z  536 │ │       selectedThread !== null && selectedThreadCwd !== null ? (
2026-10-24T10:35:58.1058245Z  537 │ │         <ThreadFileNavigatorPane
2026-10-24T10:35:58.1058351Z  538 │ │           cwd={selectedThreadCwd}
2026-10-24T10:35:58.1058487Z  539 │ │           environmentId={selectedThread.environmentId}
2026-10-24T10:35:58.1058611Z  540 │ │           headerInset={inspectorHeaderInset}
2026-10-24T10:35:58.1058766Z  541 │ │           projectName={selectedThreadProject?.title ?? "Files"}
2026-10-24T10:35:58.1058873Z  542 │ │           selectedPath={null}
2026-10-24T10:35:58.1059002Z  543 │ │           onSelectFile={handleSelectInspectorFile}
2026-10-24T10:35:58.1059079Z  544 │ │         />
2026-10-24T10:35:58.1059218Z  545 │ ╰─▶     ) : null;
2026-10-24T10:35:58.1059372Z  546 │       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
2026-10-24T10:35:58.1059421Z      ╰────
2026-10-24T10:35:58.1059641Z   help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-24T10:35:58.1059644Z
2026-10-24T10:35:58.1060005Z   ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
2026-10-24T10:35:58.1060195Z      ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
2026-10-24T10:35:58.1060251Z  162 │   keys,
2026-10-24T10:35:58.1060322Z  163 │   overridingProjects = [],
2026-10-24T10:35:58.1060404Z      ·                        ──
2026-10-24T10:35:58.1060469Z  164 │   onClearOverrides,
2026-10-24T10:35:58.1060518Z      ╰────
2026-10-24T10:35:58.1060840Z   help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
2026-10-24T10:35:58.1060842Z
2026-10-24T10:35:58.1061150Z   ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
2026-10-24T10:35:58.1061324Z      ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19]
2026-10-24T10:35:58.1061388Z  472 │   onFilters,
2026-10-24T10:35:58.1061454Z  473 │   authorOptions = [],
2026-10-24T10:35:58.1061530Z      ·                   ──
2026-10-24T10:35:58.1061597Z  474 │   labelOptions = [],
2026-10-24T10:35:58.1061647Z      ╰────
2026-10-24T10:35:58.1061967Z   help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
2026-10-24T10:35:58.1061969Z
2026-10-24T10:35:58.1062254Z   ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
2026-10-24T10:35:58.1062422Z      ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18]
2026-10-24T10:35:58.1062488Z  473 │   authorOptions = [],
2026-10-24T10:35:58.1062557Z  474 │   labelOptions = [],
2026-10-24T10:35:58.1062634Z      ·                  ──
2026-10-24T10:35:58.1062697Z  475 │   optionScope,
2026-10-24T10:35:58.1062747Z      ╰────
2026-10-24T10:35:58.1063066Z   help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
2026-10-24T10:35:58.1063068Z
2026-10-24T10:35:58.1063274Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T10:35:58.1063441Z    ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
2026-10-24T10:35:58.1063515Z  3 │   AuthProvidersManageScope,
2026-10-24T10:35:58.1063582Z  4 │   type AuthSessionState,
2026-10-24T10:35:58.1063666Z    ·        ────────┬───────
2026-10-24T10:35:58.1063820Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T10:35:58.1063890Z  5 │   type EnvironmentId,
2026-10-24T10:35:58.1063939Z    ╰────
2026-10-24T10:35:58.1064039Z   help: Consider removing this import.
2026-10-24T10:35:58.1064042Z
2026-10-24T10:35:58.1064212Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T10:35:58.1064345Z       ╭─[apps/web/src/components/CommandPalette.tsx:1996:20]
2026-10-24T10:35:58.1064464Z  1995 │         title: inferProjectTitleFromPath(destinationPath),
2026-10-24T10:35:58.1064558Z  1996 │         createdAt: new Date().toISOString(),
2026-10-24T10:35:58.1064650Z       ·                    ─────┬────
2026-10-24T10:35:58.1064796Z       ·                         ╰── Cannot call impure function
2026-10-24T10:35:58.1064973Z  1997 │         remoteUrl: addProjectCloneFlow.remoteUrl,
2026-10-24T10:35:58.1065062Z       ╰────
2026-10-24T10:35:58.1065390Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T10:35:58.1065687Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T10:35:58.1065689Z
2026-10-24T10:35:58.1065770Z Found 0 errors and 362 warnings in 5420 files (6.9s, 8 threads)
2026-10-24T10:35:58.1564656Z Post job cleanup.
2026-10-24T10:35:58.2161853Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-24T10:35:58.2244032Z Post job cleanup.
2026-10-24T10:35:58.2256471Z ##[start-action display=Cache full pnpm store;id=__b845a95d-d47e-4079-bc78-a4a9859d6589.__actions_cache]
2026-10-24T10:35:58.2614159Z Post job cleanup.
2026-10-24T10:35:58.3254574Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d, not saving cache.
2026-10-24T10:35:58.3290260Z ##[end-action id=__b845a95d-d47e-4079-bc78-a4a9859d6589.__actions_cache;outcome=success;conclusion=success;duration_ms=103]
2026-10-24T10:35:58.3292563Z ##[start-action display=Cache Vite+;id=__b845a95d-d47e-4079-bc78-a4a9859d6589.vp_cache]
2026-10-24T10:35:58.3316248Z Post job cleanup.
2026-10-24T10:35:58.3953659Z 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-24T10:35:58.3986328Z ##[end-action id=__b845a95d-d47e-4079-bc78-a4a9859d6589.vp_cache;outcome=success;conclusion=success;duration_ms=69]
2026-10-24T10:35:58.4030509Z Post job cleanup.
2026-10-24T10:35:58.4471712Z [command]/usr/local/bin/git version
2026-10-24T10:35:58.4505475Z git version 2.55.0
2026-10-24T10:35:58.4525013Z Temporarily overriding HOME='/home/runner/_work/_temp/d0ab4df1-b12a-47e0-a10f-1ae6f47bcd5b' before making global git config changes
2026-10-24T10:35:58.4525440Z Adding repository directory to the temporary git global config as a safe directory
2026-10-24T10:35:58.4528238Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-24T10:35:58.4661314Z Removing SSH command configuration
2026-10-24T10:35:58.4664434Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-24T10:35:58.4689812Z [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-24T10:35:58.4830847Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-24T10:35:58.4858945Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-24T10:35:58.4902776Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-24T10:35:58.4916302Z ##[group]Run '/job_completed.sh'
2026-10-24T10:35:58.4921839Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-24T10:35:58.4922008Z env:
2026-10-24T10:35:58.4922121Z   BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 182
2026-10-24T10:35:58.4922270Z   BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 428
2026-10-24T10:35:58.4922412Z   BLACKSMITH_CHECK_RUN_ID: 120850399005
2026-10-24T10:35:58.4922556Z   BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-24T10:35:58.4922695Z   GITHUB_ACTIONS_CACHE_MODE: write
2026-10-24T10:35:58.4922833Z ##[endgroup]
2026-10-24T10:35:58.5000051Z Docker container cache not activated, skipping hash computation.
2026-10-24T10:35:58.5276647Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-24T10:35:58.5319802Z Cleaning up orphan processes