{
  "description": "For each case, the files (base64) and their digests: per file, the bundle hash (every file but signature), and the verification inputs (every file under code/, env/, data/, proofs/; declared results under results/ are bound claim by claim instead). Every path set under invalid must be rejected.",
  "invalid": [
    {
      "name": "a parent segment",
      "paths": [
        "code/../paper.md"
      ]
    },
    {
      "name": "an absolute path",
      "paths": [
        "/paper.md"
      ]
    },
    {
      "name": "an empty segment",
      "paths": [
        "code//run.py"
      ]
    },
    {
      "name": "a backslash",
      "paths": [
        "code\\run.py"
      ]
    },
    {
      "name": "a path that isn't Unicode NFC",
      "paths": [
        "data/é.csv"
      ]
    },
    {
      "name": "a file outside the layout",
      "paths": [
        "notes.txt"
      ]
    },
    {
      "name": "paths that differ only in case",
      "paths": [
        "code/Run.py",
        "code/run.py"
      ]
    },
    {
      "name": "a path that is both a file and a directory",
      "paths": [
        "code/run",
        "code/run/main.py"
      ]
    },
    {
      "name": "a control character",
      "paths": [
        "code/run\u0007.py"
      ]
    },
    {
      "name": "the DEL character",
      "paths": [
        "code/run.py"
      ]
    }
  ],
  "cases": [
    {
      "name": "a minimal bundle with no verification inputs",
      "files": {
        "manifest.json": "eyJmaWVsZHMiOlsibWF0aGVtYXRpY3MiXX0=",
        "paper.md": "IyBTdW1tYXJ5Cg==",
        "claims.json": "W10="
      },
      "expected": {
        "files": {
          "manifest.json": "sha256:b7d05edd448c322c6c8aac653cbb1753afe340a718683cdfc3a23cd1f5311ec1",
          "paper.md": "sha256:88501c2f5e6660af97d9cafe49c86afa7adff4dc92cbe9e27141b4ef45642ee8",
          "claims.json": "sha256:4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945"
        },
        "bundle": "sha256:821822013f774ebdd5877fcc0c68e20c314fa407047854c316e4e9159946ace6",
        "verification_inputs": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a"
      }
    },
    {
      "name": "nested directories, an empty file, binary content, and a non-ASCII NFC path",
      "files": {
        "paper.md": "IyBTdW1tYXJ5CgpSZXN1bHRzIGZvbGxvdy4K",
        "code/eval.py": "cHJpbnQoLTAuMDMxKQo=",
        "code/lib/__init__.py": "",
        "data/raw/séance.csv": "YSxiCjEsMgo=",
        "data/blob.bin": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==",
        "results/R1.json": "eyJsb3NzX2RlbHRhIjotMC4wMzF9",
        "env/requirements.txt": "bnVtcHk9PTIuMy4wCg==",
        "proofs/Main.lean": "dGhlb3JlbSB0IDogMSArIDEgPSAyIDo9IHJmbAo="
      },
      "expected": {
        "files": {
          "paper.md": "sha256:b1124c8039f622686961348c40106fc787d66915c358f6fd7d0de223798cde83",
          "code/eval.py": "sha256:966864a685cfd9fa23f01ac639ec53f811bda01e705c06397ecc3b87ba7d4f76",
          "code/lib/__init__.py": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
          "data/raw/séance.csv": "sha256:492d5ea496056f1a6a6592241032fab764c321596317930b4fa0e1e8bc3b7470",
          "data/blob.bin": "sha256:40aff2e9d2d8922e47afd4648e6967497158785fbd1da870e7110266bf944880",
          "results/R1.json": "sha256:c97feaf053f711214eb46064a0026585fb8429a8254fc5ff8bfe191e67c58501",
          "env/requirements.txt": "sha256:dab8a0f37ae0ca3069b9b4f8d18e3bffe9d03a256fa171267904ad3ac9b2da8c",
          "proofs/Main.lean": "sha256:1a724eba004db7c651b5f3da77d41df9aec05e9ce036aaa7c906e5b85e75d801"
        },
        "bundle": "sha256:ab50d6b04dd8780bf81a98e52bb5929171e3cc0c277fa2a9848c041bbf923fd2",
        "verification_inputs": "sha256:2f0e54164e7a6c2e6c3f0418137525e0927543a1337ce15b1bbd78db55f87155"
      }
    },
    {
      "name": "the signature file is left out of the bundle hash but has a file digest",
      "files": {
        "paper.md": "IyBTdW1tYXJ5CgpSZXN1bHRzIGZvbGxvdy4K",
        "code/eval.py": "cHJpbnQoLTAuMDMxKQo=",
        "signature": "ZWQyNTUxOS1tbC1kc2EtNDQ6MDA="
      },
      "expected": {
        "files": {
          "paper.md": "sha256:b1124c8039f622686961348c40106fc787d66915c358f6fd7d0de223798cde83",
          "code/eval.py": "sha256:966864a685cfd9fa23f01ac639ec53f811bda01e705c06397ecc3b87ba7d4f76",
          "signature": "sha256:0666812fd0842a53424e9ccd5e48a7301b4dd5c71e3bb320871161777a459fc0"
        },
        "bundle": "sha256:bd48f327e8c3acb9a7c292785868c2582036f6bf2d42b794b5cc7d0cf5d75d1c",
        "verification_inputs": "sha256:6c7066c636e242349a67d3c3cf68c76ce381e34bfc8290578783a9871522619c"
      }
    },
    {
      "name": "paths whose UTF-16 order differs from their code-point order",
      "files": {
        "paper.md": "IyBTdW1tYXJ5Cg==",
        "data/.txt": "cHJpdmF0ZSB1c2UK",
        "data/😀.txt": "b3V0c2lkZSB0aGUgQk1QCg=="
      },
      "expected": {
        "files": {
          "paper.md": "sha256:88501c2f5e6660af97d9cafe49c86afa7adff4dc92cbe9e27141b4ef45642ee8",
          "data/.txt": "sha256:e563ce06518cec1684fe643aa6cedffa2c5ec5f260d4be349fd478fcecc19ced",
          "data/😀.txt": "sha256:257ca4d31b8f3815a871f2d39ccf615d2b1aa370c07179dc3edc9d54a74642d5"
        },
        "bundle": "sha256:309d0d0f7c5a9c455c0fb515bd87975817568e0545fdb9415d88ddff3352b3ed",
        "verification_inputs": "sha256:b8d0cbbe5fd297696d7b46d7b17a17e442571c5ab2a6ea43afea28d0bec384ad"
      }
    }
  ]
}
