{
  "built": {
    "at": null,
    "builder_refs": {},
    "commit": null,
    "repo": "billmallard/makerplane-data",
    "run_url": null,
    "runner": null
  },
  "checks": [
    {
      "blocking": true,
      "cannot_catch": "A pack_meta that is well formed but names the wrong id or cycle for the bytes inside.",
      "expected": "pack_meta present; kind is one the device knows",
      "id": "PACK-001",
      "measured": "id=obstacles-conus kind=obstacles cycle=261001 schema_version=1",
      "status": "pass",
      "title": "pack_meta is readable and names a known kind"
    },
    {
      "blocking": true,
      "cannot_catch": "A license tag or attribution that is present but wrong for the data.",
      "expected": "both non-empty",
      "id": "PACK-002",
      "measured": "attribution and license present",
      "status": "pass",
      "title": "Attribution and license are recorded in pack_meta"
    },
    {
      "blocking": true,
      "cannot_catch": "Whether the label matches where the data really came from. For a kind with a default label (ORIGIN_BY_KIND in packtools/report.py) the label comes from that table, not from the builder or the pack, so the check is tautological and always passes; measured says which. With --origin it shows only that the label given is one of the three.",
      "expected": "one of federal / community / user-supplied",
      "id": "PACK-003",
      "measured": "federal (defaulted by kind obstacles, not read from the pack)",
      "since": "AER-699",
      "status": "pass",
      "title": "Origin label is federal, community or user-supplied"
    },
    {
      "blocking": false,
      "cannot_catch": "A recorded source that is not the one the build actually used, and an edition or sha256 that is well formed but wrong.",
      "expected": "at least one source, each with a non-empty edition and a 64-hex sha256",
      "id": "PACK-004",
      "measured": null,
      "note": "Retro record: this edition was published before pack-report/1 existed, and the upstream inputs it was built from were not recorded then and cannot be recovered from the pack.",
      "status": "not-run",
      "title": "Upstream sources are recorded"
    },
    {
      "blocking": true,
      "cannot_catch": "Wrong values the reader accepts. It shows the device can open and query these bytes, not that what it returns is right. The queries cover fixed points only: US kinds, 5 CONUS metros (Denver, Seattle, Atlanta, Los Angeles and Chicago); airports (Canada), Toronto and Vancouver; water, Puget Sound, Lake Michigan and Lake Ontario; navaids, idents DEN, SEA, LAX; procedures, airways V23, J80, V1; terrain, one native tile or the coarsest mosaic level. So it cannot catch a missing Alaska, Hawaii or Puerto Rico, or any state or province that holds none of those points.",
      "expected": "the reader opens the pack and every query returns data",
      "id": "ACC-001",
      "measured": "opened; 5/5 queries returned data",
      "status": "pass",
      "title": "Device acceptance: pyEfis's own reader opens the pack and answers a fixed query set"
    },
    {
      "blocking": true,
      "cannot_catch": "Wrong data in a structurally sound file, and an index whose contents do not match its table: quick_check does not verify index contents, which is SQLite's documented difference from integrity_check. IDX-001 covers the R-trees.",
      "expected": "ok",
      "id": "SQL-001",
      "measured": "ok",
      "status": "pass",
      "title": "SQLite structure is sound (PRAGMA quick_check)"
    },
    {
      "blocking": true,
      "cannot_catch": "A table that has rows but is missing most of them.",
      "expected": "0 empty tables, apart from those declared empty by design for the kind (water: waterway_lines)",
      "id": "ROW-001",
      "measured": 0,
      "status": "pass",
      "title": "No data table is empty"
    },
    {
      "blocking": false,
      "cannot_catch": "A change that keeps counts steady (rows replaced by wrong rows), any defect already present in the previous edition, and a loss under the threshold (for obstacles at 10%, about 65,000 rows).",
      "expected": "Provisional threshold: no table moves more than 10%; a larger move needs a build note",
      "id": "ROW-002",
      "measured": "largest change: obstacles +0.7% (652,407 -> 657,181)",
      "provisional": "no edition-to-edition baseline yet (one published pair per kind when set); a warn level for a person to look at, to be re-set once enough records exist (AER-4102)",
      "status": "pass",
      "title": "Row counts against the previous edition"
    },
    {
      "blocking": true,
      "cannot_catch": "A table dropped together with a schema_version bump that should not have been; the bump is taken as the declaration that the drop is intended.",
      "expected": "every table in the previous edition is still present, unless schema_version changed",
      "id": "ROW-003",
      "measured": "0 of 1 tables gone",
      "since": "AER-4102",
      "status": "pass",
      "title": "No table of the previous edition has disappeared"
    },
    {
      "blocking": true,
      "cannot_catch": "A plausible coordinate in the wrong place, such as a transposed digit that still lands on land. On airway_legs, a leg with a NULL fix position (no check counts those).",
      "expected": "0 bad coordinates. On point tables a NULL latitude or longitude is bad; on procedure and airway legs a leg with no fix position is left to PROC-FIX-001",
      "id": "GEO-001",
      "measured": 0,
      "status": "pass",
      "title": "Coordinates are present, valid and not at 0,0"
    },
    {
      "blocking": true,
      "cannot_catch": "Two different things given the same correct-looking identifier in different tables, and a wrong identifier that happens to be unique.",
      "expected": "0 duplicates",
      "id": "UNQ-001",
      "measured": "obstacles(oas_no) 0",
      "status": "pass",
      "title": "Identifiers that must be unique are unique"
    },
    {
      "blocking": false,
      "cannot_catch": "A point moved to the wrong place inside the envelope; the envelope is a handful of boxes, not a coastline.",
      "expected": "Provisional threshold: no growth beyond 25 points or 10%, whichever is larger. FAA files carry real oceanic and foreign points, so the count is tracked, not forbidden",
      "id": "GEO-002",
      "measured": "5,228 (previous 5,228)",
      "provisional": "no edition-to-edition baseline yet (one published pair per kind when set); a warn level for a person to look at, to be re-set once enough records exist (AER-4102)",
      "status": "pass",
      "title": "Points outside the US coverage envelope, against the previous edition"
    },
    {
      "blocking": true,
      "cannot_catch": "A loss smaller than half an observed build (ROW-002 tracks that against the previous edition, as a warn), and rows that are present but wrong.",
      "expected": "at or above the floor: half an observed build (half of the 657,181 obstacles in 261001)",
      "id": "OBS-001",
      "measured": "obstacles 657,181 (floor 328,500)",
      "since": "AER-4102",
      "status": "pass",
      "title": "The obstacles table clears its row floor"
    }
  ],
  "gated": true,
  "metrics": {
    "ACC-001": [
      {
        "count": 11,
        "min": 1,
        "ok": true,
        "query": "obstacles within 10 nm of Denver"
      },
      {
        "count": 93,
        "min": 1,
        "ok": true,
        "query": "obstacles within 10 nm of Seattle"
      },
      {
        "count": 249,
        "min": 1,
        "ok": true,
        "query": "obstacles within 10 nm of Atlanta"
      },
      {
        "count": 194,
        "min": 1,
        "ok": true,
        "query": "obstacles within 10 nm of Los Angeles"
      },
      {
        "count": 282,
        "min": 1,
        "ok": true,
        "query": "obstacles within 10 nm of Chicago"
      }
    ],
    "GEO-002": {
      "obstacles.lat": 5228
    }
  },
  "notice": "Experimental / Amateur-Built use only. Not certified. This data is provided as-is with no warranty and any use of the data is at your own risk.",
  "origin": "federal",
  "pack": {
    "bytes": 77033472,
    "cycle": "261001",
    "id": "obstacles-conus",
    "kind": "obstacles",
    "schema_version": "1",
    "sha256": "a0a9c6626423218519e7264a644b1f817ef17f940f1a4d76d3cdf1e2c2bbf190"
  },
  "previous": {
    "cycle": "260806",
    "sha256": "9886da87e22afbf3515a18278149564665856e7597dd9e34bae9651e32d47ad0"
  },
  "record": "retro",
  "retro": {
    "commit": "0dc3dcd2bbe2337d6a08a2846af9c395ea561ffb",
    "probe_refs": {
      "pyEfis": "31110ec077522536e440a2bda9f1eae7083495de"
    },
    "run_url": null,
    "runner": "local",
    "written_at": "2026-11-01T00:53:56Z"
  },
  "schema": "pack-report/1",
  "sources": [],
  "summary": {
    "fail": 0,
    "not_run": 1,
    "pass": 12,
    "warn": 0
  },
  "tables": {
    "obstacles": {
      "prev": 652407,
      "rows": 657181
    }
  }
}
