feat: validate receipt-bound storage configuration

This commit is contained in:
2026-08-07 11:15:50 +02:00
parent 04e2bae190
commit cb37079465
5 changed files with 906 additions and 0 deletions
+22
View File
@@ -62,6 +62,28 @@ The main domain objects are:
| Campaign attachment use | Evidence connecting a campaign job or entry to an exact asset, version, blob, checksum, and stage | Retained for campaign execution evidence |
| Form evidence upload grant | A one-use, hash-only bearer grant tied to an exact Form instance/revision, purpose, custodian, size, and media-type policy | Issued for at most 15 minutes, consumed by one managed upload, then retained as evidence provenance |
## Deployment configuration packages
Files registers the `files.configuration` capability for `managed_storage`
fragments. Managed content storage is deployment-owned: the installer selects
local persistent storage, managed Garage, or an external S3-compatible service
and mounts a validated non-secret infrastructure capability receipt. Files
does not copy that endpoint or its credentials into module-owned tables.
Preflight compares the receipt's `files.storage` capability with the effective
runtime backend. It validates backend kind, sanitized S3 endpoint, bucket,
Garage management marker or external trust marker, an absolute persistent path
for local storage, and the presence of Files-owned `env:` secret references.
Secret values are never read into a plan, diagnostic, export, or fragment.
When runtime and receipt agree, the plan reports `skip`: the desired binding is
already effective, and repeated apply is a no-op. A mismatch blocks import and
explains which deployment setting must be reconciled. The provider deliberately
does not mutate process environment, migrate stored objects, probe remote
storage, or reinterpret an infrastructure replacement as safe. Use the Files
integrity and Ops checks after deployment and complete migration/recovery review
before changing an active backend.
## User tasks
The Files page is available at `/files`. Actions appear only when the current