{"record":{"id":"22c39cd3c278bc8a","repo":"different-ai/openwork","slug":"desktop-version-metadata-was-incomplete","errorCode":null,"errorMessage":"Desktop version metadata was incomplete.","messagePattern":"Desktop version metadata was incomplete\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ee/apps/den-web/app/(den)/dashboard/_components/org-settings-screen.tsx","lineNumber":322,"sourceCode":"      try {\n        const { response, payload } = await requestJson(\n          \"/v1/app-version\",\n          { method: \"GET\" },\n          12000,\n        );\n\n        if (!response.ok) {\n          throw new Error(\n            getErrorMessage(\n              payload,\n              `Failed to load desktop version metadata (${response.status}).`,\n            ),\n          );\n        }\n\n        const metadata = getDesktopVersionMetadata(payload);\n        if (!metadata) {\n          throw new Error(\"Desktop version metadata was incomplete.\");\n        }\n\n        if (cancelled) {\n          return;\n        }\n\n        setDesktopVersionOptions(metadata.publishedDesktopVersions);\n        setDesktopVersionRange({\n          minVersion: metadata.minAppVersion,\n          maxVersion: metadata.latestAppVersion,\n        });\n      } catch (error) {\n        if (!cancelled) {\n          setDesktopVersionOptions([]);\n          setDesktopVersionRange(null);\n          setDesktopVersionOptionsError(\n            error instanceof Error\n              ? error.message","sourceCodeStart":304,"sourceCodeEnd":340,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/ee/apps/den-web/app/(den)/dashboard/_components/org-settings-screen.tsx#L304-L340","documentation":"After an ok response from /v1/app-version, loadDesktopVersionOptions runs getDesktopVersionMetadata on the payload; if it cannot extract the expected metadata shape, this error is thrown. It distinguishes a well-formed HTTP response from one whose body lacks the required version fields.","triggerScenarios":"Server returned 200 but the body is missing or malformed version metadata (e.g. null metadata, wrong field names after an API change, an empty JSON object, or a proxy-inserted body).","commonSituations":"Version skew between web app and den-api after the metadata schema changed; partial deploy where the endpoint exists but returns a stub body; custom middleware returning an empty 200 on the version route.","solutions":["Log the raw payload and compare it with what getDesktopVersionMetadata expects (field names/types)","Align frontend and server versions — redeploy the side that is behind","Bypass proxies/CDN for this route to rule out body rewriting","Add unit coverage for getDesktopVersionMetadata against the actual server payload"],"exampleFix":"// before\nconst metadata = getDesktopVersionMetadata(payload);\nif (!metadata) {\n  throw new Error(\"Desktop version metadata was incomplete.\");\n}\n// after\nconst metadata = getDesktopVersionMetadata(payload);\nif (!metadata) {\n  console.error('app-version payload', payload);\n  throw new Error(`Desktop version metadata was incomplete: ${JSON.stringify(payload).slice(0, 200)}`);\n}","handlingStrategy":"validation","validationCode":"function looksLikeVersionMetadata(payload: unknown): boolean {\n  return isRecord(payload) && isRecord(payload.metadata) && typeof payload.metadata.latestVersion === 'string';\n}\n// if false, fall back to defaults instead of throwing","typeGuard":"const isDesktopVersionMetadata = (p: unknown): p is { metadata: Record<string, unknown> } =>\n  isRecord(p) && isRecord(p.metadata);","tryCatchPattern":"try {\n  const metadata = getDesktopVersionMetadata(payload);\n  if (!metadata) throw new Error('Desktop version metadata was incomplete.');\n} catch (err) {\n  console.warn('app-version metadata unusable, using defaults', payload);\n  applyDefaultVersionOptions();\n}","preventionTips":["Validate the /v1/app-version body shape with a contract test, not just the status code","Log the raw payload when getDesktopVersionMetadata returns null","Keep version-metadata parsing in a shared module tested against real server fixtures","Deploy web and den-api together when metadata fields change"],"tags":["schema-validation","api-response","versioning"],"backgroundTag":"schema-validation-failed","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}