{
  "schemaVersion": 1,
  "slug": "read-reclaim-accounting",
  "kind": "dataset",
  "title": "Read-only SSD intervals: when byte WAF is undefined",
  "summary": "Four constructed counter-delta cases preserve zero-host-write intervals, distinguish ratios from rates, and show why sequential windows must be combined before division.",
  "published": "2026-10-12",
  "updated": "2026-10-12",
  "evidenceType": "deterministic-arithmetic-examples",
  "method": "Invented consecutive write and read windows, each 3,600 seconds, plus their combined interval and an independent idle case. Byte WAF = nandProgramBytes/hostWriteBytes when hostWriteBytes>0, otherwise null. Program rate = nandProgramBytes/durationSeconds. Combine nonoverlapping sequential windows by adding byte deltas and duration, not averaging ratios.",
  "sourceUrl": "https://www.snia.org/education/online-dictionary/term/write-amplification-factor",
  "humanPage": "https://hesela.com/analyses/ssd-read-reclaim-hidden-writes/",
  "downloadPath": "/data/datasets/read-reclaim-accounting.csv",
  "codePath": "/research/read-reclaim-accounting.mjs",
  "license": "CC0-1.0 for Hesela's original code and constructed examples. Source publications retain their own rights.",
  "licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
  "columns": [
    {
      "name": "scenario",
      "type": "string",
      "description": "Constructed window label; combined-write-and-read overlaps its component rows and must not be added to them."
    },
    {
      "name": "hostReadBytes",
      "type": "number",
      "description": "Host-read byte delta in this interval; zero is an explicit observation, not missing data."
    },
    {
      "name": "hostWriteBytes",
      "type": "number",
      "description": "Host-written byte delta; denominator of byte WAF."
    },
    {
      "name": "nandProgramBytes",
      "type": "number",
      "description": "Assumed physical NAND-program byte delta; not inferred from host counters or attributed entirely to reclaim."
    },
    {
      "name": "durationSeconds",
      "type": "number",
      "description": "Interval duration in seconds; positive integer."
    },
    {
      "name": "byteWaf",
      "type": "number|null",
      "description": "NAND-programmed bytes divided by host-written bytes; null in JSON and empty in CSV when denominator is zero."
    },
    {
      "name": "nandProgramBytesPerSecond",
      "type": "number",
      "description": "Mean physical-program rate, bytes/second, across the whole interval; not peak throughput."
    },
    {
      "name": "nandProgramBytesPerHostReadByte",
      "type": "number|null",
      "description": "NAND-programmed bytes/host-read byte; not WAF or causal attribution; null/blank if no host reads."
    }
  ],
  "limits": [
    "Constructed counter deltas, not hardware observations, firmware simulation or reproduced paper data.",
    "NAND programming may include reclaim, garbage collection, metadata and other work; these rows do not separate causes.",
    "Counter availability, units, scope, resets and saturation must be verified before applying arithmetic to actual telemetry.",
    "Only nonoverlapping consecutive intervals of the same device and measurement scope can be combined. The combined row is not an additional independent observation.",
    "No latency, failure probability, read-count threshold or lifetime prediction. Deterministic arithmetic has no sampling confidence interval."
  ],
  "citations": [
    {
      "id": "snia",
      "title": "SNIA dictionary: write amplification factor. Operation-count convention, not the byte convention used in our examples.",
      "url": "https://www.snia.org/education/online-dictionary/term/write-amplification-factor",
      "accessed": "2026-10-12"
    },
    {
      "id": "hesela-reclaim",
      "title": "Hesela: SSD read reclaim and read-only accounting",
      "url": "https://hesela.com/analyses/ssd-read-reclaim-hidden-writes/",
      "accessed": "2026-10-12"
    }
  ],
  "generatedAt": "2026-10-12T06:22:55.336Z",
  "runtime": {
    "node": "v24.21.0",
    "dependencies": "none",
    "seed": "not applicable: deterministic arithmetic"
  },
  "rows": [
    {
      "scenario": "write-window",
      "hostReadBytes": 0,
      "hostWriteBytes": 1073741824,
      "nandProgramBytes": 1342177280,
      "durationSeconds": 3600,
      "byteWaf": 1.25,
      "nandProgramBytesPerSecond": 372827.02222222224,
      "nandProgramBytesPerHostReadByte": null
    },
    {
      "scenario": "read-window",
      "hostReadBytes": 68719476736,
      "hostWriteBytes": 0,
      "nandProgramBytes": 134217728,
      "durationSeconds": 3600,
      "byteWaf": null,
      "nandProgramBytesPerSecond": 37282.70222222222,
      "nandProgramBytesPerHostReadByte": 0.001953125
    },
    {
      "scenario": "combined-write-and-read",
      "hostReadBytes": 68719476736,
      "hostWriteBytes": 1073741824,
      "nandProgramBytes": 1476395008,
      "durationSeconds": 7200,
      "byteWaf": 1.375,
      "nandProgramBytesPerSecond": 205054.86222222223,
      "nandProgramBytesPerHostReadByte": 0.021484375
    },
    {
      "scenario": "idle-window",
      "hostReadBytes": 0,
      "hostWriteBytes": 0,
      "nandProgramBytes": 0,
      "durationSeconds": 3600,
      "byteWaf": null,
      "nandProgramBytesPerSecond": 0,
      "nandProgramBytesPerHostReadByte": null
    }
  ],
  "rowCount": 4,
  "artifacts": {
    "codeSha256": "9333c1ba24ba464c749e4359e229a3cf0c2a68c6cfb840783f204d0970541e12",
    "csvSha256": "67be68f043dc5337c35a51d3783814192fa7aa847bb79e875737460f4d0f91ff"
  }
}
