{
  "experiment": "zip-path-traversal-preflight",
  "executedAt": "2026-10-15T02:00:17.294909+00:00",
  "runtime": "3.14.8",
  "synthetic": true,
  "cases": [
    {
      "case": "parent",
      "errors": [
        {
          "name": "../outside.txt",
          "reason": "unsafe path"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "absolute",
      "errors": [
        {
          "name": "/outside.txt",
          "reason": "unsafe path"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "windows-drive",
      "errors": [
        {
          "name": "C:/outside.txt",
          "reason": "unsafe path"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "backslash",
      "errors": [
        {
          "name": "..\\outside.txt",
          "reason": "unsafe path"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "symlink",
      "errors": [
        {
          "name": "shortcut",
          "reason": "symlink"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "case-collision",
      "errors": [
        {
          "name": "report.txt",
          "reason": "duplicate normalized destination"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "large-member",
      "errors": [
        {
          "name": "large.txt",
          "reason": "compression ratio limit"
        },
        {
          "reason": "total size limit"
        }
      ],
      "written": [],
      "filesOnDisk": 0
    },
    {
      "case": "safe",
      "errors": [],
      "written": [
        {
          "name": "notes/readme.txt",
          "sha256": "76ebc8ee2673d4c79bf5d9809c02a163d6b57ab0f35194433b7d90205b5c19bd"
        },
        {
          "name": "data/value.csv",
          "sha256": "7a167636330ac42926be04e6f40768ea0ecff96d2c71056752d3ab421b8df287"
        }
      ],
      "filesOnDisk": 2
    }
  ],
  "unsafeCasesBlockedBeforeWrite": 7,
  "safeFilesWritten": 2,
  "outsideFileCreated": false,
  "limits": {
    "maxEntries": 12,
    "maxMemberBytes": 1024,
    "maxTotalBytes": 2048,
    "maxDeclaredCompressionRatio": 100
  },
  "scope": "Tiny synthetic ZIPs in a new empty temp directory. Reject symlinks/backslashes and casefold/NFC collisions conservatively. Not a hardened multi-user extractor: concurrent filesystem mutation, encrypted archives, stream resource exhaustion and power failure are not tested."
}
