{
  "_comment": "Hand-authored, one entry per page. Rules, never figure values — a data refresh must never stale this file. Cleaning lines may bind to the script that enforces them: const (module-level constant), expr (an ast.unparse'd comparison), or calls (a function that must be called). Sources under site/ link to the deployed copy automatically; anything under data/ is not deployed and must carry an href to the publisher's own download, or say why it cannot be downloaded. scripts/check_recipes.py verifies all of it.",
  "pages": {
    "index.html": {
      "title": "Home",
      "kind": "quoted",
      "starts_from": [
        {
          "label": "Every figure here is lifted from another page's study. Nothing on the home page is worked out here.",
          "unobtainable": "there is no source of its own — follow the link on each figure to the page that derives it"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "Figures are copied by hand from seven separate studies, then typed into the page."
        },
        {
          "text": "The two charts here are drawn by hand as SVG files, not from a data file. They do not update themselves when a study is rebuilt."
        }
      ],
      "judgment": [
        "Hand-copying is the weakest link on the site, because a figure can be corrected on the page it comes from and left stale here. So this page has the strictest checking script on the site. It re-reads all 45 figures from the seven data files behind them. It checks both hand-drawn charts as well as the text. And it refuses any number that does not declare where it came from.",
        "That last rule is what caught the mobile chart still showing county-wide figures the regressivity study had already withdrawn."
      ],
      "watched_by": {
        "script": "scripts/audit_homepage_figures.py",
        "tier": 1
      }
    },
    "elmira.html": {
      "title": "City Fiscal Health",
      "kind": "derived",
      "starts_from": [
        {
          "label": "NYS assessment rolls, every parcel in the county for 2021 through 2025",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_all_years.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_elmira.py",
        "output": "site/data/elmira-fiscal.json"
      },
      "cleaning": [
        {
          "text": "Narrow to the City of Elmira by its state code, normalised first. The code arrives as the number 70400 from a saved file and as the text \"070400\" from the state's live service, and comparing the wrong one silently matches nothing.",
          "binds": {
            "script": "scripts/visualize_elmira.py",
            "calls": "cm.swis"
          }
        },
        {
          "text": "For the frozen-roll charts, keep residential property only — the state's class codes 200 to 299.",
          "binds": {
            "script": "scripts/visualize_elmira.py",
            "expr": "df['property_class'].between(200, 299)"
          }
        },
        {
          "text": "Drop any parcel the roll gives no assessed value.",
          "binds": {
            "script": "scripts/visualize_elmira.py",
            "expr": "df['assessment_total'] > 0"
          }
        },
        {
          "text": "For the exemption breakdown, use the 2025 roll only, and treat a parcel as fully exempt when its taxable value for county purposes is zero.",
          "binds": {
            "script": "scripts/visualize_elmira.py",
            "expr": "df['roll_year'] == 2025"
          }
        }
      ],
      "judgment": [
        "\"Frozen\" is measured by comparing each parcel's assessment across the five rolls, not by asking the city when it last reassessed. A parcel whose number never moves across five years is frozen in the only sense that affects a tax bill.",
        "Exemption categories are grouped from the roll's own exemption codes. Where a parcel carries more than one exemption, it is counted under the largest."
      ],
      "watched_by": null
    },
    "elmira-equity.html": {
      "title": "Frozen Assessments",
      "kind": "derived",
      "starts_from": [
        {
          "label": "NYS assessment rolls, 2021 through 2025",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_all_years.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        },
        {
          "label": "State equalization rates for Chemung County, back to the 1950s",
          "publisher": "NYS ORPTS",
          "path": "data/raw/ny_equalization_rates_chemung.csv",
          "href": "https://data.ny.gov/Government-Finance/Equalization-Rates-Beginning-Rate-Year-1954/e6pv-77bh"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_equity.py",
        "output": "site/data/equity.json"
      },
      "cleaning": [
        {
          "text": "Narrow to the City of Elmira by its normalised state code.",
          "binds": {
            "script": "scripts/visualize_equity.py",
            "calls": "cm.swis"
          }
        },
        {
          "text": "Keep residential property only, class codes 200 to 299, with an assessed value above zero.",
          "binds": {
            "script": "scripts/visualize_equity.py",
            "expr": "df['property_class'].between(200, 299)"
          }
        },
        {
          "text": "Compare each parcel's 2021 assessment with its 2025 one, and sort every parcel into reassessed, transferred, or untouched.",
          "binds": {
            "script": "scripts/visualize_equity.py",
            "expr": "df['roll_year'] == 2025"
          }
        },
        {
          "text": "The equalization chart starts at 1970, and marks 1995 as the last city-wide revaluation.",
          "binds": {
            "script": "scripts/visualize_equity.py",
            "const": "EQ_REVAL",
            "value": 1995
          }
        }
      ],
      "judgment": [
        "A parcel that changed hands is separated out from one that was reassessed without a sale, because a sale is the usual trigger. Lumping them together would make the roll look more actively maintained than it is.",
        "The page names individual streets. Street names come from the roll's own address field, which is not always tidy. A few parcels on a street can be filed under a spelling variant and miss the group."
      ],
      "watched_by": null
    },
    "jcurve.html": {
      "title": "Assessment Regressivity",
      "kind": "derived",
      "starts_from": [
        {
          "label": "Every property sale the state records in Chemung County",
          "publisher": "NYS ORPTS SalesWeb",
          "path": "data/raw/SaleswebExtract.csv",
          "href": "https://www.tax.ny.gov/research/property/assess/sales/"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_jcurve.py",
        "output": "site/data/jcurve.json"
      },
      "cleaning": [
        {
          "text": "Keep only arm's-length sales. That means a real deal between a willing buyer and a willing seller. It drops sales between relatives, and transfers that were never a sale at all.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "expr": "df.arms_length_flag == 'Y'"
          }
        },
        {
          "text": "Keep only ordinary single-family houses. The state calls this property class 210. Comparing a house to a factory would tell you nothing.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "expr": "df.prop_class_at_sale == 210"
          }
        },
        {
          "text": "Drop any sale under $10,000. At that price it is nearly always a data-entry error or a gift inside a family.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "expr": "df.sale_price > 10000"
          }
        },
        {
          "text": "Drop any parcel the roll gives no assessed value.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "expr": "df.total_av > 0"
          }
        },
        {
          "text": "Work out each home's ratio. The ratio is its assessed value divided by the price it sold for. Then drop any ratio of 5 or more, which means one of the two numbers is wrong.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "expr": "sf.ratio < 5"
          }
        },
        {
          "text": "Keep sales from 2018 through 2025. That drops about 40 stray sales dated 2026 or not dated at all.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "expr": "sf.sale_year >= 2018"
          }
        },
        {
          "text": "Narrow to the City of Elmira, through the one shared function every script here uses. Asking the roll for \"Elmira\" by name also hands back the Town of Elmira, which pays no city tax.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "A price band is only drawn if at least this many sales fall inside it. A median of six sales is not a finding.",
          "binds": {
            "script": "scripts/visualize_jcurve.py",
            "const": "MIN_BIN",
            "value": 30
          }
        }
      ],
      "judgment": [
        "Sorting homes by sale price puts that price on both sides of the sum. It sets the band a home lands in, and it is also the bottom of its ratio. So the curve bends before any unfairness is involved. Sorting by assessed value instead does not fix it, because that tilts the error the other way.",
        "To measure the bend, the script finds homes that sold twice within three years. How far apart those two prices sit tells you how much one sale price strays from what a house is really worth. It then simulates a city with that much randomness and no unfairness at all, runs the same method on it, and subtracts whatever gap comes back. The published gap is the smaller, corrected one.",
        "An earlier version of this study pooled all eleven towns in the county. Those towns assess on very different scales, so gaps between towns were being read as unfairness inside Elmira. It was wrong. We withdrew it, and a scan now makes sure those old figures cannot quietly come back anywhere on the site."
      ],
      "watched_by": {
        "script": "scripts/audit_jcurve_figures.py",
        "tier": 2
      }
    },
    "tax-burden.html": {
      "title": "The Fair-Share Map",
      "kind": "derived",
      "starts_from": [
        {
          "label": "Recorded property sales, used to work out what homes actually fetch",
          "publisher": "NYS ORPTS SalesWeb",
          "path": "data/raw/SaleswebExtract.csv",
          "href": "https://www.tax.ny.gov/research/property/assess/sales/"
        },
        {
          "label": "The 2025 assessment roll, for every parcel's assessed value and map position",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_assessment_fairness_map.py",
        "output": "site/data/fairness-map.json"
      },
      "cleaning": [
        {
          "text": "Narrow the roll to City of Elmira parcels through the shared function.",
          "binds": {
            "script": "scripts/visualize_assessment_fairness_map.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "Drop parcels with no map coordinates, which cannot be placed on a map at all.",
          "binds": {
            "script": "scripts/visualize_assessment_fairness_map.py",
            "expr": "df.grid_coordinates_east > 0"
          }
        },
        {
          "text": "For each parcel work out how far its assessment sits from what comparable homes nearby actually sold for, and sort it into a band by that gap.",
          "binds": {
            "script": "scripts/visualize_assessment_fairness_map.py",
            "expr": "city.deviation > 0.1"
          }
        }
      ],
      "judgment": [
        "The labels are relative, and that matters more here than anywhere else on the site. A parcel marked as paying more than its share is assessed at a higher share of its value than the typical Elmira home. It is almost certainly still assessed below what it would sell for. An early version of this page said \"over-assessed\", which in plain English means assessed for more than it is worth, and that was not true. The classification was right and the word was wrong.",
        "A parcel needs nearby comparable sales to be placed at all. In blocks where almost nothing has sold, there is no honest answer, and the parcel is left uncoloured rather than guessed at."
      ],
      "watched_by": null
    },
    "per-acre.html": {
      "title": "Tax Value per Acre",
      "kind": "derived",
      "starts_from": [
        {
          "label": "The 2025 assessment roll",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        },
        {
          "label": "Parcel acreage, measured from county GIS parcel shapes",
          "publisher": "Chemung County GIS",
          "path": "data/processed/parcel_acres.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_per_acre.py",
        "output": "site/data/per-acre.json"
      },
      "cleaning": [
        {
          "text": "Narrow to City of Elmira parcels through the shared function.",
          "binds": {
            "script": "scripts/visualize_per_acre.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "Divide each parcel's assessed value by its acreage to get value per acre.",
          "binds": {
            "script": "scripts/visualize_per_acre.py",
            "calls": "cm.swis"
          }
        },
        {
          "text": "For the like-for-like lot comparison, keep lots between a tenth of an acre and a full acre. Below that the acreage figure is mostly rounding; above it the lot is not really a city house lot.",
          "binds": {
            "script": "scripts/visualize_per_acre.py",
            "expr": "city.acres > 0.1"
          }
        },
        {
          "text": "Compare single-family houses against two- and three-family ones on the same lot sizes.",
          "binds": {
            "script": "scripts/visualize_per_acre.py",
            "expr": "city.property_class == 210"
          }
        }
      ],
      "judgment": [
        "Value per acre measures what a property is assessed at, not what it pays. A tax-exempt parcel can show a high value per acre and contribute nothing, so the exempt parcels are shown separately rather than mixed in.",
        "Acreage comes from the shape of the parcel on the county's map, not from the deed. Where the two disagree the map is what gets used, because it is the only figure available for every parcel."
      ],
      "watched_by": null
    },
    "trends.html": {
      "title": "Multi-Year Trends",
      "kind": "derived",
      "starts_from": [
        {
          "label": "NYS assessment rolls, every parcel in the county for 2021 through 2025",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_all_years.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_trends.py",
        "output": "site/data/trends.json"
      },
      "cleaning": [
        {
          "text": "Work out each municipality from its normalised state code rather than its name.",
          "binds": {
            "script": "scripts/visualize_trends.py",
            "calls": "cm.swis"
          }
        },
        {
          "text": "Drop any parcel the roll gives no assessed value.",
          "binds": {
            "script": "scripts/visualize_trends.py",
            "expr": "df['assessment_total'] > 0"
          }
        },
        {
          "text": "Group the state's several hundred property classes into a handful of readable categories, and total each one by year."
        }
      ],
      "judgment": [
        "This page compares whole municipalities, so it does not use the city-only filter the rest of the site does. The Town of Elmira appears here on purpose, as its own line.",
        "Totals move for two different reasons — properties being reassessed, and properties being built, split or demolished. The chart shows the combined effect, which is what a levy actually falls on, but it cannot tell you which of the two moved a given line."
      ],
      "watched_by": null
    },
    "reassessment.html": {
      "title": "Reassessment",
      "kind": "derived",
      "starts_from": [
        {
          "label": "Recorded property sales, which anchor the model to real prices",
          "publisher": "NYS ORPTS SalesWeb",
          "path": "data/raw/SaleswebExtract.csv",
          "href": "https://www.tax.ny.gov/research/property/assess/sales/"
        },
        {
          "label": "The 2025 assessment roll, the base every projected bill starts from",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        },
        {
          "label": "The state's own residential assessment ratio for Elmira, as an outside check",
          "publisher": "NYS ORPTS",
          "path": "data/raw/ny_residential_assessment_ratios_chemung.csv",
          "href": "https://data.ny.gov/d/bsmp-6um6"
        }
      ],
      "built_by": {
        "script": "scripts/reassessment_model.py",
        "output": "site/data/reassessment.json"
      },
      "cleaning": [
        {
          "text": "Narrow to City of Elmira parcels through the shared function.",
          "binds": {
            "script": "scripts/reassessment_model.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "Fit the model on ordinary single-family houses with an assessed value above zero.",
          "binds": {
            "script": "scripts/reassessment_model.py",
            "expr": "city.property_class == 210"
          }
        },
        {
          "text": "A value band needs at least this many sales before the model will fit a curve through it.",
          "binds": {
            "script": "scripts/reassessment_model.py",
            "const": "SPARSE_BAND_SALES",
            "value": 60
          }
        },
        {
          "text": "Assume the city reassesses to 85% of market value rather than 100%, which is what assessors in practice aim for.",
          "binds": {
            "script": "scripts/reassessment_model.py",
            "const": "NEW_LOA",
            "value": 0.85
          }
        },
        {
          "text": "Hold the total levy fixed. A reassessment moves who pays, not how much the city collects, so every projected bill is worked out against the same total."
        }
      ],
      "judgment": [
        "Sort homes on assessed value and average the price, never the ratio. Doing it the other way round broke the first version of this model. It took ratios measured against sale price and applied them as if they had been measured against assessed value. That manufactured a transfer from poor to rich. That version was withdrawn.",
        "Every figure is a projection, not a measurement. It says what the typical home in a band would see, not what any particular bill will be.",
        "The model is refit 500 times on resampled data, which puts a range around each figure. It is then refit 18 more ways, to check no single choice is holding the answer up."
      ],
      "watched_by": {
        "script": "scripts/audit_reassessment_figures.py",
        "tier": 2
      }
    },
    "rebate.html": {
      "title": "Maintenance Rebate",
      "kind": "derived",
      "starts_from": [
        {
          "label": "The reassessment model's own output, so both pages rest on one set of numbers",
          "publisher": "Open Elmira",
          "path": "site/data/reassessment.json"
        },
        {
          "label": "The 2025 assessment roll",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/analyze_rebate.py",
        "output": "site/data/rebate.json"
      },
      "cleaning": [
        {
          "text": "Narrow to City of Elmira parcels through the shared function.",
          "binds": {
            "script": "scripts/analyze_rebate.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "Keep residential property with an assessed value above zero.",
          "binds": {
            "script": "scripts/analyze_rebate.py",
            "expr": "city.property_class.between(200, 299)"
          }
        },
        {
          "text": "Cost the programme at four different eligibility thresholds, and publish the one the page proposes.",
          "binds": {
            "script": "scripts/analyze_rebate.py",
            "const": "CHOSEN",
            "value": 45000
          }
        },
        {
          "text": "Because nobody knows how many eligible owners would actually claim, cost it across a range of take-up rates rather than assuming one."
        }
      ],
      "judgment": [
        "This page describes a programme that does not exist. Every figure is what it would cost if the city adopted it, not what anything currently costs.",
        "The threshold is a choice, not a finding. The page publishes the costs at the other thresholds too, so you can disagree with the choice and still use the arithmetic."
      ],
      "watched_by": null
    },
    "zoning.html": {
      "title": "Zoning, Explained",
      "kind": "derived",
      "starts_from": [
        {
          "label": "The 2025 assessment roll, for each parcel's recorded lot size and frontage",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        },
        {
          "label": "Elmira City Zoning Map feature service, for district boundaries and parcel shapes",
          "publisher": "Southern Tier Central RPDB",
          "href": "https://services2.arcgis.com/qO6xd1V1VbSyViir/arcgis/rest/services/Elmira_City_Zoning_Map/FeatureServer"
        },
        {
          "label": "City Center Form-Based Code, adopted 17 August 2020",
          "publisher": "City of Elmira",
          "path": "site/sources/elmira-city-center-form-based-code-adopted-2020.pdf"
        }
      ],
      "built_by": {
        "script": "scripts/visualize_zoning_map.py",
        "output": "site/data/zoning.json",
        "also": [
          "site/data/zoning-parcels.json"
        ]
      },
      "cleaning": [
        {
          "text": "Narrow the roll to City of Elmira parcels, through the same shared function the rest of the site uses.",
          "binds": {
            "script": "scripts/visualize_zoning_map.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "Keep one row per parcel. The roll can carry a parcel more than once.",
          "binds": {
            "script": "scripts/visualize_zoning_map.py",
            "expr": "roll.drop_duplicates('pk')"
          }
        },
        {
          "text": "Match each parcel to its zoning district using the district shapes from the county's map service."
        },
        {
          "text": "Apply the ordinance's own rules to each parcel's recorded size. The district name is only half an answer. On most lots what really binds is Table 320, which sets how much land and street frontage each home needs. The page reports which of the two rules stops you."
        },
        {
          "text": "Work out the form-based code districts by reading them off the city's map. That map is a scanned drawing, not data, so each parcel's position is put through the georeferencing built into the PDF and the colour underneath it is sampled."
        }
      ],
      "judgment": [
        "Reading a boundary off the colour of a scanned map is the softest step here. There is no published shapefile of the form-based code to check it against. If a boundary sits a parcel off, that parcel gets the wrong answer.",
        "The zoning map the city posts was last printed on 27 January 2021, and the ordinance it posts is still the February 2010 printing. The current text lives on Municode.",
        "This page shipped four wrong denominators in two days when it launched, and none of them was a maths error. Each one counted the right thing over the wrong set of parcels. That is why its checking script rebuilds every figure from the district shapes and the roll, and re-derives the facts for every street address the page names."
      ],
      "watched_by": {
        "script": "scripts/audit_zoning_figures.py",
        "tier": 2
      }
    },
    "city-budget.html": {
      "title": "City Budget Explorer",
      "kind": "derived",
      "starts_from": [
        {
          "label": "City of Elmira annual financial filings to the State Comptroller, 1995 to 2025, all funds",
          "publisher": "NYS Comptroller (AUD)",
          "path": "site/sources/elmira-osc-city-data.json"
        },
        {
          "label": "City annual summary — fund balance and debt",
          "publisher": "NYS Comptroller",
          "path": "site/sources/elmira-osc-summary.json"
        }
      ],
      "built_by": {
        "script": "scripts/build_budget_json.py",
        "output": "site/data/city-budget.json"
      },
      "cleaning": [
        {
          "text": "Keep the General Fund, the account codes beginning with \"A\". That is the fund the property-tax levy actually lands in. An all-funds total is kept alongside it for context."
        },
        {
          "text": "Roll the Comptroller's hundreds of individual account lines up into readable categories, keeping the original line items underneath so you can drill down to them."
        },
        {
          "text": "Where the page compares across years, restate the older ones in current dollars. Otherwise inflation alone looks like a spending rise."
        }
      ],
      "judgment": [
        "These are the city's own filed figures, not our estimates. Where a year looks odd it is usually a real accounting change — a fund reorganised, or a one-off transfer — rather than an error.",
        "The Comptroller publishes what the city filed. If the city misfiled a line, that line is wrong here too, and nothing in this pipeline could detect it."
      ],
      "watched_by": null
    },
    "county-budget.html": {
      "title": "County Budget",
      "kind": "derived",
      "starts_from": [
        {
          "label": "Annual financial filings for every New York county, by year",
          "publisher": "NYS Comptroller (AUD)",
          "path": "site/sources/elmira-osc-summary.json"
        }
      ],
      "built_by": {
        "script": "scripts/build_budget_json.py",
        "output": "site/data/county-budget.json"
      },
      "cleaning": [
        {
          "text": "Keep Chemung County's General Fund, in the same shape as the city page, so the two can be read side by side."
        },
        {
          "text": "For the peer comparison, pick counties of comparable size and structure rather than all 62, and work out each one's reliance on sales tax against property tax."
        }
      ],
      "judgment": [
        "The peer set is a choice. A different set of peers would move where Chemung sits in the ranking, so the page names which counties are in it rather than presenting a bare rank.",
        "Counties differ in what they fund. Some run a nursing home and some do not. A raw spending comparison therefore rates them on structure, not on how well they are run."
      ],
      "watched_by": null
    },
    "city-county.html": {
      "title": "The City–County Relationship",
      "kind": "derived",
      "starts_from": [
        {
          "label": "State and local sales-tax distributions, by year",
          "publisher": "NYS Comptroller",
          "path": "data/raw/ny_sales_tax_distributions_chemung.csv",
          "href": "https://data.ny.gov/Government-Finance/State-and-Local-Sales-Tax-Distributions-Beginning-/5g2s-tnb7/about"
        },
        {
          "label": "City filings, for what the city actually received",
          "publisher": "NYS Comptroller (AUD)",
          "path": "site/sources/elmira-osc-city-data.json"
        },
        {
          "label": "The 2017 county shared-services report",
          "publisher": "Chemung County",
          "path": "site/sources/chemung-county-shared-services-report-2017.pdf"
        }
      ],
      "built_by": {
        "script": "scripts/build_budget_json.py",
        "output": "site/data/sales-tax-split.json"
      },
      "cleaning": [
        {
          "text": "Line the county's total sales-tax collections up against what the city received each year, and work out the share the city kept."
        },
        {
          "text": "Split the series at the point the sharing arrangement changed, so the flat era and what followed are not averaged together."
        }
      ],
      "judgment": [
        "The cumulative loss figure compares what the city received against what it would have received had the earlier share continued. That is a counterfactual, not a measurement — it assumes the old share would otherwise have held.",
        "Most records behind the 2015 resolution fall outside the county's retention period. So parts of this story rest on what was published at the time, not on the agreement itself."
      ],
      "watched_by": null
    },
    "water-board.html": {
      "title": "The Water Board",
      "kind": "derived",
      "starts_from": [
        {
          "label": "City filings to the State Comptroller, which include the Water Board's enterprise fund",
          "publisher": "NYS Comptroller (AUD)",
          "path": "site/sources/elmira-osc-city-data.json"
        },
        {
          "label": "The 2007 Attorney General opinion on the Water Board",
          "publisher": "NYS Attorney General",
          "path": "site/sources/elmira-ag-opinion-2007-6-water-board.pdf"
        },
        {
          "label": "Council canvass of the Water Board election",
          "publisher": "City of Elmira",
          "path": "site/sources/elmira-council-2025-06-16-water-board-election-canvass.pdf"
        }
      ],
      "built_by": {
        "script": "scripts/build_budget_json.py",
        "output": "site/data/water-board.json"
      },
      "cleaning": [
        {
          "text": "Pull the Water Board out of the city's filings as its own fund — net position, surplus and debt — rather than leaving it inside the city totals."
        },
        {
          "text": "Match the Board's owned parcels against the assessment roll to work out what it holds."
        }
      ],
      "judgment": [
        "The charter's fair-return mechanism has never been used. What the city could have collected under it is worked out from the charter's own formula. The Board has published no such figure.",
        "Turnout figures come from the council's canvass of the election, which is the only public record of it."
      ],
      "watched_by": null
    },
    "decline.html": {
      "title": "The Long Decline",
      "kind": "derived",
      "starts_from": [
        {
          "label": "Municipal tax rates for Chemung County, by year",
          "publisher": "NYS ORPTS",
          "path": "data/raw/ny_tax_rates_chemung.csv",
          "href": "https://data.ny.gov/d/iq85-sdzs"
        },
        {
          "label": "State equalization rates, needed to convert an assessed rate to a market one",
          "publisher": "NYS ORPTS",
          "path": "data/raw/ny_equalization_rates_chemung.csv",
          "href": "https://data.ny.gov/Government-Finance/Equalization-Rates-Beginning-Rate-Year-1954/e6pv-77bh"
        }
      ],
      "built_by": {
        "script": "scripts/build_tax_rates.py",
        "output": "site/data/tax-rates.json"
      },
      "cleaning": [
        {
          "text": "Narrow to the City of Elmira through the shared function.",
          "binds": {
            "script": "scripts/build_tax_rates.py",
            "calls": "cm.city_parcels"
          }
        },
        {
          "text": "Keep both tax rates separately and never average them. One is per $1,000 of assessed value, the other per $1,000 of market value. They measure different things, and merging them once put a wrong rate on this site for a year."
        },
        {
          "text": "Convert between the two using the state's equalization rate for that year, so a rate from 1995 and one from 2025 can be compared."
        }
      ],
      "judgment": [
        "Most of this page is history rather than data — deindustrialisation, the 1972 flood, white flight. Those passages are sourced to documents in the footer and are not derived from any file.",
        "The rate series is only as good as the state's equalization rate for each year. In years when the roll was badly out of date, that rate is itself an estimate."
      ],
      "watched_by": null
    },
    "ida.html": {
      "title": "IDA Overview",
      "kind": "derived",
      "starts_from": [
        {
          "label": "PARIS, the state's public authority reporting system — every CCIDA project",
          "publisher": "NYS Authorities Budget Office",
          "path": "data/raw/ccida_projects_paris.csv",
          "href": "https://data.ny.gov/d/9rtk-3fkw"
        },
        {
          "label": "The 2025 assessment roll, for what each IDA parcel is assessed at",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/build_ida_json.py",
        "output": "site/data/ida.json"
      },
      "cleaning": [
        {
          "text": "Find IDA-held parcels on the roll by their ownership code rather than by matching a company name, which is unreliable."
        },
        {
          "text": "Decide whether a project is in the City of Elmira from the parcel's own state code, not from the city PARIS reports. PARIS records the company's mailing address, so a project in the town can be filed as Elmira.",
          "binds": {
            "script": "scripts/build_ida_json.py",
            "const": "CITY_SWIS",
            "value": 70400
          }
        },
        {
          "text": "Treat a parcel as fully off the tax rolls when its taxable value for county purposes is zero.",
          "binds": {
            "script": "scripts/build_ida_json.py",
            "expr": "city_parcels.county_taxable_value == 0"
          }
        }
      ],
      "judgment": [
        "The city-versus-town distinction is the whole ballgame on these pages. Using the address PARIS reports would credit the city with projects that pay it nothing.",
        "PARIS is self-reported by the IDA. Where a project's figures look wrong, they are wrong in the state's record, and the page says so rather than quietly correcting them."
      ],
      "watched_by": {
        "script": "scripts/audit_ida_figures.py",
        "tier": 1
      }
    },
    "ida-projects.html": {
      "title": "IDA Projects",
      "kind": "derived",
      "starts_from": [
        {
          "label": "PARIS project-level filings for every CCIDA project",
          "publisher": "NYS Authorities Budget Office",
          "path": "data/raw/ccida_projects_paris.csv",
          "href": "https://data.ny.gov/d/9rtk-3fkw"
        }
      ],
      "built_by": {
        "script": "scripts/build_ida_json.py",
        "output": "site/data/ida.json"
      },
      "cleaning": [
        {
          "text": "One row per project. Each carries what the IDA itself reported: jobs promised, jobs reported, tax breaks given, and payments made in return."
        },
        {
          "text": "Locate each project by its parcel's state code rather than the address in PARIS.",
          "binds": {
            "script": "scripts/build_ida_json.py",
            "const": "CITY_SWIS",
            "value": 70400
          }
        }
      ],
      "judgment": [
        "Jobs figures are what the IDA reported. That includes projects that filed the same number every year for a decade. The table shows them as filed.",
        "A project can look like it gave back more than it got in a year. That is because tax breaks and payments are reported on different schedules."
      ],
      "watched_by": {
        "script": "scripts/audit_ida_figures.py",
        "tier": 1
      }
    },
    "ida-elmira.html": {
      "title": "IDA & Elmira",
      "kind": "derived",
      "starts_from": [
        {
          "label": "PARIS filings, narrowed to projects whose parcels are inside the city",
          "publisher": "NYS Authorities Budget Office",
          "path": "data/raw/ccida_projects_paris.csv",
          "href": "https://data.ny.gov/d/9rtk-3fkw"
        },
        {
          "label": "The 2025 assessment roll",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/build_ida_json.py",
        "output": "site/data/ida.json"
      },
      "cleaning": [
        {
          "text": "Keep only projects on parcels inside the City of Elmira, decided by the parcel's state code.",
          "binds": {
            "script": "scripts/build_ida_json.py",
            "const": "CITY_SWIS",
            "value": 70400
          }
        },
        {
          "text": "Work out what the city forgoes by comparing each parcel's assessed value against its taxable value."
        }
      ],
      "judgment": [
        "What the city forgoes is not the same as what it would collect if the exemption ended. Some of these projects would not exist without it, and the page does not claim otherwise.",
        "School and county levies are separate from the city levy. The page keeps them apart, because a single \"lost tax\" figure would mix three different taxing bodies."
      ],
      "watched_by": {
        "script": "scripts/audit_ida_figures.py",
        "tier": 1
      }
    },
    "ida-inventory.html": {
      "title": "IDA-Owned Property",
      "kind": "derived",
      "starts_from": [
        {
          "label": "The 2025 assessment roll, filtered to parcels the IDA holds",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        }
      ],
      "built_by": {
        "script": "scripts/build_ida_json.py",
        "output": "site/data/ida.json"
      },
      "cleaning": [
        {
          "text": "Select parcels by the roll's own IDA ownership code, then join each one to the PARIS project it belongs to where a match exists."
        },
        {
          "text": "Report each parcel's assessed value and its taxable value, so the gap between them is visible per parcel rather than only in total."
        }
      ],
      "judgment": [
        "Some IDA-held parcels match no project in PARIS. They are listed rather than dropped, because a parcel off the rolls with no project attached is itself worth seeing.",
        "The roll is a snapshot. A parcel sold back to private ownership mid-year still appears here until the next roll."
      ],
      "watched_by": {
        "script": "scripts/audit_ida_figures.py",
        "tier": 1
      }
    },
    "ida-board.html": {
      "title": "The IDA Board",
      "kind": "document",
      "starts_from": [
        {
          "label": "CCIDA board minutes and appointment records",
          "publisher": "Chemung County IDA",
          "href": "https://chemungcountyida.com/"
        },
        {
          "label": "PARIS governance filings, which list board members and their terms",
          "publisher": "NYS Authorities Budget Office",
          "href": "https://data.ny.gov/d/9rtk-3fkw"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "Board membership, who appoints each seat, and how seats map to municipalities are read out of the county's own records and typed into the page."
        },
        {
          "text": "Where a member holds another public office, that is recorded from the public record of that office rather than inferred."
        }
      ],
      "judgment": [
        "Nothing here is computed, so nothing can be recomputed. Checking it means reading the minutes.",
        "Board composition changes without announcement. This page is right as of the records it cites, and nothing in the pipeline will notice when it stops being right."
      ],
      "watched_by": {
        "script": "scripts/audit_ida_figures.py",
        "tier": 1
      }
    },
    "pilot.html": {
      "title": "PILOT Agreements",
      "kind": "document",
      "starts_from": [
        {
          "label": "The 2025 assessment roll, for how much property each institution holds tax-free",
          "publisher": "NYS ORPTS",
          "path": "data/processed/chemung_assessments_2025.csv",
          "href": "https://data.ny.gov/Government-Finance/Property-Assessment-Data-from-Local-Assessment-Rol/7vem-aaz7"
        },
        {
          "label": "City of Elmira 2026 adopted budget, A fund",
          "publisher": "City of Elmira",
          "path": "site/sources/elmira-2026-adopted-budget-a-fund.pdf"
        },
        {
          "label": "The City Chamberlain's office, by phone",
          "publisher": "City of Elmira",
          "unobtainable": "a phone confirmation, not a document; the budget line above is the written record"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "There is no dataset behind the payments on this page. A PILOT is an agreement between the city and one institution, so there is no table to recompute and nothing for a script to rebuild."
        },
        {
          "text": "The exempt property values come from the 2025 roll. A person read them off and typed them into the page."
        },
        {
          "text": "The payment amounts come from the budget and from the Chamberlain's office. Elmira College's $5,000 is not booked with the PILOTs at all. It sits under \"Other General Department Income\", account 412890, which is itself part of the story."
        }
      ],
      "judgment": [
        "Checking a figure like this means something entirely different. No script can confirm it, and writing one would not help. It takes a person reading a budget PDF, or getting hold of the agreement.",
        "If the city renegotiated a payment tomorrow, nothing here would notice. The sentence would sit there being wrong until someone read the next budget. What holds it up is naming the source precisely enough that you can go and check it yourself."
      ],
      "not_seen": [
        "The executed 1994 Elmira College agreement. A records request for it is open, and the page says so rather than implying we have read it."
      ],
      "watched_by": null
    },
    "decoder.html": {
      "title": "Fiscal Decoder",
      "kind": "document",
      "starts_from": [
        {
          "label": "City of Elmira audited financial reports, the figures behind all seven indicators",
          "publisher": "City of Elmira",
          "path": "site/sources/elmira-acfr-data.json"
        },
        {
          "label": "The most recent audited financial report",
          "publisher": "City of Elmira",
          "path": "site/sources/elmira-financial-report-2023.pdf"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "All seven Strong Towns indicators are worked out by hand from the audited statements. Each one follows that framework's own definition, not ours."
        },
        {
          "text": "Figures come from the audited reports, not the budget. A budget is a plan. An audit is what happened."
        }
      ],
      "judgment": [
        "The framework is somebody else's. Its definition of an indicator sometimes differs from how a city accountant would frame the same thing. The page follows the framework, and says where it does.",
        "Audited reports land well after the year they cover. So this page always sits a year or two behind the budget pages. That lag is real, not an oversight."
      ],
      "watched_by": null
    },
    "council-minutes.html": {
      "title": "Council Minutes",
      "kind": "document",
      "starts_from": [
        {
          "label": "City Council meeting minutes and agendas, as published by the city",
          "publisher": "City of Elmira",
          "href": "https://www.cityofelmira.net/"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "Minutes are downloaded as published and kept as filed. Nothing in them is edited."
        },
        {
          "text": "Each meeting is flagged for items touching assessment, certiorari and property tax, by searching the text for those subjects."
        }
      ],
      "judgment": [
        "The flags are a search over the text, so they will miss an item discussed under a heading that does not use any of those words. Treat the flags as a starting point, not a complete index.",
        "The city publishes minutes irregularly, and a meeting missing here is usually a meeting whose minutes were not posted."
      ],
      "watched_by": null
    },
    "redlining.html": {
      "title": "1940 Redlining Map",
      "kind": "document",
      "starts_from": [
        {
          "label": "The 1940 HOLC residential security map for Elmira, and its area descriptions",
          "publisher": "Mapping Inequality, University of Richmond",
          "href": "https://dsl.richmond.edu/panorama/redlining/"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "The map and its grades are reproduced as drawn in 1940. Nothing is recalculated."
        },
        {
          "text": "Quotes from the surveyors' notes are given as written. That includes the language they used about the people who lived there. Softening it would hide the record."
        }
      ],
      "judgment": [
        "The page sets 1940 grades beside conditions today. That is a comparison, not a cause. Eighty years of other decisions sit in between.",
        "The old boundaries were drawn by hand. They do not line up with today's parcels or streets, so any overlay is rough."
      ],
      "watched_by": null
    },
    "matters.html": {
      "title": "Why It Matters",
      "kind": "quoted",
      "starts_from": [
        {
          "label": "Figures are quoted from the study pages that derive them; the policy tools are described from state law and the city charter",
          "unobtainable": "no source of its own — each figure links to the page that produces it"
        }
      ],
      "built_by": null,
      "cleaning": [
        {
          "text": "Every number here is repeated from another page and typed in by hand."
        },
        {
          "text": "The tools it describes — reassessment, PILOTs, sales-tax renegotiation, a land bank — are summarised from the statutes and charter provisions that create them."
        }
      ],
      "judgment": [
        "This is the most argumentative page on the site. It draws conclusions the data pages deliberately stop short of, and it should be read that way.",
        "Saying a tool exists and goes unused is a claim about the record. Where we have not found evidence a tool was considered, the page says that, rather than asserting it never was."
      ],
      "watched_by": null
    }
  }
}
