Skip to content

feat!: align removal capabilities with the blob-removal RFC - #49

Merged
frrist merged 2 commits into
mainfrom
frrist/blob-removal-rfc
Jul 27, 2026
Merged

feat!: align removal capabilities with the blob-removal RFC#49
frrist merged 2 commits into
mainfrom
frrist/blob-removal-rfc

Conversation

@frrist

@frrist frrist commented Jul 23, 2026

Copy link
Copy Markdown
Member

Splits the provider leg out of /blob/remove into a new /blob/release binding, per the blob-removal RFC (fil-one/RFC#13, merged): /blob/remove and /blob/abort are now space-subject client verbs whose arguments no longer carry the space (it is the invocation subject), while /blob/release carries {space, digest} under the provider subject, matching /blob/allocate and /blob/accept. Cause references say /blob/add throughout — the /space command prefix died with the UCAN 1.0 transition.

Defines the RFC's named errors where every service can share them: BlobAccepted (reject refused because the invoking space accepted the blob — the guard is space-scoped, not digest-scoped, so another tenant's acceptance never strands a parked allocation) and MissingCause (abort's cause is missing or doesn't resolve to a known /blob/add task).

Landing order

This PR is the root of the removal chainfil-forge/piri#30, fil-forge/sprue#33, fil-forge/smelt#19, and fil-forge/ingot#40 all pin this branch's head (3e5e6ba) and re-pin to the merge commit once this lands.

🤖 Generated with Claude Code

Split the provider leg out of /blob/remove into a new /blob/release
binding: /blob/remove and /blob/abort are now space-subject client verbs
whose arguments no longer carry the space (it is the invocation subject),
while /blob/release carries {space, digest} under the provider subject,
matching /blob/allocate and /blob/accept.

Define the RFC's named errors where both services can share them:
BlobAccepted (reject refused because the invoking space accepted the
blob — guard is space-scoped, not digest-scoped) and MissingCause
(abort's cause is missing or unknown).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@frrist frrist self-assigned this Jul 23, 2026
@frrist
frrist requested a review from alanshaw July 23, 2026 21:23
The /space command prefix was dropped in the UCAN 1.0 transition (RFC
review); the task an abort's cause links to is /blob/add.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@frrist
frrist merged commit 5e299c4 into main Jul 27, 2026
7 checks passed
frrist added a commit to fil-forge/sprue that referenced this pull request Jul 27, 2026
…(FIL-522) (#33)

Serves the upload-service half of blob removal, aligned with the
blob-removal RFC
([fil-one/RFC#13](fil-one/RFC#13)):

- `/blob/remove` (subject = the space, args `{digest}`) — releases a
space's claim on an accepted blob: recovers every provider holding it
(primary via the registration's receipt chain, plus non-failed
replicas), forwards a provider-rooted **`/blob/release`** `{space,
digest}` to each (best-effort), and deregisters last so the receipt
chain survives for a retry if every forward fails.
- `/blob/abort` (subject = the space, args `{digest, cause}`) — abandons
a parked (never-accepted) blob: the provider is recovered from the
cause's receipt chain and the abort is forwarded as `/blob/reject`. A
cause that doesn't resolve to a known `/blob/add` task fails with the
named error `MissingCause`; a node refusing because the space accepted
the blob has its `BlobAccepted` re-surfaced in the abort receipt, so
clients can distinguish "use `/blob/remove`" from a retryable fault. No
local state mutates, so aborts are safely retryable.
- `/upload/remove` (subject = the space, args `{root}`) — deletes the
upload's root→shards index entry only. Shard blobs are the client's
per-digest `/blob/remove` decision (content addressing shares shards
between uploads).

All handlers are idempotent (unknown/already-removed → success). Named
errors come from libforge, shared with piri.

## Landing order

fil-forge/libforge#49 (`/blob/release` binding + named errors; pinned at
its branch head, re-pin on merge) → fil-forge/piri#30 (piri serves
`/blob/release` + `/blob/reject`) → **this** — the forwards here invoke
piri capabilities that only exist on #30.

Same chain: fil-forge/smelt#19 (devnet delegations), fil-forge/ingot#40
(S3 surface). Validated end-to-end by ingot's delete-finality and
deferred-multipart itests against piri #30 + this branch.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants