{"record":{"id":"11d26fad05a1baf7","repo":"different-ai/openwork","slug":"task-creation-did-not-return-a-session-id","errorCode":null,"errorMessage":"Task creation did not return a session ID.","messagePattern":"Task creation did not return a session ID\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/app/src/react-app/domains/session/control/session-control-actions.ts","lineNumber":98,"sourceCode":"    opencodeClient,\n    refreshRouteState,\n    selectedSessionId,\n    selectedWorkspaceId,\n    selectedWorkspaceRoot,\n    sessionsByWorkspaceId,\n    workspaces,\n  } = input;\n\n  const createTaskControlAction = useMemo<OpenworkControlAction>(() => ({\n    id: \"session.create_task\",\n    label: \"Create a new task\",\n    description: \"Create a new session in the selected workspace.\",\n    sideEffect: \"mutation\",\n    disabled: !canCreateTask || !selectedWorkspaceId,\n    execute: async () => {\n      if (!selectedWorkspaceId) throw new Error(\"Cannot create a task without a selected workspace.\");\n      const sessionId = await createTaskInWorkspace(selectedWorkspaceId);\n      if (sessionId === null) throw new Error(\"Task creation did not return a session ID.\");\n      return sessionId;\n    },\n  }), [canCreateTask, createTaskInWorkspace, selectedWorkspaceId]);\n  useControlAction(createTaskControlAction);\n\n  const listSessionsControlAction = useMemo<OpenworkControlAction>(() => ({\n    id: \"session.list_sessions\",\n    label: \"List available sessions\",\n    description: \"Return the list of sessions across workspaces so the user can ask to open one by name.\",\n    kind: \"query\",\n    effects: { data: \"read\", ui: \"none\", external: false },\n    sideEffect: \"none\",\n    execute: () => {\n      const out: { sessionId: string; title: string; workspace: string; updatedAt: number }[] = [];\n      for (const workspace of workspaces) {\n        const list = sessionsByWorkspaceId[workspace.id] ?? [];\n        for (const session of list) {\n          const sessionId = session.id?.trim() ?? \"\";","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/react-app/domains/session/control/session-control-actions.ts#L80-L116","documentation":"After createTaskInWorkspace resolves, the action expects a session ID string; a null return means the backend accepted task creation but the response did not carry a session identifier. This throws so the caller never continues with a sessionId-less result. It signals an API contract violation rather than a user mistake.","triggerScenarios":"createTaskInWorkspace(selectedWorkspaceId) resolves to null — e.g. the server returned a malformed/empty body, a 2xx response whose payload lacks sessionId, or the client wrapper returns null on unexpected response shapes.","commonSituations":"Backend/client version skew (server response schema changed), a proxy stripping the response body, or an OpenWork server bug where session creation succeeds but the session record isn't returned.","solutions":["Inspect the network response of the task-creation call and confirm the session ID field is present; fix the server response or update the client's response parsing.","Check for version mismatch between the OpenWork app and server and align versions.","Retry creation; if it reproduces, capture the response payload and file a bug against the server endpoint."],"exampleFix":"// before\nconst sessionId = await createTaskInWorkspace(selectedWorkspaceId);\nif (sessionId === null) throw new Error(\"Task creation did not return a session ID.\");\n// after (surface server payload)\nconst sessionId = await createTaskInWorkspace(selectedWorkspaceId);\nif (sessionId === null) {\n  const raw = await debugLastResponse();\n  throw new Error(`Task creation did not return a session ID. Response: ${raw}`);\n}","handlingStrategy":"try-catch","validationCode":"const response = await createTaskInWorkspace(id);\nif (response !== null && typeof response !== \"string\") {\n  throw new Error(\"Unexpected createTask response shape\");\n}","typeGuard":"function isSessionId(v: string | null): v is string {\n  return typeof v === \"string\" && v.length > 0;\n}","tryCatchPattern":"try {\n  const sessionId = await createTaskInWorkspace(workspaceId);\n  if (sessionId === null) throw new Error(\"Task creation did not return a session ID.\");\n} catch (e) {\n  logServerError(e); // capture raw response for the backend bug report\n  showToast(\"Task creation failed — server returned no session\");\n}","preventionTips":["Add an integration test asserting the create-task endpoint always returns a sessionId on 2xx.","Pin app/server versions during development to avoid response-schema skew.","Log the raw response body whenever the parsed session ID is null."],"tags":["api-contract","session","null-response"],"backgroundTag":"unexpected-api-response","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}