What to build
Replace the manual Create link commit with an automatic, repeatable seal. The share link is generated as a consequence of the well settling, and stays current as the sender renames or adds/removes files. This slice keeps the existing page layout (the link may still surface via the current TransferLink); the full well restructure is a later slice.
All manifest writes flow through one debounced, serialized reconcile (never concurrent PUTs) that recomputes from live client state on each run: members = fully-uploaded files, and sealed = (nothing queued/uploading) && members.length > 0. Emptying the well deletes the bundle (link reverts to /gone).
The non-negotiable invariant from docs/adr/0002-sealed-manifest-lifecycle.md: the manifest is never sealed: true while any upload is in flight. Sealing must be a reconcile that reads live state at write time — NOT an eager "write sealed on file-done", which races a concurrent add and can publish a sealed manifest missing the new file. The worst observable state must be a brief in-progress page, never a premature or partial download.
Acceptance criteria
Blocked by
What to build
Replace the manual Create link commit with an automatic, repeatable seal. The share link is generated as a consequence of the well settling, and stays current as the sender renames or adds/removes files. This slice keeps the existing page layout (the link may still surface via the current
TransferLink); the full well restructure is a later slice.All manifest writes flow through one debounced, serialized reconcile (never concurrent PUTs) that recomputes from live client state on each run: members = fully-uploaded files, and
sealed = (nothing queued/uploading) && members.length > 0. Emptying the well deletes the bundle (link reverts to/gone).The non-negotiable invariant from
docs/adr/0002-sealed-manifest-lifecycle.md: the manifest is neversealed: truewhile any upload is in flight. Sealing must be a reconcile that reads live state at write time — NOT an eager "write sealed on file-done", which races a concurrent add and can publish a sealed manifest missing the new file. The worst observable state must be a brief in-progress page, never a premature or partial download.Acceptance criteria
sealedfrom live state each run; a trailing reconcile fires when the last in-flight upload settles so the final write reflects settled truthsealed:false), then re-seals once it settles againsealed:truemanifest while an upload is in flightBlocked by