scrollcase-consumer 0.1.2

Verify, prepare, and run caller-supplied local Scrollcase boxes.
Documentation
{
  "schemaVersion": 1,
  "format": "sha256-path-list-v1",
  "description": "Canonical payload digest vectors. An implementation materialises each case's entries, derives each record's content digest, serialises the canonical stream, and must reproduce streamBase64 and sha256 exactly.",
  "cases": [
    {
      "name": "an empty payload still commits to its format",
      "entries": [],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQo=",
      "sha256": "7774b93cbe3885bca0b65a24b06f7e510efaea4894d6224b2b5a8952afe6e798"
    },
    {
      "name": "a single regular file",
      "entries": [
        {
          "path": "box.json",
          "kind": "file",
          "contentBase64": "eyJzY2hlbWFWZXJzaW9uIjoyfQo="
        }
      ],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQpib3guanNvbgBmADY1OWY3ZTQxODI3ZTc2NjkwNjg5ZWM0MTRiZjU3OTYyNTJmNTU1YmE1MmIzNGVjYWRhYmYxMDU2Y2ZlMzI1ZjkK",
      "sha256": "70de80106f6d1f8aa72329a6a4980d8f0eda2575b7fce3a7304a0e56bd9ef6de"
    },
    {
      "name": "ordering places a dot before a slash",
      "entries": [
        {
          "path": "a/b",
          "kind": "file",
          "contentBase64": "dW5kZXIgYSBkaXJlY3Rvcnk="
        },
        {
          "path": "a.txt",
          "kind": "file",
          "contentBase64": "YmVzaWRlIGl0"
        }
      ],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQphLnR4dABmADBiOTM0NWJiODVlZjZmMGNkOWEyODAzODJmMDZmYmM2MDFlOGQ3ODljYzQ3ODA2N2Y1YjFhNjg2NGJjMTczOTQKYS9iAGYAMDRhYjdhYzA4YmEyYmU5MjEwOWVlYmY0YThlOTg0Yjk2Y2ZhOTQ5ZTliMjcyNDMwM2EwODZhMWMxMzgzZjk1ZAo=",
      "sha256": "debd6969fd92adf50d2c69cf9639a32c7cc42005a5a7bd33a43d4a1e4605c5e8"
    },
    {
      "name": "ordering is by UTF-8 bytes, not UTF-16 code units or code points",
      "entries": [
        {
          "path": "😀",
          "kind": "file",
          "contentBase64": "YXN0cmFs"
        },
        {
          "path": "�",
          "kind": "file",
          "contentBase64": "cmVwbGFjZW1lbnQ="
        }
      ],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQrvv70AZgA5NTcxM2U5Y2JkZDFkZmNiMmQ0MDgwYzI1MzdmNDE4ZDQzY2EwZGEyNWYwZDdkNjYzMWY0ZjdjOTdiODlkYzQ3CvCfmIAAZgAyZTlmNzY4MzQ0ZmYzOWFjN2MxZTQxMjE4YjBhNDg4YTBmYjY2Njk5Mjc3N2Y3YmZlMDNkMDk0NTBkZjRmNWIxCg==",
      "sha256": "1a68ff0c870e8eeb508b4985e394dad23c8136bb73407d3816a5d14c1c2717c8"
    },
    {
      "name": "a newline inside a filename does not break the framing",
      "entries": [
        {
          "path": "we\nird",
          "kind": "file",
          "contentBase64": "b25lIGZpbGU="
        },
        {
          "path": "weird",
          "kind": "file",
          "contentBase64": "YW5vdGhlciBmaWxl"
        }
      ],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQp3ZQppcmQAZgA1YTYyZDRkYjRjZTM3N2IwNGY1ODhiMjEyMjJiZmMzNDMyNzM5NjY5OGNkZGM3NWUwOWE0YTk4NjJiMDdhMmE2CndlaXJkAGYAMTAwZWY2YTcxYmFjOTI1ZjcwOWZlOWMxMTRjNjA0NjBiZjZlNDcyY2ZkYjlkNDRiZDhhZGYxNjk4MTM1MjYwZgo=",
      "sha256": "d89bb873f9231c07129a96b76f4ee3fcbf768d9868b49f6c34461c8f6e2ef719"
    },
    {
      "name": "a link is not a file whose bytes are its target",
      "requiresSymlinks": true,
      "entries": [
        {
          "path": "p",
          "kind": "link",
          "linkTarget": "p-real"
        },
        {
          "path": "q",
          "kind": "file",
          "contentBase64": "cC1yZWFs"
        },
        {
          "path": "p-real",
          "kind": "file",
          "contentBase64": "dGhlIHJlYWwgYnl0ZXM="
        }
      ],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQpwAGwAYzNhYjA2OTJjZGEwMWE0MWRmNjBlNzhkZDBkN2Q5OTllNzZkODM0YWEyNTlhNTE5N2FkOTg5MWMzM2EyMGJiOApwLXJlYWwAZgAxY2E2ZTJiZWU0OTQwYzA2M2NhYWM4ZjE2OGY5YjQ0YTQ4ZTViNDRjMWQ5OGZmYTFjNWNiMjBmYWVlMGEwYmFiCnEAZgBjM2FiMDY5MmNkYTAxYTQxZGY2MGU3OGRkMGQ3ZDk5OWU3NmQ4MzRhYTI1OWE1MTk3YWQ5ODkxYzMzYTIwYmI4Cg==",
      "sha256": "8db58d6312529f85d0d654809013f60e52c957f10177c4e9708553478adab86d"
    },
    {
      "name": "nested paths sort by their whole byte sequence",
      "entries": [
        {
          "path": "venv/lib/python3.12/site-packages/z.py",
          "kind": "file",
          "contentBase64": "eg=="
        },
        {
          "path": "venv/lib/python3.12/site-packages/a.py",
          "kind": "file",
          "contentBase64": "YQ=="
        },
        {
          "path": "venv/bin/python",
          "kind": "file",
          "contentBase64": "aW50ZXJwcmV0ZXI="
        },
        {
          "path": "box.json",
          "kind": "file",
          "contentBase64": "e30="
        }
      ],
      "streamBase64": "c2hhMjU2LXBhdGgtbGlzdC12MQpib3guanNvbgBmADQ0MTM2ZmEzNTViMzY3OGExMTQ2YWQxNmY3ZTg2NDllOTRmYjRmYzIxZmU3N2U4MzEwYzA2MGY2MWNhYWZmOGEKdmVudi9iaW4vcHl0aG9uAGYAOTY2NmQ5ZTg4OTk0NDc3MzVjYjk4OTdiNzdkYmIxMjE3NTRmZDRkNTAzNjA5NzU4NzU1YmQzZmRhZTNhNGIyMgp2ZW52L2xpYi9weXRob24zLjEyL3NpdGUtcGFja2FnZXMvYS5weQBmAGNhOTc4MTEyY2ExYmJkY2FmYWMyMzFiMzlhMjNkYzRkYTc4NmVmZjgxNDdjNGU3MmI5ODA3Nzg1YWZlZTQ4YmIKdmVudi9saWIvcHl0aG9uMy4xMi9zaXRlLXBhY2thZ2VzL3oucHkAZgA1OTRlNTE5YWU0OTkzMTJiMjk0MzNiN2RkOGE5N2ZmMDY4ZGVmY2JhOTc1NWI2ZDVkMDBlODRjNTI0ZDY3YjA2Cg==",
      "sha256": "619490fb8fba18079b1591756f04f7ece849658415476a6d57bf1a80308f5cb6"
    }
  ]
}