GitHub check

256 KB of 611 KB loaded Download the full log (611 KB)
355 KB of earlier output not loaded
:38:28.3003533Z      ╰────
2026-10-24T20:38:28.3003536Z
2026-10-24T20:38:28.3003729Z   ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
2026-10-24T20:38:28.3003831Z     ╭─[apps/server/src/auth/http.ts:28:10]
2026-10-24T20:38:28.3003918Z  27 │ import * as Schema from "effect/Schema";
2026-10-24T20:38:28.3004009Z  28 │ import { identity } from "effect/Function";
2026-10-24T20:38:28.3004082Z     ·          ────┬───
2026-10-24T20:38:28.3004214Z     ·              ╰── 'identity' is imported here
2026-10-24T20:38:28.3004297Z  29 │ import * as Layer from "effect/Layer";
2026-10-24T20:38:28.3004346Z     ╰────
2026-10-24T20:38:28.3004439Z   help: Consider removing this import.
2026-10-24T20:38:28.3004441Z
2026-10-24T20:38:28.3004662Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T20:38:28.3004789Z      ╭─[scripts/lib/cli-external-packages.test.ts:114:11]
2026-10-24T20:38:28.3004858Z  113 │         const declared = {
2026-10-24T20:38:28.3004946Z  114 │           ...(manifest.dependencies ?? {}),
2026-10-24T20:38:28.3005053Z      ·           ────────────────────────────────
2026-10-24T20:38:28.3005156Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-24T20:38:28.3005206Z      ╰────
2026-10-24T20:38:28.3005468Z   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-24T20:38:28.3005473Z
2026-10-24T20:38:28.3005685Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T20:38:28.3005856Z      ╭─[scripts/lib/cli-external-packages.test.ts:115:11]
2026-10-24T20:38:28.3005972Z  114 │           ...(manifest.dependencies ?? {}),
2026-10-24T20:38:28.3006073Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-24T20:38:28.3006189Z      ·           ────────────────────────────────────────
2026-10-24T20:38:28.3006286Z  116 │           ...(manifest.peerDependencies ?? {}),
2026-10-24T20:38:28.3006337Z      ╰────
2026-10-24T20:38:28.3006597Z   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-24T20:38:28.3006600Z
2026-10-24T20:38:28.3006811Z   ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T20:38:28.3006939Z      ╭─[scripts/lib/cli-external-packages.test.ts:116:11]
2026-10-24T20:38:28.3007041Z  115 │           ...(manifest.optionalDependencies ?? {}),
2026-10-24T20:38:28.3007135Z  116 │           ...(manifest.peerDependencies ?? {}),
2026-10-24T20:38:28.3007245Z      ·           ────────────────────────────────────
2026-10-24T20:38:28.3007303Z  117 │         };
2026-10-24T20:38:28.3007354Z      ╰────
2026-10-24T20:38:28.3007611Z   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-24T20:38:28.3007613Z
2026-10-24T20:38:28.3007788Z   ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used.
2026-10-24T20:38:28.3007921Z     ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18]
2026-10-24T20:38:28.3008006Z  14 │ import * as Layer from "effect/Layer";
2026-10-24T20:38:28.3008102Z  15 │ import type * as Scope from "effect/Scope";
2026-10-24T20:38:28.3008183Z     ·                  ──┬──
2026-10-24T20:38:28.3008313Z     ·                    ╰── 'Scope' is imported here
2026-10-24T20:38:28.3008398Z  16 │ import * as Stream from "effect/Stream";
2026-10-24T20:38:28.3008450Z     ╰────
2026-10-24T20:38:28.3008545Z   help: Consider removing this import.
2026-10-24T20:38:28.3008549Z
2026-10-24T20:38:28.3008748Z   ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
2026-10-24T20:38:28.3008849Z     ╭─[infra/relay/src/http/Api.ts:69:13]
2026-10-24T20:38:28.3008986Z  68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
2026-10-24T20:38:28.3009097Z  69 │ import * as HookForwarder from "../hooks/HookForwarder.ts";
2026-10-24T20:38:28.3009185Z     ·             ──────┬──────
2026-10-24T20:38:28.3009326Z     ·                   ╰── 'HookForwarder' is imported here
2026-10-24T20:38:28.3009428Z  70 │ import * as HeldHooks from "../hooks/HeldHooks.ts";
2026-10-24T20:38:28.3009478Z     ╰────
2026-10-24T20:38:28.3009570Z   help: Consider removing this import.
2026-10-24T20:38:28.3009573Z
2026-10-24T20:38:28.3009855Z   ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
2026-10-24T20:38:28.3010007Z      ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
2026-10-24T20:38:28.3010063Z  162 │   keys,
2026-10-24T20:38:28.3010133Z  163 │   overridingProjects = [],
2026-10-24T20:38:28.3010215Z      ·                        ──
2026-10-24T20:38:28.3010282Z  164 │   onClearOverrides,
2026-10-24T20:38:28.3010394Z      ╰────
2026-10-24T20:38:28.3010735Z   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-24T20:38:28.3010738Z
2026-10-24T20:38:28.3010966Z   ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
2026-10-24T20:38:28.3011102Z     ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10]
2026-10-24T20:38:28.3011154Z  21 │
2026-10-24T20:38:28.3011305Z  22 │ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
2026-10-24T20:38:28.3011391Z     ·          ────────┬───────
2026-10-24T20:38:28.3011535Z     ·                  ╰── 'summarizePayload' is declared here
2026-10-24T20:38:28.3011646Z  23 │   if (payload === null) return { valueType: "null" };
2026-10-24T20:38:28.3011697Z     ╰────
2026-10-24T20:38:28.3011797Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3011800Z
2026-10-24T20:38:28.3011942Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3012059Z      ╭─[apps/mobile/src/native/StackHeader.tsx:185:9]
2026-10-24T20:38:28.3012122Z  184 │         "options",
2026-10-24T20:38:28.3012214Z  185 │         latestOptionFunctionsRef.current,
2026-10-24T20:38:28.3012319Z      ·         ────────────────┬───────────────
2026-10-24T20:38:28.3012509Z      ·                         ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3012600Z  186 │         optionFunctionWrappersRef.current,
2026-10-24T20:38:28.3012651Z      ╰────
2026-10-24T20:38:28.3013119Z   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-24T20:38:28.3013409Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3013411Z
2026-10-24T20:38:28.3013552Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3013666Z      ╭─[apps/mobile/src/native/StackHeader.tsx:186:9]
2026-10-24T20:38:28.3013757Z  185 │         latestOptionFunctionsRef.current,
2026-10-24T20:38:28.3013847Z  186 │         optionFunctionWrappersRef.current,
2026-10-24T20:38:28.3013955Z      ·         ────────────────┬────────────────
2026-10-24T20:38:28.3014146Z      ·                         ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3014238Z  187 │       ) as NativeStackNavigationOptions)
2026-10-24T20:38:28.3014287Z      ╰────
2026-10-24T20:38:28.3014743Z   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-24T20:38:28.3015028Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3015030Z
2026-10-24T20:38:28.3015216Z   ⚠ eslint(require-yield): This generator function does not have `yield`
2026-10-24T20:38:28.3015406Z      ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78]
2026-10-24T20:38:28.3015488Z   80 │
2026-10-24T20:38:28.3015755Z   81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* (
2026-10-24T20:38:28.3015872Z   82 │ │     options: AcpMcpOverAcpBridgeOptions,
2026-10-24T20:38:28.3015993Z   83 │ │   ): Effect.fn.Return<AcpMcpOverAcpBridge> {
2026-10-24T20:38:28.3016157Z   84 │ │     const fetchImplementation = options.fetchImplementation ?? fetch;
2026-10-24T20:38:28.3016290Z   85 │ │     const connections = new Map<string, Connection>();
2026-10-24T20:38:28.3016357Z   86 │ │
2026-10-24T20:38:28.3016572Z   87 │ │     const connectionFor = (connectionId: string): Effect.Effect<Connection, AcpMcpOverAcpError> =>
2026-10-24T20:38:28.3016674Z   88 │ │       Effect.suspend(() => {
2026-10-24T20:38:28.3016806Z   89 │ │         const connection = connections.get(connectionId);
2026-10-24T20:38:28.3016915Z   90 │ │         return connection === undefined
2026-10-24T20:38:28.3017122Z   91 │ │           ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`))
2026-10-24T20:38:28.3017229Z   92 │ │           : Effect.succeed(connection);
2026-10-24T20:38:28.3017303Z   93 │ │       });
2026-10-24T20:38:28.3017370Z   94 │ │
2026-10-24T20:38:28.3017450Z   95 │ │     const send = (
2026-10-24T20:38:28.3017548Z   96 │ │       connection: Connection,
2026-10-24T20:38:28.3017644Z   97 │ │       message: unknown,
2026-10-24T20:38:28.3017800Z   98 │ │     ): Effect.Effect<ReadonlyArray<unknown>, AcpMcpOverAcpError> =>
2026-10-24T20:38:28.3017909Z   99 │ │       connection.mutex.withPermits(1)(
2026-10-24T20:38:28.3018014Z  100 │ │         Effect.gen(function* () {
2026-10-24T20:38:28.3018133Z  101 │ │           const body = JSON.stringify(message);
2026-10-24T20:38:28.3018270Z  102 │ │           if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) {
2026-10-24T20:38:28.3018481Z  103 │ │             return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB."));
2026-10-24T20:38:28.3018557Z  104 │ │           }
2026-10-24T20:38:28.3018687Z  105 │ │           const response = yield* Effect.tryPromise({
2026-10-24T20:38:28.3018788Z  106 │ │             try: (signal) =>
2026-10-24T20:38:28.3018919Z  107 │ │               fetchImplementation(options.endpoint, {
2026-10-24T20:38:28.3019019Z  108 │ │                 method: "POST",
2026-10-24T20:38:28.3019109Z  109 │ │                 signal,
2026-10-24T20:38:28.3019204Z  110 │ │                 headers: {
2026-10-24T20:38:28.3019327Z  111 │ │                   "content-type": "application/json",
2026-10-24T20:38:28.3019466Z  112 │ │                   accept: "application/json, text/event-stream",
2026-10-24T20:38:28.3019594Z  113 │ │                   authorization: options.authorization,
2026-10-24T20:38:28.3019717Z  114 │ │                   ...(connection.sessionId === null
2026-10-24T20:38:28.3019857Z  115 │ │                     ? {}
2026-10-24T20:38:28.3020024Z  116 │ │                     : { "mcp-session-id": connection.sessionId }),
2026-10-24T20:38:28.3020155Z  117 │ │                   ...(connection.protocolVersion === null
2026-10-24T20:38:28.3020246Z  118 │ │                     ? {}
2026-10-24T20:38:28.3020406Z  119 │ │                     : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T20:38:28.3020493Z  120 │ │                 },
2026-10-24T20:38:28.3020585Z  121 │ │                 body,
2026-10-24T20:38:28.3020669Z  122 │ │               }),
2026-10-24T20:38:28.3020767Z  123 │ │             catch: bridgeError,
2026-10-24T20:38:28.3020866Z  124 │ │           });
2026-10-24T20:38:28.3021085Z  125 │ │           connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId;
2026-10-24T20:38:28.3021186Z  126 │ │           if (!response.ok) {
2026-10-24T20:38:28.3021288Z  127 │ │             yield* Effect.promise(
2026-10-24T20:38:28.3021465Z  128 │ │               () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T20:38:28.3021545Z  129 │ │             );
2026-10-24T20:38:28.3021654Z  130 │ │             return yield* Effect.fail(
2026-10-24T20:38:28.3021862Z  131 │ │               new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`),
2026-10-24T20:38:28.3021940Z  132 │ │             );
2026-10-24T20:38:28.3022014Z  133 │ │           }
2026-10-24T20:38:28.3022226Z  134 │ │           const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))];
2026-10-24T20:38:28.3022345Z  135 │ │           for (const payload of payloads) {
2026-10-24T20:38:28.3022555Z  136 │ │             connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion;
2026-10-24T20:38:28.3022632Z  137 │ │           }
2026-10-24T20:38:28.3022727Z  138 │ │           return payloads;
2026-10-24T20:38:28.3022849Z  139 │ │         }).pipe(Effect.mapError(bridgeError)),
2026-10-24T20:38:28.3022921Z  140 │ │       );
2026-10-24T20:38:28.3022991Z  141 │ │
2026-10-24T20:38:28.3023162Z  142 │ │     const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* (
2026-10-24T20:38:28.3023336Z  143 │ │       request: AcpSchema.DisconnectMcpRequest,
2026-10-24T20:38:28.3023545Z  144 │ │     ): Effect.fn.Return<AcpSchema.DisconnectMcpResponse, AcpMcpOverAcpError> {
2026-10-24T20:38:28.3023703Z  145 │ │       const connection = yield* connectionFor(request.connectionId);
2026-10-24T20:38:28.3023829Z  146 │ │       connections.delete(request.connectionId);
2026-10-24T20:38:28.3023948Z  147 │ │       const sessionId = connection.sessionId;
2026-10-24T20:38:28.3024047Z  148 │ │       if (sessionId !== null) {
2026-10-24T20:38:28.3024173Z  149 │ │         const response = yield* Effect.tryPromise({
2026-10-24T20:38:28.3024268Z  150 │ │           try: (signal) =>
2026-10-24T20:38:28.3024398Z  151 │ │             fetchImplementation(options.endpoint, {
2026-10-24T20:38:28.3024496Z  152 │ │               method: "DELETE",
2026-10-24T20:38:28.3024585Z  153 │ │               signal,
2026-10-24T20:38:28.3024679Z  154 │ │               headers: {
2026-10-24T20:38:28.3024806Z  155 │ │                 authorization: options.authorization,
2026-10-24T20:38:28.3024920Z  156 │ │                 "mcp-session-id": sessionId,
2026-10-24T20:38:28.3025051Z  157 │ │                 ...(connection.protocolVersion === null
2026-10-24T20:38:28.3025141Z  158 │ │                   ? {}
2026-10-24T20:38:28.3025301Z  159 │ │                   : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T20:38:28.3025383Z  160 │ │               },
2026-10-24T20:38:28.3025470Z  161 │ │             }),
2026-10-24T20:38:28.3025573Z  162 │ │           catch: bridgeError,
2026-10-24T20:38:28.3025652Z  163 │ │         });
2026-10-24T20:38:28.3025782Z  164 │ │         if (!response.ok && response.status !== 404) {
2026-10-24T20:38:28.3025893Z  165 │ │           return yield* Effect.fail(
2026-10-24T20:38:28.3026002Z  166 │ │             new AcpMcpOverAcpError(
2026-10-24T20:38:28.3026185Z  167 │ │               `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`,
2026-10-24T20:38:28.3026266Z  168 │ │             ),
2026-10-24T20:38:28.3026343Z  169 │ │           );
2026-10-24T20:38:28.3026421Z  170 │ │         }
2026-10-24T20:38:28.3026532Z  171 │ │         yield* Effect.promise(
2026-10-24T20:38:28.3026710Z  172 │ │           () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T20:38:28.3026785Z  173 │ │         );
2026-10-24T20:38:28.3026860Z  174 │ │       }
2026-10-24T20:38:28.3026947Z  175 │ │       return {};
2026-10-24T20:38:28.3027019Z  176 │ │     });
2026-10-24T20:38:28.3027089Z  177 │ │
2026-10-24T20:38:28.3027168Z  178 │ │     return {
2026-10-24T20:38:28.3027339Z  179 │ │       connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) {
2026-10-24T20:38:28.3027456Z  180 │ │         if (request.serverId !== "t3-code") {
2026-10-24T20:38:28.3027564Z  181 │ │           return yield* Effect.fail(
2026-10-24T20:38:28.3027803Z  182 │ │             new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`),
2026-10-24T20:38:28.3027910Z  183 │ │           );
2026-10-24T20:38:28.3027987Z  184 │ │         }
2026-10-24T20:38:28.3028112Z  185 │ │         if (connections.size >= MAX_CONNECTIONS) {
2026-10-24T20:38:28.3028320Z  186 │ │           return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections."));
2026-10-24T20:38:28.3028397Z  187 │ │         }
2026-10-24T20:38:28.3028552Z  188 │ │         const connectionId = yield* options.allocateConnectionId;
2026-10-24T20:38:28.3028663Z  189 │ │         connections.set(connectionId, {
2026-10-24T20:38:28.3028781Z  190 │ │           mutex: yield* Semaphore.make(1),
2026-10-24T20:38:28.3028884Z  191 │ │           sessionId: null,
2026-10-24T20:38:28.3028992Z  192 │ │           protocolVersion: null,
2026-10-24T20:38:28.3029089Z  193 │ │           nextRequestId: 0,
2026-10-24T20:38:28.3029167Z  194 │ │         });
2026-10-24T20:38:28.3029270Z  195 │ │         return { connectionId };
2026-10-24T20:38:28.3029352Z  196 │ │       }),
2026-10-24T20:38:28.3029518Z  197 │ │       message: Effect.fn("mcpOverAcpBridge.message")(function* (request) {
2026-10-24T20:38:28.3029681Z  198 │ │         const connection = yield* connectionFor(request.connectionId);
2026-10-24T20:38:28.3029803Z  199 │ │         const id = ++connection.nextRequestId;
2026-10-24T20:38:28.3029936Z  200 │ │         const payloads = yield* send(connection, {
2026-10-24T20:38:28.3030034Z  201 │ │           jsonrpc: "2.0",
2026-10-24T20:38:28.3030117Z  202 │ │           id,
2026-10-24T20:38:28.3030260Z  203 │ │           method: request.method,
2026-10-24T20:38:28.3030532Z  204 │ │           ...(request.params == null ? {} : { params: request.params }),
2026-10-24T20:38:28.3030646Z  205 │ │         });
2026-10-24T20:38:28.3030879Z  206 │ │         const response = payloads.find((payload) => asEnvelope(payload)?.id === id);
2026-10-24T20:38:28.3032310Z  207 │ │         const envelope = asEnvelope(response);
2026-10-24T20:38:28.3032447Z  208 │ │         if (envelope === null) {
2026-10-24T20:38:28.3032575Z  209 │ │           return yield* Effect.fail(
2026-10-24T20:38:28.3032798Z  210 │ │             new AcpMcpOverAcpError("MCP server did not return a matching response."),
2026-10-24T20:38:28.3032908Z  211 │ │           );
2026-10-24T20:38:28.3033004Z  212 │ │         }
2026-10-24T20:38:28.3033143Z  213 │ │         if (envelope.error !== undefined) {
2026-10-24T20:38:28.3033378Z  214 │ │           return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error)));
2026-10-24T20:38:28.3033482Z  215 │ │         }
2026-10-24T20:38:28.3033676Z  216 │ │         return (envelope.result ?? null) as AcpSchema.MessageMcpResponse;
2026-10-24T20:38:28.3033756Z  217 │ │       }),
2026-10-24T20:38:28.3033997Z  218 │ │       notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) {
2026-10-24T20:38:28.3034251Z  219 │ │         const connection = yield* connectionFor(request.connectionId);
2026-10-24T20:38:28.3034470Z  220 │ │         yield* send(connection, {
2026-10-24T20:38:28.3034578Z  221 │ │           jsonrpc: "2.0",
2026-10-24T20:38:28.3034714Z  222 │ │           method: request.method,
2026-10-24T20:38:28.3034903Z  223 │ │           ...(request.params == null ? {} : { params: request.params }),
2026-10-24T20:38:28.3035013Z  224 │ │         });
2026-10-24T20:38:28.3035099Z  225 │ │       }),
2026-10-24T20:38:28.3035210Z  226 │ │       disconnect,
2026-10-24T20:38:28.3035365Z  227 │ │       dispose: Effect.suspend(() =>
2026-10-24T20:38:28.3035490Z  228 │ │         Effect.forEach(
2026-10-24T20:38:28.3035627Z  229 │ │           [...connections.keys()],
2026-10-24T20:38:28.3035812Z  230 │ │           (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore),
2026-10-24T20:38:28.3035942Z  231 │ │           { discard: true },
2026-10-24T20:38:28.3036056Z  232 │ │         ),
2026-10-24T20:38:28.3036159Z  233 │ │       ),
2026-10-24T20:38:28.3036249Z  234 │ │     };
2026-10-24T20:38:28.3036397Z  235 │ ╰─▶ });
2026-10-24T20:38:28.3036497Z      ╰────
2026-10-24T20:38:28.3036774Z   help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed.
2026-10-24T20:38:28.3036777Z
2026-10-24T20:38:28.3036987Z   ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used.
2026-10-24T20:38:28.3037214Z     ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10]
2026-10-24T20:38:28.3037377Z  16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native";
2026-10-24T20:38:28.3037527Z  17 │ import { Image, Platform, StyleSheet } from "react-native";
2026-10-24T20:38:28.3037611Z     ·          ──┬──
2026-10-24T20:38:28.3037769Z     ·            ╰── 'Image' is imported here
2026-10-24T20:38:28.3037843Z  18 │
2026-10-24T20:38:28.3037944Z     ╰────
2026-10-24T20:38:28.3038054Z   help: Consider removing this import.
2026-10-24T20:38:28.3038057Z
2026-10-24T20:38:28.3038294Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3038470Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6]
2026-10-24T20:38:28.3038665Z  225 │     nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
2026-10-24T20:38:28.3038791Z  226 │       nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3038899Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3039404Z      ·                  ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3039985Z  227 │       mostRecentEventCount,
2026-10-24T20:38:28.3040253Z  228 │     );
2026-10-24T20:38:28.3040521Z  229 │   }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
2026-10-24T20:38:28.3040863Z      ·      ──────────────────────────┬──────────────────────────
2026-10-24T20:38:28.3041354Z      ·                                ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3041712Z  230 │   const assumedValue = props.value;
2026-10-24T20:38:28.3041906Z      ╰────
2026-10-24T20:38:28.3042202Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3043058Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3043415Z
2026-10-24T20:38:28.3043712Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T20:38:28.3044142Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7]
2026-10-24T20:38:28.3044502Z  236 │     nativeEventSnapshotsRef.current = assumeComposerControlledState(
2026-10-24T20:38:28.3044801Z  237 │       nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3045066Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3045675Z      ·                  ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3046237Z  238 │       controlledEventCount,
2026-10-24T20:38:28.3046435Z  239 │       assumedValue,
2026-10-24T20:38:28.3046637Z  240 │     );
2026-10-24T20:38:28.3046960Z  241 │   }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
2026-10-24T20:38:28.3047770Z      ·                                                         ───────────┬──────────
2026-10-24T20:38:28.3048298Z      ·                                                                    ╰── Unnecessary dependency `controlledDocumentJson`
2026-10-24T20:38:28.3048644Z  242 │   const acceptNativeEvent = useCallback(
2026-10-24T20:38:28.3048854Z      ╰────
2026-10-24T20:38:28.3049389Z   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-24T20:38:28.3050124Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3050454Z
2026-10-24T20:38:28.3050628Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3051005Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29]
2026-10-24T20:38:28.3051411Z  161 │     const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3051704Z  162 │       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3052081Z      ·                             ─────────────┬────────────
2026-10-24T20:38:28.3052534Z      ·                                          ╰── Cannot access ref value during render
2026-10-24T20:38:28.3052865Z  163 │     });
2026-10-24T20:38:28.3053026Z      ╰────
2026-10-24T20:38:28.3053738Z   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-24T20:38:28.3054551Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3054891Z
2026-10-24T20:38:28.3055057Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3055470Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29]
2026-10-24T20:38:28.3055797Z  161 │     const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3056101Z  162 │       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3056401Z      ·                             ─────────────┬────────────
2026-10-24T20:38:28.3056774Z      ·                                          ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3057203Z  163 │     });
2026-10-24T20:38:28.3057359Z      ╰────
2026-10-24T20:38:28.3058003Z   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-24T20:38:28.3058809Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3059175Z
2026-10-24T20:38:28.3059354Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3059702Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23]
2026-10-24T20:38:28.3059952Z  163 │     });
2026-10-24T20:38:28.3060143Z  164 │     confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3060437Z      ·     ─────────┬────────────┬───
2026-10-24T20:38:28.3060801Z      ·              │            ╰── Cannot update ref value during render
2026-10-24T20:38:28.3061182Z      ·              ╰── This value is a ref
2026-10-24T20:38:28.3061432Z  165 │     return JSON.stringify(
2026-10-24T20:38:28.3061633Z      ╰────
2026-10-24T20:38:28.3062254Z   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-24T20:38:28.3063021Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3063317Z
2026-10-24T20:38:28.3063561Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3063925Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5]
2026-10-24T20:38:28.3064203Z  205 │     mostRecentEventCount,
2026-10-24T20:38:28.3064432Z  206 │     nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3064681Z      ·     ───────────────┬───────────────
2026-10-24T20:38:28.3065044Z      ·                    ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3065376Z  207 │   );
2026-10-24T20:38:28.3065561Z      ╰────
2026-10-24T20:38:28.3066116Z   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-24T20:38:28.3066890Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3067201Z
2026-10-24T20:38:28.3067372Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3067695Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5]
2026-10-24T20:38:28.3067987Z  211 │     mostRecentEventCount,
2026-10-24T20:38:28.3068205Z  212 │     nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3068481Z      ·     ───────────────┬───────────────
2026-10-24T20:38:28.3068861Z      ·                    ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3069161Z  213 │   );
2026-10-24T20:38:28.3069312Z      ╰────
2026-10-24T20:38:28.3069867Z   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-24T20:38:28.3070647Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3070987Z
2026-10-24T20:38:28.3071190Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3071697Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6]
2026-10-24T20:38:28.3072026Z  161 │     const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3075742Z  162 │       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3075988Z      ·                             ─────────┬────────
2026-10-24T20:38:28.3076572Z      ·                                      ╰── Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3077037Z  163 │     });
2026-10-24T20:38:28.3077196Z  164 │     confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3077373Z  165 │     return JSON.stringify(
2026-10-24T20:38:28.3077624Z  166 │       composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
2026-10-24T20:38:28.3077861Z  167 │         const record =
2026-10-24T20:38:28.3078022Z  168 │           token.type === "context"
2026-10-24T20:38:28.3078286Z  169 │             ? props.context?.records.find((record) => record.contextId === token.contextId)
2026-10-24T20:38:28.3078519Z  170 │             : undefined;
2026-10-24T20:38:28.3078811Z  171 │         const presentation = contextChipPresentation(
2026-10-24T20:38:28.3079080Z  172 │           token.type === "context" ? token.kind : token.type,
2026-10-24T20:38:28.3079269Z  173 │           record,
2026-10-24T20:38:28.3079404Z  174 │         );
2026-10-24T20:38:28.3079556Z  175 │         const icon = contextChipIcon(
2026-10-24T20:38:28.3079721Z  176 │           presentation,
2026-10-24T20:38:28.3079944Z  177 │           token.type === "mention" ? token.value : contextRecordFileName(record),
2026-10-24T20:38:28.3080151Z  178 │         );
2026-10-24T20:38:28.3080279Z  179 │         return {
2026-10-24T20:38:28.3080428Z  180 │           type: token.type,
2026-10-24T20:38:28.3080586Z  181 │           source: token.source,
2026-10-24T20:38:28.3080749Z  182 │           start: token.start,
2026-10-24T20:38:28.3080921Z  183 │           end: token.end,
2026-10-24T20:38:28.3081201Z  184 │           accent: contextChipAccent(presentation.accent, theme, chipTextColor),
2026-10-24T20:38:28.3081418Z  185 │           label:
2026-10-24T20:38:28.3081569Z  186 │             token.type === "skill"
2026-10-24T20:38:28.3081776Z  187 │               ? (skillLabels.get(token.value) ?? token.value)
2026-10-24T20:38:28.3081976Z  188 │               : token.type === "context"
2026-10-24T20:38:28.3082311Z  189 │                 ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
2026-10-24T20:38:28.3082618Z  190 │                 : basename(token.value),
2026-10-24T20:38:28.3082864Z  191 │           detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
2026-10-24T20:38:28.3083104Z  192 │           iconUri: contextChipIconUri(icon),
2026-10-24T20:38:28.3083304Z  193 │           tintsIcon: icon.kind === "chip",
2026-10-24T20:38:28.3083466Z  194 │         };
2026-10-24T20:38:28.3083592Z  195 │       }),
2026-10-24T20:38:28.3083714Z  196 │     );
2026-10-24T20:38:28.3083911Z  197 │   }, [props.value, props.context, skillLabels, theme, chipTextColor]);
2026-10-24T20:38:28.3084202Z      ·      ───────────────────────────────┬───────────────────────────────
2026-10-24T20:38:28.3084547Z      ·                                     ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3084872Z  198 │   // Every render resolves against the snapshot history, so a render whose
2026-10-24T20:38:28.3085071Z      ╰────
2026-10-24T20:38:28.3085331Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3085857Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3086154Z
2026-10-24T20:38:28.3086340Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3086661Z      ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5]
2026-10-24T20:38:28.3086935Z  251 │       mostRecentEventCountRef.current = acknowledgedEventCount;
2026-10-24T20:38:28.3087172Z  252 │       nativeEventSnapshotsRef.current.push({
2026-10-24T20:38:28.3087380Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3087932Z      ·                  ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3088484Z  253 │         eventCount: acknowledgedEventCount,
2026-10-24T20:38:28.3088743Z  254 │         value,
2026-10-24T20:38:28.3088931Z  255 │         selection: nextSelection,
2026-10-24T20:38:28.3089082Z  256 │       });
2026-10-24T20:38:28.3089251Z  257 │       return acknowledgedEventCount;
2026-10-24T20:38:28.3089407Z  258 │     },
2026-10-24T20:38:28.3089526Z  259 │     [],
2026-10-24T20:38:28.3089659Z      ·     ─┬
2026-10-24T20:38:28.3089917Z      ·      ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3090143Z  260 │   );
2026-10-24T20:38:28.3090251Z      ╰────
2026-10-24T20:38:28.3090506Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3091060Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3091354Z
2026-10-24T20:38:28.3091555Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3091973Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6]
2026-10-24T20:38:28.3092274Z  227 │     nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
2026-10-24T20:38:28.3092528Z  228 │       nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3092733Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3093281Z      ·                  ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3093756Z  229 │       mostRecentEventCount,
2026-10-24T20:38:28.3093901Z  230 │     );
2026-10-24T20:38:28.3094094Z  231 │   }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
2026-10-24T20:38:28.3094360Z      ·      ──────────────────────────┬──────────────────────────
2026-10-24T20:38:28.3094684Z      ·                                ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3094950Z  232 │   const assumedValue = props.value;
2026-10-24T20:38:28.3095102Z      ╰────
2026-10-24T20:38:28.3095322Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3095813Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3096106Z
2026-10-24T20:38:28.3096323Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T20:38:28.3096665Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7]
2026-10-24T20:38:28.3096945Z  238 │     nativeEventSnapshotsRef.current = assumeComposerControlledState(
2026-10-24T20:38:28.3097185Z  239 │       nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3097382Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3097932Z      ·                  ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3098398Z  240 │       controlledEventCount,
2026-10-24T20:38:28.3098551Z  241 │       assumedValue,
2026-10-24T20:38:28.3098685Z  242 │     );
2026-10-24T20:38:28.3098960Z  243 │   }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
2026-10-24T20:38:28.3099284Z      ·                                                         ───────────┬──────────
2026-10-24T20:38:28.3099615Z      ·                                                                    ╰── Unnecessary dependency `controlledDocumentJson`
2026-10-24T20:38:28.3099886Z  244 │   const acceptNativeEvent = useCallback(
2026-10-24T20:38:28.3100039Z      ╰────
2026-10-24T20:38:28.3100504Z   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-24T20:38:28.3101217Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3101510Z
2026-10-24T20:38:28.3101654Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3101937Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29]
2026-10-24T20:38:28.3102199Z  163 │     const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3102443Z  164 │       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3102684Z      ·                             ─────────────┬────────────
2026-10-24T20:38:28.3102966Z      ·                                          ╰── Cannot access ref value during render
2026-10-24T20:38:28.3103178Z  165 │     });
2026-10-24T20:38:28.3103289Z      ╰────
2026-10-24T20:38:28.3103812Z   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-24T20:38:28.3104517Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3104792Z
2026-10-24T20:38:28.3104935Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3105213Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29]
2026-10-24T20:38:28.3105478Z  163 │     const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3105720Z  164 │       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3105959Z      ·                             ─────────────┬────────────
2026-10-24T20:38:28.3106325Z      ·                                          ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3106600Z  165 │     });
2026-10-24T20:38:28.3106711Z      ╰────
2026-10-24T20:38:28.3107224Z   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-24T20:38:28.3107923Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3108202Z
2026-10-24T20:38:28.3108343Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3108625Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23]
2026-10-24T20:38:28.3108827Z  165 │     });
2026-10-24T20:38:28.3108976Z  166 │     confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3109204Z      ·     ─────────┬────────────┬───
2026-10-24T20:38:28.3109508Z      ·              │            ╰── Cannot update ref value during render
2026-10-24T20:38:28.3109795Z      ·              ╰── This value is a ref
2026-10-24T20:38:28.3109984Z  167 │     return JSON.stringify(
2026-10-24T20:38:28.3110122Z      ╰────
2026-10-24T20:38:28.3110631Z   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-24T20:38:28.3111498Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3111777Z
2026-10-24T20:38:28.3111918Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3112199Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5]
2026-10-24T20:38:28.3112406Z  207 │     mostRecentEventCount,
2026-10-24T20:38:28.3112580Z  208 │     nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3112784Z      ·     ───────────────┬───────────────
2026-10-24T20:38:28.3113073Z      ·                    ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3113302Z  209 │   );
2026-10-24T20:38:28.3113412Z      ╰────
2026-10-24T20:38:28.3113927Z   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-24T20:38:28.3114631Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3114904Z
2026-10-24T20:38:28.3115045Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3115325Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5]
2026-10-24T20:38:28.3115532Z  213 │     mostRecentEventCount,
2026-10-24T20:38:28.3115705Z  214 │     nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3115907Z      ·     ───────────────┬───────────────
2026-10-24T20:38:28.3116261Z      ·                    ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3116534Z  215 │   );
2026-10-24T20:38:28.3116641Z      ╰────
2026-10-24T20:38:28.3117151Z   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-24T20:38:28.3117854Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3118128Z
2026-10-24T20:38:28.3118308Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3118620Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6]
2026-10-24T20:38:28.3118883Z  163 │     const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3119127Z  164 │       preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3119357Z      ·                             ─────────┬────────
2026-10-24T20:38:28.3119928Z      ·                                      ╰── Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3120382Z  165 │     });
2026-10-24T20:38:28.3120534Z  166 │     confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3120705Z  167 │     return JSON.stringify(
2026-10-24T20:38:28.3121000Z  168 │       composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
2026-10-24T20:38:28.3121237Z  169 │         const record =
2026-10-24T20:38:28.3121400Z  170 │           token.type === "context"
2026-10-24T20:38:28.3121660Z  171 │             ? props.context?.records.find((record) => record.contextId === token.contextId)
2026-10-24T20:38:28.3121887Z  172 │             : undefined;
2026-10-24T20:38:28.3122075Z  173 │         const presentation = contextChipPresentation(
2026-10-24T20:38:28.3122299Z  174 │           token.type === "context" ? token.kind : token.type,
2026-10-24T20:38:28.3122483Z  175 │           record,
2026-10-24T20:38:28.3122615Z  176 │         );
2026-10-24T20:38:28.3122764Z  177 │         const icon = contextChipIcon(
2026-10-24T20:38:28.3122926Z  178 │           presentation,
2026-10-24T20:38:28.3123148Z  179 │           token.type === "mention" ? token.value : contextRecordFileName(record),
2026-10-24T20:38:28.3123354Z  180 │         );
2026-10-24T20:38:28.3123480Z  181 │         return {
2026-10-24T20:38:28.3123630Z  182 │           type: token.type,
2026-10-24T20:38:28.3123791Z  183 │           source: token.source,
2026-10-24T20:38:28.3123954Z  184 │           start: token.start,
2026-10-24T20:38:28.3124105Z  185 │           end: token.end,
2026-10-24T20:38:28.3124333Z  186 │           accent: contextChipAccent(presentation.accent, theme, chipTextColor),
2026-10-24T20:38:28.3124545Z  187 │           label:
2026-10-24T20:38:28.3124693Z  188 │             token.type === "skill"
2026-10-24T20:38:28.3124895Z  189 │               ? (skillLabels.get(token.value) ?? token.value)
2026-10-24T20:38:28.3125095Z  190 │               : token.type === "context"
2026-10-24T20:38:28.3125420Z  191 │                 ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
2026-10-24T20:38:28.3125721Z  192 │                 : basename(token.value),
2026-10-24T20:38:28.3126015Z  193 │           detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
2026-10-24T20:38:28.3126282Z  194 │           iconUri: contextChipIconUri(icon),
2026-10-24T20:38:28.3126474Z  195 │           tintsIcon: icon.kind === "chip",
2026-10-24T20:38:28.3126633Z  196 │         };
2026-10-24T20:38:28.3126755Z  197 │       }),
2026-10-24T20:38:28.3126873Z  198 │     );
2026-10-24T20:38:28.3127066Z  199 │   }, [props.value, props.context, skillLabels, theme, chipTextColor]);
2026-10-24T20:38:28.3127356Z      ·      ───────────────────────────────┬───────────────────────────────
2026-10-24T20:38:28.3127694Z      ·                                     ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3128020Z  200 │   // Every render resolves against the snapshot history, so a render whose
2026-10-24T20:38:28.3128216Z      ╰────
2026-10-24T20:38:28.3128477Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3128986Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3129278Z
2026-10-24T20:38:28.3129459Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3129770Z      ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5]
2026-10-24T20:38:28.3130038Z  253 │       mostRecentEventCountRef.current = acknowledgedEventCount;
2026-10-24T20:38:28.3130274Z  254 │       nativeEventSnapshotsRef.current.push({
2026-10-24T20:38:28.3130477Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3131061Z      ·                  ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3131555Z  255 │         eventCount: acknowledgedEventCount,
2026-10-24T20:38:28.3131722Z  256 │         value,
2026-10-24T20:38:28.3131873Z  257 │         selection: nextSelection,
2026-10-24T20:38:28.3132023Z  258 │       });
2026-10-24T20:38:28.3132171Z  259 │       return acknowledgedEventCount;
2026-10-24T20:38:28.3132323Z  260 │     },
2026-10-24T20:38:28.3132440Z  261 │     [],
2026-10-24T20:38:28.3132565Z      ·     ─┬
2026-10-24T20:38:28.3132820Z      ·      ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3133044Z  262 │   );
2026-10-24T20:38:28.3133151Z      ╰────
2026-10-24T20:38:28.3133411Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3133919Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3134214Z
2026-10-24T20:38:28.3134469Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3134835Z      ╭─[apps/server/src/serverRuntimeStartup.ts:728:7]
2026-10-24T20:38:28.3135018Z  727 │
2026-10-24T20:38:28.3135149Z  728 │ const layer = layerWithOptions();
2026-10-24T20:38:28.3135315Z      ·       ──┬──
2026-10-24T20:38:28.3135515Z      ·         ╰── 'layer' is declared here
2026-10-24T20:38:28.3135690Z      ╰────
2026-10-24T20:38:28.3135898Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3136043Z
2026-10-24T20:38:28.3136241Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T20:38:28.3136592Z    ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
2026-10-24T20:38:28.3136830Z  3 │   AuthProvidersManageScope,
2026-10-24T20:38:28.3136986Z  4 │   type AuthSessionState,
2026-10-24T20:38:28.3137155Z    ·        ────────┬───────
2026-10-24T20:38:28.3137390Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T20:38:28.3137595Z  5 │   type EnvironmentId,
2026-10-24T20:38:28.3137728Z    ╰────
2026-10-24T20:38:28.3137873Z   help: Consider removing this import.
2026-10-24T20:38:28.3137985Z
2026-10-24T20:38:28.3138182Z   ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used.
2026-10-24T20:38:28.3138504Z    ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3]
2026-10-24T20:38:28.3138709Z  1 │ import type {
2026-10-24T20:38:28.3138841Z  2 │   EnvironmentId,
2026-10-24T20:38:28.3138988Z    ·   ──────┬──────
2026-10-24T20:38:28.3139202Z    ·         ╰── 'EnvironmentId' is imported here
2026-10-24T20:38:28.3139418Z  3 │   ExecutionEnvironmentCapabilities,
2026-10-24T20:38:28.3139567Z    ╰────
2026-10-24T20:38:28.3139710Z   help: Consider removing this import.
2026-10-24T20:38:28.3139819Z
2026-10-24T20:38:28.3140287Z   ⚠ 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-24T20:38:28.3140877Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
2026-10-24T20:38:28.3141088Z  168 │           });
2026-10-24T20:38:28.3141352Z  169 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-24T20:38:28.3141721Z  170 │ │           if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
2026-10-24T20:38:28.3142011Z  171 │ │           yield* Effect.yieldNow;
2026-10-24T20:38:28.3142257Z  172 │ ╰─▶       }
2026-10-24T20:38:28.3142439Z  173 │
2026-10-24T20:38:28.3142548Z      ╰────
2026-10-24T20:38:28.3142605Z
2026-10-24T20:38:28.3143069Z   ⚠ 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-24T20:38:28.3143624Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
2026-10-24T20:38:28.3143879Z  177 │           yield* Deferred.succeed(releaseSave, undefined);
2026-10-24T20:38:28.3144189Z  178 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-24T20:38:28.3144497Z  179 │ │           if ((yield* Ref.get(saved)).length > 0) break;
2026-10-24T20:38:28.3144735Z  180 │ │           yield* Effect.yieldNow;
2026-10-24T20:38:28.3144975Z  181 │ ╰─▶       }
2026-10-24T20:38:28.3145162Z  182 │
2026-10-24T20:38:28.3145269Z      ╰────
2026-10-24T20:38:28.3145378Z
2026-10-24T20:38:28.3145858Z   ⚠ 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-24T20:38:28.3146405Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
2026-10-24T20:38:28.3146680Z  306 │           yield* Deferred.succeed(releaseUnenrichedSave, undefined);
2026-10-24T20:38:28.3147001Z  307 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-24T20:38:28.3147297Z  308 │ │           const values = yield* Ref.get(saved);
2026-10-24T20:38:28.3147615Z  309 │ │           if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
2026-10-24T20:38:28.3147890Z  310 │ │             break;
2026-10-24T20:38:28.3148068Z  311 │ │           }
2026-10-24T20:38:28.3148261Z  312 │ │           yield* Effect.yieldNow;
2026-10-24T20:38:28.3148504Z  313 │ ╰─▶       }
2026-10-24T20:38:28.3148687Z  314 │
2026-10-24T20:38:28.3148794Z      ╰────
2026-10-24T20:38:28.3148848Z
2026-10-24T20:38:28.3149043Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3149378Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
2026-10-24T20:38:28.3149622Z  256 │     return () => cancelAnimationFrame(frame);
2026-10-24T20:38:28.3149808Z  257 │   }, [props.path, targetIndex]);
2026-10-24T20:38:28.3149980Z      ·       ─────┬────
2026-10-24T20:38:28.3150215Z      ·            ╰── Unnecessary dependency `props.path`
2026-10-24T20:38:28.3150410Z  258 │
2026-10-24T20:38:28.3150517Z      ╰────
2026-10-24T20:38:28.3151034Z   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-24T20:38:28.3151665Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3151958Z
2026-10-24T20:38:28.3152146Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3152476Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
2026-10-24T20:38:28.3152695Z  292 │                     <SourceText
2026-10-24T20:38:28.3152948Z  293 │                       key={`${index}:${tokenIndex}`}
2026-10-24T20:38:28.3153217Z      ·                       ──────────────────────────────
2026-10-24T20:38:28.3153406Z  294 │                       style={{
2026-10-24T20:38:28.3153542Z      ╰────
2026-10-24T20:38:28.3153736Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3153889Z
2026-10-24T20:38:28.3154076Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3154402Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
2026-10-24T20:38:28.3154615Z  308 │             return (
2026-10-24T20:38:28.3154778Z  309 │               <SourceText key={index}>
2026-10-24T20:38:28.3154973Z      ·                           ───────────
2026-10-24T20:38:28.3155148Z  310 │                 {body}
2026-10-24T20:38:28.3155282Z      ╰────
2026-10-24T20:38:28.3155474Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3155625Z
2026-10-24T20:38:28.3155878Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3156253Z      ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
2026-10-24T20:38:28.3156446Z  150 │
2026-10-24T20:38:28.3156567Z  151 │   useEffect(() => {
2026-10-24T20:38:28.3156716Z      ·   ────┬────
2026-10-24T20:38:28.3156923Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3157135Z  152 │     if (!controlledSelectedPath) {
2026-10-24T20:38:28.3157292Z  153 │       return;
2026-10-24T20:38:28.3157417Z  154 │     }
2026-10-24T20:38:28.3157567Z  155 │     setExpandedPaths((current) => {
2026-10-24T20:38:28.3157745Z      ·     ────────┬───────
2026-10-24T20:38:28.3158002Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3158287Z  156 │       const ancestors = ancestorPaths(controlledSelectedPath);
2026-10-24T20:38:28.3158471Z      ╰────
2026-10-24T20:38:28.3159115Z   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-24T20:38:28.3159973Z   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-24T20:38:28.3160276Z
2026-10-24T20:38:28.3160730Z   ⚠ 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-24T20:38:28.3161325Z       ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7]
2026-10-24T20:38:28.3161572Z  1679 │           yield* harness.replaceSession;
2026-10-24T20:38:28.3161883Z  1680 │ ╭─▶       for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T20:38:28.3162221Z  1681 │ │           if ((yield* Ref.get(harness.subscriptionCount)) >= 2) {
2026-10-24T20:38:28.3162458Z  1682 │ │             break;
2026-10-24T20:38:28.3162692Z  1683 │ │           }
2026-10-24T20:38:28.3162921Z  1684 │ │           yield* Effect.yieldNow;
2026-10-24T20:38:28.3163168Z  1685 │ ╰─▶       }
2026-10-24T20:38:28.3163372Z  1686 │           yield* Queue.offer(
2026-10-24T20:38:28.3163512Z       ╰────
2026-10-24T20:38:28.3163565Z
2026-10-24T20:38:28.3164021Z   ⚠ 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-24T20:38:28.3164580Z       ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7]
2026-10-24T20:38:28.3164824Z  1788 │           yield* harness.replaceSession;
2026-10-24T20:38:28.3165132Z  1789 │ ╭─▶       for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T20:38:28.3165476Z  1790 │ │           if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break;
2026-10-24T20:38:28.3165734Z  1791 │ │           yield* Effect.yieldNow;
2026-10-24T20:38:28.3165981Z  1792 │ ╰─▶       }
2026-10-24T20:38:28.3166237Z  1793 │           expect(yield* Ref.get(harness.subscriptionCount)).toBe(2);
2026-10-24T20:38:28.3166425Z       ╰────
2026-10-24T20:38:28.3166478Z
2026-10-24T20:38:28.3166657Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T20:38:28.3167013Z      ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34]
2026-10-24T20:38:28.3167263Z  115 │     return [...commands];
2026-10-24T20:38:28.3167483Z  116 │   }, [activeThreadRef, pathname, registrationVersion, navigation]);
2026-10-24T20:38:28.3167736Z      ·                                  ─────────┬─────────
2026-10-24T20:38:28.3168032Z      ·                                           ╰── Unnecessary dependency `registrationVersion`
2026-10-24T20:38:28.3168251Z  117 │
2026-10-24T20:38:28.3168357Z      ╰────
2026-10-24T20:38:28.3168724Z   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-24T20:38:28.3169322Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3169618Z
2026-10-24T20:38:28.3169832Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T20:38:28.3170157Z     ╭─[apps/web/src/lib/announce.browser.test.ts:41:46]
2026-10-24T20:38:28.3170336Z  40 │
2026-10-24T20:38:28.3170497Z  41 │     expect(regionTexts()).toEqual([...first].reverse());
2026-10-24T20:38:28.3170727Z     ·                                              ───────
2026-10-24T20:38:28.3170943Z  42 │     expect(regionTexts()).toContain("Claude");
2026-10-24T20:38:28.3171129Z     ╰────
2026-10-24T20:38:28.3171434Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T20:38:28.3171681Z
2026-10-24T20:38:28.3172188Z   ⚠ 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-24T20:38:28.3172801Z      ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
2026-10-24T20:38:28.3173049Z  520 │                 })).delivery;
2026-10-24T20:38:28.3173323Z  521 │ ╭─▶             while (delivery.outcome === "accepted") {
2026-10-24T20:38:28.3173614Z  522 │ │                 yield* Effect.yieldNow;
2026-10-24T20:38:28.3173877Z  523 │ │                 delivery = (yield* service.getWebhookDelivery({
2026-10-24T20:38:28.3174124Z  524 │ │                   id: task.id,
2026-10-24T20:38:28.3174348Z  525 │ │                   deliveryId: deliveryId!,
2026-10-24T20:38:28.3174568Z  526 │ │                 })).delivery;
2026-10-24T20:38:28.3174813Z  527 │ ╰─▶             }
2026-10-24T20:38:28.3175067Z  528 │                 assert.equal(delivery.outcome, "dispatch_failed");
2026-10-24T20:38:28.3175240Z      ╰────
2026-10-24T20:38:28.3175294Z
2026-10-24T20:38:28.3175499Z   ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
2026-10-24T20:38:28.3175818Z     ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10]
2026-10-24T20:38:28.3175997Z  78 │
2026-10-24T20:38:28.3176186Z  79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string {
2026-10-24T20:38:28.3176413Z     ·          ────────┬───────
2026-10-24T20:38:28.3176649Z     ·                  ╰── 'describeSchedule' is declared here
2026-10-24T20:38:28.3176894Z  80 │   if (schedule.type === "webhook") return "On webhook";
2026-10-24T20:38:28.3177066Z     ╰────
2026-10-24T20:38:28.3177222Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3177337Z
2026-10-24T20:38:28.3177489Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3177796Z     ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
2026-10-24T20:38:28.3178009Z  35 │
2026-10-24T20:38:28.3178196Z  36 │   const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
2026-10-24T20:38:28.3178423Z     ·         ────────┬────────
2026-10-24T20:38:28.3178656Z     ·                 ╰── `inspectorProgress` originates here
2026-10-24T20:38:28.3178887Z  37 │   const { renderedInspectorWidth } = props;
2026-10-24T20:38:28.3179121Z  38 │   const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T20:38:28.3179316Z  39 │
2026-10-24T20:38:28.3179450Z  40 │   const onClosed = props.onClosed;
2026-10-24T20:38:28.3179608Z  41 │   useEffect(() => {
2026-10-24T20:38:28.3179777Z  42 │     inspectorProgress.value = withTiming(
2026-10-24T20:38:28.3179962Z     ·     ────────┬────────
2026-10-24T20:38:28.3180197Z     ·             ╰── `inspectorProgress` cannot be modified
2026-10-24T20:38:28.3180414Z  43 │       inspectorVisible ? 1 : 0,
2026-10-24T20:38:28.3180555Z     ╰────
2026-10-24T20:38:28.3180901Z   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-24T20:38:28.3181451Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3181740Z
2026-10-24T20:38:28.3181943Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3182284Z     ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
2026-10-24T20:38:28.3182535Z  37 │   const { renderedInspectorWidth } = props;
2026-10-24T20:38:28.3182769Z  38 │   const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T20:38:28.3182996Z     ·         ──────────┬─────────
2026-10-24T20:38:28.3183244Z     ·                   ╰── `renderedContentWidth` originates here
2026-10-24T20:38:28.3183441Z  39 │
2026-10-24T20:38:28.3183573Z  40 │   const onClosed = props.onClosed;
2026-10-24T20:38:28.3183728Z  41 │   useEffect(() => {
2026-10-24T20:38:28.3183893Z  42 │     inspectorProgress.value = withTiming(
2026-10-24T20:38:28.3184071Z  43 │       inspectorVisible ? 1 : 0,
2026-10-24T20:38:28.3184238Z  44 │       WORKSPACE_PANE_TIMING,
2026-10-24T20:38:28.3184396Z  45 │       (finished) => {
2026-10-24T20:38:28.3184611Z  46 │         if (finished === true && !inspectorVisible && onClosed !== undefined) {
2026-10-24T20:38:28.3184824Z  47 │           runOnJS(onClosed)();
2026-10-24T20:38:28.3184968Z  48 │         }
2026-10-24T20:38:28.3185085Z  49 │       },
2026-10-24T20:38:28.3185197Z  50 │     );
2026-10-24T20:38:28.3185384Z  51 │     const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
2026-10-24T20:38:28.3185602Z  52 │     renderedInspectorWidth.set(
2026-10-24T20:38:28.3185836Z  53 │       resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
2026-10-24T20:38:28.3186040Z  54 │     );
2026-10-24T20:38:28.3186151Z  55 │   }, [
2026-10-24T20:38:28.3186279Z  56 │     inspectorProgress,
2026-10-24T20:38:28.3186427Z  57 │     inspectorVisible,
2026-10-24T20:38:28.3186577Z  58 │     inspectorWidth,
2026-10-24T20:38:28.3186719Z  59 │     onClosed,
2026-10-24T20:38:28.3186859Z  60 │     renderedInspectorWidth,
2026-10-24T20:38:28.3187006Z  61 │     resizing,
2026-10-24T20:38:28.3187125Z  62 │   ]);
2026-10-24T20:38:28.3187235Z  63 │
2026-10-24T20:38:28.3187349Z  64 │   useEffect(() => {
2026-10-24T20:38:28.3187517Z  65 │     const targetWidth = inspectorWidth ?? 0;
2026-10-24T20:38:28.3187704Z  66 │     if (!inspectorVisible || resizing) {
2026-10-24T20:38:28.3187901Z  67 │       renderedContentWidth.value = targetWidth;
2026-10-24T20:38:28.3188095Z     ·       ──────────┬─────────
2026-10-24T20:38:28.3188250Z     ·                 ╰── `renderedContentWidth` cannot be modified
2026-10-24T20:38:28.3188308Z  68 │       return;
2026-10-24T20:38:28.3188359Z     ╰────
2026-10-24T20:38:28.3188626Z   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-24T20:38:28.3188931Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3188933Z
2026-10-24T20:38:28.3189098Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T20:38:28.3189214Z      ╭─[apps/server/src/processRunner.test.ts:266:14]
2026-10-24T20:38:28.3189267Z  265 │
2026-10-24T20:38:28.3189370Z  266 │   for (const {} of ["timeout", "success"] as const) {
2026-10-24T20:38:28.3189440Z      ·              ──
2026-10-24T20:38:28.3189491Z  267 │   }
2026-10-24T20:38:28.3189542Z      ╰────
2026-10-24T20:38:28.3189827Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T20:38:28.3189858Z
2026-10-24T20:38:28.3190055Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3190213Z      ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7]
2026-10-24T20:38:28.3190267Z  154 │     }
2026-10-24T20:38:28.3190333Z  155 │   }, [wrappedRender]);
2026-10-24T20:38:28.3190409Z      ·       ──────┬──────
2026-10-24T20:38:28.3190552Z      ·             ╰── Unnecessary dependency `wrappedRender`
2026-10-24T20:38:28.3190604Z  156 │
2026-10-24T20:38:28.3190653Z      ╰────
2026-10-24T20:38:28.3190978Z   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-24T20:38:28.3191295Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3191298Z
2026-10-24T20:38:28.3191576Z   ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T20:38:28.3191734Z      ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42]
2026-10-24T20:38:28.3191787Z  799 │     >
2026-10-24T20:38:28.3191909Z  800 │       <AdaptiveWorkspaceContext.Provider value={contextValue}>
2026-10-24T20:38:28.3192027Z      ·                                          ────────────────────
2026-10-24T20:38:28.3192125Z  801 │         <WindowHingeContext value={windowHinge}>
2026-10-24T20:38:28.3192175Z      ╰────
2026-10-24T20:38:28.3192398Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T20:38:28.3192538Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T20:38:28.3192540Z
2026-10-24T20:38:28.3192725Z   ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used.
2026-10-24T20:38:28.3192855Z    ╭─[packages/client-runtime/src/state/threadSort.ts:4:13]
2026-10-24T20:38:28.3192969Z  3 │ import type { EnvironmentThreadShell } from "./models.ts";
2026-10-24T20:38:28.3193046Z  4 │ import * as Arr from "effect/Array";
2026-10-24T20:38:28.3193116Z    ·             ─┬─
2026-10-24T20:38:28.3193238Z    ·              ╰── 'Arr' is imported here
2026-10-24T20:38:28.3193319Z  5 │ import * as Order from "effect/Order";
2026-10-24T20:38:28.3193429Z    ╰────
2026-10-24T20:38:28.3193562Z   help: Consider removing this import.
2026-10-24T20:38:28.3193564Z
2026-10-24T20:38:28.3193753Z   ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used.
2026-10-24T20:38:28.3193879Z    ╭─[packages/client-runtime/src/state/threadSort.ts:5:13]
2026-10-24T20:38:28.3193956Z  4 │ import * as Arr from "effect/Array";
2026-10-24T20:38:28.3194037Z  5 │ import * as Order from "effect/Order";
2026-10-24T20:38:28.3194109Z    ·             ──┬──
2026-10-24T20:38:28.3194235Z    ·               ╰── 'Order' is imported here
2026-10-24T20:38:28.3194284Z  6 │
2026-10-24T20:38:28.3194337Z    ╰────
2026-10-24T20:38:28.3194431Z   help: Consider removing this import.
2026-10-24T20:38:28.3194434Z
2026-10-24T20:38:28.3194581Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3194745Z     ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
2026-10-24T20:38:28.3194827Z  26 │   const latestInput = useRef(input);
2026-10-24T20:38:28.3194902Z  27 │   latestInput.current = input;
2026-10-24T20:38:28.3195008Z     ·   ─────┬─────────┬───
2026-10-24T20:38:28.3195182Z     ·        │         ╰── Cannot update ref value during render
2026-10-24T20:38:28.3195294Z     ·        ╰── This value is a ref
2026-10-24T20:38:28.3195368Z  28 │   const mounted = useRef(true);
2026-10-24T20:38:28.3195419Z     ╰────
2026-10-24T20:38:28.3195890Z   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-24T20:38:28.3196182Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3196185Z
2026-10-24T20:38:28.3196337Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3196497Z     ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
2026-10-24T20:38:28.3196600Z  65 │   const [expanded, setExpanded] = useState(false);
2026-10-24T20:38:28.3196679Z  66 │   const progress = useSharedValue(0);
2026-10-24T20:38:28.3196751Z     ·         ────┬───
2026-10-24T20:38:28.3196879Z     ·             ╰── `progress` originates here
2026-10-24T20:38:28.3196949Z  67 │   useEffect(() => {
2026-10-24T20:38:28.3197070Z  68 │     progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
2026-10-24T20:38:28.3197139Z     ·     ────┬───
2026-10-24T20:38:28.3197268Z     ·         ╰── `progress` cannot be modified
2026-10-24T20:38:28.3197337Z  69 │   }, [expanded, progress]);
2026-10-24T20:38:28.3197385Z     ╰────
2026-10-24T20:38:28.3197643Z   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-24T20:38:28.3197940Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3197943Z
2026-10-24T20:38:28.3198092Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3198299Z     ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
2026-10-24T20:38:28.3198382Z  90 │ }) {
2026-10-24T20:38:28.3198495Z  91 │   const rotation = useSharedValue(props.hidden ? 1 : 0);
2026-10-24T20:38:28.3198566Z     ·         ────┬───
2026-10-24T20:38:28.3198690Z     ·             ╰── `rotation` originates here
2026-10-24T20:38:28.3198758Z  92 │   useLayoutEffect(() => {
2026-10-24T20:38:28.3198897Z  93 │     rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
2026-10-24T20:38:28.3198966Z     ·     ────┬───
2026-10-24T20:38:28.3199090Z     ·         ╰── `rotation` cannot be modified
2026-10-24T20:38:28.3199165Z  94 │   }, [props.hidden, rotation]);
2026-10-24T20:38:28.3199216Z     ╰────
2026-10-24T20:38:28.3199478Z   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-24T20:38:28.3199775Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3199780Z
2026-10-24T20:38:28.3199932Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3200100Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
2026-10-24T20:38:28.3200192Z  266 │   const variant = props.variant ?? "plain";
2026-10-24T20:38:28.3200320Z  267 │   const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
2026-10-24T20:38:28.3200404Z      ·         ────────┬────────
2026-10-24T20:38:28.3200554Z      ·                 ╰── `loadingVisibility` originates here
2026-10-24T20:38:28.3200624Z  268 │   useLayoutEffect(() => {
2026-10-24T20:38:28.3200779Z  269 │     loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
2026-10-24T20:38:28.3200871Z      ·     ────────┬────────
2026-10-24T20:38:28.3201044Z      ·             ╰── `loadingVisibility` cannot be modified
2026-10-24T20:38:28.3201135Z  270 │   }, [loadingVisibility, props.loading]);
2026-10-24T20:38:28.3201185Z      ╰────
2026-10-24T20:38:28.3201439Z   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-24T20:38:28.3201737Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3201739Z
2026-10-24T20:38:28.3201893Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3202059Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
2026-10-24T20:38:28.3202111Z  325 │ }) {
2026-10-24T20:38:28.3202266Z  326 │   const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
2026-10-24T20:38:28.3202352Z      ·         ─────────┬─────────
2026-10-24T20:38:28.3202501Z      ·                  ╰── `recordingVisibility` originates here
2026-10-24T20:38:28.3202567Z  327 │   useLayoutEffect(() => {
2026-10-24T20:38:28.3202750Z  328 │     recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
2026-10-24T20:38:28.3202834Z      ·     ─────────┬─────────
2026-10-24T20:38:28.3203030Z      ·              ╰── `recordingVisibility` cannot be modified
2026-10-24T20:38:28.3203148Z  329 │   }, [props.phase, recordingVisibility]);
2026-10-24T20:38:28.3203199Z      ╰────
2026-10-24T20:38:28.3203456Z   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-24T20:38:28.3203754Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3203756Z
2026-10-24T20:38:28.3203896Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3204048Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
2026-10-24T20:38:28.3204203Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T20:38:28.3204329Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T20:38:28.3204448Z      ·                                      ───────────┬──────────
2026-10-24T20:38:28.3204615Z      ·                                                 ╰── Cannot access ref value during render
2026-10-24T20:38:28.3204731Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T20:38:28.3204782Z      ╰────
2026-10-24T20:38:28.3205245Z   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-24T20:38:28.3205535Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3205539Z
2026-10-24T20:38:28.3205677Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3205831Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
2026-10-24T20:38:28.3205884Z  125 │
2026-10-24T20:38:28.3205990Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3206074Z      ·        ─────────┬────────
2026-10-24T20:38:28.3206219Z      ·                 ╰── Cannot access ref value during render
2026-10-24T20:38:28.3206317Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3206368Z      ╰────
2026-10-24T20:38:28.3206828Z   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-24T20:38:28.3207114Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3207117Z
2026-10-24T20:38:28.3207255Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3207407Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
2026-10-24T20:38:28.3207462Z  125 │
2026-10-24T20:38:28.3207565Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3207649Z      ·       ─────────┬─────────
2026-10-24T20:38:28.3207793Z      ·                ╰── Cannot access ref value during render
2026-10-24T20:38:28.3207941Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3208086Z      ╰────
2026-10-24T20:38:28.3208541Z   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-24T20:38:28.3208825Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3208827Z
2026-10-24T20:38:28.3208965Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3209118Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
2026-10-24T20:38:28.3209167Z  125 │
2026-10-24T20:38:28.3209270Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3209384Z      ·                               ─────────┬─────────
2026-10-24T20:38:28.3209547Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T20:38:28.3209643Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3209693Z      ╰────
2026-10-24T20:38:28.3210144Z   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-24T20:38:28.3210426Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3210428Z
2026-10-24T20:38:28.3210569Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3210724Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
2026-10-24T20:38:28.3210776Z  125 │
2026-10-24T20:38:28.3210887Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3211022Z      ·                              ──────────┬─────────
2026-10-24T20:38:28.3211184Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T20:38:28.3211282Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3211335Z      ╰────
2026-10-24T20:38:28.3211785Z   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-24T20:38:28.3212072Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3212077Z
2026-10-24T20:38:28.3212216Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3212369Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
2026-10-24T20:38:28.3212477Z  126 │       if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3212662Z  127 │ ╭─▶     const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3212832Z  128 │ │         create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T20:38:28.3212955Z  129 │ │         onStatus: (status: RecordingStatus) => {
2026-10-24T20:38:28.3213148Z  130 │ │           sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T20:38:28.3213297Z  131 │ │             isFinished: status.isFinished,
2026-10-24T20:38:28.3213468Z  132 │ │             hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T20:38:28.3213569Z  133 │ │             error: status.error,
2026-10-24T20:38:28.3213664Z  134 │ │             url: status.url,
2026-10-24T20:38:28.3213744Z  135 │ │           });
2026-10-24T20:38:28.3213818Z  136 │ │         },
2026-10-24T20:38:28.3214009Z  137 │ │         // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T20:38:28.3214116Z  138 │ │         selectInput: (inputs) => {
2026-10-24T20:38:28.3214273Z  139 │ │           const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T20:38:28.3214416Z  140 │ │           if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T20:38:28.3214577Z  141 │ │           const known = microphoneOrder(preferences.value.microphones);
2026-10-24T20:38:28.3214713Z  142 │ │           const order = rememberMicrophones(known, inputs);
2026-10-24T20:38:28.3214812Z  143 │ │           if (order !== known) {
2026-10-24T20:38:28.3214944Z  144 │ │             registry.set(updateMobilePreferencesAtom, {
2026-10-24T20:38:28.3215055Z  145 │ │               transform: (current) => ({
2026-10-24T20:38:28.3215255Z  146 │ │                 microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T20:38:28.3215344Z  147 │ │               }),
2026-10-24T20:38:28.3215423Z  148 │ │             });
2026-10-24T20:38:28.3215501Z  149 │ │           }
2026-10-24T20:38:28.3215638Z  150 │ │           return preferredMicrophoneInput(inputs, order);
2026-10-24T20:38:28.3215714Z  151 │ │         },
2026-10-24T20:38:28.3215840Z  152 │ ├─▶     });
2026-10-24T20:38:28.3216070Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3216154Z  153 │         recorderRef.current = recorder;
2026-10-24T20:38:28.3216206Z      ╰────
2026-10-24T20:38:28.3216708Z   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-24T20:38:28.3217022Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3217025Z
2026-10-24T20:38:28.3217165Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3217318Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
2026-10-24T20:38:28.3217375Z  152 │     });
2026-10-24T20:38:28.3217453Z  153 │     recorderRef.current = recorder;
2026-10-24T20:38:28.3217565Z      ·     ─────┬─────────┬───
2026-10-24T20:38:28.3217751Z      ·          │         ╰── Cannot update ref value during render
2026-10-24T20:38:28.3217865Z      ·          ╰── This value is a ref
2026-10-24T20:38:28.3217966Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3218016Z      ╰────
2026-10-24T20:38:28.3218469Z   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-24T20:38:28.3218751Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3218753Z
2026-10-24T20:38:28.3218890Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3219045Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
2026-10-24T20:38:28.3219131Z  153 │         recorderRef.current = recorder;
2026-10-24T20:38:28.3219319Z  154 │ ╭─▶     sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3219403Z  155 │ │         recorder,
2026-10-24T20:38:28.3219526Z  156 │ │         getTranscriber: getLocalVoiceTranscriber,
2026-10-24T20:38:28.3219642Z  157 │ │         requestPermission: async () => {
2026-10-24T20:38:28.3219800Z  158 │ │           const permission = await requestRecordingPermissionsAsync();
2026-10-24T20:38:28.3219986Z  159 │ │           return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T20:38:28.3220060Z  160 │ │         },
2026-10-24T20:38:28.3220204Z  161 │ │         configureRecording: configureVoiceRecordingAudio,
2026-10-24T20:38:28.3220339Z  162 │ │         releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T20:38:28.3220470Z  163 │ │         deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T20:38:28.3220577Z  164 │ │         onStateChange: (nextState) =>
2026-10-24T20:38:28.3220665Z  165 │ │           setState({
2026-10-24T20:38:28.3220762Z  166 │ │             state: nextState,
2026-10-24T20:38:28.3220906Z  167 │ │             ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T20:38:28.3221055Z  168 │ │             label: sessionRef.current?.label ?? null,
2026-10-24T20:38:28.3221132Z  169 │ │           }),
2026-10-24T20:38:28.3221302Z  170 │ ├─▶     });
2026-10-24T20:38:28.3221526Z      · ╰──── Cannot access ref value during render
2026-10-24T20:38:28.3221582Z  171 │       }
2026-10-24T20:38:28.3221631Z      ╰────
2026-10-24T20:38:28.3222087Z   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-24T20:38:28.3222371Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3222373Z
2026-10-24T20:38:28.3222513Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3222669Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
2026-10-24T20:38:28.3222752Z  153 │     recorderRef.current = recorder;
2026-10-24T20:38:28.3222854Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3222961Z      ·     ─────┬────────┬───
2026-10-24T20:38:28.3223136Z      ·          │        ╰── Cannot update ref value during render
2026-10-24T20:38:28.3223250Z      ·          ╰── This value is a ref
2026-10-24T20:38:28.3223313Z  155 │       recorder,
2026-10-24T20:38:28.3223363Z      ╰────
2026-10-24T20:38:28.3223822Z   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-24T20:38:28.3224104Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3224107Z
2026-10-24T20:38:28.3224246Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3224397Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
2026-10-24T20:38:28.3224482Z  184 │     return () => subscription.remove();
2026-10-24T20:38:28.3224545Z  185 │   }, [controller]);
2026-10-24T20:38:28.3224619Z      ·       ─────┬────
2026-10-24T20:38:28.3224760Z      ·            ╰── Cannot access ref value during render
2026-10-24T20:38:28.3224811Z  186 │
2026-10-24T20:38:28.3224860Z      ╰────
2026-10-24T20:38:28.3225321Z   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-24T20:38:28.3225603Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3225606Z
2026-10-24T20:38:28.3225746Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3225896Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
2026-10-24T20:38:28.3225978Z  184 │     return () => subscription.remove();
2026-10-24T20:38:28.3226043Z  185 │   }, [controller]);
2026-10-24T20:38:28.3226119Z      ·      ──────┬─────
2026-10-24T20:38:28.3226304Z      ·            ╰── Cannot access ref value during render
2026-10-24T20:38:28.3226385Z  186 │
2026-10-24T20:38:28.3226435Z      ╰────
2026-10-24T20:38:28.3226888Z   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-24T20:38:28.3227168Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3227171Z
2026-10-24T20:38:28.3227307Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3227460Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
2026-10-24T20:38:28.3227519Z  191 │     },
2026-10-24T20:38:28.3227591Z  192 │     [controller, recorder],
2026-10-24T20:38:28.3227664Z      ·      ─────┬────
2026-10-24T20:38:28.3227802Z      ·           ╰── Cannot access ref value during render
2026-10-24T20:38:28.3227856Z  193 │   );
2026-10-24T20:38:28.3227906Z      ╰────
2026-10-24T20:38:28.3228358Z   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-24T20:38:28.3228639Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3228641Z
2026-10-24T20:38:28.3228783Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3228940Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
2026-10-24T20:38:28.3229028Z  174 │   const controller = session.controller;
2026-10-24T20:38:28.3229112Z  175 │   const recorder = recorderRef.current;
2026-10-24T20:38:28.3229214Z      ·                    ─────────┬─────────
2026-10-24T20:38:28.3229367Z      ·                             ╰── Cannot access ref value during render
2026-10-24T20:38:28.3229417Z  176 │
2026-10-24T20:38:28.3229465Z      ╰────
2026-10-24T20:38:28.3229920Z   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-24T20:38:28.3230206Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3230211Z
2026-10-24T20:38:28.3230349Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3230500Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
2026-10-24T20:38:28.3230553Z  191 │     },
2026-10-24T20:38:28.3230624Z  192 │     [controller, recorder],
2026-10-24T20:38:28.3230711Z      ·     ───────────┬──────────
2026-10-24T20:38:28.3230863Z      ·                ╰── Cannot access ref value during render
2026-10-24T20:38:28.3230915Z  193 │   );
2026-10-24T20:38:28.3230994Z      ╰────
2026-10-24T20:38:28.3231542Z   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-24T20:38:28.3231862Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3231864Z
2026-10-24T20:38:28.3231999Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3232152Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
2026-10-24T20:38:28.3232242Z  245 │     return () => clearInterval(intervalId);
2026-10-24T20:38:28.3232351Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T20:38:28.3232435Z      ·                    ─────┬────
2026-10-24T20:38:28.3232590Z      ·                         ╰── Cannot access ref value during render
2026-10-24T20:38:28.3232644Z  247 │
2026-10-24T20:38:28.3232698Z      ╰────
2026-10-24T20:38:28.3233153Z   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-24T20:38:28.3233431Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3233434Z
2026-10-24T20:38:28.3233571Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3233724Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
2026-10-24T20:38:28.3233815Z  245 │     return () => clearInterval(intervalId);
2026-10-24T20:38:28.3233923Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T20:38:28.3234048Z      ·      ────────────────────────┬───────────────────────
2026-10-24T20:38:28.3234201Z      ·                              ╰── Cannot access ref value during render
2026-10-24T20:38:28.3234253Z  247 │
2026-10-24T20:38:28.3234301Z      ╰────
2026-10-24T20:38:28.3234758Z   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-24T20:38:28.3235039Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3235042Z
2026-10-24T20:38:28.3235185Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3235340Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
2026-10-24T20:38:28.3235406Z  260 │     setOwnerFocused,
2026-10-24T20:38:28.3235470Z  261 │     session,
2026-10-24T20:38:28.3235540Z      ·     ───┬───
2026-10-24T20:38:28.3235676Z      ·        ╰── Cannot access ref value during render
2026-10-24T20:38:28.3235733Z  262 │     stop,
2026-10-24T20:38:28.3235785Z      ╰────
2026-10-24T20:38:28.3237886Z   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-24T20:38:28.3238250Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3238296Z
2026-10-24T20:38:28.3238437Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3238591Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
2026-10-24T20:38:28.3238645Z  250 │
2026-10-24T20:38:28.3238781Z  251 │ ╭─▶   return {
2026-10-24T20:38:28.3238987Z  252 │ │       isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
2026-10-24T20:38:28.3239065Z  253 │ │       state,
2026-10-24T20:38:28.3239151Z  254 │ │       audioLevels,
2026-10-24T20:38:28.3239248Z  255 │ │       elapsedSeconds,
2026-10-24T20:38:28.3239376Z  256 │ │       isBusy: voiceInputBlocksSubmission(state),
2026-10-24T20:38:28.3239455Z  257 │ │       ownerKey,
2026-10-24T20:38:28.3239531Z  258 │ │       label,
2026-10-24T20:38:28.3239619Z  259 │ │       focusedOwners,
2026-10-24T20:38:28.3239709Z  260 │ │       setOwnerFocused,
2026-10-24T20:38:28.3239788Z  261 │ │       session,
2026-10-24T20:38:28.3239863Z  262 │ │       stop,
2026-10-24T20:38:28.3239940Z  263 │ │       cancel,
2026-10-24T20:38:28.3240062Z  264 │ ├─▶   };
2026-10-24T20:38:28.3240255Z      · ╰──── Cannot access ref value during render
2026-10-24T20:38:28.3240316Z  265 │     }
2026-10-24T20:38:28.3240370Z      ╰────
2026-10-24T20:38:28.3240828Z   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-24T20:38:28.3241150Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3241153Z
2026-10-24T20:38:28.3241305Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3241459Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T20:38:28.3241613Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T20:38:28.3241736Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T20:38:28.3241815Z      ·         ─────┬─────
2026-10-24T20:38:28.3241947Z      ·              ╰── `audioLevels` originates here
2026-10-24T20:38:28.3242063Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T20:38:28.3242203Z  124 │   const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
2026-10-24T20:38:28.3242258Z  125 │
2026-10-24T20:38:28.3242362Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3242458Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3242592Z  128 │       create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T20:38:28.3242684Z  129 │       onStatus: (status: RecordingStatus) => {
2026-10-24T20:38:28.3242859Z  130 │         sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T20:38:28.3242970Z  131 │           isFinished: status.isFinished,
2026-10-24T20:38:28.3243108Z  132 │           hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T20:38:28.3243180Z  133 │           error: status.error,
2026-10-24T20:38:28.3243245Z  134 │           url: status.url,
2026-10-24T20:38:28.3243303Z  135 │         });
2026-10-24T20:38:28.3243356Z  136 │       },
2026-10-24T20:38:28.3243517Z  137 │       // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T20:38:28.3243591Z  138 │       selectInput: (inputs) => {
2026-10-24T20:38:28.3243710Z  139 │         const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T20:38:28.3243818Z  140 │         if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T20:38:28.3243951Z  141 │         const known = microphoneOrder(preferences.value.microphones);
2026-10-24T20:38:28.3244057Z  142 │         const order = rememberMicrophones(known, inputs);
2026-10-24T20:38:28.3244126Z  143 │         if (order !== known) {
2026-10-24T20:38:28.3244227Z  144 │           registry.set(updateMobilePreferencesAtom, {
2026-10-24T20:38:28.3244308Z  145 │             transform: (current) => ({
2026-10-24T20:38:28.3244476Z  146 │               microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T20:38:28.3244536Z  147 │             }),
2026-10-24T20:38:28.3244593Z  148 │           });
2026-10-24T20:38:28.3244649Z  149 │         }
2026-10-24T20:38:28.3244754Z  150 │         return preferredMicrophoneInput(inputs, order);
2026-10-24T20:38:28.3244808Z  151 │       },
2026-10-24T20:38:28.3244860Z  152 │     });
2026-10-24T20:38:28.3244939Z  153 │     recorderRef.current = recorder;
2026-10-24T20:38:28.3245044Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3245104Z  155 │       recorder,
2026-10-24T20:38:28.3245199Z  156 │       getTranscriber: getLocalVoiceTranscriber,
2026-10-24T20:38:28.3245280Z  157 │       requestPermission: async () => {
2026-10-24T20:38:28.3245406Z  158 │         const permission = await requestRecordingPermissionsAsync();
2026-10-24T20:38:28.3245556Z  159 │         return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T20:38:28.3245610Z  160 │       },
2026-10-24T20:38:28.3245717Z  161 │       configureRecording: configureVoiceRecordingAudio,
2026-10-24T20:38:28.3245818Z  162 │       releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T20:38:28.3245917Z  163 │       deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T20:38:28.3245994Z  164 │       onStateChange: (nextState) =>
2026-10-24T20:38:28.3246056Z  165 │         setState({
2026-10-24T20:38:28.3246172Z  166 │           state: nextState,
2026-10-24T20:38:28.3246303Z  167 │           ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T20:38:28.3246396Z  168 │           label: sessionRef.current?.label ?? null,
2026-10-24T20:38:28.3246453Z  169 │         }),
2026-10-24T20:38:28.3246506Z  170 │     });
2026-10-24T20:38:28.3246556Z  171 │   }
2026-10-24T20:38:28.3246606Z  172 │
2026-10-24T20:38:28.3246688Z  173 │   const session = sessionRef.current;
2026-10-24T20:38:28.3246773Z  174 │   const controller = session.controller;
2026-10-24T20:38:28.3246854Z  175 │   const recorder = recorderRef.current;
2026-10-24T20:38:28.3246903Z  176 │
2026-10-24T20:38:28.3246967Z  177 │   useEffect(() => {
2026-10-24T20:38:28.3247112Z  178 │     const subscription = AppState.addEventListener("change", (nextState) => {
2026-10-24T20:38:28.3247252Z  179 │       // iOS reports `inactive` while its permission dialog is open. Only the
2026-10-24T20:38:28.3247388Z  180 │       // real background state cancels preparation; recorder status handles
2026-10-24T20:38:28.3247494Z  181 │       // calls and route interruptions during capture.
2026-10-24T20:38:28.3247626Z  182 │       if (nextState === "background") controller.appMovedToBackground();
2026-10-24T20:38:28.3247678Z  183 │     });
2026-10-24T20:38:28.3247761Z  184 │     return () => subscription.remove();
2026-10-24T20:38:28.3247823Z  185 │   }, [controller]);
2026-10-24T20:38:28.3247875Z  186 │
2026-10-24T20:38:28.3247932Z  187 │   useEffect(
2026-10-24T20:38:28.3247991Z  188 │     () => () => {
2026-10-24T20:38:28.3248061Z  189 │       controller.dispose();
2026-10-24T20:38:28.3248127Z  190 │       recorder.release();
2026-10-24T20:38:28.3248179Z  191 │     },
2026-10-24T20:38:28.3248245Z  192 │     [controller, recorder],
2026-10-24T20:38:28.3248301Z  193 │   );
2026-10-24T20:38:28.3248351Z  194 │
2026-10-24T20:38:28.3248413Z  195 │   useEffect(() => {
2026-10-24T20:38:28.3248502Z  196 │     if (state.phase !== "recording") return;
2026-10-24T20:38:28.3248552Z  197 │
2026-10-24T20:38:28.3248693Z  198 │     const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
2026-10-24T20:38:28.3248793Z  199 │     const activation = activateKeepAwakeAsync(tag);
2026-10-24T20:38:28.3248871Z  200 │     void activation.catch(() => {});
2026-10-24T20:38:28.3248932Z  201 │     return () => {
2026-10-24T20:38:28.3249075Z  202 │       // Release after activation settles, even if the recording ends immediately.
2026-10-24T20:38:28.3249209Z  203 │       void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
2026-10-24T20:38:28.3249261Z  204 │     };
2026-10-24T20:38:28.3249337Z  205 │   }, [keepAwakeId, state.phase]);
2026-10-24T20:38:28.3249390Z  206 │
2026-10-24T20:38:28.3249456Z  207 │   useEffect(() => {
2026-10-24T20:38:28.3249587Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T20:38:28.3249636Z  209 │
2026-10-24T20:38:28.3249752Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T20:38:28.3249901Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T20:38:28.3250000Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-24T20:38:28.3250075Z      ·       ─────┬─────
2026-10-24T20:38:28.3250209Z      ·            ╰── `audioLevels` cannot be modified
2026-10-24T20:38:28.3250262Z  213 │     }
2026-10-24T20:38:28.3250311Z      ╰────
2026-10-24T20:38:28.3250625Z   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-24T20:38:28.3250996Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3250999Z
2026-10-24T20:38:28.3251192Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T20:38:28.3251346Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T20:38:28.3251397Z  206 │
2026-10-24T20:38:28.3251457Z  207 │   useEffect(() => {
2026-10-24T20:38:28.3251531Z      ·             ───┬───
2026-10-24T20:38:28.3251744Z      ·                ╰── This function may (indirectly) reassign or modify `audioLevels` after render
2026-10-24T20:38:28.3251881Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T20:38:28.3251930Z  209 │
2026-10-24T20:38:28.3252047Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T20:38:28.3252196Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T20:38:28.3252294Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-24T20:38:28.3252367Z      ·       ─────┬─────
2026-10-24T20:38:28.3252496Z      ·            ╰── This modifies `audioLevels`
2026-10-24T20:38:28.3252548Z  213 │     }
2026-10-24T20:38:28.3252597Z      ╰────
2026-10-24T20:38:28.3252929Z   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-24T20:38:28.3253234Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3253238Z
2026-10-24T20:38:28.3253444Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T20:38:28.3253575Z     ╭─[apps/web/src/lib/composerContextReferences.ts:90:40]
2026-10-24T20:38:28.3253647Z  89 │   let cursor = prompt.length;
2026-10-24T20:38:28.3253749Z  90 │   for (const occurrence of occurrences.reverse()) {
2026-10-24T20:38:28.3253850Z     ·                                        ───────
2026-10-24T20:38:28.3253929Z  91 │     let { start, end } = occurrence;
2026-10-24T20:38:28.3253979Z     ╰────
2026-10-24T20:38:28.3254231Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T20:38:28.3254239Z
2026-10-24T20:38:28.3254403Z   ⚠ eslint(no-control-regex): Unexpected control character
2026-10-24T20:38:28.3254592Z      ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
2026-10-24T20:38:28.3254726Z  219 │               <Text selectable className="font-mono text-sm text-foreground">
2026-10-24T20:38:28.3254865Z  220 │                 {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
2026-10-24T20:38:28.3254970Z      ·                                              ──┬─
2026-10-24T20:38:28.3255130Z      ·                                                ╰── 'U+001B' is a control character.
2026-10-24T20:38:28.3255192Z  221 │               </Text>
2026-10-24T20:38:28.3255240Z      ╰────
2026-10-24T20:38:28.3255517Z   help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.
2026-10-24T20:38:28.3255549Z
2026-10-24T20:38:28.3255745Z   ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining
2026-10-24T20:38:28.3255908Z       ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8]
2026-10-24T20:38:28.3255972Z  1782 │     assert.equal(
2026-10-24T20:38:28.3256110Z  1783 │       (stored.context?.records[0] as { attachmentId: string }).attachmentId,
2026-10-24T20:38:28.3256210Z       ·        ──────────────────────────
2026-10-24T20:38:28.3256288Z  1784 │       stored.attachments[0]?.id,
2026-10-24T20:38:28.3256337Z       ╰────
2026-10-24T20:38:28.3256503Z   help: If this short-circuits with 'undefined' the evaluation will throw TypeError
2026-10-24T20:38:28.3256505Z
2026-10-24T20:38:28.3256770Z   ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3256900Z      ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7]
2026-10-24T20:38:28.3256950Z  339 │
2026-10-24T20:38:28.3257046Z  340 │ const layerTest = AnalyticsService.layerTest;
2026-10-24T20:38:28.3257118Z      ·       ────┬────
2026-10-24T20:38:28.3257244Z      ·           ╰── 'layerTest' is declared here
2026-10-24T20:38:28.3257293Z      ╰────
2026-10-24T20:38:28.3257392Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3257395Z
2026-10-24T20:38:28.3257570Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T20:38:28.3257725Z      ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85]
2026-10-24T20:38:28.3257830Z   99 │   const startEditor = startScheduledTaskEditor;
2026-10-24T20:38:28.3258008Z  100 │   const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
2026-10-24T20:38:28.3258149Z      ·                                                                                     ─────┬─────
2026-10-24T20:38:28.3258347Z      ·                                                                                          ╰── Unnecessary dependency `startEditor`
2026-10-24T20:38:28.3258424Z  101 │   const readEditor = useCallback(
2026-10-24T20:38:28.3258471Z      ╰────
2026-10-24T20:38:28.3258782Z   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-24T20:38:28.3259097Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3259102Z
2026-10-24T20:38:28.3259276Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T20:38:28.3259429Z      ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7]
2026-10-24T20:38:28.3259489Z  120 │       setEditor,
2026-10-24T20:38:28.3259550Z  121 │       startEditor,
2026-10-24T20:38:28.3259623Z      ·       ─────┬─────
2026-10-24T20:38:28.3259763Z      ·            ╰── Unnecessary dependency `startEditor`
2026-10-24T20:38:28.3259823Z  122 │       hasChanges,
2026-10-24T20:38:28.3259872Z      ╰────
2026-10-24T20:38:28.3260226Z   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-24T20:38:28.3260558Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3260561Z
2026-10-24T20:38:28.3260757Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T20:38:28.3260895Z    ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8]
2026-10-24T20:38:28.3260995Z  2 │   AuthDiagnosticsReadScope,
2026-10-24T20:38:28.3261061Z  3 │   type AuthSessionState,
2026-10-24T20:38:28.3261141Z    ·        ────────┬───────
2026-10-24T20:38:28.3261280Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T20:38:28.3261346Z  4 │   sessionGrantsScope,
2026-10-24T20:38:28.3261399Z    ╰────
2026-10-24T20:38:28.3261496Z   help: Consider removing this import.
2026-10-24T20:38:28.3261499Z
2026-10-24T20:38:28.3261717Z   ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-24T20:38:28.3261883Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15]
2026-10-24T20:38:28.3261949Z  1997 │       assert.equal(
2026-10-24T20:38:28.3262091Z  1998 │         items.filter((item) => item.type === "assistant_message").at(-1)?.text,
2026-10-24T20:38:28.3262167Z       ·               ──────
2026-10-24T20:38:28.3262246Z  1999 │         "authoritative answer",
2026-10-24T20:38:28.3262295Z       ╰────
2026-10-24T20:38:28.3262460Z   help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-24T20:38:28.3262462Z
2026-10-24T20:38:28.3262932Z   ⚠ 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-24T20:38:28.3263098Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7]
2026-10-24T20:38:28.3263273Z  3950 │           const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
2026-10-24T20:38:28.3263473Z  3951 │ ╭─▶       while (!responseLifecycle.includes("failed")) {
2026-10-24T20:38:28.3263579Z  3952 │ │           yield* Effect.yieldNow;
2026-10-24T20:38:28.3263707Z  3953 │ ╰─▶       }
2026-10-24T20:38:28.3263830Z  3954 │           const responseExit = yield* Fiber.join(responseFiber);
2026-10-24T20:38:28.3263881Z       ╰────
2026-10-24T20:38:28.3263884Z
2026-10-24T20:38:28.3264337Z   ⚠ 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-24T20:38:28.3264499Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9]
2026-10-24T20:38:28.3264587Z  6061 │               .pipe(Effect.forkScoped);
2026-10-24T20:38:28.3264765Z  6062 │ ╭─▶         while (promptGates.length < 1) {
2026-10-24T20:38:28.3264871Z  6063 │ │             yield* Effect.yieldNow;
2026-10-24T20:38:28.3265000Z  6064 │ ╰─▶         }
2026-10-24T20:38:28.3265210Z  6065 │             assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
2026-10-24T20:38:28.3265293Z       ╰────
2026-10-24T20:38:28.3265295Z
2026-10-24T20:38:28.3265747Z   ⚠ 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-24T20:38:28.3265909Z       ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9]
2026-10-24T20:38:28.3265993Z  6196 │               .pipe(Effect.forkScoped);
2026-10-24T20:38:28.3266169Z  6197 │ ╭─▶         while (promptGates.length < 2) {
2026-10-24T20:38:28.3266274Z  6198 │ │             yield* Effect.yieldNow;
2026-10-24T20:38:28.3266407Z  6199 │ ╰─▶         }
2026-10-24T20:38:28.3266569Z  6200 │             if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
2026-10-24T20:38:28.3266619Z       ╰────
2026-10-24T20:38:28.3266621Z
2026-10-24T20:38:28.3266874Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3267038Z        ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7]
2026-10-24T20:38:28.3267090Z  10601 │
2026-10-24T20:38:28.3267160Z  10602 │ const layer: Layer.Layer<
2026-10-24T20:38:28.3267231Z        ·       ──┬──
2026-10-24T20:38:28.3267355Z        ·         ╰── 'layer' is declared here
2026-10-24T20:38:28.3267452Z  10603 │   ProviderAdapter.ProviderAdapterV2,
2026-10-24T20:38:28.3267504Z        ╰────
2026-10-24T20:38:28.3267606Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3267609Z
2026-10-24T20:38:28.3267931Z   ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3268087Z       ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7]
2026-10-24T20:38:28.3268138Z  1443 │
2026-10-24T20:38:28.3268250Z  1444 │ const layerCodexAppServerClientFactoryCommand = (
2026-10-24T20:38:28.3268363Z       ·       ───────────────────┬───────────────────
2026-10-24T20:38:28.3268563Z       ·                          ╰── 'layerCodexAppServerClientFactoryCommand' is declared here
2026-10-24T20:38:28.3268685Z  1445 │   options: CodexClient.CodexAppServerClientOptions & {
2026-10-24T20:38:28.3268737Z       ╰────
2026-10-24T20:38:28.3268836Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3268839Z
2026-10-24T20:38:28.3269087Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3269242Z       ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7]
2026-10-24T20:38:28.3269293Z  1679 │
2026-10-24T20:38:28.3269361Z  1680 │ const layer: Layer.Layer<
2026-10-24T20:38:28.3269428Z       ·       ──┬──
2026-10-24T20:38:28.3269547Z       ·         ╰── 'layer' is declared here
2026-10-24T20:38:28.3269636Z  1681 │   ProviderAdapter.ProviderAdapterV2,
2026-10-24T20:38:28.3269685Z       ╰────
2026-10-24T20:38:28.3269830Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3269911Z
2026-10-24T20:38:28.3270278Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T20:38:28.3270400Z      ╭─[packages/shared/src/otelEnvironment.ts:146:14]
2026-10-24T20:38:28.3270457Z  145 │     name,
2026-10-24T20:38:28.3270591Z  146 │     (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()),
2026-10-24T20:38:28.3270692Z      ·              ──────────────────────────
2026-10-24T20:38:28.3270812Z  147 │     `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`,
2026-10-24T20:38:28.3270875Z      ╰────
2026-10-24T20:38:28.3270878Z
2026-10-24T20:38:28.3271155Z   ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
2026-10-24T20:38:28.3271391Z      ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
2026-10-24T20:38:28.3271444Z  959 │
2026-10-24T20:38:28.3271549Z  960 │ function layerClaudeAgentSdkReplayQueryRunner(
2026-10-24T20:38:28.3271658Z      ·          ──────────────────┬─────────────────
2026-10-24T20:38:28.3271850Z      ·                            ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here
2026-10-24T20:38:28.3271950Z  961 │   transcript: ClaudeAgentSdkReplayTranscript,
2026-10-24T20:38:28.3272000Z      ╰────
2026-10-24T20:38:28.3272098Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3272100Z
2026-10-24T20:38:28.3272319Z   ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used.
2026-10-24T20:38:28.3272481Z       ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10]
2026-10-24T20:38:28.3272535Z  1397 │
2026-10-24T20:38:28.3272620Z  1398 │ function assertUserMessagesExclude(
2026-10-24T20:38:28.3272719Z       ·          ────────────┬────────────
2026-10-24T20:38:28.3272882Z       ·                      ╰── 'assertUserMessagesExclude' is declared here
2026-10-24T20:38:28.3272987Z  1399 │   projection: OrchestrationV2ThreadProjection,
2026-10-24T20:38:28.3273036Z       ╰────
2026-10-24T20:38:28.3273134Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3273136Z
2026-10-24T20:38:28.3273314Z   ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
2026-10-24T20:38:28.3273419Z      ╭─[packages/shared/src/qrCode.ts:458:44]
2026-10-24T20:38:28.3273548Z  457 │   ): Array<byte> {
2026-10-24T20:38:28.3273693Z  458 │     let result: Array<byte> = divisor.map((_) => 0);
2026-10-24T20:38:28.3273788Z      ·                                            ┬
2026-10-24T20:38:28.3273928Z      ·                                            ╰── '_' is declared here
2026-10-24T20:38:28.3273997Z  459 │     for (const b of data) {
2026-10-24T20:38:28.3274047Z      ╰────
2026-10-24T20:38:28.3274146Z   help: Consider removing this parameter.
2026-10-24T20:38:28.3274148Z
2026-10-24T20:38:28.3274342Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T20:38:28.3274471Z    ╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2026-10-24T20:38:28.3274541Z  2 │   AuthFilesystemReadScope,
2026-10-24T20:38:28.3274607Z  3 │   type AuthSessionState,
2026-10-24T20:38:28.3274694Z    ·        ────────┬───────
2026-10-24T20:38:28.3274835Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T20:38:28.3274907Z  4 │   type FilesystemBrowseEntry,
2026-10-24T20:38:28.3274956Z    ╰────
2026-10-24T20:38:28.3275052Z   help: Consider removing this import.
2026-10-24T20:38:28.3275055Z
2026-10-24T20:38:28.3275248Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3275407Z      ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33]
2026-10-24T20:38:28.3275499Z  113 │     return () => cancelAnimationFrame(frame);
2026-10-24T20:38:28.3275595Z  114 │   }, [restoreSearch, tabActive, bottomSearch]);
2026-10-24T20:38:28.3275696Z      ·                                 ──────┬─────
2026-10-24T20:38:28.3275860Z      ·                                       ╰── Unnecessary dependency `bottomSearch`
2026-10-24T20:38:28.3275962Z  115 │   const composeButton = nativeToolbarCompose ? (
2026-10-24T20:38:28.3276012Z      ╰────
2026-10-24T20:38:28.3276304Z   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-24T20:38:28.3276609Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3276612Z
2026-10-24T20:38:28.3276794Z   ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
2026-10-24T20:38:28.3276914Z      ╭─[packages/client-runtime/src/state/shell.ts:189:5]
2026-10-24T20:38:28.3277025Z  186 │     let waiting = yield* Ref.get(awaitingCompletion);
2026-10-24T20:38:28.3277092Z  187 │     let next = initial;
2026-10-24T20:38:28.3277159Z      ·         ──┬─
2026-10-24T20:38:28.3277276Z      ·           ╰── From this accumulator
2026-10-24T20:38:28.3277353Z  188 │     let receivedSnapshot = false;
2026-10-24T20:38:28.3277427Z  189 │     for (const item of items) {
2026-10-24T20:38:28.3277493Z      ·     ─┬─
2026-10-24T20:38:28.3277593Z      ·      ╰── For this loop
2026-10-24T20:38:28.3277681Z  190 │       if (item.kind === "synchronized") {
2026-10-24T20:38:28.3277745Z  191 │         waiting = false;
2026-10-24T20:38:28.3277833Z  192 │         if (Option.isSome(next.snapshot)) {
2026-10-24T20:38:28.3277946Z  193 │           next = { ...next, status: "live", error: Option.none() };
2026-10-24T20:38:28.3278078Z      ·                    ───┬───
2026-10-24T20:38:28.3278229Z      ·                       ╰── From this spread
2026-10-24T20:38:28.3278287Z  194 │         }
2026-10-24T20:38:28.3278335Z      ╰────
2026-10-24T20:38:28.3278486Z   help: Consider using `Object.assign()` to mutate the accumulator instead.
2026-10-24T20:38:28.3278638Z   note: Using spreads within accumulators leads to `O(n^2)` time complexity.
2026-10-24T20:38:28.3278641Z
2026-10-24T20:38:28.3278818Z   ⚠ react(static-components): Cannot create components during render
2026-10-24T20:38:28.3278972Z      ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
2026-10-24T20:38:28.3279057Z  196 │   const { onInput, onResize } = props;
2026-10-24T20:38:28.3279204Z  197 │   const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
2026-10-24T20:38:28.3279332Z      ·                                     ────────────────┬───────────────
2026-10-24T20:38:28.3279511Z      ·                                                     ╰── The component is created during render here
2026-10-24T20:38:28.3279634Z  198 │   const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
2026-10-24T20:38:28.3279685Z  199 │
2026-10-24T20:38:28.3279751Z  200 │   useEffect(() => {
2026-10-24T20:38:28.3279834Z  201 │     terminalDebugLog("native:surface", {
2026-10-24T20:38:28.3279919Z  202 │       terminalKey: props.terminalKey,
2026-10-24T20:38:28.3279992Z  203 │       native: hasNativeSurface,
2026-10-24T20:38:28.3280122Z  204 │       hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
2026-10-24T20:38:28.3280202Z  205 │       bufferLen: props.buffer.length,
2026-10-24T20:38:28.3280284Z  206 │       isRunning: props.isRunning,
2026-10-24T20:38:28.3280343Z  207 │     });
2026-10-24T20:38:28.3280499Z  208 │   }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
2026-10-24T20:38:28.3280582Z  209 │   const handleNativeInput = useCallback(
2026-10-24T20:38:28.3280693Z  210 │     (event: NativeSyntheticEvent<TerminalInputEvent>) => {
2026-10-24T20:38:28.3280787Z  211 │       if (!props.isRunning || props.readOnly) {
2026-10-24T20:38:28.3280858Z  212 │         return;
2026-10-24T20:38:28.3280910Z  213 │       }
2026-10-24T20:38:28.3281024Z  214 │       terminalDebugLog("native:onInput", {
2026-10-24T20:38:28.3281171Z  215 │         codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
2026-10-24T20:38:28.3281227Z  216 │       });
2026-10-24T20:38:28.3281309Z  217 │       onInput(event.nativeEvent.data);
2026-10-24T20:38:28.3281362Z  218 │     },
2026-10-24T20:38:28.3281463Z  219 │     [onInput, props.isRunning, props.readOnly],
2026-10-24T20:38:28.3281516Z  220 │   );
2026-10-24T20:38:28.3281602Z  221 │   const handleNativeResize = useCallback(
2026-10-24T20:38:28.3281713Z  222 │     (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
2026-10-24T20:38:28.3281774Z  223 │       onResize({
2026-10-24T20:38:28.3281854Z  224 │         cols: event.nativeEvent.cols,
2026-10-24T20:38:28.3281934Z  225 │         rows: event.nativeEvent.rows,
2026-10-24T20:38:28.3281989Z  226 │       });
2026-10-24T20:38:28.3282042Z  227 │     },
2026-10-24T20:38:28.3282101Z  228 │     [onResize],
2026-10-24T20:38:28.3282154Z  229 │   );
2026-10-24T20:38:28.3282203Z  230 │
2026-10-24T20:38:28.3282284Z  231 │   if (NativeTerminalSurfaceView) {
2026-10-24T20:38:28.3282341Z  232 │     return (
2026-10-24T20:38:28.3282417Z  233 │       <View style={props.style}>
2026-10-24T20:38:28.3282616Z  234 │         <NativeTerminalSurfaceView
2026-10-24T20:38:28.3282758Z      ·          ────────────┬────────────
2026-10-24T20:38:28.3282912Z      ·                      ╰── This component is created during render
2026-10-24T20:38:28.3283005Z  235 │           appearanceScheme={themeAppearance}
2026-10-24T20:38:28.3283054Z      ╰────
2026-10-24T20:38:28.3283295Z   help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-24T20:38:28.3283608Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T20:38:28.3283610Z
2026-10-24T20:38:28.3283799Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3283959Z     ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
2026-10-24T20:38:28.3284024Z  71 │             <Pressable
2026-10-24T20:38:28.3284086Z  72 │               key={index}
2026-10-24T20:38:28.3284170Z     ·               ───────────
2026-10-24T20:38:28.3284251Z  73 │               accessibilityRole="button"
2026-10-24T20:38:28.3284300Z     ╰────
2026-10-24T20:38:28.3284443Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3284446Z
2026-10-24T20:38:28.3284697Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3284880Z      ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
2026-10-24T20:38:28.3284931Z  117 │
2026-10-24T20:38:28.3284999Z  118 │   useEffect(() => {
2026-10-24T20:38:28.3285070Z      ·   ────┬────
2026-10-24T20:38:28.3285196Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3285273Z  119 │     void refreshNotifications();
2026-10-24T20:38:28.3285360Z      ·          ──────────┬─────────
2026-10-24T20:38:28.3285528Z      ·                    ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3285667Z  120 │     const subscription = AppState.addEventListener("change", (state) => {
2026-10-24T20:38:28.3285715Z      ╰────
2026-10-24T20:38:28.3286311Z   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-24T20:38:28.3286634Z   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-24T20:38:28.3286637Z
2026-10-24T20:38:28.3286887Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3287069Z      ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
2026-10-24T20:38:28.3287119Z  125 │
2026-10-24T20:38:28.3287181Z  126 │   useEffect(() => {
2026-10-24T20:38:28.3287250Z      ·   ────┬────
2026-10-24T20:38:28.3287373Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3287435Z  127 │     if (!isLoaded) {
2026-10-24T20:38:28.3287565Z  128 │       setLiveActivityStatus("checking");
2026-10-24T20:38:28.3287679Z      ·       ──────────┬──────────
2026-10-24T20:38:28.3287846Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3287907Z  129 │       return;
2026-10-24T20:38:28.3287955Z      ╰────
2026-10-24T20:38:28.3288541Z   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-24T20:38:28.3288853Z   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-24T20:38:28.3288856Z
2026-10-24T20:38:28.3289109Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3289264Z      ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
2026-10-24T20:38:28.3289428Z  112 │   const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
2026-10-24T20:38:28.3289491Z  113 │   useEffect(() => {
2026-10-24T20:38:28.3289559Z      ·   ────┬────
2026-10-24T20:38:28.3289683Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3289842Z  114 │     if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
2026-10-24T20:38:28.3289901Z  115 │       return;
2026-10-24T20:38:28.3289954Z  116 │     }
2026-10-24T20:38:28.3290073Z  117 │     setEntry({ key: input.targetKey, location: candidate });
2026-10-24T20:38:28.3290143Z      ·     ────┬───
2026-10-24T20:38:28.3290303Z      ·         ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3290420Z  118 │   }, [candidate, entry.key, entry.location, input.targetKey]);
2026-10-24T20:38:28.3290473Z      ╰────
2026-10-24T20:38:28.3291092Z   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-24T20:38:28.3291404Z   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-24T20:38:28.3291406Z
2026-10-24T20:38:28.3291599Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3291740Z     ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
2026-10-24T20:38:28.3291827Z  35 │       <T3SourceTextRunNativeComponent
2026-10-24T20:38:28.3291887Z  36 │         key={index}
2026-10-24T20:38:28.3291963Z     ·         ───────────
2026-10-24T20:38:28.3292036Z  37 │         style={flattenedStyle}
2026-10-24T20:38:28.3292084Z     ╰────
2026-10-24T20:38:28.3292225Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3292228Z
2026-10-24T20:38:28.3292436Z   ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T20:38:28.3292538Z       ╭─[apps/mobile/src/Stack.tsx:1079:21]
2026-10-24T20:38:28.3292645Z  1078 │     <Navigator
2026-10-24T20:38:28.3292806Z  1079 │       screenLayout={(props) => <GuardedScreenLayout {...props} />}
2026-10-24T20:38:28.3292938Z       ·                     ─────────────────────────────────────────────
2026-10-24T20:38:28.3293018Z  1080 │       screenOptions={({ route }) =>
2026-10-24T20:38:28.3293068Z       ╰────
2026-10-24T20:38:28.3293422Z   help: Move this component definition out of the parent component `AdaptiveRootStack` and pass data as props. If you want to allow component creation in props, set `allowAsProps` option to true.
2026-10-24T20:38:28.3293426Z
2026-10-24T20:38:28.3293675Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3293841Z      ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
2026-10-24T20:38:28.3293898Z  118 │
2026-10-24T20:38:28.3293963Z  119 │   useEffect(() => {
2026-10-24T20:38:28.3294030Z      ·   ────┬────
2026-10-24T20:38:28.3294153Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3294234Z  120 │     if (orientationSettled) return;
2026-10-24T20:38:28.3294346Z  121 │     const orientation = getNativeShowcaseOrientation();
2026-10-24T20:38:28.3294417Z  122 │     if (orientation === null) {
2026-10-24T20:38:28.3294497Z  123 │       setOrientationSettled(true);
2026-10-24T20:38:28.3294584Z      ·       ──────────┬──────────
2026-10-24T20:38:28.3294748Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3294807Z  124 │       return;
2026-10-24T20:38:28.3294858Z      ╰────
2026-10-24T20:38:28.3295444Z   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-24T20:38:28.3295760Z   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-24T20:38:28.3295763Z
2026-10-24T20:38:28.3296009Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3296177Z      ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
2026-10-24T20:38:28.3296227Z  292 │
2026-10-24T20:38:28.3296289Z  293 │   useEffect(() => {
2026-10-24T20:38:28.3296396Z      ·   ────┬────
2026-10-24T20:38:28.3296545Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3296602Z  294 │     if (
2026-10-24T20:38:28.3296667Z  295 │       scene === null ||
2026-10-24T20:38:28.3296740Z  296 │       requestedScene === null ||
2026-10-24T20:38:28.3296814Z  297 │       scene !== requestedScene ||
2026-10-24T20:38:28.3296876Z  298 │       !hasFixture ||
2026-10-24T20:38:28.3296946Z  299 │       !orientationSettled ||
2026-10-24T20:38:28.3297009Z  300 │       !themeApplied ||
2026-10-24T20:38:28.3297122Z  301 │       (scene === "agent-activity" && !agentActivityStaged) ||
2026-10-24T20:38:28.3297253Z  302 │       !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
2026-10-24T20:38:28.3297307Z  303 │     ) {
2026-10-24T20:38:28.3297372Z  304 │       setReadyScene(null);
2026-10-24T20:38:28.3297454Z      ·       ──────┬──────
2026-10-24T20:38:28.3297620Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3297679Z  305 │       return;
2026-10-24T20:38:28.3297726Z      ╰────
2026-10-24T20:38:28.3298308Z   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-24T20:38:28.3298619Z   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-24T20:38:28.3298622Z
2026-10-24T20:38:28.3298892Z   ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3299059Z      ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
2026-10-24T20:38:28.3299124Z  127 │     let cancelled = false;
2026-10-24T20:38:28.3299213Z  128 │     let lastOutcome: string | null = null;
2026-10-24T20:38:28.3299291Z      ·         ─────┬─────
2026-10-24T20:38:28.3299422Z      ·              ╰── 'lastOutcome' is declared here
2026-10-24T20:38:28.3299594Z  129 │     void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
2026-10-24T20:38:28.3299643Z      ╰────
2026-10-24T20:38:28.3299745Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3299747Z
2026-10-24T20:38:28.3300001Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3300164Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
2026-10-24T20:38:28.3300216Z  638 │
2026-10-24T20:38:28.3300279Z  639 │   useEffect(() => {
2026-10-24T20:38:28.3300346Z      ·   ────┬────
2026-10-24T20:38:28.3300468Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3300575Z  640 │     if (pendingLaunchEntry.key === launchTargetKey) {
2026-10-24T20:38:28.3300634Z  641 │       return;
2026-10-24T20:38:28.3300686Z  642 │     }
2026-10-24T20:38:28.3300757Z  643 │     setPendingLaunchEntry({
2026-10-24T20:38:28.3300842Z      ·     ──────────┬──────────
2026-10-24T20:38:28.3301037Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3301154Z  644 │       key: launchTargetKey,
2026-10-24T20:38:28.3301231Z      ╰────
2026-10-24T20:38:28.3301811Z   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-24T20:38:28.3302123Z   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-24T20:38:28.3302125Z
2026-10-24T20:38:28.3302373Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3302542Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
2026-10-24T20:38:28.3302594Z  648 │
2026-10-24T20:38:28.3302656Z  649 │   useEffect(() => {
2026-10-24T20:38:28.3302724Z      ·   ────┬────
2026-10-24T20:38:28.3302849Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3302959Z  650 │     if (initialAttachGridEntry.key === launchTargetKey) {
2026-10-24T20:38:28.3303018Z  651 │       return;
2026-10-24T20:38:28.3303070Z  652 │     }
2026-10-24T20:38:28.3303148Z  653 │     setInitialAttachGridEntry({
2026-10-24T20:38:28.3303237Z      ·     ────────────┬────────────
2026-10-24T20:38:28.3303403Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3303472Z  654 │       key: launchTargetKey,
2026-10-24T20:38:28.3303521Z      ╰────
2026-10-24T20:38:28.3304106Z   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-24T20:38:28.3304422Z   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-24T20:38:28.3304425Z
2026-10-24T20:38:28.3304672Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3304835Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
2026-10-24T20:38:28.3304885Z  743 │
2026-10-24T20:38:28.3304945Z  744 │   useEffect(() => {
2026-10-24T20:38:28.3305015Z      ·   ────┬────
2026-10-24T20:38:28.3305140Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3305239Z  745 │     if (!routeEnvironmentId || !routeThreadId) {
2026-10-24T20:38:28.3305303Z  746 │       setLastGridSize({
2026-10-24T20:38:28.3305382Z      ·       ───────┬───────
2026-10-24T20:38:28.3305544Z      ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3305624Z  747 │         cols: DEFAULT_TERMINAL_COLS,
2026-10-24T20:38:28.3305672Z      ╰────
2026-10-24T20:38:28.3306303Z   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-24T20:38:28.3306643Z   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-24T20:38:28.3306645Z
2026-10-24T20:38:28.3306840Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3307004Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
2026-10-24T20:38:28.3307057Z  537 │     });
2026-10-24T20:38:28.3307174Z  538 │   }, [terminal.buffer, terminal.buffer.length, terminalKey]);
2026-10-24T20:38:28.3307279Z      ·                        ───────────┬──────────
2026-10-24T20:38:28.3307522Z      ·                                   ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
2026-10-24T20:38:28.3307680Z  539 │   const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
2026-10-24T20:38:28.3307729Z      ╰────
2026-10-24T20:38:28.3308015Z   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-24T20:38:28.3308318Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3308321Z
2026-10-24T20:38:28.3308512Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3308674Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
2026-10-24T20:38:28.3308766Z  708 │     sentInitialInputKeyRef.current = null;
2026-10-24T20:38:28.3308835Z  709 │   }, [terminalKey]);
2026-10-24T20:38:28.3308909Z      ·       ─────┬─────
2026-10-24T20:38:28.3309047Z      ·            ╰── Unnecessary dependency `terminalKey`
2026-10-24T20:38:28.3309098Z  710 │
2026-10-24T20:38:28.3309146Z      ╰────
2026-10-24T20:38:28.3309428Z   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-24T20:38:28.3309729Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3309732Z
2026-10-24T20:38:28.3309923Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3310091Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
2026-10-24T20:38:28.3310147Z  799 │     };
2026-10-24T20:38:28.3310320Z  800 │   }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
2026-10-24T20:38:28.3310491Z      ·                                                    ────────────┬────────────  ─────┬─────
2026-10-24T20:38:28.3310716Z      ·                                                                │                   ╰── Unnecessary dependency `terminalKey`
2026-10-24T20:38:28.3310931Z      ·                                                                ╰── Unnecessary dependency `terminal.lifecycleVersion`
2026-10-24T20:38:28.3311010Z  801 │
2026-10-24T20:38:28.3311060Z      ╰────
2026-10-24T20:38:28.3311451Z   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-24T20:38:28.3311795Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3311797Z
2026-10-24T20:38:28.3311937Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3312097Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
2026-10-24T20:38:28.3312151Z  792 │   }
2026-10-24T20:38:28.3312255Z  793 │   const pasteSession = pasteSessionRef.current;
2026-10-24T20:38:28.3312366Z      ·                        ───────────┬───────────
2026-10-24T20:38:28.3312529Z      ·                                   ╰── Cannot access ref value during render
2026-10-24T20:38:28.3312581Z  794 │
2026-10-24T20:38:28.3312629Z      ╰────
2026-10-24T20:38:28.3313090Z   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-24T20:38:28.3313374Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3313379Z
2026-10-24T20:38:28.3313628Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3313757Z      ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5]
2026-10-24T20:38:28.3313947Z  167 │   const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
2026-10-24T20:38:28.3314015Z  168 │   useLayoutEffect(() => {
2026-10-24T20:38:28.3314090Z      ·   ───────┬───────
2026-10-24T20:38:28.3314219Z      ·          ╰── This is the containing effect
2026-10-24T20:38:28.3314305Z  169 │     if (faviconRequest === null) return;
2026-10-24T20:38:28.3314355Z  170 │
2026-10-24T20:38:28.3314483Z  171 │     const endRequest = beginProjectFaviconRequest(faviconRequest);
2026-10-24T20:38:28.3314576Z  172 │     setActiveFaviconRequest(faviconRequest);
2026-10-24T20:38:28.3314664Z      ·     ───────────┬───────────
2026-10-24T20:38:28.3314831Z      ·                ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3314896Z  173 │     return endRequest;
2026-10-24T20:38:28.3314945Z      ╰────
2026-10-24T20:38:28.3315579Z   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-24T20:38:28.3315921Z   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-24T20:38:28.3315923Z
2026-10-24T20:38:28.3316063Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3316216Z      ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
2026-10-24T20:38:28.3316270Z  276 │
2026-10-24T20:38:28.3316451Z  277 │ ╭─▶   return createElement(RawNativeView, {
2026-10-24T20:38:28.3316544Z  278 │ │       ...nativeProps,
2026-10-24T20:38:28.3316685Z  279 │ │       refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-24T20:38:28.3316774Z  280 │ │       ref: nativeRef,
2026-10-24T20:38:28.3316898Z  281 │ ├─▶   });
2026-10-24T20:38:28.3317129Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3317181Z  282 │     }
2026-10-24T20:38:28.3317230Z      ╰────
2026-10-24T20:38:28.3317692Z   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-24T20:38:28.3317978Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3317981Z
2026-10-24T20:38:28.3318230Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3318391Z      ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
2026-10-24T20:38:28.3318443Z  100 │
2026-10-24T20:38:28.3318507Z  101 │   useEffect(() => {
2026-10-24T20:38:28.3318575Z      ·   ────┬────
2026-10-24T20:38:28.3318698Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3318798Z  102 │     if (!target || selectedLines.length === 0) {
2026-10-24T20:38:28.3318884Z  103 │       setHighlightedLinesById({});
2026-10-24T20:38:28.3318978Z      ·       ───────────┬───────────
2026-10-24T20:38:28.3319147Z      ·                  ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3319208Z  104 │       return;
2026-10-24T20:38:28.3319256Z      ╰────
2026-10-24T20:38:28.3319841Z   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-24T20:38:28.3320154Z   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-24T20:38:28.3320202Z
2026-10-24T20:38:28.3320421Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3320565Z      ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25]
2026-10-24T20:38:28.3320670Z  271 │                 {record.elements?.map((element, index) => (
2026-10-24T20:38:28.3320833Z  272 │                   <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
2026-10-24T20:38:28.3321016Z      ·                         ───────────────────────────────────────────────────────
2026-10-24T20:38:28.3321092Z  273 │                     <ContextField
2026-10-24T20:38:28.3321143Z      ╰────
2026-10-24T20:38:28.3321287Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3321290Z
2026-10-24T20:38:28.3321487Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3321617Z     ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6]
2026-10-24T20:38:28.3321671Z  81 │     },
2026-10-24T20:38:28.3321732Z  82 │     [draftKey],
2026-10-24T20:38:28.3321801Z     ·      ────┬───
2026-10-24T20:38:28.3321935Z     ·          ╰── Unnecessary dependency `draftKey`
2026-10-24T20:38:28.3321986Z  83 │   );
2026-10-24T20:38:28.3322035Z     ╰────
2026-10-24T20:38:28.3322318Z   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-24T20:38:28.3322621Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3322624Z
2026-10-24T20:38:28.3322877Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3323062Z      ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
2026-10-24T20:38:28.3323113Z  104 │
2026-10-24T20:38:28.3323175Z  105 │   useEffect(() => {
2026-10-24T20:38:28.3323244Z      ·   ────┬────
2026-10-24T20:38:28.3323369Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3323445Z  106 │     clearReviewCommentTarget();
2026-10-24T20:38:28.3323539Z  107 │     setPendingNativeCommentSelection(null);
2026-10-24T20:38:28.3323643Z      ·     ────────────────┬───────────────
2026-10-24T20:38:28.3323817Z      ·                     ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3323890Z  108 │   }, [selectedSection?.id]);
2026-10-24T20:38:28.3323939Z      ╰────
2026-10-24T20:38:28.3324518Z   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-24T20:38:28.3324830Z   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-24T20:38:28.3324832Z
2026-10-24T20:38:28.3325080Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3325307Z      ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
2026-10-24T20:38:28.3325390Z  109 │
2026-10-24T20:38:28.3325453Z  110 │   useEffect(() => {
2026-10-24T20:38:28.3325522Z      ·   ────┬────
2026-10-24T20:38:28.3325644Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3325730Z  111 │     if (activeCommentTarget === null) {
2026-10-24T20:38:28.3325829Z  112 │       setPendingNativeCommentSelection(null);
2026-10-24T20:38:28.3325934Z      ·       ────────────────┬───────────────
2026-10-24T20:38:28.3326104Z      ·                       ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3326157Z  113 │     }
2026-10-24T20:38:28.3326206Z      ╰────
2026-10-24T20:38:28.3326793Z   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-24T20:38:28.3327108Z   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-24T20:38:28.3327110Z
2026-10-24T20:38:28.3327300Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3327478Z      ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
2026-10-24T20:38:28.3327571Z  107 │     setPendingNativeCommentSelection(null);
2026-10-24T20:38:28.3327642Z  108 │   }, [selectedSection?.id]);
2026-10-24T20:38:28.3327730Z      ·       ─────────┬─────────
2026-10-24T20:38:28.3327889Z      ·                ╰── Unnecessary dependency `selectedSection?.id`
2026-10-24T20:38:28.3327941Z  109 │
2026-10-24T20:38:28.3327989Z      ╰────
2026-10-24T20:38:28.3328272Z   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-24T20:38:28.3328575Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3328578Z
2026-10-24T20:38:28.3328769Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3328900Z      ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
2026-10-24T20:38:28.3328987Z  453 │     showAuxiliaryPane("inspector");
2026-10-24T20:38:28.3329093Z  454 │   }, [environmentId, showAuxiliaryPane, threadId]);
2026-10-24T20:38:28.3329234Z      ·       ──────┬──────                     ────┬───
2026-10-24T20:38:28.3329426Z      ·             │                               ╰── Unnecessary dependency `threadId`
2026-10-24T20:38:28.3329571Z      ·             ╰── Unnecessary dependency `environmentId`
2026-10-24T20:38:28.3329629Z  455 │   const {
2026-10-24T20:38:28.3329678Z      ╰────
2026-10-24T20:38:28.3329964Z   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-24T20:38:28.3330322Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3330354Z
2026-10-24T20:38:28.3330534Z   ⚠ react(static-components): Cannot create components during render
2026-10-24T20:38:28.3330664Z      ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
2026-10-24T20:38:28.3330727Z  492 │   // same check.
2026-10-24T20:38:28.3330862Z  493 │   const NativeReviewDiffView = resolveNativeReviewDiffView();
2026-10-24T20:38:28.3331006Z      ·                                ─────────────┬─────────────
2026-10-24T20:38:28.3331180Z      ·                                             ╰── The component is created during render here
2026-10-24T20:38:28.3331325Z  494 │   const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
2026-10-24T20:38:28.3331446Z  495 │   const showcasedReviewDrawRef = useRef<string | null>(null);
2026-10-24T20:38:28.3331576Z  496 │   const [isPullRefreshing, setIsPullRefreshing] = useState(false);
2026-10-24T20:38:28.3331665Z  497 │   const handlePullToRefresh = async () => {
2026-10-24T20:38:28.3331741Z  498 │     setIsPullRefreshing(true);
2026-10-24T20:38:28.3331823Z  499 │     await refreshSelectedSection();
2026-10-24T20:38:28.3331900Z  500 │     setIsPullRefreshing(false);
2026-10-24T20:38:28.3331950Z  501 │   };
2026-10-24T20:38:28.3332089Z  502 │   const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
2026-10-24T20:38:28.3332226Z  503 │   const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
2026-10-24T20:38:28.3332331Z  504 │   const fileVisibility = useReviewFileVisibility({
2026-10-24T20:38:28.3332413Z  505 │     threadKey: reviewCache.threadKey,
2026-10-24T20:38:28.3332501Z  506 │     sectionId: selectedSection?.id ?? null,
2026-10-24T20:38:28.3332572Z  507 │     files: reviewFiles,
2026-10-24T20:38:28.3332671Z  508 │     cachedExpandedFileIds: selectedSection?.id
2026-10-24T20:38:28.3332797Z  509 │       ? reviewCache.expandedFileIdsBySection[selectedSection.id]
2026-10-24T20:38:28.3332860Z  510 │       : undefined,
2026-10-24T20:38:28.3332952Z  511 │     cachedViewedFileIds: selectedSection?.id
2026-10-24T20:38:28.3333071Z  512 │       ? reviewCache.viewedFileIdsBySection[selectedSection.id]
2026-10-24T20:38:28.3333130Z  513 │       : undefined,
2026-10-24T20:38:28.3333183Z  514 │   });
2026-10-24T20:38:28.3333368Z  515 │   const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
2026-10-24T20:38:28.3333495Z  516 │   const commentSelection = useReviewCommentSelectionController({
2026-10-24T20:38:28.3333554Z  517 │     environmentId,
2026-10-24T20:38:28.3333614Z  518 │     threadId,
2026-10-24T20:38:28.3333683Z  519 │     selectedSection,
2026-10-24T20:38:28.3333751Z  520 │     nativeReviewDiffData,
2026-10-24T20:38:28.3333803Z  521 │   });
2026-10-24T20:38:28.3333904Z  522 │   const nativeBridge = useNativeReviewDiffBridge({
2026-10-24T20:38:28.3333987Z  523 │     threadKey: reviewCache.threadKey,
2026-10-24T20:38:28.3334073Z  524 │     sectionId: selectedSection?.id ?? null,
2026-10-24T20:38:28.3334148Z  525 │     diff: selectedSection?.diff,
2026-10-24T20:38:28.3334222Z  526 │     data: nativeReviewDiffData,
2026-10-24T20:38:28.3334291Z  527 │     collapsedFileIds,
2026-10-24T20:38:28.3334351Z  528 │     viewedFileIds,
2026-10-24T20:38:28.3334457Z  529 │     selectedRowIds: commentSelection.selectedRowIds,
2026-10-24T20:38:28.3334553Z  530 │     canHighlight: parsedDiff.kind === "files",
2026-10-24T20:38:28.3334605Z  531 │   });
2026-10-24T20:38:28.3334675Z  532 │   const showcaseReviewKey =
2026-10-24T20:38:28.3334853Z  533 │     SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
2026-10-24T20:38:28.3335084Z  534 │       ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
2026-10-24T20:38:28.3335143Z  535 │       : null;
2026-10-24T20:38:28.3335304Z  536 │   const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
2026-10-24T20:38:28.3335380Z  537 │     nativeBridge.onDebug(event);
2026-10-24T20:38:28.3335437Z  538 │     if (
2026-10-24T20:38:28.3335514Z  539 │       showcaseReviewKey === null ||
2026-10-24T20:38:28.3335630Z  540 │       showcasedReviewDrawRef.current === showcaseReviewKey ||
2026-10-24T20:38:28.3335737Z  541 │       !isNativeReviewDiffDrawEvent(event.nativeEvent)
2026-10-24T20:38:28.3335791Z  542 │     ) {
2026-10-24T20:38:28.3335849Z  543 │       return;
2026-10-24T20:38:28.3335900Z  544 │     }
2026-10-24T20:38:28.3336014Z  545 │     showcasedReviewDrawRef.current = showcaseReviewKey;
2026-10-24T20:38:28.3336174Z  546 │     reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
2026-10-24T20:38:28.3336225Z  547 │   };
2026-10-24T20:38:28.3336275Z  548 │
2026-10-24T20:38:28.3336388Z  549 │   const handleSelectFile = async (fileId: string | null) => {
2026-10-24T20:38:28.3336465Z  550 │     loadVisibleFile(fileId, true);
2026-10-24T20:38:28.3336551Z  551 │     commentSelection.clearSelection();
2026-10-24T20:38:28.3336668Z  552 │     if (fileId !== null && collapsedFileIds.includes(fileId)) {
2026-10-24T20:38:28.3336746Z  553 │       toggleExpandedFile(fileId);
2026-10-24T20:38:28.3336798Z  554 │     }
2026-10-24T20:38:28.3336905Z  555 │     const nativeView = nativeReviewDiffViewRef.current;
2026-10-24T20:38:28.3336973Z  556 │     if (!nativeView) return;
2026-10-24T20:38:28.3337068Z  557 │     const result = await settlePromise(() =>
2026-10-24T20:38:28.3337239Z  558 │       fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
2026-10-24T20:38:28.3337292Z  559 │     );
2026-10-24T20:38:28.3337378Z  560 │     if (AsyncResult.isFailure(result)) {
2026-10-24T20:38:28.3337554Z  561 │       console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
2026-10-24T20:38:28.3337606Z  562 │     }
2026-10-24T20:38:28.3337656Z  563 │   };
2026-10-24T20:38:28.3337736Z  564 │   const handleVisibleFileChange = (
2026-10-24T20:38:28.3337865Z  565 │     event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
2026-10-24T20:38:28.3337922Z  566 │   ) => {
2026-10-24T20:38:28.3338026Z  567 │     loadVisibleFile(event.nativeEvent.fileId ?? null);
2026-10-24T20:38:28.3338236Z  568 │     reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
2026-10-24T20:38:28.3338317Z  569 │   };
2026-10-24T20:38:28.3338393Z  570 │   const renderInspector = () => (
2026-10-24T20:38:28.3338458Z  571 │     <ReviewFileNavigator
2026-10-24T20:38:28.3338536Z  572 │       ref={reviewFileNavigatorRef}
2026-10-24T20:38:28.3338622Z  573 │       files={nativeReviewDiffData.files}
2026-10-24T20:38:28.3338695Z  574 │       headerInset={insets.top}
2026-10-24T20:38:28.3338784Z  575 │       sectionId={selectedSection?.id ?? null}
2026-10-24T20:38:28.3338899Z  576 │       onSelectFile={(fileId) => void handleSelectFile(fileId)}
2026-10-24T20:38:28.3338952Z  577 │     />
2026-10-24T20:38:28.3339002Z  578 │   );
2026-10-24T20:38:28.3339053Z  579 │
2026-10-24T20:38:28.3339232Z  580 │   const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
2026-10-24T20:38:28.3339323Z  581 │     const { fileId } = event.nativeEvent;
2026-10-24T20:38:28.3339385Z  582 │     if (fileId) {
2026-10-24T20:38:28.3339466Z  583 │       loadVisibleFile(fileId, true);
2026-10-24T20:38:28.3339541Z  584 │       toggleExpandedFile(fileId);
2026-10-24T20:38:28.3339594Z  585 │     }
2026-10-24T20:38:28.3339644Z  586 │   };
2026-10-24T20:38:28.3339693Z  587 │
2026-10-24T20:38:28.3339780Z  588 │   const handleNativeToggleViewedFile = (
2026-10-24T20:38:28.3339897Z  589 │     event: NativeSyntheticEvent<{ readonly fileId?: string }>,
2026-10-24T20:38:28.3339951Z  590 │   ) => {
2026-10-24T20:38:28.3340035Z  591 │     const { fileId } = event.nativeEvent;
2026-10-24T20:38:28.3340097Z  592 │     if (fileId) {
2026-10-24T20:38:28.3340170Z  593 │       toggleViewedFile(fileId);
2026-10-24T20:38:28.3340220Z  594 │     }
2026-10-24T20:38:28.3340272Z  595 │   };
2026-10-24T20:38:28.3340323Z  596 │
2026-10-24T20:38:28.3340396Z  597 │   const parsedDiffNotice =
2026-10-24T20:38:28.3340554Z  598 │     parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
2026-10-24T20:38:28.3340671Z  599 │   const hasCachedSelectedDiff = selectedSection?.diff != null;
2026-10-24T20:38:28.3340822Z  600 │   const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
2026-10-24T20:38:28.3340972Z  601 │   const sectionMenu = buildReviewSectionMenu(reviewSections);
2026-10-24T20:38:28.3341125Z  602 │   const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
2026-10-24T20:38:28.3341232Z  603 │     hasEnvironmentPresentation: environment.isReady,
2026-10-24T20:38:28.3341330Z  604 │     isEnvironmentConnected: isEnvironmentReady,
2026-10-24T20:38:28.3341400Z  605 │     hasCachedSelectedDiff,
2026-10-24T20:38:28.3341463Z  606 │     hasAnyCachedDiff,
2026-10-24T20:38:28.3341515Z  607 │   });
2026-10-24T20:38:28.3341604Z  608 │   const handleRetryEnvironment = () => {
2026-10-24T20:38:28.3341688Z  609 │     void retryEnvironment(environmentId);
2026-10-24T20:38:28.3341740Z  610 │   };
2026-10-24T20:38:28.3341822Z  611 │   const handleReturnToThread = () => {
2026-10-24T20:38:28.3341898Z  612 │     if (navigation.canGoBack()) {
2026-10-24T20:38:28.3341963Z  613 │       navigation.goBack();
2026-10-24T20:38:28.3342020Z  614 │       return;
2026-10-24T20:38:28.3342072Z  615 │     }
2026-10-24T20:38:28.3342150Z  616 │     navigation.navigate("Thread", {
2026-10-24T20:38:28.3342236Z  617 │       environmentId: String(environmentId),
2026-10-24T20:38:28.3342311Z  618 │       threadId: String(threadId),
2026-10-24T20:38:28.3342363Z  619 │     });
2026-10-24T20:38:28.3342416Z  620 │   };
2026-10-24T20:38:28.3342490Z  621 │   const androidHeaderSubtitle = [
2026-10-24T20:38:28.3342605Z  622 │     selectedSection?.title,
2026-10-24T20:38:28.3342715Z  623 │     headerDiffSummary.additions,
2026-10-24T20:38:28.3342790Z  624 │     headerDiffSummary.deletions,
2026-10-24T20:38:28.3342842Z  625 │   ]
2026-10-24T20:38:28.3342945Z  626 │     .filter((part): part is string => Boolean(part))
2026-10-24T20:38:28.3343006Z  627 │     .join(" · ");
2026-10-24T20:38:28.3343056Z  628 │
2026-10-24T20:38:28.3343131Z  629 │   const showChangedFilesPane =
2026-10-24T20:38:28.3343203Z  630 │     !showConnectionNotice &&
2026-10-24T20:38:28.3343276Z  631 │     selectedSection !== null &&
2026-10-24T20:38:28.3343351Z  632 │     parsedDiff.kind === "files" &&
2026-10-24T20:38:28.3343429Z  633 │     NativeReviewDiffView !== null;
2026-10-24T20:38:28.3343594Z  634 │   useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
2026-10-24T20:38:28.3343766Z  635 │   const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
2026-10-24T20:38:28.3343817Z  636 │
2026-10-24T20:38:28.3343888Z  637 │   const listHeader = (() => {
2026-10-24T20:38:28.3343971Z  638 │     const children: ReactElement[] = [];
2026-10-24T20:38:28.3344021Z  639 │
2026-10-24T20:38:28.3344080Z  640 │     if (error) {
2026-10-24T20:38:28.3344144Z  641 │       children.push(
2026-10-24T20:38:28.3344202Z  642 │         <View
2026-10-24T20:38:28.3344270Z  643 │           key="review-error"
2026-10-24T20:38:28.3344333Z  644 │           className={cn(
2026-10-24T20:38:28.3344408Z  645 │             "bg-card px-4 py-3",
2026-10-24T20:38:28.3344558Z  646 │             Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
2026-10-24T20:38:28.3344614Z  647 │           )}
2026-10-24T20:38:28.3344670Z  648 │         >
2026-10-24T20:38:28.3344835Z  649 │           <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
2026-10-24T20:38:28.3344991Z  650 │           <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
2026-10-24T20:38:28.3345050Z  651 │         </View>,
2026-10-24T20:38:28.3345105Z  652 │       );
2026-10-24T20:38:28.3345158Z  653 │     }
2026-10-24T20:38:28.3345207Z  654 │
2026-10-24T20:38:28.3345275Z  655 │     if (parsedDiffNotice) {
2026-10-24T20:38:28.3345431Z  656 │       children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
2026-10-24T20:38:28.3345483Z  657 │     }
2026-10-24T20:38:28.3345532Z  658 │
2026-10-24T20:38:28.3345605Z  659 │     if (children.length === 0) {
2026-10-24T20:38:28.3345667Z  660 │       return null;
2026-10-24T20:38:28.3345719Z  661 │     }
2026-10-24T20:38:28.3345770Z  662 │
2026-10-24T20:38:28.3345838Z  663 │     return <>{children}</>;
2026-10-24T20:38:28.3345898Z  664 │   })();
2026-10-24T20:38:28.3345968Z  665 │   const headerSubtitle = [
2026-10-24T20:38:28.3346045Z  666 │     headerDiffSummary.additions,
2026-10-24T20:38:28.3346121Z  667 │     headerDiffSummary.deletions,
2026-10-24T20:38:28.3346201Z  668 │     pendingReviewCommentCount > 0
2026-10-24T20:38:28.3346370Z  669 │       ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
2026-10-24T20:38:28.3346427Z  670 │       : null,
2026-10-24T20:38:28.3346479Z  671 │   ]
2026-10-24T20:38:28.3346543Z  672 │     .filter(Boolean)
2026-10-24T20:38:28.3346604Z  673 │     .join(" · ");
2026-10-24T20:38:28.3346734Z  674 │   const headerTitleText = selectedSection?.title ?? "Review changes";
2026-10-24T20:38:28.3346786Z  675 │
2026-10-24T20:38:28.3346845Z  676 │   return (
2026-10-24T20:38:28.3346900Z  677 │     <>
2026-10-24T20:38:28.3346961Z  678 │       <ReviewHeader
2026-10-24T20:38:28.3347094Z  679 │         environmentId={environmentId}
2026-10-24T20:38:28.3347191Z  680 │         threadId={threadId}
2026-10-24T20:38:28.3347266Z  681 │         title={headerTitleText}
2026-10-24T20:38:28.3347342Z  682 │         subtitle={headerSubtitle}
2026-10-24T20:38:28.3347438Z  683 │         androidSubtitle={androidHeaderSubtitle}
2026-10-24T20:38:28.3347509Z  684 │         iconColor={headerIcon}
2026-10-24T20:38:28.3347602Z  685 │         selectedThreadCwd={selectedThreadCwd}
2026-10-24T20:38:28.3347676Z  686 │         sectionMenu={sectionMenu}
2026-10-24T20:38:28.3347760Z  687 │         selectedSection={selectedSection}
2026-10-24T20:38:28.3347855Z  688 │         showSectionToolbar={showSectionToolbar}
2026-10-24T20:38:28.3347962Z  689 │         showChangedFilesToggle={showChangedFilesToggle}
2026-10-24T20:38:28.3348046Z  690 │         onRefresh={handlePullToRefresh}
2026-10-24T20:38:28.3348135Z  691 │         onSelectSection={selectSection}
2026-10-24T20:38:28.3348230Z  692 │         onReturnToThread={handleReturnToThread}
2026-10-24T20:38:28.3348284Z  693 │       />
2026-10-24T20:38:28.3348335Z  694 │
2026-10-24T20:38:28.3348401Z  695 │       <ScreenContent>
2026-10-24T20:38:28.3348520Z  696 │         <View className="flex-1 bg-sheet android:bg-sheet-solid">
2026-10-24T20:38:28.3348597Z  697 │           {showConnectionNotice ? (
2026-10-24T20:38:28.3348735Z  698 │             <View className="flex-1" style={{ paddingTop: topContentInset }}>
2026-10-24T20:38:28.3348823Z  699 │               <EnvironmentConnectionNotice
2026-10-24T20:38:28.3348995Z  700 │                 environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
2026-10-24T20:38:28.3349061Z  701 │                 connection={
2026-10-24T20:38:28.3349170Z  702 │                   environment.presentation?.connection ?? {
2026-10-24T20:38:28.3349251Z  703 │                     phase: "available",
2026-10-24T20:38:28.3349323Z  704 │                     error: null,
2026-10-24T20:38:28.3349394Z  705 │                     traceId: null,
2026-10-24T20:38:28.3349458Z  706 │                   }
2026-10-24T20:38:28.3349518Z  707 │                 }
2026-10-24T20:38:28.3349597Z  708 │                 resourceName="review"
2026-10-24T20:38:28.3349689Z  709 │                 onRetry={handleRetryEnvironment}
2026-10-24T20:38:28.3349749Z  710 │               />
2026-10-24T20:38:28.3349810Z  711 │             </View>
2026-10-24T20:38:28.3349963Z  712 │           ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
2026-10-24T20:38:28.3350020Z  713 │             <View
2026-10-24T20:38:28.3350094Z  714 │               className="flex-1"
2026-10-24T20:38:28.3350157Z  715 │               style={{
2026-10-24T20:38:28.3350275Z  716 │                 backgroundColor: nativeBridge.theme.background,
2026-10-24T20:38:28.3350334Z  717 │               }}
2026-10-24T20:38:28.3350392Z  718 │             >
2026-10-24T20:38:28.3350454Z  719 │               <View
2026-10-24T20:38:28.3350537Z  720 │                 className="min-w-0 flex-1"
2026-10-24T20:38:28.3350674Z  721 │                 style={listHeader ? { paddingTop: topContentInset } : undefined}
2026-10-24T20:38:28.3350734Z  722 │               >
2026-10-24T20:38:28.3350802Z  723 │                 {listHeader}
2026-10-24T20:38:28.3350954Z  724 │                 <View className="min-w-0 flex-1" collapsable={false}>
2026-10-24T20:38:28.3351035Z  725 │                   <NativeReviewDiffView
2026-10-24T20:38:28.3351141Z      ·                    ──────────┬─────────
2026-10-24T20:38:28.3351405Z      ·                              ╰── This component is created during render
2026-10-24T20:38:28.3351522Z  726 │                     collapsable={false}
2026-10-24T20:38:28.3351574Z      ╰────
2026-10-24T20:38:28.3351821Z   help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-24T20:38:28.3352137Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T20:38:28.3352140Z
2026-10-24T20:38:28.3352395Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3352527Z     ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5]
2026-10-24T20:38:28.3352630Z  66 │   const { id: attachmentId, fileUri } = attachment;
2026-10-24T20:38:28.3352697Z  67 │   useEffect(() => {
2026-10-24T20:38:28.3352768Z     ·   ────┬────
2026-10-24T20:38:28.3352892Z     ·       ╰── This is the containing effect
2026-10-24T20:38:28.3352953Z  68 │     setUri(null);
2026-10-24T20:38:28.3353023Z     ·     ───┬──
2026-10-24T20:38:28.3353182Z     ·        ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3353243Z  69 │     setError(null);
2026-10-24T20:38:28.3353293Z     ╰────
2026-10-24T20:38:28.3353881Z   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-24T20:38:28.3354203Z   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-24T20:38:28.3354208Z
2026-10-24T20:38:28.3354403Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3354534Z     ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7]
2026-10-24T20:38:28.3354588Z  90 │     };
2026-10-24T20:38:28.3354661Z  91 │   }, [attachmentId, fileUri]);
2026-10-24T20:38:28.3354774Z     ·       ──────┬─────  ───┬───
2026-10-24T20:38:28.3354949Z     ·             │          ╰── Unnecessary dependency `fileUri`
2026-10-24T20:38:28.3355091Z     ·             ╰── Unnecessary dependency `attachmentId`
2026-10-24T20:38:28.3355228Z  92 │   const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
2026-10-24T20:38:28.3355281Z     ╰────
2026-10-24T20:38:28.3355566Z   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-24T20:38:28.3355872Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3355874Z
2026-10-24T20:38:28.3356081Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T20:38:28.3356218Z      ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34]
2026-10-24T20:38:28.3356282Z  212 │   useEffect(() => {
2026-10-24T20:38:28.3356502Z  213 │     if (!isFocused && hasSource) props.onRequestClose();
2026-10-24T20:38:28.3356626Z      ·                                  ──┬──
2026-10-24T20:38:28.3356773Z      ·                                    ╰── Missing dependency `props`
2026-10-24T20:38:28.3356879Z  214 │   }, [isFocused, hasSource, props.onRequestClose]);
2026-10-24T20:38:28.3356985Z      ·                             ──────────┬─────────
2026-10-24T20:38:28.3357206Z      ·                                       ╰── Overly precise dependency `props.onRequestClose`, use `props` instead
2026-10-24T20:38:28.3357277Z  215 │   const { source } = props;
2026-10-24T20:38:28.3357327Z      ╰────
2026-10-24T20:38:28.3357745Z   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-24T20:38:28.3358055Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3358057Z
2026-10-24T20:38:28.3358308Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3358451Z     ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55]
2026-10-24T20:38:28.3358508Z  61 │   }, []);
2026-10-24T20:38:28.3358568Z  62 │   useEffect(() => {
2026-10-24T20:38:28.3358636Z     ·   ────┬────
2026-10-24T20:38:28.3358760Z     ·       ╰── This is the containing effect
2026-10-24T20:38:28.3358908Z  63 │     if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
2026-10-24T20:38:28.3359031Z     ·                                                       ───────┬──────
2026-10-24T20:38:28.3359231Z     ·                                                              ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3359308Z  64 │   }, [playbackUrl, resolvedUrl]);
2026-10-24T20:38:28.3359357Z     ╰────
2026-10-24T20:38:28.3359941Z   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-24T20:38:28.3360261Z   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-24T20:38:28.3360266Z
2026-10-24T20:38:28.3360455Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3360602Z      ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
2026-10-24T20:38:28.3360706Z  222 │               ? snippetTokens.map((line, lineIndex) => (
2026-10-24T20:38:28.3360797Z  223 │                   <NativeText key={lineIndex}>
2026-10-24T20:38:28.3360932Z      ·                               ───────────────
2026-10-24T20:38:28.3361022Z  224 │                     {lineIndex > 0 ? "\n" : ""}
2026-10-24T20:38:28.3361072Z      ╰────
2026-10-24T20:38:28.3361214Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3361217Z
2026-10-24T20:38:28.3361452Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3361634Z      ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
2026-10-24T20:38:28.3361710Z  226 │                       <NativeText
2026-10-24T20:38:28.3361790Z  227 │                         key={tokenIndex}
2026-10-24T20:38:28.3361890Z      ·                         ────────────────
2026-10-24T20:38:28.3361962Z  228 │                         style={{
2026-10-24T20:38:28.3362015Z      ╰────
2026-10-24T20:38:28.3362154Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3362156Z
2026-10-24T20:38:28.3362408Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3362578Z     ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
2026-10-24T20:38:28.3362634Z  55 │
2026-10-24T20:38:28.3362697Z  56 │   useEffect(() => {
2026-10-24T20:38:28.3362765Z     ·   ────┬────
2026-10-24T20:38:28.3362889Z     ·       ╰── This is the containing effect
2026-10-24T20:38:28.3362954Z  57 │     scheduler.reset();
2026-10-24T20:38:28.3363048Z  58 │     highlightedRowIdsRef.current = new Set();
2026-10-24T20:38:28.3363132Z  59 │     visibleChunkIndexRef.current = 0;
2026-10-24T20:38:28.3363246Z  60 │     setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
2026-10-24T20:38:28.3363323Z     ·     ───────┬───────
2026-10-24T20:38:28.3363487Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3363598Z  61 │     setTokensPatchJson(createEmptyTokenPatch(resetKey));
2026-10-24T20:38:28.3363649Z     ╰────
2026-10-24T20:38:28.3364241Z   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-24T20:38:28.3364559Z   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-24T20:38:28.3364561Z
2026-10-24T20:38:28.3364754Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3364924Z     ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
2026-10-24T20:38:28.3365003Z  62 │     return () => scheduler.cancel();
2026-10-24T20:38:28.3365105Z  63 │   }, [enabled, resetKey, rows.length, scheduler]);
2026-10-24T20:38:28.3365229Z     ·       ───┬───            ─────┬─────
2026-10-24T20:38:28.3365416Z     ·          │                    ╰── Unnecessary dependency `rows.length`
2026-10-24T20:38:28.3365549Z     ·          ╰── Unnecessary dependency `enabled`
2026-10-24T20:38:28.3365600Z  64 │
2026-10-24T20:38:28.3365648Z     ╰────
2026-10-24T20:38:28.3365938Z   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-24T20:38:28.3366241Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3366243Z
2026-10-24T20:38:28.3366561Z   ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3366731Z     ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
2026-10-24T20:38:28.3366782Z  60 │ ) {
2026-10-24T20:38:28.3366946Z  61 │   const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
2026-10-24T20:38:28.3367024Z     ·         ──────┬──────
2026-10-24T20:38:28.3367159Z     ·               ╰── 'useDragRegion' is declared here
2026-10-24T20:38:28.3367246Z  62 │   const isInline = props.mode === "inline";
2026-10-24T20:38:28.3367295Z     ╰────
2026-10-24T20:38:28.3367396Z   help: Consider removing this declaration.
2026-10-24T20:38:28.3367399Z
2026-10-24T20:38:28.3367654Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3367822Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7]
2026-10-24T20:38:28.3367877Z  328 │   };
2026-10-24T20:38:28.3367942Z  329 │   useEffect(() => {
2026-10-24T20:38:28.3368013Z      ·   ────┬────
2026-10-24T20:38:28.3368137Z      ·       ╰── This is the containing effect
2026-10-24T20:38:28.3368234Z  330 │     if (!guidesEnabled && section === "guide") {
2026-10-24T20:38:28.3368327Z  331 │       requestedSection.current = "overview";
2026-10-24T20:38:28.3368488Z  332 │       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-24T20:38:28.3368558Z  333 │       setSection("overview");
2026-10-24T20:38:28.3368631Z      ·       ─────┬────
2026-10-24T20:38:28.3368804Z      ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3368860Z  334 │     }
2026-10-24T20:38:28.3368909Z      ╰────
2026-10-24T20:38:28.3369493Z   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-24T20:38:28.3369807Z   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-24T20:38:28.3369809Z
2026-10-24T20:38:28.3370007Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3370222Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6]
2026-10-24T20:38:28.3370342Z  330 │     if (!guidesEnabled && section === "guide") {
2026-10-24T20:38:28.3370436Z  331 │       requestedSection.current = "overview";
2026-10-24T20:38:28.3370517Z      ·       ────────┬───────
2026-10-24T20:38:28.3370992Z      ·               ╰── 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-24T20:38:28.3371150Z  332 │       currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-24T20:38:28.3371297Z      ·       ─────────┬─────────           ──────┬──────
2026-10-24T20:38:28.3371791Z      ·                │                          ╰── 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-24T20:38:28.3372234Z      ·                ╰── 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-24T20:38:28.3372309Z  333 │       setSection("overview");
2026-10-24T20:38:28.3372360Z  334 │     }
2026-10-24T20:38:28.3372450Z  335 │   }, [guidesEnabled, section, insets.top]);
2026-10-24T20:38:28.3372558Z      ·      ──────────────────┬─────────────────
2026-10-24T20:38:28.3372751Z      ·                        ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3372837Z  336 │   const tabContent = activityContent;
2026-10-24T20:38:28.3372887Z      ╰────
2026-10-24T20:38:28.3373050Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3373354Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3373357Z
2026-10-24T20:38:28.3373555Z   ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3373720Z      ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6]
2026-10-24T20:38:28.3373777Z  860 │     if (
2026-10-24T20:38:28.3373890Z  861 │       lastSelection.current.path === route.params.path &&
2026-10-24T20:38:28.3373971Z      ·       ──────┬──────
2026-10-24T20:38:28.3374393Z      ·             ╰── 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-24T20:38:28.3374519Z  862 │       lastSelection.current.id === route.params.fileSelectionId
2026-10-24T20:38:28.3374570Z  863 │     )
2026-10-24T20:38:28.3374632Z  864 │       return;
2026-10-24T20:38:28.3374803Z  865 │     lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
2026-10-24T20:38:28.3374935Z  866 │     if (route.params.focus) navigation.setParams({ focus: undefined });
2026-10-24T20:38:28.3375019Z  867 │     setJumpPath(route.params.path);
2026-10-24T20:38:28.3375089Z  868 │     setSelectedRowId(null);
2026-10-24T20:38:28.3375166Z  869 │     jumpStarted.current = false;
2026-10-24T20:38:28.3375358Z  870 │     const file = data.files.find((entry) => entry.path === route.params.path);
2026-10-24T20:38:28.3375479Z  871 │     if (!file || !nativeView.current) return;
2026-10-24T20:38:28.3375567Z      ·                   ─────┬────
2026-10-24T20:38:28.3375994Z      ·                        ╰── 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-24T20:38:28.3376117Z  872 │     setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
2026-10-24T20:38:28.3376194Z  873 │     jumpStarted.current = true;
2026-10-24T20:38:28.3376326Z  874 │     void nativeView.current.scrollToFile(file.id, false).catch(() => {
2026-10-24T20:38:28.3376403Z  875 │       jumpStarted.current = false;
2026-10-24T20:38:28.3376463Z  876 │     });
2026-10-24T20:38:28.3376655Z  877 │   }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
2026-10-24T20:38:28.3376855Z      ·      ──────────────────────────────────────────────┬──────────────────────────────────────────────
2026-10-24T20:38:28.3377068Z      ·                                                    ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3377175Z  878 │   const appliedFilter = useRef(filter.hideTestFiles);
2026-10-24T20:38:28.3377226Z      ╰────
2026-10-24T20:38:28.3377388Z   help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3377693Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3377702Z
2026-10-24T20:38:28.3377783Z Found 0 errors and 367 warnings in 5479 files (5.5s, 8 threads)
2026-10-24T20:38:28.3814487Z Post job cleanup.
2026-10-24T20:38:28.4400711Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-24T20:38:28.4466773Z Post job cleanup.
2026-10-24T20:38:28.4476653Z ##[start-action display=Cache full pnpm store;id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.__actions_cache]
2026-10-24T20:38:28.4778177Z Post job cleanup.
2026-10-24T20:38:28.5483266Z [command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/_work/t3code/t3code --files-from manifest.txt --use-compress-program zstdmt
2026-10-24T20:38:32.0104225Z Failed to save: Unable to reserve cache with key pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6, another job may be creating this cache.
2026-10-24T20:38:32.0565525Z ##[end-action id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.__actions_cache;outcome=success;conclusion=success;duration_ms=3608]
2026-10-24T20:38:32.0567162Z ##[start-action display=Cache Vite+;id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.vp_cache]
2026-10-24T20:38:32.0585937Z Post job cleanup.
2026-10-24T20:38:32.1183454Z 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-24T20:38:32.1212248Z ##[end-action id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.vp_cache;outcome=success;conclusion=success;duration_ms=64]
2026-10-24T20:38:32.1245945Z Post job cleanup.
2026-10-24T20:38:32.1616808Z [command]/usr/local/bin/git version
2026-10-24T20:38:32.1642786Z git version 2.55.0
2026-10-24T20:38:32.1689670Z Temporarily overriding HOME='/home/runner/_work/_temp/fe065c06-5498-4a18-91d5-577c1fadb2cf' before making global git config changes
2026-10-24T20:38:32.1690015Z Adding repository directory to the temporary git global config as a safe directory
2026-10-24T20:38:32.1692340Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-24T20:38:32.1712114Z Removing SSH command configuration
2026-10-24T20:38:32.1714826Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-24T20:38:32.1735481Z [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-24T20:38:32.1843220Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-24T20:38:32.1867544Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-24T20:38:32.1909768Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-24T20:38:32.1923515Z ##[group]Run '/job_completed.sh'
2026-10-24T20:38:32.1929076Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-24T20:38:32.1929242Z env:
2026-10-24T20:38:32.1929348Z   BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167
2026-10-24T20:38:32.1929501Z   BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383
2026-10-24T20:38:32.1929634Z   BLACKSMITH_CHECK_RUN_ID: 120981382431
2026-10-24T20:38:32.1929770Z   BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-24T20:38:32.1929904Z   GITHUB_ACTIONS_CACHE_MODE: write
2026-10-24T20:38:32.1930033Z ##[endgroup]
2026-10-24T20:38:32.1997329Z Docker container cache not activated, skipping hash computation.
2026-10-24T20:38:32.2249311Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-24T20:38:32.2289509Z Cleaning up orphan processes