{
  "schemaVersion": 1,
  "name": "DoneCove SRT QA Sample Pack",
  "version": "1.0.0",
  "releasedOn": "2026-10-24",
  "provenance": "Original fictional teaching material. Five previously published fixtures and four new fixtures.",
  "license": {
    "name": "DoneCove Example Files Permission v1",
    "file": "LICENSE.txt",
    "scope": "Example materials only; excludes product source code and services."
  },
  "validator": {
    "name": "DoneCove SRT validator",
    "interface": "validateSrt(text)",
    "specification": "Expected results describe this checker, not a universal SRT or player conformance standard.",
    "errorLines": "One-based after stripping a leading BOM and normalizing CRLF/CR to LF.",
    "cueCount": "Parsed blocks; a missing separator can reduce this number."
  },
  "limitations": [
    "No companion video or audio: timing is illustrative and synchronization is not evaluated.",
    "Bilingual text is a written illustration, not a measured workbench translation result.",
    "Structural checks do not establish translation accuracy, reading speed or player compatibility.",
    "An overlap is a warning; a structure-check pass can still contain warnings.",
    "This is a small teaching corpus, not an exhaustive validator benchmark."
  ],
  "samples": [
    {
      "id": "timestamp",
      "file": "samples/srt-example-invalid-timestamp.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-invalid-timestamp.srt",
      "title": "A dot in an SRT timestamp",
      "purpose": "An SRT timestamp in this checker uses a comma before three millisecond digits. Change 00:00:01.000 to 00:00:01,000 and compare with the reference. Renaming a VTT file does not convert its format.",
      "origin": "existing-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 111,
      "sha256": "542f07ee4dfdbb92894f7a6afe6fb4291c315e50a6c9f7c43687cd8b3d6eabc7",
      "expected": {
        "ok": false,
        "cueCount": 2,
        "errorCount": 1,
        "warningCount": 0,
        "issues": [
          {
            "code": "TIMESTAMP",
            "severity": "error",
            "line": 2,
            "cue": "1"
          }
        ]
      }
    },
    {
      "id": "separator",
      "file": "samples/srt-example-missing-blank-line.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-missing-blank-line.srt",
      "title": "A missing blank line",
      "purpose": "The second timing row is inside the first parsed block. Insert a blank line before cue number 2. The reported cue count is the number of parsed blocks, not a claim that no dialogue was lost.",
      "origin": "existing-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 110,
      "sha256": "169ba8042955ba064cb0e2083b40472462abbd1d3aec352ee89a9971b1133b2c",
      "expected": {
        "ok": false,
        "cueCount": 1,
        "errorCount": 1,
        "warningCount": 0,
        "issues": [
          {
            "code": "MISSING_SEPARATOR",
            "severity": "error",
            "line": 5,
            "cue": "1"
          }
        ]
      }
    },
    {
      "id": "number",
      "file": "samples/srt-example-duplicate-number.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-duplicate-number.srt",
      "title": "A repeated cue number",
      "purpose": "Both cues are numbered 1. In this example change the second number to 2. The checker reports duplicate numbers; it does not require every valid file to use consecutive numbers.",
      "origin": "existing-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 111,
      "sha256": "32cacaa35d1f3a5ed566f3e9a969b2872f005c416d30a20a4959014448b07785",
      "expected": {
        "ok": false,
        "cueCount": 2,
        "errorCount": 1,
        "warningCount": 0,
        "issues": [
          {
            "code": "DUPLICATE_NUMBER",
            "severity": "error",
            "line": 5,
            "cue": "1"
          }
        ]
      }
    },
    {
      "id": "overlap",
      "file": "samples/srt-example-overlapping-cues.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-overlapping-cues.srt",
      "title": "Overlapping cues: review, do not automatically reject",
      "purpose": "Cue 1 ends at 4 seconds and cue 2 starts at 3 seconds. Overlap is a warning, so the structure check still passes. Simultaneous speech can be intentional. A whole-file time shift preserves this overlap.",
      "origin": "existing-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 111,
      "sha256": "e554f39c2a21d73b9658804dca141f0a6bf5048243dd9e12b43106ea3eaf2000",
      "expected": {
        "ok": true,
        "cueCount": 2,
        "errorCount": 0,
        "warningCount": 1,
        "issues": [
          {
            "code": "OVERLAP",
            "severity": "warning",
            "line": 6,
            "cue": "2"
          }
        ]
      }
    },
    {
      "id": "checked",
      "file": "samples/srt-example-structure-checked.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-structure-checked.srt",
      "title": "The structure-checked reference",
      "purpose": "Compare cue numbers, commas and blank lines with the four preceding files. Zero reported issues means only that this small file meets the checks in this checker.",
      "origin": "existing-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 111,
      "sha256": "7261388e158b1e00d933e567cc9c623448d62b1a0ec5f0fe50d4f8944fcb4793",
      "expected": {
        "ok": true,
        "cueCount": 2,
        "errorCount": 0,
        "warningCount": 0,
        "issues": []
      }
    },
    {
      "id": "time-range",
      "file": "samples/srt-example-end-before-start.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-end-before-start.srt",
      "title": "An end time before its start",
      "purpose": "Cue 1 starts at 1 second but ends at 0.5 seconds. For this teaching example restore the end to 3 seconds. Real cue boundaries must be chosen against the actual video.",
      "origin": "new-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 111,
      "sha256": "c24d101dde665064aaa3b815e43f82ef84c982b36ac3fd3509445037a882ccba",
      "expected": {
        "ok": false,
        "cueCount": 2,
        "errorCount": 1,
        "warningCount": 0,
        "issues": [
          {
            "code": "TIME_RANGE",
            "severity": "error",
            "line": 2,
            "cue": "1"
          }
        ]
      }
    },
    {
      "id": "empty-text",
      "file": "samples/srt-example-empty-caption.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-empty-caption.srt",
      "title": "A cue with no caption text",
      "purpose": "Cue 1 has a number and timing but no text. Restore the fictional reference sentence to reproduce a passing check. This does not test whether an actual translation omitted a sentence.",
      "origin": "new-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 87,
      "sha256": "f108bfe5850f6f20cd6a320c5e2bd5df5e4ecc735cafd3bf3512c3a793753430",
      "expected": {
        "ok": false,
        "cueCount": 2,
        "errorCount": 1,
        "warningCount": 0,
        "issues": [
          {
            "code": "EMPTY_TEXT",
            "severity": "error",
            "line": 3,
            "cue": "1"
          }
        ]
      }
    },
    {
      "id": "touching-bilingual",
      "file": "samples/srt-example-touching-bilingual.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-touching-bilingual.srt",
      "title": "Touching boundaries with two text lines",
      "purpose": "The next cue starts exactly when the previous one ends, so this checker reports no overlap. The English and Chinese sentences are written illustrations, not results captured from an evaluated workbench translation run.",
      "origin": "new-donecove-original",
      "encoding": "UTF-8",
      "bom": false,
      "lineEndings": "LF",
      "bytes": 166,
      "sha256": "160ca69c92ac5ad4950f36a4013f4dc3b9cf2f4a42e52afd9521f5f616b1108e",
      "expected": {
        "ok": true,
        "cueCount": 2,
        "errorCount": 0,
        "warningCount": 0,
        "issues": []
      }
    },
    {
      "id": "bom-crlf",
      "file": "samples/srt-example-utf8-bom-crlf.srt",
      "download": "/marketing-assets/srt-qa-kit-v1-srt-example-utf8-bom-crlf.srt",
      "title": "UTF-8 BOM, CRLF and nonconsecutive numbers",
      "purpose": "This byte-level fixture uses a UTF-8 byte order mark, Windows line endings and cue numbers 10 and 20. It should pass this checker. It is not a certification that every player accepts the same choices.",
      "origin": "new-donecove-original",
      "encoding": "UTF-8",
      "bom": true,
      "lineEndings": "CRLF",
      "bytes": 130,
      "sha256": "9bc202ae534352c43e2de4822b41be4b7287275314b57727d394a932896d8a90",
      "expected": {
        "ok": true,
        "cueCount": 2,
        "errorCount": 0,
        "warningCount": 0,
        "issues": []
      }
    }
  ]
}
