{"record":{"id":"d076d82ad666e085","repo":"different-ai/openwork","slug":"latest-mac-yml-is-missing-artifact-path-url","errorCode":null,"errorMessage":"latest-mac.yml is missing artifact path/url.","messagePattern":"latest-mac\\.yml is missing artifact path/url\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"apps/app/src/app/lib/electron-alpha.ts","lineNumber":51,"sourceCode":"\nfunction resolveArtifactUrl(pathOrUrl: string): string {\n  if (/^https:\\/\\//i.test(pathOrUrl)) return pathOrUrl;\n  return new URL(pathOrUrl, `${ELECTRON_ALPHA_RELEASE_BASE_URL}/`).toString();\n}\n\nexport function parseElectronLatestMacYml(\n  raw: string,\n  arch: \"arm64\" | \"x64\",\n): ElectronAlphaArtifact {\n  const version = parseYamlScalar(raw, \"version\");\n  const path = parseYamlScalar(raw, \"path\") ?? parseFirstFileUrl(raw);\n  const sha512 = parseYamlScalar(raw, \"sha512\");\n\n  if (!version) {\n    throw new Error(\"latest-mac.yml is missing version.\");\n  }\n  if (!path) {\n    throw new Error(\"latest-mac.yml is missing artifact path/url.\");\n  }\n  if (!sha512) {\n    throw new Error(\"latest-mac.yml is missing sha512.\");\n  }\n\n  return {\n    arch,\n    manifestUrl: ELECTRON_ALPHA_LATEST_MAC_YML_URL,\n    releaseUrl: ELECTRON_ALPHA_RELEASE_PAGE_URL,\n    url: resolveArtifactUrl(path),\n    path,\n    version,\n    sha512,\n  };\n}\n\nexport async function resolveElectronAlphaArtifact(\n  arch: \"arm64\" | \"x64\" = \"arm64\",","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/app/lib/electron-alpha.ts#L33-L69","documentation":"parseElectronLatestMacYml parses the latest-mac.yml auto-update manifest fetched from electron builds and requires a non-empty artifact path/url. If the YAML lacks a `path` (or url) field, this error is thrown. It guards resolveElectronAlphaArtifact from returning an artifact that cannot be downloaded.","triggerScenarios":"Fetching ELECTRON_ALPHA_LATEST_MAC_YML_URL returns YAML without a `path` key — e.g. electron-builder published a manifest without a mac artifact, or the fetched document is an error page/redirect body that still parses loosely.","commonSituations":"Alpha/beta channel publishing pipeline misconfigured (no mac zip uploaded), manifest format changed between electron-builder versions, or a CDN/origin serving an HTML error page instead of the YAML.","solutions":["Inspect the raw latest-mac.yml at ELECTRON_ALPHA_LATEST_MAC_YML_URL and confirm it contains a `path:` entry.","Re-run the electron publish step so the mac artifact and manifest are uploaded together.","Check the electron-builder version for manifest schema changes and update the parser keys if the field was renamed (e.g. `url`)."],"exampleFix":"// before: manifest missing path, silently parsed\nconst path = parseYamlScalar(raw, \"path\");\n// after: log raw manifest when path is absent to aid diagnosis\nif (!path) throw new Error(`latest-mac.yml is missing artifact path/url. raw=${raw.slice(0, 200)}`);","handlingStrategy":"validation","validationCode":"const text = await (await desktopFetch(ELECTRON_ALPHA_LATEST_MAC_YML_URL, { headers: { Accept: \"text/yaml, text/plain, */*\" } })).text();\nif (!/^path:\\s*\\S+/m.test(text)) throw new Error(\"Refusing update: manifest has no artifact path.\");","typeGuard":"function hasManifestPath(m: { path?: unknown }): m is { path: string } {\n  return typeof m.path === \"string\" && m.path.length > 0;\n}","tryCatchPattern":"try {\n  const artifact = await resolveElectronAlphaArtifact();\n} catch (err) {\n  if (err instanceof Error && err.message.includes(\"missing artifact path\")) {\n    // surface actionable message; skip update, keep current version\n    console.warn(\"Alpha manifest incomplete; skipping update check.\");\n  } else throw err;\n}","preventionTips":["Verify the alpha channel publish pipeline uploads both the artifact and its manifest atomically.","Add a CI check that fetches latest-mac.yml after release and asserts version/path/sha512 all exist.","Pin the electron-builder version so manifest schema stays stable."],"tags":["network","parsing","electron-updater","manifest"],"backgroundTag":"update-manifest-missing-field","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}