Skip to content

Multipart skill publish leaves Convex blobs after a failed publish #3670

Description

@SebTardif

Summary

Authenticated multipart skill publish (POST /api/v1/skills) stores each uploaded file in Convex, then can reject the request during parse or later validation. Those stored ids are not deleted. Failed publishes leave unreferenced blobs.

This is a source-level resource leak. I did not run a live Convex publish against production.

Verification / reproduction

  1. Read convex/httpApiV1/shared.ts parseMultipartPublish (store, then parsePublishBody).
  2. Follow the handler path that returns 400 after a successful store.
  3. Confirm there is no storage.delete of those new ids on that failure path.
  4. Compare with the sibling scan upload path in the same file, which already deletes on failure.

Actual

  • Failed multipart skill publish can leave stored files that no skill version owns.

Expected

  • Stored ids from the request are deleted unless a published (or otherwise persisted) version owns them.
  • Successful publishes still retain their blobs.

Evidence

Source: convex/httpApiV1/shared.ts. Proposed patch: PR #3549.

ClawSweeper also asked that blobs already committed to a version stay retained. That commit-then-keep rule belongs in the same fix.

Security / privacy

Storage leak for an authenticated publisher. Not a claimed remote unauthenticated vuln. No payload.

Acceptance criteria

  • Request-local stored ids are deleted when parse or publish fails before a version owns them.
  • Blobs already committed to a version are not deleted by request-local cleanup.
  • Successful publish still attaches and retains the files.

This tracker stays open if PR #3549 is closed without landing on main.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Normal backlog priority with limited blast radius.clawsweeper:bulk-filedClawSweeper detected a high recent issue-filing volume from this author.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.impact:otherThis issue has meaningful maintainer-visible impact outside the owned taxonomy.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions