Scope:quarantine bucket — /mnt/fusionio/spikersoft/quarantine (/app/quarantine). Note: Art Studio quarantine is already GridFS (GridFsArtAssetQuarantineService) — this ticket covers only the upload/blog quarantine directory used by file-movement, upload-coordinator, blog-media-processor (BlogController.cs:1203-1245 references it).
Steps: bucket + scoped key (write-mostly; consider a lifecycle/retention rule on the bucket) → backend PR: quarantine writes go to S3 behind Storage:UseS3 → backfill existing quarantined objects → dual-run → drop binds with the uploads batch.
Parent epic: #413.
**Scope:** `quarantine` bucket — `/mnt/fusionio/spikersoft/quarantine` (`/app/quarantine`). Note: **Art Studio quarantine is already GridFS** (`GridFsArtAssetQuarantineService`) — this ticket covers only the upload/blog quarantine directory used by file-movement, upload-coordinator, blog-media-processor (`BlogController.cs:1203-1245` references it).
**Steps:** bucket + scoped key (write-mostly; consider a lifecycle/retention rule on the bucket) → backend PR: quarantine writes go to S3 behind `Storage:UseS3` → backfill existing quarantined objects → dual-run → drop binds with the uploads batch.
Backend PR #257: both quarantine writers (FileMovementService root tree + BlogMediaOrchestrator blogs/ subdir) dual-write to the quarantine bucket behind Storage:UseS3 — disk authoritative, octet-stream forced, shared-root key layout. Storage seam gained AddKeyedS3ObjectStore since FileMovement is the first two-bucket service (ebooks + quarantine). Bucket provisioning + backfill + bind-drop ride with the #529 uploads batch.
Backend PR #257: both quarantine writers (FileMovementService root tree + BlogMediaOrchestrator blogs/ subdir) dual-write to the quarantine bucket behind Storage:UseS3 — disk authoritative, octet-stream forced, shared-root key layout. Storage seam gained AddKeyedS3ObjectStore since FileMovement is the first two-bucket service (ebooks + quarantine). Bucket provisioning + backfill + bind-drop ride with the #529 uploads batch.
Epic #413 accuracy pass (2026-07-18) — closing: migration scope complete; the one real blocker is #613, which gates #529 phase 2.
Verified against current masters:
Code merged: backend #257 — both quarantine writers dual-write behind Storage:UseS3 (QuarantineMirror in blog-media-processor + file-movement's root-tree route, AddKeyedS3ObjectStore two-bucket seam) — on backend master
quarantine bucket created in the 2026-07-14 phase 0 (it was missing until then); empty-as-disk
Stacks dual-run (file-movement and blog-media-processor both carry Storage__UseS3=true)
The live blocker is #613: file-movement's metadata-svc key gets Access Denied writing quarantine (Seq evidence 2026-07-16). That's a MinIO policy fix, precisely scoped in #613, and it must land before the #529 phase-2 bind drop — otherwise quarantine writes have nowhere to go. EICAR-upload verification after the policy fix is #613's/# 529's acceptance line.
**Epic #413 accuracy pass (2026-07-18) — closing: migration scope complete; the one real blocker is #613, which gates #529 phase 2.**
Verified against current masters:
- Code merged: backend #257 — both quarantine writers dual-write behind `Storage:UseS3` (`QuarantineMirror` in blog-media-processor + file-movement's root-tree route, `AddKeyedS3ObjectStore` two-bucket seam) — on backend master
- `quarantine` bucket created in the 2026-07-14 phase 0 (it was missing until then); empty-as-disk
- Stacks dual-run (`file-movement` and `blog-media-processor` both carry `Storage__UseS3=true`)
The live blocker is **#613**: file-movement's `metadata-svc` key gets `Access Denied` writing `quarantine` (Seq evidence 2026-07-16). That's a MinIO policy fix, precisely scoped in #613, and it must land before the #529 phase-2 bind drop — otherwise quarantine writes have nowhere to go. EICAR-upload verification after the policy fix is #613's/# 529's acceptance line.
Residual tracked in: #613 (key policy) + #529 (bind drop).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Parent epic: #413.
Scope:
quarantinebucket —/mnt/fusionio/spikersoft/quarantine(/app/quarantine). Note: Art Studio quarantine is already GridFS (GridFsArtAssetQuarantineService) — this ticket covers only the upload/blog quarantine directory used by file-movement, upload-coordinator, blog-media-processor (BlogController.cs:1203-1245references it).Steps: bucket + scoped key (write-mostly; consider a lifecycle/retention rule on the bucket) → backend PR: quarantine writes go to S3 behind
Storage:UseS3→ backfill existing quarantined objects → dual-run → drop binds with the uploads batch.Backend PR #257: both quarantine writers (FileMovementService root tree + BlogMediaOrchestrator blogs/ subdir) dual-write to the quarantine bucket behind Storage:UseS3 — disk authoritative, octet-stream forced, shared-root key layout. Storage seam gained AddKeyedS3ObjectStore since FileMovement is the first two-bucket service (ebooks + quarantine). Bucket provisioning + backfill + bind-drop ride with the #529 uploads batch.
Code MERGED (backend #257). Remaining = ops via the #529 runbook: quarantine bucket + keys (blogs-svc write, file-movement policy widening), backfill, Storage__UseS3 flip (already true on file-movement stack; blog-media rides infra #60), bind drop at phase 2.
Epic #413 accuracy pass (2026-07-18) — closing: migration scope complete; the one real blocker is #613, which gates #529 phase 2.
Verified against current masters:
Storage:UseS3(QuarantineMirrorin blog-media-processor + file-movement's root-tree route,AddKeyedS3ObjectStoretwo-bucket seam) — on backend masterquarantinebucket created in the 2026-07-14 phase 0 (it was missing until then); empty-as-diskfile-movementandblog-media-processorboth carryStorage__UseS3=true)The live blocker is #613: file-movement's
metadata-svckey getsAccess Deniedwritingquarantine(Seq evidence 2026-07-16). That's a MinIO policy fix, precisely scoped in #613, and it must land before the #529 phase-2 bind drop — otherwise quarantine writes have nowhere to go. EICAR-upload verification after the policy fix is #613's/# 529's acceptance line.Residual tracked in: #613 (key policy) + #529 (bind drop).