{
  "product": "Specification (reference)",
  "title": "File Upload Service",
  "summary": "Multipart uploads, validation, storage backends and signed URLs.",
  "category": "services",
  "entries": [
    {
      "path": [
        "AI",
        "Upload",
        "Multipart upload endpoint"
      ],
      "value": "POST /api/files",
      "status": "yes",
      "note": "size limit enforced with clear error"
    },
    {
      "path": [
        "AI",
        "Upload",
        "Resumable/chunked upload"
      ],
      "value": "",
      "status": "yes",
      "note": "resume after connection loss"
    },
    {
      "path": [
        "AI",
        "Upload",
        "Type allowlist + content sniffing"
      ],
      "value": "",
      "status": "yes",
      "note": "extension alone not trusted"
    },
    {
      "path": [
        "AI",
        "Upload",
        "Deduplication by content hash"
      ],
      "value": "SHA-256",
      "status": "yes",
      "note": "same bytes stored once"
    },
    {
      "path": [
        "AI",
        "Files",
        "Download with correct headers"
      ],
      "value": "content-type, disposition",
      "status": "yes",
      "note": "range requests supported"
    },
    {
      "path": [
        "AI",
        "Files",
        "Expiring share links"
      ],
      "value": "signed URL",
      "status": "yes",
      "note": "revocable"
    },
    {
      "path": [
        "AI",
        "Files",
        "Delete with grace period"
      ],
      "value": "",
      "status": "yes",
      "note": "purge job after retention"
    },
    {
      "path": [
        "AI",
        "Images",
        "Thumbnail generation"
      ],
      "value": "async",
      "status": "yes",
      "note": "sizes configurable"
    },
    {
      "path": [
        "AI",
        "Ops",
        "Storage quota per owner"
      ],
      "value": "",
      "status": "yes",
      "note": "clear over-quota error"
    },
    {
      "path": [
        "AI",
        "Ops",
        "Metadata listing API"
      ],
      "value": "paginated",
      "status": "yes",
      "note": "name, size, hash, created"
    },
    {
      "path": [
        "UI",
        "Upload",
        "Drag-and-drop zone with progress"
      ],
      "value": "per-file bars",
      "status": "yes",
      "note": "cancel per file"
    },
    {
      "path": [
        "UI",
        "Files",
        "File list with previews and actions"
      ],
      "value": "",
      "status": "yes",
      "note": "copy link, delete"
    },
    {
      "path": [
        "UI",
        "Files",
        "Quota usage indicator"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    }
  ]
}
