paperclipai/paperclip · error · Error

No audit result returned for skill ${skill.key}.

Error message

No audit result returned for skill ${skill.key}.

What it means

Thrown by auditCompanySkills() when POST /api/companies/{companyId}/skills/{skillId}/audit returns null/undefined. The audit endpoint is expected to return a CompanySkillAuditResult; null indicates the server did not produce an audit (empty body, unsupported route, or upstream error swallowed).

Source

Thrown at cli/src/commands/client/skills.ts:731

    }
  }
  return rows;
}

async function auditCompanySkills(
  ctx: ResolvedClientContext,
  skillRef: string | undefined,
): Promise<Array<{ skill: CompanySkillReferenceTarget; audit: CompanySkillAuditResult }>> {
  const skills = await listCompanySkills(ctx);
  const selected = skillRef ? [resolveCompanySkillReference(skills, skillRef)] : skills;
  const rows: Array<{ skill: CompanySkillReferenceTarget; audit: CompanySkillAuditResult }> = [];
  for (const skill of selected) {
    const audit = await ctx.api.post<CompanySkillAuditResult>(
      `/api/companies/${ctx.companyId}/skills/${encodeURIComponent(skill.id)}/audit`,
      {},
    );
    if (!audit) {
      throw new Error(`No audit result returned for skill ${skill.key}.`);
    }
    rows.push({ skill: toSkillReferenceTarget(skill), audit });
  }
  return rows;
}

async function resolveAgent(ctx: ResolvedClientContext, agentRef: string): Promise<Agent> {
  const params = new URLSearchParams({ companyId: ctx.companyId ?? "" });
  const agent = await ctx.api.get<Agent>(`/api/agents/${encodeURIComponent(agentRef)}?${params.toString()}`);
  if (!agent) {
    throw new Error(`Agent not found: ${agentRef}`);
  }
  return agent;
}

function printCompanySkillRows(rows: Array<CompanySkillListItem | CompanySkill>): void {
  if (rows.length === 0) {
    printOutput([], { json: false });

View on GitHub (pinned to 67001ec6eb)

Solutions

  1. Verify server version supports skill audit (`/api/health`, release notes).
  2. Try auditing a different skill to isolate whether it is skill-specific or route-level.
  3. Reinstall the skill (`skills install --force`) if its bytes are missing, then re-audit.

Example fix

# before
paperclipai skills audit my-skill
# after: confirm route exists, then re-audit a known-good skill
paperclipai skills audit other-skill
Defensive patterns

Strategy: try-catch

Type guard

function isAuditResult(v: unknown): v is CompanySkillAuditResult {
  return v != null && typeof v === "object";
}

Try / catch

try {
  await run(["skills", "audit", ref]);
} catch (err) {
  if (err instanceof Error && /No audit result returned/.test(err.message)) {
    console.error("Audit route returned nothing; verify server supports skill audit.");
    process.exit(2);
  }
  throw err;
}

Prevention

When it happens

Trigger: `paperclipai skills audit [skillRef]` against a server that does not implement the audit route, returns 200 with no JSON, or fails to audit a particular skill (e.g. empty skill body).

Common situations: CLI newer than the deployed server (audit added later), skill whose files are empty/missing on disk, or an audit worker that crashed server-side but still returned 2xx.

Related errors


AI-assisted analysis of paperclipai/paperclip@67001ec6eb (2026-08-12). Data as JSON: /api/errors/1c1fce8fe412348f. Report an issue: GitHub.