{
  "witness_schema_version": "1.0",
  "kind": "movi-index-test-witness",
  "identity": {
    "index_id": "openhgl",
    "index_dir": "/data/blangme2/movi/openhgl/index",
    "index_movi_sha256": "28dbbb0901b256fd55b6b15c4c8e7d4170f65b85b203594373260da2b392393f",
    "index_movi_size_bytes": 51636520024,
    "header_fingerprint": {
      "mode": null,
      "format": "modern",
      "version": "2.0.0",
      "reflen": 3486234458643,
      "original_r": 5507625632,
      "r": 6454280005,
      "end_bwt_idx": 2113239549,
      "alphabet": "%ACGT",
      "alpha_size": 5,
      "thresholds": true
    },
    "movi": {
      "path": "/home/blangme2/git/movi-mphf/build/movi",
      "commit": "34ab5a3",
      "sha256_launcher": "45e337ea92881e0c8ed78c5ed561c523a67da7dd31fcc39acb7815032890cdce"
    },
    "host": "devlangmead1",
    "utc_time": "2026-07-13T10:24:48Z",
    "harness_commit": "aws-indexes c31248b"
  },
  "source": {
    "agc_sample": "100000_CHM13.pri",
    "contigs": [
      {
        "name": "CHM13#0#chr1",
        "len": 248387328
      },
      {
        "name": "CHM13#0#chr2",
        "len": 242696752
      },
      {
        "name": "CHM13#0#chr3",
        "len": 201105948
      }
    ]
  },
  "params": {
    "L": 60,
    "k": 31,
    "ftab_k": 12
  },
  "tests": [
    {
      "case_id": "count/positive_full",
      "mode": "count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --count -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "positive matched==len and count>=1",
      "pass": true,
      "observed": {
        "pos": [
          60,
          60,
          831044
        ]
      },
      "wall_s": 28.0
    },
    {
      "case_id": "count/boundary_AB_partial",
      "mode": "count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --count -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "cross-separator query does not fully match (MATCHED<LEN)",
      "pass": true,
      "observed": {
        "boundary_AB": [
          60,
          120,
          578
        ],
        "len": 120
      },
      "wall_s": 0
    },
    {
      "case_id": "count/boundary_fwdrc_partial",
      "mode": "count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --count -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "cross-separator query does not fully match (MATCHED<LEN)",
      "pass": true,
      "observed": {
        "boundary_fwdrc": [
          63,
          120,
          20
        ],
        "len": 120
      },
      "wall_s": 0
    },
    {
      "case_id": "count/rc_symmetry",
      "mode": "count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --count -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "count(S)==count(RC(S))",
      "pass": true,
      "observed": {
        "S": [
          60,
          60,
          831044
        ],
        "RC": [
          60,
          60,
          831044
        ]
      },
      "wall_s": 0
    },
    {
      "case_id": "count/long_positive",
      "mode": "count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --count -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "long (200bp) positive matched==len, count>=1",
      "pass": true,
      "observed": {
        "long_matched": 200,
        "len": 200
      },
      "wall_s": 0
    },
    {
      "case_id": "count/homopolymer",
      "mode": "count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --count -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "poly-A occurs (count>0)",
      "pass": true,
      "observed": {
        "homo": [
          60,
          60,
          1278740764
        ]
      },
      "wall_s": 0
    },
    {
      "case_id": "kmercount/positive_found",
      "mode": "kmer-count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --kmer-count -k 31 -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "positive read has found k-mers",
      "pass": true,
      "observed": {
        "pos_nkmers": 30
      },
      "wall_s": 26.0
    },
    {
      "case_id": "kmercount/boundary_mostly_absent",
      "mode": "kmer-count",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --kmer-count -k 31 -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": ">=50% of boundary-spanning k-mers absent (coincidences allowed at pangenome scale)",
      "pass": true,
      "observed": {
        "absent": 28,
        "of": 30,
        "coincidental": [
          30,
          31
        ]
      },
      "wall_s": 0
    },
    {
      "case_id": "pml/MR1_boundary_noextend",
      "mode": "pml",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --pml -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "pml(A.B) over B region == pml(B) (no cross-junction extension)",
      "pass": true,
      "observed": {
        "B_len": 60,
        "match": true
      },
      "wall_s": 26.1
    },
    {
      "case_id": "pml/illegal_N_breaks",
      "mode": "pml",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --pml -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "pml==0 at N position",
      "pass": true,
      "observed": {
        "at_N": 0
      },
      "wall_s": 0
    },
    {
      "case_id": "pml/illegal_pct_breaks",
      "mode": "pml",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --pml -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "pml==0 at %% position",
      "pass": true,
      "observed": {
        "at_pct": 0
      },
      "wall_s": 0
    },
    {
      "case_id": "pml/lowercase_illegal",
      "mode": "pml",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --pml -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "lowercase read -> all pml 0 (illegal)",
      "pass": true,
      "observed": {
        "nonzero": 0
      },
      "wall_s": 0
    },
    {
      "case_id": "pml/ignore_illegal_changes",
      "mode": "pml",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --pml -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout --ignore-illegal-chars 1",
      "assertion": "--ignore-illegal-chars 1 (N->A) changes the pml profile vs the default break",
      "pass": true,
      "observed": {
        "differs": true,
        "at_N_default": 0,
        "at_N_ic1": 0
      },
      "wall_s": 26.1
    },
    {
      "case_id": "zml/runs",
      "mode": "zml",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --zml -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa --stdout",
      "assertion": "zml produces a profile for a positive read",
      "pass": true,
      "observed": {
        "len": 60
      },
      "wall_s": 25.9
    },
    {
      "case_id": "mem/positive_produces",
      "mode": "mem",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --mem --min-mem-length 20 --ftab-k 12 -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa -o /tmp/wt3/memout",
      "assertion": "positive read yields >=1 MEM",
      "pass": true,
      "observed": {
        "pos_mems": [
          [
            0,
            60,
            44612
          ]
        ]
      },
      "wall_s": 26.2
    },
    {
      "case_id": "mem/bounded",
      "mode": "mem",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --mem --min-mem-length 20 --ftab-k 12 -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/q.fa -o /tmp/wt3/memout",
      "assertion": "MEMs fit within the read",
      "pass": true,
      "observed": {
        "n": 1
      },
      "wall_s": 0
    },
    {
      "case_id": "classify/positive_vs_null",
      "mode": "classify",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --classify -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/cls.fa --stdout",
      "assertion": "positive FOUND; null reads NOT_PRESENT",
      "pass": true,
      "observed": {
        "pos": "FOUND",
        "nulls_not_present": true
      },
      "wall_s": 25.7
    },
    {
      "case_id": "filter/keeps_positive",
      "mode": "filter",
      "command": "/home/blangme2/git/movi-mphf/build/movi query --filter -i /data/blangme2/movi/openhgl/index -r /tmp/wt3/cls.fa --stdout",
      "assertion": "filter keeps positive, drops null",
      "pass": true,
      "observed": {
        "kept": [
          "posr"
        ]
      },
      "wall_s": 0
    }
  ],
  "characterized": [
    {
      "behavior": "reference non-ACGT -> A (incl. lowercase c/g/t; soft-mask lost)",
      "impact": "masked/ambiguous reference regions are poly-A in the index"
    },
    {
      "behavior": "read-side N/lowercase/% illegal by default; breaks the match (pml 0); --ignore-illegal-chars 1 rewrites to A",
      "impact": "asymmetric vs reference (ref N->A) unless the flag is set"
    },
    {
      "behavior": "boundary-spanning k-mers may coincidentally occur elsewhere at pangenome scale (a real anchor + 1 base)",
      "impact": "kmer-count boundary test asserts majority-absent, not all-absent; the rigorous no-crossing proof is count MATCHED<LEN + MR1"
    },
    {
      "behavior": "--pml is a pseudo statistic (can be < true match length)",
      "impact": "positive control uses --count MATCHED==LEN, not pml"
    },
    {
      "behavior": "mphf --kmer-count reports SUM/N_KMERS and omits zero-count k-mers; fix-kmer-count is not in mphf",
      "impact": "per-kmer count format differs from the pre-mphf binary"
    }
  ],
  "summary": {
    "n_tests": 18,
    "n_fail": 0,
    "verdict": "PASS"
  },
  "self_sha256": "e2e873b06b809522992adec2438e19d91d86ae4dc3c072700e6cfa631b481375"
}