{
  "schemaVersion": 1,
  "experiment": "ddrescue-output-provenance",
  "generatedAt": "2026-10-18T05:23:15.836662+00:00",
  "evidenceType": "constructed-software-experiment",
  "faultMethod": "GNU ddrescue --test-mode; no physical device failures",
  "environment": {
    "python": "3.12.14",
    "kernel": "6.18.55",
    "system": "Linux",
    "machine": "x86_64",
    "versions": [
      {
        "argv": [
          "ddrescue",
          "--version"
        ],
        "returncode": 0,
        "stdout": "GNU ddrescue 1.30\nCopyright (C) 2026 Antonio Diaz Diaz.\nLicense GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n",
        "stderr": ""
      },
      {
        "argv": [
          "ddrescuelog",
          "--version"
        ],
        "returncode": 0,
        "stdout": "GNU ddrescuelog 1.30\nCopyright (C) 2026 Antonio Diaz Diaz.\nLicense GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n",
        "stderr": ""
      }
    ],
    "executableSha256": {
      "ddrescue": "a7eea3ce9cc7f1fd1fc7b8aae1e38002cb4097a2b18a6c5ef8e6bfa0544e468c",
      "ddrescuelog": "f407cd8892bdfb21335616416acad85163840e225b47404f42f37ff6b8e672dc"
    }
  },
  "upstream": {
    "version": "1.30",
    "archiveUrl": "https://ftp.gnu.org/gnu/ddrescue/ddrescue-1.30.tar.lz",
    "archiveSha256": "2264622d309d6c87a1cfc19148292b8859a688e9bc02d4702f5cd4f288745542"
  },
  "harnessSha256": "2b80ed1ae80fc1209fb528493d31e618efb64b1bfd71b9fe2b61550362189432",
  "source": {
    "bytes": 4096,
    "sectorBytes": 512,
    "sha256": "2d52d2f58e027b88b7f5487af54413141f1ebe868b9847c3286daeec99f99a2d",
    "sectors": [
      "A",
      "00",
      "C",
      "D",
      "E",
      "F",
      "G",
      "H"
    ],
    "encoding": "512 repetitions of each ASCII byte; 00 is 512 zero bytes"
  },
  "cases": [
    {
      "id": "fresh-bad-data",
      "mode": "rescue",
      "destinationInitially": "absent",
      "sparse": false,
      "simulatedBadSector": 2,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "--test-mode=bad-data.map",
          "source.img",
          "fresh-bad-data.img",
          "fresh-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "fresh-bad-data.map"
        ],
        "returncode": 1,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "fresh-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "f018401cb65be53daa0483a7581ccee9d5b5ac616fe77c5367995af50954f2cc",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        false,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [
        1,
        2
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 --test-mode=bad-data.map source.img fresh-bad-data.img fresh-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000800     +               2\n#      pos        size  status\n0x00000000  0x00000400  +\n0x00000400  0x00000200  -\n0x00000600  0x00000A00  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 1024,
          "status": "+"
        },
        {
          "offset": 1024,
          "length": 512,
          "status": "-"
        },
        {
          "offset": 1536,
          "length": 2560,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "-",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 3584
    },
    {
      "id": "reused-bad-data",
      "mode": "rescue",
      "destinationInitially": "Z-filled",
      "sparse": false,
      "simulatedBadSector": 2,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "--test-mode=bad-data.map",
          "source.img",
          "reused-bad-data.img",
          "reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "reused-bad-data.map"
        ],
        "returncode": 1,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "a4c7d3691b80efb7b0373c42ee61f269d612a9be4256bbc8858a8f0758d05491",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        false,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [
        1
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 --test-mode=bad-data.map source.img reused-bad-data.img reused-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000800     +               2\n#      pos        size  status\n0x00000000  0x00000400  +\n0x00000400  0x00000200  -\n0x00000600  0x00000A00  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 1024,
          "status": "+"
        },
        {
          "offset": 1024,
          "length": 512,
          "status": "-"
        },
        {
          "offset": 1536,
          "length": 2560,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "-",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 3584
    },
    {
      "id": "fresh-bad-zero",
      "mode": "rescue",
      "destinationInitially": "absent",
      "sparse": false,
      "simulatedBadSector": 1,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "--test-mode=bad-zero.map",
          "source.img",
          "fresh-bad-zero.img",
          "fresh-bad-zero.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "fresh-bad-zero.map"
        ],
        "returncode": 1,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "fresh-bad-zero.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "2d52d2f58e027b88b7f5487af54413141f1ebe868b9847c3286daeec99f99a2d",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "2ab0e56ff48de274010e5f0c4dc6ce87c401f118a9f505fccb828856d078d0d2",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        true,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 4096,
      "zeroSectors": [
        1
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 --test-mode=bad-zero.map source.img fresh-bad-zero.img fresh-bad-zero.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000600     +               2\n#      pos        size  status\n0x00000000  0x00000200  +\n0x00000200  0x00000200  -\n0x00000400  0x00000C00  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 512,
          "status": "+"
        },
        {
          "offset": 512,
          "length": 512,
          "status": "-"
        },
        {
          "offset": 1024,
          "length": 3072,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "-",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 3584
    },
    {
      "id": "fresh-healthy",
      "mode": "rescue",
      "destinationInitially": "absent",
      "sparse": false,
      "simulatedBadSector": null,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "source.img",
          "fresh-healthy.img",
          "fresh-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "fresh-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "fresh-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "2d52d2f58e027b88b7f5487af54413141f1ebe868b9847c3286daeec99f99a2d",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "2ab0e56ff48de274010e5f0c4dc6ce87c401f118a9f505fccb828856d078d0d2",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        true,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 4096,
      "zeroSectors": [
        1
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 source.img fresh-healthy.img fresh-healthy.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000E00     +               1\n#      pos        size  status\n0x00000000  0x00001000  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 4096,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 4096
    },
    {
      "id": "sparse-fresh-healthy",
      "mode": "rescue",
      "destinationInitially": "absent",
      "sparse": true,
      "simulatedBadSector": null,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "--sparse",
          "source.img",
          "sparse-fresh-healthy.img",
          "sparse-fresh-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "sparse-fresh-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "sparse-fresh-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "2d52d2f58e027b88b7f5487af54413141f1ebe868b9847c3286daeec99f99a2d",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "2ab0e56ff48de274010e5f0c4dc6ce87c401f118a9f505fccb828856d078d0d2",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        true,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 4096,
      "zeroSectors": [
        1
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 --sparse source.img sparse-fresh-healthy.img sparse-fresh-healthy.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000E00     +               1\n#      pos        size  status\n0x00000000  0x00001000  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 4096,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 4096
    },
    {
      "id": "sparse-reused-healthy",
      "mode": "rescue",
      "destinationInitially": "Z-filled",
      "sparse": true,
      "simulatedBadSector": null,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "--sparse",
          "source.img",
          "sparse-reused-healthy.img",
          "sparse-reused-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "sparse-reused-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "sparse-reused-healthy.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "6d10c447de8e64ce6b2ac6c1a485af0825b089c479d15d91d06426f4b6632eec",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "2ab0e56ff48de274010e5f0c4dc6ce87c401f118a9f505fccb828856d078d0d2",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        false,
        true,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 --sparse source.img sparse-reused-healthy.img sparse-reused-healthy.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000E00     +               1\n#      pos        size  status\n0x00000000  0x00001000  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 4096,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 4096
    },
    {
      "id": "sparse-reused-bad-data",
      "mode": "rescue",
      "destinationInitially": "Z-filled",
      "sparse": true,
      "simulatedBadSector": 2,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=0",
          "--sparse",
          "--test-mode=bad-data.map",
          "source.img",
          "sparse-reused-bad-data.img",
          "sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "sparse-reused-bad-data.map"
        ],
        "returncode": 1,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "a6b477d42e7e818375085ae831f7db19ca2bc565ecbb396bf00de657c32ffe71",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        false,
        false,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3072,
      "zeroSectors": [],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 --sparse --test-mode=bad-data.map source.img sparse-reused-bad-data.img sparse-reused-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000800     +               2\n#      pos        size  status\n0x00000000  0x00000400  +\n0x00000400  0x00000200  -\n0x00000600  0x00000A00  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 1024,
          "status": "+"
        },
        {
          "offset": 1024,
          "length": 512,
          "status": "-"
        },
        {
          "offset": 1536,
          "length": 2560,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "-",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 3584
    },
    {
      "id": "resume-sparse-reused",
      "mode": "resume",
      "parentCase": "sparse-reused-bad-data",
      "sparse": false,
      "simulatedBadSector": null,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--cluster-size=1",
          "--retry-passes=1",
          "source.img",
          "sparse-reused-bad-data.img",
          "sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "6d10c447de8e64ce6b2ac6c1a485af0825b089c479d15d91d06426f4b6632eec",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "2ab0e56ff48de274010e5f0c4dc6ce87c401f118a9f505fccb828856d078d0d2",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        false,
        true,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=1 source.img sparse-reused-bad-data.img sparse-reused-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000400     +               1\n#      pos        size  status\n0x00000000  0x00001000  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 4096,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 4096
    },
    {
      "id": "generated-fresh-bad-data",
      "mode": "generate",
      "parentCase": "fresh-bad-data",
      "generatedMapIsApproximate": true,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--generate-mode",
          "source.img",
          "generated-fresh-bad-data.img",
          "generated-fresh-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "generated-fresh-bad-data.map"
        ],
        "returncode": 1,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "generated-fresh-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "f018401cb65be53daa0483a7581ccee9d5b5ac616fe77c5367995af50954f2cc",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        false,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [
        1,
        2
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --generate-mode source.img generated-fresh-bad-data.img generated-fresh-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000000     +               1\n#      pos        size  status\n0x00000000  0x00000200  +\n0x00000200  0x00000400  ?\n0x00000600  0x00000A00  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 512,
          "status": "+"
        },
        {
          "offset": 512,
          "length": 1024,
          "status": "?"
        },
        {
          "offset": 1536,
          "length": 2560,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "?",
        "?",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 3072
    },
    {
      "id": "generated-reused-bad-data",
      "mode": "generate",
      "parentCase": "reused-bad-data",
      "generatedMapIsApproximate": true,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--generate-mode",
          "source.img",
          "generated-reused-bad-data.img",
          "generated-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "generated-reused-bad-data.map"
        ],
        "returncode": 1,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "generated-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "a4c7d3691b80efb7b0373c42ee61f269d612a9be4256bbc8858a8f0758d05491",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        false,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [
        1
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --generate-mode source.img generated-reused-bad-data.img generated-reused-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000000     +               1\n#      pos        size  status\n0x00000000  0x00000200  +\n0x00000200  0x00000200  ?\n0x00000400  0x00000C00  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 512,
          "status": "+"
        },
        {
          "offset": 512,
          "length": 512,
          "status": "?"
        },
        {
          "offset": 1024,
          "length": 3072,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "?",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 3584
    },
    {
      "id": "generated-sparse-reused-bad-data",
      "mode": "generate",
      "parentCase": "sparse-reused-bad-data",
      "generatedMapIsApproximate": true,
      "operation": {
        "argv": [
          "ddrescue",
          "--quiet",
          "--sector-size=512",
          "--generate-mode",
          "source.img",
          "generated-sparse-reused-bad-data.img",
          "generated-sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "generated-sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "generated-sparse-reused-bad-data.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "a6b477d42e7e818375085ae831f7db19ca2bc565ecbb396bf00de657c32ffe71",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "a863e21577e54cd763729803a621804da4b5030afa35bcf879ea3b3413488a66",
        "fa381301af1b62fa259addbe7ae427fd54486abc7604ea7619e7a9c47965606d",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        false,
        false,
        true,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3072,
      "zeroSectors": [],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --generate-mode source.img generated-sparse-reused-bad-data.img generated-sparse-reused-bad-data.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000000     +               1\n#      pos        size  status\n0x00000000  0x00001000  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 4096,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 4096
    },
    {
      "id": "modified-after-completion",
      "mode": "post-copy-modification",
      "parentCase": "fresh-healthy",
      "operation": {
        "argv": [
          "fixture-sector-overwrite",
          "sector=3",
          "byte=0x58"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "doneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "modified.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "firstSectorDoneStatus": {
        "argv": [
          "ddrescuelog",
          "--done-status",
          "--size=512",
          "modified.map"
        ],
        "returncode": 0,
        "stdout": "",
        "stderr": ""
      },
      "imageBytes": 4096,
      "imageSha256": "999474e2a3043de78c92b81091a9e2dabc55f729e462389793055817583943cf",
      "sectorSha256": [
        "32beecb58a128af8248504600bd203dcc676adf41045300485655e6b8780a01d",
        "076a27c79e5ace2a3d47f9dd2e83e4ff6ea8872b3c2218f66c92b89b55f36560",
        "2ab0e56ff48de274010e5f0c4dc6ce87c401f118a9f505fccb828856d078d0d2",
        "6d1658a92a0c35551c1e935c4c616b3d1876f2129300aa0e042e62608889cc4b",
        "e4b0d4324dd30703dafa59e883b377855a978255e650aa78790ae8b05abd7242",
        "be9da2c7a85e4a76371cbc8d08ac8ca0fdca981dc8b05ed25c8a72d53cec128e",
        "e0a05b4574584211d2fb52b252b626b888704e811fe9a35443857dd89949bfc9",
        "a6e1997daf03cbb80714f521a4e01c96762c0750f1b084f551251ccd5d32ae4a"
      ],
      "matchesSourceBySector": [
        true,
        true,
        true,
        false,
        true,
        true,
        true,
        true
      ],
      "matchingSourceBytes": 3584,
      "zeroSectors": [
        1
      ],
      "mapText": "# Mapfile. Created by GNU ddrescue version 1.30\n# Command line: /workspace/tmp/sources/ddrescue-1.30/ddrescue --quiet --sector-size=512 --cluster-size=1 --retry-passes=0 source.img fresh-healthy.img fresh-healthy.map\n# Start time:   2026-10-18 05:23:15\n# Current time: 2026-10-18 05:23:15\n# Finished\n# current_pos  current_status  current_pass\n0x00000E00     +               1\n#      pos        size  status\n0x00000000  0x00001000  +\n",
      "mapBlocks": [
        {
          "offset": 0,
          "length": 4096,
          "status": "+"
        }
      ],
      "mapStatusBySector": [
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+",
        "+"
      ],
      "finishedBytes": 4096
    }
  ],
  "limitations": [
    "Regular files only; software-simulated read errors.",
    "One upstream version and build; no hardware recovery rates, power-loss or timing claims.",
    "Map '+' describes rescue bookkeeping, not a digest comparison with the source.",
    "Reused sparse output intentionally violates the documented empty-or-zeroed destination precondition."
  ]
}
