{
 "schema": "galena.city-report/1",
 "id": "norfolk-va",
 "name": "Norfolk",
 "province_or_state": "Virginia",
 "country": "US",
 "generated": "2026-11-03T19:33:58Z",
 "decision": "FAIL",
 "headline": "Check failed. Of the model's not-lead calls on lines the city checked in the field, 10.4% turned out to be lead or galvanized pipe needing replacement, at most 12.7% with 98.33% confidence. Lines built in the 1950s, the 1960s, the 1980s, the 1990s and the 2010s fail on their own. The limits are 1% for that share and 2% for the \"at most\" figure.",
 "reasons": [
  "release bound fails on field-checked clears of lead or GRR: decades 1950, 1960, 1980, 1990, 2010; overall 10.4% (upper 12.7%)"
 ],
 "metrics": {
  "model": "lightgbm",
  "values": {
   "brier_lead": {
    "estimate": 0.006428043450354965,
    "lower": 0.004219058226574734,
    "upper": 0.008479110597049637,
    "level": 0.95
   },
   "brier_multiclass": {
    "estimate": 0.0982412821444071,
    "lower": 0.08414813557542478,
    "upper": 0.1134832328412202,
    "level": 0.95
   },
   "brier_reliability": {
    "estimate": 1.463498115889448e-05,
    "lower": 1.179872267344022e-05,
    "upper": 4.712486208068689e-05,
    "level": 0.95
   },
   "brier_resolution": {
    "estimate": 0.00010086870389299975,
    "lower": 4.620525510999451e-05,
    "upper": 0.00017486041324691527,
    "level": 0.95
   },
   "brier_uncertainty": {
    "estimate": 0.006496635125227586,
    "lower": 0.00422483372299577,
    "upper": 0.008585077430522982,
    "level": 0.95
   },
   "lead_found_top_decile": {
    "estimate": 77.6,
    "lower": 52.575,
    "upper": 100.1075,
    "level": 0.95
   },
   "log_loss": {
    "estimate": 0.2065933584816279,
    "lower": 0.18202270176164073,
    "upper": 0.23400002830298747,
    "level": 0.95
   },
   "pr_auc_grr": {
    "estimate": 0.17225751219564645,
    "lower": 0.1382966698906088,
    "upper": 0.2048691563252511,
    "level": 0.95
   },
   "pr_auc_lead": {
    "estimate": 0.029684151729751595,
    "lower": 0.021288104665040452,
    "upper": 0.039412338185790305,
    "level": 0.95
   },
   "pr_auc_macro": {
    "estimate": 0.39343525463857637,
    "lower": 0.3822905902584229,
    "upper": 0.4034738112805613,
    "level": 0.95
   },
   "pr_auc_non_lead": {
    "estimate": 0.978364099990331,
    "lower": 0.973655617975851,
    "upper": 0.9829068119841079,
    "level": 0.95
   },
   "recall_at_precision_0_8": {
    "estimate": 0.0,
    "lower": 0.0,
    "upper": 0.0008573717948717956,
    "level": 0.95
   },
   "roc_auc_grr": {
    "estimate": 0.7542895492143289,
    "lower": 0.7225667108250167,
    "upper": 0.7747527191034159,
    "level": 0.95
   },
   "roc_auc_lead": {
    "estimate": 0.8392985955200982,
    "lower": 0.7967273300055281,
    "upper": 0.8667690189757382,
    "level": 0.95
   },
   "roc_auc_macro": {
    "estimate": 0.7894474869107462,
    "lower": 0.7634790471727378,
    "upper": 0.8065594487136677,
    "level": 0.95
   },
   "roc_auc_non_lead": {
    "estimate": 0.7747543159978113,
    "lower": 0.7472854891097449,
    "upper": 0.7938036265849954,
    "level": 0.95
   }
  }
 },
 "sufficiency": {
  "lead_blocks_h3_7": 14,
  "min_lead_blocks": 5,
  "min_verified_leads": 100,
  "verified_leads": 160,
  "verified_mask": "given"
 },
 "expected_lead_per_cell": null,
 "estimate": null,
 "counts": {
  "lines": 71275,
  "with_year": 70326,
  "with_coords": 71275,
  "recorded": {
   "non_lead": 59004,
   "unknown": 10715,
   "grr": 1315,
   "lead": 241
  },
  "labels_used": {
   "unknown": 46209,
   "non_lead": 23685,
   "grr": 1215,
   "lead": 166
  },
  "model_made_categories_read_as_unlabelled": 35494,
  "verified_labels": {
   "non_lead": 7544,
   "grr": 1195,
   "lead": 165
  }
 },
 "frame": "Every line in the City's LCRI service line inventory.",
 "labels_rule": "A category from the city's record is a label. A category the city made with a predictive model is unlabelled. The city's own verified flag is passed only where the city publishes one; otherwise the gate counts recorded leads and says verified_mask: absent.",
 "note": "Lines whose category came from the City's own predictive model are read as unlabelled, as the data card says.",
 "method": {
  "pipeline": "craftpine.worker.fitting.train_product, then craftpine.core.model_score.score_loaded and craftpine.worker.estimates.system_estimates on a PASS",
  "algorithm_requested": "lightgbm",
  "algorithm_stored": "lightgbm",
  "seed": 0,
  "code_commit": "0b808dd530ab2ba9c9bcefbacec390ceb7e1a8fe",
  "runtime_seconds": {
   "load": 0.6,
   "train_and_check": 558.2
  },
  "train_reused_from_earlier_invocation": true,
  "cells_with_model_based_only": 0,
  "cells": "H3 resolution 8; a cell with fewer than 10 lines is not published",
  "suppressed": {
   "cells": 42,
   "lines": 132
  },
  "code_note": "The Galena repository is private. The commit hash pins the exact code.",
  "script": {
   "path": "deploy/cities/run_city.py",
   "branch": "lead/site-2026-11-02",
   "commit": "3d0700ae61b9a625a6013aa816753f41667a2d8a"
  }
 },
 "data_card": {
  "publisher": "City of Norfolk Department of Utilities",
  "page": "https://data.norfolk.gov/Utilities/LCRI-Water-Service-Line-Inventory/62wx-9fci",
  "source_url": "https://data.norfolk.gov/api/views/62wx-9fci/rows.csv",
  "licence": "City of Norfolk Open Data Policy: portal data is dedicated to the public domain, with no use restrictions.",
  "licence_url": "https://www.norfolk.gov/3885/Open-Data-Norfolk",
  "attribution": "Data from the City of Norfolk open data portal, public domain.",
  "retrieved": "2026-10-24",
  "inputs": [
   {
    "file": "norfolk-va-lcri-inventory_harmonised.csv",
    "role": "harmonised copy the run read",
    "sha256": "7583520adec1671f48b96e770d1c4d089d956ffef28fd4cce4e332a21c1302f5",
    "bytes": 22871151,
    "redistributed": false
   },
   {
    "file": "norfolk_lcri_service_line_inventory.csv",
    "role": "publisher's file as downloaded",
    "sha256": "52aa785bc52ea47e1ec4fa795c6258ceddca9ca6e961e4e0bda9766942da9991",
    "bytes": 15305784,
    "redistributed": false
   }
  ],
  "harmonise": {
   "script": "deploy/cities/harmonise/harmonise_w12.py",
   "helper": "deploy/cities/harmonise/harmonise_common.py"
  },
  "redistribution": "Line-level inputs are not republished here, because they give the address or exact place of each line. Download the publisher's file from source_url and compare its checksum. The publisher updates its data, so a new download may differ from our copy of 2026-10-24."
 },
 "bbox": [
  -76.43626,
  36.76067,
  -75.9515,
  36.96841
 ],
 "clearance": {
  "baseline_share": 0.7837936636880585,
  "min_share": 0.05,
  "non_lead_calls": 20173,
  "scored_rows": 24620,
  "sentence": null,
  "share": 0.819374492282697,
  "useful": true
 },
 "release_bound": {
  "status": "fail",
  "basis": "field_checked",
  "miss_classes": [
   "LEAD",
   "GRR"
  ],
  "confidence": 0.9833333333333333,
  "candidates": 3,
  "decade_support": 203,
  "summary": "release bound fails on field-checked clears of lead or GRR: decades 1950, 1960, 1980, 1990, 2010; overall 10.4% (upper 12.7%)",
  "statement": "Of the model's not-lead calls on test lines the city had checked in the field, 10.4% turned out to be lead or galvanized pipe needing replacement; with 98.33% confidence the share is at most 12.7%. Weighted to stand for the lines nobody checked, the share is 16.2%, at most 20.2%. The model makes no call for lines built in the 1870s, the 1890s, the 1900s, the 1910s, the 1920s, the 1930s, the 1940s, the 1970s, the 2000s and the 2020s: too few checked lines there to judge it.",
  "reasons": [
   "Lines built in the 1950s: across 10 test runs, 287 of the model's 11,102 not-lead calls on lines the city had checked in the field (2.59%) turned out to be lead or galvanized pipe needing replacement, at most 4.64% with 98.33% confidence.",
   "Lines built in the 1960s: across 10 test runs, 98 of the model's 5,841 not-lead calls on lines the city had checked in the field (1.68%) turned out to be lead or galvanized pipe needing replacement, at most 3.68% with 98.33% confidence.",
   "Lines built in the 1980s: across 10 test runs, 1,080 of the model's 7,001 not-lead calls on lines the city had checked in the field (15.4%) turned out to be lead or galvanized pipe needing replacement, at most 22.1% with 98.33% confidence.",
   "Lines built in the 1990s: across 10 test runs, 1,956 of the model's 12,411 not-lead calls on lines the city had checked in the field (15.8%) turned out to be lead or galvanized pipe needing replacement, at most 19.4% with 98.33% confidence.",
   "Lines built in the 2010s: across 10 test runs, 865 of the model's 4,946 not-lead calls on lines the city had checked in the field (17.5%) turned out to be lead or galvanized pipe needing replacement, at most 23.6% with 98.33% confidence.",
   "Over the decades judged, across 10 test runs, 4,286 of the model's 41,301 not-lead calls on lines the city had checked in the field (10.4%) turned out to be lead or galvanized pipe needing replacement, at most 12.7% with 98.33% confidence.",
   "Weighted so that the checked lines stand for the lines nobody checked, 16.2% of the model's not-lead calls were lead or galvanized pipe needing replacement, at most 20.2%.",
   "The limits are 1.00% for the share of misses and 2.00% for its upper bound, in each decade and over all decades judged."
  ],
  "overall": {
   "calls": 41301,
   "misses": 4286,
   "point": 0.10377472700418876,
   "upper": 0.12650721486459773,
   "lead_misses": 259,
   "lead_point": 0.006271034599646497,
   "lead_upper": 0.011898131414081341
  },
  "decades": [
   {
    "decade": "1870",
    "status": "withdrawn",
    "judged_calls": 0,
    "misses": 0,
    "point": 0.0,
    "upper": 1.0
   },
   {
    "decade": "1880",
    "status": "no calls",
    "judged_calls": 0,
    "misses": 0,
    "point": 0.0,
    "upper": 1.0
   },
   {
    "decade": "1890",
    "status": "withdrawn",
    "judged_calls": 15,
    "misses": 2,
    "point": 0.13333333333333333,
    "upper": 1.0
   },
   {
    "decade": "1900",
    "status": "withdrawn",
    "judged_calls": 68,
    "misses": 12,
    "point": 0.17647058823529413,
    "upper": 1.0
   },
   {
    "decade": "1910",
    "status": "withdrawn",
    "judged_calls": 62,
    "misses": 11,
    "point": 0.1774193548387097,
    "upper": 1.0
   },
   {
    "decade": "1920",
    "status": "withdrawn",
    "judged_calls": 241,
    "misses": 40,
    "point": 0.16597510373443983,
    "upper": 1.0
   },
   {
    "decade": "1930",
    "status": "withdrawn",
    "judged_calls": 429,
    "misses": 20,
    "point": 0.046620046620046623,
    "upper": 0.23162434275048416
   },
   {
    "decade": "1940",
    "status": "withdrawn",
    "judged_calls": 926,
    "misses": 133,
    "point": 0.14362850971922247,
    "upper": 0.3515625
   },
   {
    "decade": "1950",
    "status": "fail",
    "judged_calls": 11102,
    "misses": 287,
    "point": 0.025851197982345524,
    "upper": 0.046370967741935484
   },
   {
    "decade": "1960",
    "status": "fail",
    "judged_calls": 5841,
    "misses": 98,
    "point": 0.016777948981338813,
    "upper": 0.036845163505480144
   },
   {
    "decade": "1970",
    "status": "withdrawn",
    "judged_calls": 1877,
    "misses": 286,
    "point": 0.1523708044752264,
    "upper": 0.2990936555891239
   },
   {
    "decade": "1980",
    "status": "fail",
    "judged_calls": 7001,
    "misses": 1080,
    "point": 0.15426367661762605,
    "upper": 0.2209178228388474
   },
   {
    "decade": "1990",
    "status": "fail",
    "judged_calls": 12411,
    "misses": 1956,
    "point": 0.15760212714527436,
    "upper": 0.193859649122807
   },
   {
    "decade": "2000",
    "status": "withdrawn",
    "judged_calls": 2162,
    "misses": 204,
    "point": 0.09435707678075855,
    "upper": 0.20388349514563106
   },
   {
    "decade": "2010",
    "status": "fail",
    "judged_calls": 4946,
    "misses": 865,
    "point": 0.17488879902951882,
    "upper": 0.23588039867109634
   },
   {
    "decade": "2020",
    "status": "withdrawn",
    "judged_calls": 1625,
    "misses": 124,
    "point": 0.07630769230769231,
    "upper": 0.14548490585892096
   }
  ],
  "withdrawn_decades": [
   "1870",
   "1890",
   "1900",
   "1910",
   "1920",
   "1930",
   "1940",
   "1970",
   "2000",
   "2020"
  ],
  "limits": {
   "share": 0.01,
   "upper": 0.02
  },
  "weighted": {
   "point": 0.16179214917685236,
   "upper": 0.20245496081990055,
   "kish_ess_min": 1144.7523879208677,
   "status": "fail"
  },
  "meaning": "Each of the 10 test runs' calls of not lead, on the lines the city checked in the field (or, records only, on every labelled line). A miss is lead or galvanized pipe needing replacement. Calls are summed over the runs, so a line counts once a run. The upper value is the worst run's at the stated confidence: an exact binomial bound, widened where misses cluster on the map. A decade with too few judged calls is withdrawn: the model makes no call there."
 },
 "plain": {
  "decision": "FAIL",
  "headline": "The model failed the check.",
  "notes": [
   "Of the model's not-lead calls on test lines the city had checked in the field, 10.4% turned out to be lead or galvanized pipe needing replacement; with 98.33% confidence the share is at most 12.7%. Weighted to stand for the lines nobody checked, the share is 16.2%, at most 20.2%. The model makes no call for lines built in the 1870s, the 1890s, the 1900s, the 1910s, the 1920s, the 1930s, the 1940s, the 1970s, the 2000s and the 2020s: too few checked lines there to judge it."
  ],
  "reasons": [
   "Lines built in the 1950s: across 10 test runs, 287 of the model's 11,102 not-lead calls on lines the city had checked in the field (2.59%) turned out to be lead or galvanized pipe needing replacement, at most 4.64% with 98.33% confidence.",
   "Lines built in the 1960s: across 10 test runs, 98 of the model's 5,841 not-lead calls on lines the city had checked in the field (1.68%) turned out to be lead or galvanized pipe needing replacement, at most 3.68% with 98.33% confidence.",
   "Lines built in the 1980s: across 10 test runs, 1,080 of the model's 7,001 not-lead calls on lines the city had checked in the field (15.4%) turned out to be lead or galvanized pipe needing replacement, at most 22.1% with 98.33% confidence.",
   "Lines built in the 1990s: across 10 test runs, 1,956 of the model's 12,411 not-lead calls on lines the city had checked in the field (15.8%) turned out to be lead or galvanized pipe needing replacement, at most 19.4% with 98.33% confidence.",
   "Lines built in the 2010s: across 10 test runs, 865 of the model's 4,946 not-lead calls on lines the city had checked in the field (17.5%) turned out to be lead or galvanized pipe needing replacement, at most 23.6% with 98.33% confidence.",
   "Over the decades judged, across 10 test runs, 4,286 of the model's 41,301 not-lead calls on lines the city had checked in the field (10.4%) turned out to be lead or galvanized pipe needing replacement, at most 12.7% with 98.33% confidence.",
   "Weighted so that the checked lines stand for the lines nobody checked, 16.2% of the model's not-lead calls were lead or galvanized pipe needing replacement, at most 20.2%.",
   "The limits are 1.00% for the share of misses and 2.00% for its upper bound, in each decade and over all decades judged."
  ]
 },
 "false_non_lead": {
  "rate": 0.0015799068838277235,
  "upper": 0.0020583839751982273,
  "non_lead_calls": 20173,
  "seed_summary": {
   "failing_seeds": 0,
   "rate_max": 0.0021585557299843012,
   "rate_mean": 0.0015799068838277235,
   "rate_mean_ci95": [
    0.001416335757580797,
    0.00174347801007465
   ],
   "rate_min": 0.001225940909648155,
   "rate_sd": 0.00026390679509144765,
   "seeds": 10,
   "seeds_with_calls": 10,
   "upper_mean": 0.0020583839751982273
  },
  "meaning": "Of the held-out lines the model called not lead, the share that the records say are lead, as the mean over the release runs. It counts lead only, not galvanized pipe requiring replacement. Upper is an average of the runs' own interval ends, not a bound on the mean: a single run can be above it. Kept for comparison; the check now judges release_bound (ADR 0019)."
 },
 "false_non_lead_field_checked": {
  "calls": 5294,
  "false": 32,
  "rate": 0.006044578768417076,
  "lower": 0.004138053194629633,
  "upper": 0.008522517602504377,
  "level": 0.95,
  "meaning": "Of the test lines the city had checked in the field that the model called not lead, the share that were lead. Seed 0, summed over the equity audit's groups that have checked lines. The interval is Clopper-Pearson."
 },
 "calibration": {
  "ece_lead_equal_width": 0.0017146203722653815,
  "ece_lead_equal_mass": 0.0033355508205943018,
  "slope": 1.1210890396827937,
  "intercept": 0.4268617113397051,
  "log_loss_improvement": {
   "estimate": 0.01279448377009045,
   "excludes_zero": true,
   "level": 0.95,
   "lower": 0.008991597786717244,
   "upper": 0.016318537687242427
  }
 },
 "equity_failures": [
  {
   "group": "decade_built:1940",
   "rate": 0.0,
   "overall": 0.006044578768417076,
   "gap": 0.0,
   "lines": 1437.0,
   "recorded_lead": 40
  },
  {
   "group": "decade_built:1980",
   "rate": 0.008859357696566999,
   "overall": 0.006044578768417076,
   "gap": 0.002814778928149923,
   "lines": 1730.0,
   "recorded_lead": 47
  }
 ],
 "caveats": [
  "The check follows the rules approved on November 3, 2026 (ADR 0019): it judges the lines a city checked in the field, where the city marks them; a call of not lead must also rule out galvanized pipe needing replacement; each decade must pass on its own, or the model makes no call there; and each \"at most\" figure is the worst of the 10 test runs: an exact binomial bound, widened where misses cluster on the map.",
  "This city marks the lines it checked in the field, and the check judges the model on those lines.",
  "The other false non-lead figures in this report count lead only and are kept for comparison, not as the check's bound. The one against the records is the mean of the 10 test runs.",
  "Galena gives no model answer about a single home anywhere yet. It will only after its fixed check passes on a city it was never tuned on, and none of today's cities can be that city."
 ],
 "repeat": [
  "Get the publisher's file from data_card.source_url. Our copy of 2026-10-24 has the sha256 in data_card.inputs. A newer download may differ.",
  "Galena's code is not public yet. You can check each city result against its published files and checksums."
 ]
}