{
  "extraction": {
    "protocol_sha256": "f5eec8ec46150815c95e1002502f9afc6005cfb25db2a0db49f07a9c2b6f71b3",
    "files": [
      {
        "station": "airport",
        "file": "x031y081x040y090.202306.10x10.d06.m3d",
        "sha256": "a3128a4668c1c965d954067f7f9bf5c4374a012cf6f87a7a345fb9dc54014310",
        "bytes": 149058342,
        "source_url": "https://nrs.objectstore.gov.bc.ca/wrfdel/calpuff/3ddat/202306/d06/0308/x031y081x040y090.202306.10x10.d06.m3d",
        "complete_hours": 733,
        "first_data_offset": 6866,
        "first_utc": "2023-06-01T00:00:00Z",
        "last_utc": "2023-07-01T12:00:00Z",
        "selected_static_record": {
          "raw": "  33  84  49.7889 -123.1675   22 16 -999.0000 -999.0000 -999",
          "byte_offset": 2718
        },
        "counts": {
          "surface_records": 73300,
          "profile_records": 2932000
        },
        "selected_cell": {
          "distance_m": 778.1213867907702,
          "tile": "x031y081x040y090",
          "i": 33,
          "j": 84,
          "latitude_token": "49.7889",
          "longitude_token": "-123.1675",
          "terrain_HGT_rounded_m_MSL_token": "22",
          "landuse_LU_INDEX_token": "16",
          "source_line": 81,
          "source_url": "https://nrs.objectstore.gov.bc.ca/wrfdel/calpuff/3ddat/202306/d06/0308/x031y081x040y090.202306.10x10.d06.m3d"
        },
        "profile_values_interpreted": false
      },
      {
        "station": "pam-rocks",
        "file": "x021y051x030y060.202306.10x10.d06.m3d",
        "sha256": "f3ab904bef96f352ab297260beb52f561ce0ef724a4f165acca51ff0d3af6d7e",
        "bytes": 147102606,
        "source_url": "https://nrs.objectstore.gov.bc.ca/wrfdel/calpuff/3ddat/202306/d06/0205/x021y051x030y060.202306.10x10.d06.m3d",
        "complete_hours": 733,
        "first_data_offset": 6866,
        "first_utc": "2023-06-01T00:00:00Z",
        "last_utc": "2023-07-01T12:00:00Z",
        "selected_static_record": {
          "raw": "  25  59  49.4874 -123.2994    0 16 -999.0000 -999.0000 -999",
          "byte_offset": 5890
        },
        "counts": {
          "surface_records": 73300,
          "profile_records": 2932000
        },
        "selected_cell": {
          "distance_m": 42.456526660389365,
          "tile": "x021y051x030y060",
          "i": 25,
          "j": 59,
          "latitude_token": "49.4874",
          "longitude_token": "-123.2994",
          "terrain_HGT_rounded_m_MSL_token": "0",
          "landuse_LU_INDEX_token": "16",
          "source_line": 133,
          "source_url": "https://nrs.objectstore.gov.bc.ca/wrfdel/calpuff/3ddat/202306/d06/0205/x021y051x030y060.202306.10x10.d06.m3d"
        },
        "profile_values_interpreted": false
      }
    ]
  },
  "comparison": {
    "protocol_sha256": "f5eec8ec46150815c95e1002502f9afc6005cfb25db2a0db49f07a9c2b6f71b3",
    "paired_slots": 1440,
    "observation_present": 1418,
    "missing_slots": 22,
    "speed_pairs": 1418,
    "vector_pairs": 1418,
    "summary_groups": 112,
    "direction_groups": 336,
    "missing_labels": {
      "airport": [
        "2023-06-06T09:00:00-08:00",
        "2023-06-06T10:00:00-08:00",
        "2023-06-06T11:00:00-08:00",
        "2023-06-06T12:00:00-08:00",
        "2023-06-06T13:00:00-08:00",
        "2023-06-06T14:00:00-08:00",
        "2023-06-06T15:00:00-08:00",
        "2023-06-07T09:00:00-08:00",
        "2023-06-07T10:00:00-08:00",
        "2023-06-07T11:00:00-08:00",
        "2023-06-07T12:00:00-08:00",
        "2023-06-07T13:00:00-08:00",
        "2023-06-07T14:00:00-08:00",
        "2023-06-07T15:00:00-08:00",
        "2023-06-07T16:00:00-08:00",
        "2023-06-08T09:00:00-08:00",
        "2023-06-08T10:00:00-08:00",
        "2023-06-08T11:00:00-08:00",
        "2023-06-08T12:00:00-08:00",
        "2023-06-08T13:00:00-08:00",
        "2023-06-08T14:00:00-08:00",
        "2023-06-08T15:00:00-08:00"
      ],
      "pam-rocks": []
    },
    "model_forcing_accepted": false,
    "independent_validation": false,
    "inputs_and_outputs_sha256": {
      "extract.py": "2abe477d49d20916ebb26737a687de4e89bf06a1aae876883087a60271a47582",
      "compare.py": "88c47ddcdaca552ce4b3e604067cfe1a16061f9f4bac370361d9b373b5d5eaab",
      "protocol.json": "f5eec8ec46150815c95e1002502f9afc6005cfb25db2a0db49f07a9c2b6f71b3",
      "results/native-surface.json": "63b080145545ffcac7edc5bce157287f8d6385ac0476367d50e20d69c19c0765",
      "results/paired.csv": "5af58f6e13ed2f1ec4d8b1b8266255881851d42f1e93e9ba4e0e2785690b782f",
      "results/summary.csv": "f5de2357f373cb5b73e958ec3e4c1e20b65d1bfd6d76f99332a89cb04edd1544",
      "results/direction.csv": "00b6d7e9b0537f8c4935bd849c3a92f3757403f7bdd7b224759f2887c66e069e",
      "results/reported-calm-distribution.csv": "ff40db96920d850f1c99bec4ee04178acb1e7bdc85b6f81e920e1140222f04fe"
    }
  },
  "independent_reconstruction": {
    "checked_at_utc": "2026-09-05T21:57:34.807322+00:00",
    "classification": "Independent computational reconstruction and export comparison; not independent meteorological validation.",
    "independent_freeze_sha256": "5325bb34f3e1ad88f4f2f077242e6dee456bd7d026de5c4aa2d32ffe67c108dd",
    "independent_frozen_at_utc": "2026-09-05T21:54:45.326935+00:00",
    "root_result_hashes": {
      "paired.json": "804eeee6aee137c8ec4a3473ca129ec7f78846aa7d6ca74bafedeacaba2be4f2",
      "paired.csv": "5af58f6e13ed2f1ec4d8b1b8266255881851d42f1e93e9ba4e0e2785690b782f",
      "summary.json": "6c7cc74d131dec4edba8e9a9d1328761932f51c92a02c222a0c85794bdef5bb8",
      "summary.csv": "f5de2357f373cb5b73e958ec3e4c1e20b65d1bfd6d76f99332a89cb04edd1544",
      "direction.json": "a9adf978a257b61e416287d66f25491f09d01c27e8b8224686ced768b432b039",
      "direction.csv": "00b6d7e9b0537f8c4935bd849c3a92f3757403f7bdd7b224759f2887c66e069e",
      "reported-calm-distribution.json": "864d8530353532043596ef6b93171f37e5f1af09ad923d63e2505b6124342fbb",
      "reported-calm-distribution.csv": "ff40db96920d850f1c99bec4ee04178acb1e7bdc85b6f81e920e1140222f04fe",
      "native-surface.json": "63b080145545ffcac7edc5bce157287f8d6385ac0476367d50e20d69c19c0765",
      "extraction-checks.json": "102cdeefe1c827097073445f310a02707fad93097464538f3e5c321795aa1626",
      "comparison-checks.json": "3b55c68f7fe3e48e2ee3b17586de1b75d6fd8f87a3800ad50adff3a83806ec08"
    },
    "comparison_script_sha256": "ab6e07df54dd524c064b5e28d6a277a5e598f4471a8660030ee3087080a46b65",
    "tolerance": {
      "derived_absolute": 1e-10,
      "derived_relative": 1e-12,
      "native_values_tokens_counts_membership": "exact"
    },
    "compared_checks": {
      "paired.exact": 34561,
      "paired.derived_float": 12960,
      "pair_direction_masks.exact": 4320,
      "summary.exact": 897,
      "summary.derived_float": 1344,
      "direction.exact": 2353,
      "direction.derived_float": 672,
      "calm_distribution.exact": 2165,
      "calm_distribution.derived_float": 684,
      "native_surface.exact": 14661,
      "extraction_checks.exact": 22,
      "comparison_checks.exact": 12,
      "root_CSV_roundtrip.exact": 61804,
      "observation_coordinate_identity.exact": 2836
    },
    "largest_absolute_float_differences": {
      "paired": {
        "absolute_difference": 1.7763568394002505e-15,
        "identity": [
          "pam-rocks",
          "2023-06-07T07:00:00Z"
        ],
        "field": "dv_m_s"
      },
      "summary": {
        "absolute_difference": 8.881784197001252e-16,
        "identity": [
          "airport",
          "month",
          "2023-06 PST"
        ],
        "field": "speed_rmse_m_s"
      },
      "direction": {
        "absolute_difference": 0.0,
        "identity": [
          "airport",
          "month",
          "2023-06 PST",
          0.5
        ],
        "field": "angular_mae_deg"
      },
      "calm_distribution": {
        "absolute_difference": 0.0,
        "identity": [
          "airport",
          "month",
          "2023-06 PST",
          0.0
        ],
        "field": "cumulative_fraction"
      }
    },
    "coverage": {
      "paired_slots": 1440,
      "native_selected_surface_rows": 1466,
      "summary_groups": 112,
      "direction_threshold_groups": 336,
      "per_pair_threshold_masks": 4320,
      "calm_frequency_rows": 684,
      "root_csv": {
        "paired": {
          "rows": 1440,
          "fields": 35,
          "cells": 50400
        },
        "summary": {
          "rows": 112,
          "fields": 23,
          "cells": 2576
        },
        "direction": {
          "rows": 336,
          "fields": 12,
          "cells": 4032
        },
        "reported-calm-distribution": {
          "rows": 684,
          "fields": 7,
          "cells": 4788
        }
      }
    },
    "intentional_representation_differences": {
      "explicit_null_flag_token_string_vs_JSON_null": 4254,
      "unpaired_model_components_retained_by_root_only": 44,
      "model_calm_native_bearing_preserved_vs_defined_bearing_null": 1
    },
    "representation_explanation": [
      "Root encodes explicit observed JSON-null flags as the token string null; independent tables retain JSON null plus observation-present status. Absent slots remain distinct.",
      "Root nulls the defined model bearing when reported model speed is zero; independent output also retains the native bearing token and explicitly marks direction undefined.",
      "Root retains model-only vector components at the 22 absent-observation slots; independent paired component columns are null there. Root components were separately recomputed from native model speed/bearing and agree; all paired metrics exclude those slots.",
      "Root hourly-group labels are integer strings; independent labels use HH:00. These are crosswalked by PST hour.",
      "Root calm table reports cumulative frequencies; independent table reports empirical frequencies. Cumulative counts were reconstructed without changing frozen frequencies."
    ],
    "supplementary_observation_coordinate_checks": [
      {
        "station": "airport",
        "rows": 698,
        "geometry_and_metadata_match_frozen_reference": true
      },
      {
        "station": "pam-rocks",
        "rows": 720,
        "geometry_and_metadata_match_frozen_reference": true
      }
    ],
    "discrepancy_count": 0,
    "discrepancies": [],
    "all_frozen_results_unchanged": true,
    "root_files_unchanged": true,
    "conclusion": "All shared meaningful values agree within the declared tolerance."
  },
  "figure": {
    "scope": "Figure-only rendering of paired.csv and existing monthly summary values. No new meteorological metrics, filtering, date selection or calibration.",
    "script": "work/bc-wrf-wind-june2023/figure/plot_winds.py",
    "script_sha256": "27b4f9d09b522b9fee52dfc96bc394d0a67110b6de6e406bc52f6e67bed8475f",
    "inputs": [
      {
        "path": "results/paired.csv",
        "sha256": "5af58f6e13ed2f1ec4d8b1b8266255881851d42f1e93e9ba4e0e2785690b782f"
      },
      {
        "path": "results/summary.csv",
        "sha256": "f5de2357f373cb5b73e958ec3e4c1e20b65d1bfd6d76f99332a89cb04edd1544"
      },
      {
        "path": "protocol.json",
        "sha256": "f5eec8ec46150815c95e1002502f9afc6005cfb25db2a0db49f07a9c2b6f71b3"
      }
    ],
    "input_hashes_unchanged_after_render": true,
    "period": "2023-06-01 00:00 to2023-07-01 00:00 half-open, fixed PST UTC-8",
    "title": "June 2023 \u00b7 modelled and observed winds",
    "common_wind_axis_max_m_s": 12,
    "date_display_timezone": "PST fixedUTC-8; native timestamps verified before dropping timezone only for display",
    "station_checks": [
      {
        "station": "airport",
        "time_series_slots": 720,
        "observed_finite_points": 698,
        "model_finite_points": 720,
        "observation_missing_gaps": 22,
        "missing_runs": [
          {
            "start_missing_pst": "2023-06-06T09:00:00",
            "last_missing_pst": "2023-06-06T15:00:00",
            "missing_slots": 7,
            "visual_span_start": "2023-06-06T08:30:00",
            "visual_span_end": "2023-06-06T15:30:00"
          },
          {
            "start_missing_pst": "2023-06-07T09:00:00",
            "last_missing_pst": "2023-06-07T16:00:00",
            "missing_slots": 8,
            "visual_span_start": "2023-06-07T08:30:00",
            "visual_span_end": "2023-06-07T16:30:00"
          },
          {
            "start_missing_pst": "2023-06-08T09:00:00",
            "last_missing_pst": "2023-06-08T15:00:00",
            "missing_slots": 7,
            "visual_span_start": "2023-06-08T08:30:00",
            "visual_span_end": "2023-06-08T15:30:00"
          }
        ],
        "paired_scatter_points": 698,
        "scatter_uses_all_speed_eligible_rows": true,
        "time_series_data_unchanged": true,
        "scatter_data_unchanged": true,
        "no_jitter": true,
        "no_regression": true,
        "summary_annotation": "Bias +3.64 \u00b7 RMSE 4.15 m/s",
        "cell": {
          "distance_m": 778.1213867907702,
          "tile": "x031y081x040y090",
          "i": 33,
          "j": 84,
          "latitude_token": "49.7889",
          "longitude_token": "-123.1675",
          "terrain_HGT_rounded_m_MSL_token": "22",
          "landuse_LU_INDEX_token": "16",
          "source_line": 81,
          "source_url": "https://nrs.objectstore.gov.bc.ca/wrfdel/calpuff/3ddat/202306/d06/0308/x031y081x040y090.202306.10x10.d06.m3d"
        },
        "observation_source_url": "https://api.weather.gc.ca/collections/climate-hourly/items?f=json&limit=1000&CLIMATE_IDENTIFIER=10476F0&LOCAL_YEAR=2023&LOCAL_MONTH=6"
      },
      {
        "station": "pam-rocks",
        "time_series_slots": 720,
        "observed_finite_points": 720,
        "model_finite_points": 720,
        "observation_missing_gaps": 0,
        "missing_runs": [],
        "paired_scatter_points": 720,
        "scatter_uses_all_speed_eligible_rows": true,
        "time_series_data_unchanged": true,
        "scatter_data_unchanged": true,
        "no_jitter": true,
        "no_regression": true,
        "summary_annotation": "Bias +0.20 \u00b7 RMSE 2.21 m/s",
        "cell": {
          "distance_m": 42.456526660389365,
          "tile": "x021y051x030y060",
          "i": 25,
          "j": 59,
          "latitude_token": "49.4874",
          "longitude_token": "-123.2994",
          "terrain_HGT_rounded_m_MSL_token": "0",
          "landuse_LU_INDEX_token": "16",
          "source_line": 133,
          "source_url": "https://nrs.objectstore.gov.bc.ca/wrfdel/calpuff/3ddat/202306/d06/0205/x021y051x030y060.202306.10x10.d06.m3d"
        },
        "observation_source_url": "https://api.weather.gc.ca/collections/climate-hourly/items?f=json&limit=1000&CLIMATE_IDENTIFIER=10459NN&LOCAL_YEAR=2023&LOCAL_MONTH=6"
      }
    ],
    "all_visible_text_within_canvas": true,
    "figure_inches": [
      16,
      10
    ],
    "png_dpi": 220,
    "software": {
      "python": "3.12.14 (main, Aug 25 2026, 13:50:33) [Clang 22.1.3 ]",
      "numpy": "2.5.2",
      "matplotlib": "3.11.1"
    },
    "visual_inspection": "See visual-review.json for the separate exported-image inspection and matching artifact hashes.",
    "independent_science_review": "Performed separately; figure does not claim to substitute for it.",
    "outputs": [
      {
        "path": "../../outputs/woodfibre-wrf-wind-june2023.png",
        "bytes": 1041777,
        "sha256": "067a50c1bf7655976931edb3c888806cfb375e343435ed5224d282ab7845a8cd"
      },
      {
        "path": "../../outputs/woodfibre-wrf-wind-june2023.svg",
        "bytes": 329014,
        "sha256": "12d046cab3773ae594bde0df998282f5c551f98606dc7105915427abb89898b7"
      }
    ]
  },
  "figure_visual_review": {
    "status": "passed",
    "method": "Visual inspection of final exported PNG at tool display resolution, plus render-time text bounding-box and point preservation assertions. SVG uses the same plotted figure and was not separately rasterized.",
    "observations": [
      "Title, station labels, legend, axis labels and footer are readable without overlap or clipping.",
      "Two station rows share the same wind-speed scale. Scatter axes are equal and include the equality line.",
      "Airport missing observations remain line gaps; the three missing intervals are shaded. Pam Rocks has no missing slots.",
      "All paired points are retained without jitter; no regression line is introduced.",
      "Fixed PST display and FDDA/consistency limitation are explicit."
    ],
    "artifacts": [
      {
        "path": "../../outputs/woodfibre-wrf-wind-june2023.png",
        "bytes": 1041777,
        "sha256": "067a50c1bf7655976931edb3c888806cfb375e343435ed5224d282ab7845a8cd"
      },
      {
        "path": "../../outputs/woodfibre-wrf-wind-june2023.svg",
        "bytes": 329014,
        "sha256": "12d046cab3773ae594bde0df998282f5c551f98606dc7105915427abb89898b7"
      }
    ],
    "scope": "Figure review only; independent numerical audit is separate."
  },
  "root_figure_review": "Exported PNG inspected: readable, no clipping or overlap; full-month series and missingness retained.",
  "reproduction_archive": {
    "bytes": 313203,
    "sha256": "5c5ab042b9162a2879e960ab3df14143248929a8c2c91280ea9be72d9576e526",
    "members": 22,
    "explicit_allowlist": true,
    "external_native_files": 2,
    "external_native_bytes": 296160948,
    "all_payload_hashes_pass": true
  },
  "reproduction_roundtrip": {
    "data_csvs": {
      "paired.csv": "byte-identical",
      "summary.csv": "byte-identical",
      "direction.csv": "byte-identical",
      "reported-calm-distribution.csv": "byte-identical"
    },
    "figure_assets": {
      "woodfibre-wrf-wind-june2023.png": "byte-identical",
      "woodfibre-wrf-wind-june2023.svg": "byte-identical"
    },
    "external_inputs": "Previously hash-verified originals reused via hard links; no successful network retrieval in this roundtrip.",
    "seed_harness_note": "One-off seed helper corrected from Python3.10-only Path.hardlink_to to os.link; kit source unchanged.",
    "python_data_version": "3.9",
    "figure_environment": "Bundled Python3.12 with existing Matplotlib3.11.1 and NumPy2.5.2",
    "reproduction_complete": true
  }
}
