{"record":{"id":"fdc73fc3f4a8b428","repo":"paperclipai/paperclip","slug":"no-update-status-returned-for-skill-skill-key","errorCode":null,"errorMessage":"No update status returned for skill ${skill.key}.","messagePattern":"No update status returned for skill (.+?)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/client/skills.ts","lineNumber":649,"sourceCode":"  ctx: ResolvedClientContext,\n  reference: string,\n): Promise<CompanySkillReferenceTarget> {\n  return resolveCompanySkillReference(await listCompanySkills(ctx), reference);\n}\n\nasync function checkCompanySkills(\n  ctx: ResolvedClientContext,\n  skillRef: string | undefined,\n): Promise<CompanySkillCheckRow[]> {\n  const skills = await listCompanySkills(ctx);\n  const selected = skillRef ? [resolveCompanySkillReference(skills, skillRef)] : skills;\n  const rows: CompanySkillCheckRow[] = [];\n  for (const skill of selected) {\n    const status = await ctx.api.get<CompanySkillUpdateStatus>(\n      `/api/companies/${ctx.companyId}/skills/${encodeURIComponent(skill.id)}/update-status`,\n    );\n    if (!status) {\n      throw new Error(`No update status returned for skill ${skill.key}.`);\n    }\n    rows.push({ skill: toSkillReferenceTarget(skill), status });\n  }\n  return rows;\n}\n\nasync function updateOneCompanySkill(\n  ctx: ResolvedClientContext,\n  skillRef: string,\n  opts: SkillUpdateOptions = {},\n): Promise<CompanySkillUpdateRow> {\n  const skill = await resolveCompanySkill(ctx, skillRef);\n  const updated = await ctx.api.post<CompanySkill>(\n    `/api/companies/${ctx.companyId}/skills/${encodeURIComponent(skill.id)}/install-update`,\n    { force: opts.force || undefined },\n  );\n  return {\n    skillRef,","sourceCodeStart":631,"sourceCodeEnd":667,"githubUrl":"https://github.com/paperclipai/paperclip/blob/67001ec6eb96ae601aa27bc91d9b2415d665334a/cli/src/commands/client/skills.ts#L631-L667","documentation":"Thrown by checkCompanySkills() when GET /api/companies/{companyId}/skills/{skillId}/update-status returns null/undefined for an installed skill. The CLI expects a CompanySkillUpdateStatus object; a null body is treated as a contract violation rather than silently skipping the row.","triggerScenarios":"`paperclipai skills check [skillRef]` (or the per-skill update-status fetch) where the server returns an empty 2xx response, the route is missing in the deployed API version, or a proxy strips the body.","commonSituations":"Version skew between an older/newer CLI and server, a misbehaving gateway that returns 200 with no body, or the skill id resolving to a row the server no longer recognizes mid-flight.","solutions":["Confirm CLI and server versions match (`paperclipai --version`, server /api/health).","Retry `skills check` after refreshing the company context.","If persistent, inspect the raw response with `curl /api/companies/{id}/skills/{sid}/update-status` to see whether the server or transport drops the body."],"exampleFix":"# before\npaperclipai skills check my-skill\n# diagnose\ncurl -sS \"$API/api/companies/$CID/skills/$SID/update-status\" -H \"authorization: Bearer $TOKEN\" | jq .","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"function isUpdateStatus(v: unknown): v is CompanySkillUpdateStatus {\n  return v != null && typeof v === \"object\";\n}","tryCatchPattern":"try {\n  await run([\"skills\", \"check\", ref]);\n} catch (err) {\n  if (err instanceof Error && /No update status returned/.test(err.message)) {\n    console.error(\"Server returned no status. Check CLI/server version alignment.\");\n    process.exit(2);\n  }\n  throw err;\n}","preventionTips":["Keep CLI and server versions in sync.","Smoke-test /api/health and the update-status route after upgrades.","Treat null-body responses as a version/transport defect to investigate."],"tags":["cli","api","skills","null-response","version-skew"],"backgroundTag":null,"analyzedSha":"67001ec6eb96ae601aa27bc91d9b2415d665334a","analyzedAt":"2026-08-12T12:05:45.408Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}