feat: Store task description files on the workspace - #7234
Merged
Merged
Conversation
Task descriptions stored remote image URLs. Private GitHub images and editor attachments did not stay available. SuperPlane now stores those files in platform object storage and keeps a stable sp-file:// ref in the description. The API mints a signed GET URL when the UI renders a task. A factory line also receives signed URLs when it resolves the task description. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Contributor
|
👋 Commands for maintainers:
|
Contributor
|
Maintainers: comment |
andrecalil
marked this pull request as ready for review
September 7, 2026 14:15
superplane-policy-bot
Bot
requested review from
forestileao,
lucaspin and
shiroyasha
September 7, 2026 14:15
Pending uploads did not count toward the task file limit. MarkReady now checks the task count and the organization byte cap. A failed quota check deletes the uploaded object and marks the file failed. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
SQL-only deletes left blob objects behind when a factory had more than one tick of files. The worker now deletes objects first and waits while file rows remain. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
The leftover-file test uses blob.ScopeTask. The models package did not compile without that import. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Main added Productive.io intake and other schema changes. This merge keeps those updates and the workspace file storage work. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Concurrent completions could both read the same ready count and then mark two files ready. Create and MarkReady now lock the organization and task rows before they check the cap. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Reparent copied a file and then deleted the source before the work-order transaction committed. Factory cleanup deleted blobs in the same transaction as later domain deletes. Both paths now remove objects only after the matching rows are committed. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Main added last-location tracking and other product updates. This merge keeps those changes with the workspace file storage work. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Main added a later last-locations migration. golang-migrate would skip the older files migration on production. Recreate it with a fresh timestamp so it stays the newest migration. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Main tells users when a task is still under analysis. This merge keeps that UI copy with the workspace file storage work. Co-authored-by: André Calil <andrecalil@users.noreply.github.com> Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Main replaces Viewer with Operator and Maintainer, and keeps rejected Backlog drafts out of Lines Done. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Main added owner and role migrations with later merge order. Recreate the files migration with a fresh timestamp so it stays the newest migration. Resolves: #7108 Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
The split-run popup now loads live task files through useWorkOrder. Lines page specs mock useFactoryData without that export, so Vitest throws when a card opens the popup. CI shards fail on those specs. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Concurrent binds read the task file count without a row lock, so two updates can pass the same remaining slot. A later bind failure also leaves the copied object after the transaction rolls back. Factory cleanup deleted several objects in one transaction, so a later failure restored rows whose objects were already gone. Lock the quota rows before the bind count. Delete copied objects when bind or the surrounding transaction fails. Commit each factory file delete in its own transaction. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Remote image ingest writes objects before the work-order transaction commits. A later bind or content update failure rolled back the file rows and left those objects in storage. Return the new object keys from ingest and delete them when the surrounding transaction fails. Delete each factory cleanup object before the row transaction so a leftover row is removed on the next tick. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
A rolled-back import can leave ingested objects if object delete fails. The catalog row is already gone, so the file cleanup worker cannot find those objects. Retry object deletes, then store leftover keys as failed workspace file rows so the next stale-file sweep can delete them. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Analysis, plan, and implement read stored sp-file refs. They need fetchable download URLs at dispatch time, not catalog refs. Signed URLs stay off the saved description. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
Keep the branch current with column automation icons. Co-authored-by: André Calil <andrecalil@users.noreply.github.com> Signed-off-by: Cursor Agent <cursoragent@cursor.com>
mytmlt
pushed a commit
that referenced
this pull request
Sep 8, 2026
Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: André Calil <andrecalil@users.noreply.github.com>
This was referenced Sep 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stores task description files in SuperPlane object storage. Descriptions keep
sp-file://refs. Signed download URLs are minted at read and dispatch time.Upload completion rechecks the task file count and the organization byte cap. Concurrent completions lock the organization and task rows before they apply those caps. Factory cleanup deletes blob objects first and commits those row deletes before it removes the rest of the factory domain.
Resolves: #7108
Test plan
sp-file://.The PR appears safe to merge.