Linear: NIA-10 (extension comment cea459e0, Agent 1 pickup)
Built: 2026-09-25 (revised the same day after a second live-read pass: 30 concepts, ledger at 118 rows) · Framework: Spine + Context Band Ladder vocabulary · Status: planning artifact, proposals only
Companions: 11-synonym-parallel-ledger-v1.csv / .md (the rows that use these IDs) · 12-authority-scale-and-meta-proposals.md (what to add to claims/fixtures)
Inputs: 07, 08, 09 (this ticket) · MCS v4 + AGENTS-MCS.md (read-only) · docs/architecture/ and docs/architecture/vocab/ on niagaraassembly/heavymap main (49893d0) · PR #13 fixtures · live schema reads on 2026-09-25 (see §8)
A joining concept is a stable HeavyMap ID for the job a field does, so fields with different native names can be united, and fields with the same name can be kept apart. Native names are never renamed away: the claim keeps the publisher’s field name and value (see 12), and the concept ID is an extra handle.
nei_id (Niagara NEI) and Welland’s Business Directory ID are both premises-level register keys, so they share premises_register_key. They still share no key with each other, so no join between the two registers exists. A concept says “same job”, never “these two tables can be joined”.identity … share_export) says where a claim sits on the ladder. A concept lists the bands it may feed.floor_area_m2, coverage_ratio, employment_interval) is the name of a computed value. Concepts here name the published inputs (floor_area_published, lot_area_published, employment_size_band), which live on the stamp of a reading, never as a copied raw field on the derived_readings rung (claims contract).observation_on …) are separate. One concept, assessment_roll_context, is stamp-adjacent (its year maps to observation_on) and says so.aliases: line in this file. A concept ID is never reused for a different job.constraint_overlay). Families are not bands.false_friend rows.parcel, footprint, address, register_unit (a premises or facility record), zone_polygon (an overlay/zone that attaches to a unit by point_in_polygon, containment or overlap), jurisdiction_aggregate (counts for a whole county or city: cannot attach to a spine unit).Each concept carries three labels and one default: label_ca, label_us, label_neutral, default_genre.
| Situation | Default label shown | Native term shown? |
|---|---|---|
Relation same or alias, CA-comparable |
Canadian label (ca) |
In the stamp or tooltip |
Relation near |
Canadian label if comparable (ca), otherwise US (us) |
Beside the label, always |
Relation false_friend |
Neutral HeavyMap label (neutral) |
Beside the label, always. Never relabelled into the other genre |
| US-only concept (no Canadian counterpart held) | US label (us) |
In the stamp |
| Label collision: the Canadian label is itself a false friend in the other genre | Neutral label (neutral) |
Beside the label |
The collision case is real: assessment_roll_key would be “Roll number” in a Canadian genre, and in New York “roll” means the annual assessment roll, not a parcel identifier. Its default is therefore neutral.
| Required by the extension comment | Concept ID(s) |
|---|---|
| cadastral / unit key | assessment_roll_key, parcel_gis_key (+ assessing_unit_code) |
| establishment / register key | premises_register_key |
| zoning or land-use code | zoning_district (+ zoning_site_modifier, official_plan_designation) |
| assessment / property-class code | assessment_property_class (+ assessment_use_descriptor, assessed_value, assessment_roll_context) |
| environmental / constraint overlay family | constraint_overlay → flood_hazard_overlay, natural_heritage_overlay, heritage_designation_overlay, planning_policy_overlay |
| federal activity register family | regulatory_activity_register (facets by authority scale), jurisdiction_activity_aggregate |
| one derived-reading family | floor_area_published, lot_area_published → readings floor_area_m2, lot_area_m2, coverage_ratio (§6) |
Format per concept: definition · bands it may feed · grain · labels · anchor and example native fields · watch-list · refusal hook. “Live” means the field list or values were read on 2026-09-25; details are in the ledger.
identity)assessment_roll_keyidentity (native key) · parcel.neutral (label collision, §1).SBL (20-char), PRINT_KEY (47.18-1-33), SWIS_SBL_ID; Monroe countysbl (26-digit), printkey; Rochester PARCELID, PRINTKEY; Ontario roll number (MPAC’s ARN): St. Catharines ROLL_NUMBER (19-digit), Norfolk ROLLNUMFUL (19) plus three short forms, Haldimand RollNumber (15), NPCA ARN (15) and ASSESSMENT (20).not_in_coverage there. See 12 §4: the roll number is openly published by several municipalities, and NPCA publishes an MPAC-derived parcel fabric with ARN for its own area (all twelve Niagara municipalities plus parts of Hamilton and Haldimand). Under HARD-RULES 4/5 (amended 2026-10-17, #61) MPAC-derived data is usable, so the roll number from NPCA is a native key; where no join is accepted yet it is not_joined.parcel_gis_keyidentity · parcel. Labels: ca “Parcel GIS ID” · us “Municipal parcel ID” · neutral “Publisher parcel ID” · default neutral.PROPGISID (shared by parcel, landuse and zoning layers), Niagara Falls pID, NYS MUNI_PARCEL_ID (present, unsampled).footprint or address grain.assessing_unit_codeidentity · attribute of a parcel. Labels: us “SWIS” · ca none held · neutral “Assessing unit code” · default us.SWIS (6-digit, 145601), CITYTOWN_SWIS.not_joined until a SWIS join names a city or town (matches the Erie fixture).municipality_labelmunicipality (‘St Catharines’), NYS MUNI_NAME, Welland Directory City. Monroe’s field named swis belongs here, not to assessing_unit_code (it holds names).st-catharines), never mint the slug from the label.statistical_geography_codeneutral (the unit levels differ).Census Division (CD) Unique ID and Census Sub Division (CSD) Unique ID (same anchor, live); TRI state_county_fips_code (36029 for Erie) and CBP STATE/COUNTY/GEO_ID (near: a county is upper-tier, a CSD is roughly a municipality).civic_addressaddress. Join method: normalized_address, the weakest method; the contract already prefers identifier.businessstreetnumber + businessstreetname + businessunit; NYS PARCEL_ADDR, LOC_*; Monroe parceladdress*; Rochester SITEADDRESS; Haldimand StreetAddress.legal_descriptionLegal1..Legal8 (contents unsampled); Monroe description1..description3 (‘Lot 100 Twp 1 Sh Rng’); NPCA Legal_Txt; NPRI Physical Land Survey Description (a route from a facility row to a lot, if parsed).LegalAddress looks like an address but belongs here. Not a use description.parcel_fabric_flagPARCELCLASS (only value observed: ‘LAND’), Haldimand Status (‘Existing’).PARCELCLASS is the CA↔NY false friend of NY PROP_CLASS.publisher_row_idOBJECTID, GlobalID, FID, Obj_id, NEI GSmartID). Excluded from joins. Listed so they are not mistaken for keys.identity for the native key, activity_registers for the row)premises_register_keyestablishment_register_key (superseded working name).identity (native key claim, grade joined, method identifier) and activity_registers (the row) · register_unit.register_family): local_survey (NEI), local_directory (Welland), licence_register (Hamilton, unprobed), regulatory (TRI, NPRI, DEC), regulatory_cross_program (EPA FRS).ca for local registers, per-row us/ca for regulatory facets.nei_id (2022) / NEI_ID (2017–2019); Welland ID; Hamilton LICENSE_NUMBER (licence-level, near: three licence tables with no geometry); tri_facility_id; epa_registry_id / frs_id; NPRI NPRI ID / ID INRP (bilingual header cell, keep whole); NYS DEC DEC_ID, CBSNO, PBSNO, SITE_ID, AUTHORIZATION_NUMBER (five registries, five key names).nei_id keys a premises, not a business: 544 ids kept the id and changed name between 2019 and 2022, against 121 departures. Named premises_register_key (decided by Morgen, 2026-09-25). The extension comment’s working name establishment_register_key is kept as an alias so older references still resolve. The name matters because “establishment” is exactly the word Census CBP uses for a count, not a key (see the CBP false friend below).NEI_ID → nei_id; a first departures run returned zero because of the casing.ESTAB is a false friend. It is a count of establishments by NAICS × county × size class, with no key and no unit rows. It belongs to jurisdiction_activity_aggregate.not_in_coverage for the register, not “zero employment”.industry_classificationactivity_registers · register_unit. Labels: ca “NAICS” · us “NAICS” · neutral “Industry classification” · default ca.primarynaics, industry (title), primarysector; CBP NAICS2017; NPRI NAICS / Code SCIAN (bilingual header; NAICS 4 and 6 in the single-year tables); Welland SectorDescription (free text, near).zoning_district or assessment_property_class (a 710 parcel is not evidence of NAICS 31–33). NAICS edition per source vintage is not stated. secondarynaics = 0 means “absent”.employment_size_bandactivity_registers · register_unit; feeds reading employment_interval. Default ca.sizerangeemployees (2022), EmployeeSizeRange (2019), SizeRange_Employees (2017–2018). Near-neighbours: Welland FullTime/PartTime/Seasonal (counts, not a band); Hamilton NUM_1_4…NUM_500_PLUS (aggregate); CBP EMPSZES/EMP (aggregate).regulatory_activity_registeractivity_registers · register_unit. Facets by authority scale: municipal (Hamilton licence tables), provincial/state (DEC registries), federal (NPRI, TRI).fac_closed_ind, pref_latitude/longitude, pref_accuracy; NPRI per-facility, per-substance release/disposal/transfer quantities with a Units column, plus Latitude/Longitude/Datum; DEC and Hamilton expiry dates (EXPIRATION, EXPIRY_DATE).fac_closed_ind and NEI’s ‘Business Permanently Closed’ are quotation-only words, and an expiry date is not a closure. Facility points join to parcels geometrically, and the regulator’s own accuracy field should gate that (12 §1): TRI has one; NPRI’s 39 Geolocations columns have none. Never sum quantities across substances or units.jurisdiction_activity_aggregatejurisdiction_aggregate: not a claim about any spine unit.id, Description, Year, Bus_count: licence counts by type and year, not licence records).not_in_coverage. They attach to a jurisdiction through statistical_geography_code, and can feed a reading or a coverage check (12 §1).land_use)zoning_districtland_use · zone_polygon. Facets: code, label, category, by_law_ref (required for comparability).ca.Zoning + ZoneCat/ZoneCatSym/ZoneDesc; Hamilton ZONING_CODE/ZONING_DESC + PARENT_BY_LAW_NUMBER/BY_LAW_NUMBER; Brant ZONING/STATUS; Niagara County NY ZoneCode; Rochester BISZONING (near: stored on an assessment snapshot).H-RH-111). Null-attribute polygons are gaps. “Industrial” here is a use regime: false friend of NY PROP_CLASS 700–799. The NYS statewide parcel layer holds no zoning.zoning_site_modifierEXCEPTION1..3, HOLDING1..3 (each with by-law and URL).official_plan_designationca. Uses the ladder’s own word (“Designation, zoning, property class”).DESIGNAT; Brant OP_Designation (+ Within_SAB, Within_BUA); St. Catharines DISTRICT_LANDUSE_DESIGNATION / GENERAL_LANDUSE_DESIGNATION; Welland OP Schedule B Adopted_OP, Other_Use, SiteSpec.SiteSpec is near to zoning_site_modifier.assessment_property_classland_use (stamped as “property class, not zoning, not NAICS”) · parcel. Labels: ca “Property code” (MPAC’s PropCode) · us “Property class” · neutral “Assessment property class” · default neutral (changed from us after the second live pass: an Ontario code is now observed, but the two code tables are not comparable code-for-code).PROP_CLASS (string 710), Monroe propertyclass (integer 710), Rochester CLASSCD/CLASSDSCRP; coarse near-neighbours Rochester PROPERTYTYPE/RESCOM; Ontario NPCA Parcels Cityview PropCode (3-digit MPAC code, 218 distinct values; code table not read).PROPERTYTYPE ‘Industrial’ and RESCOM ‘C’ together. Brant PARCELCLASS is a false friend. The NPCA layer’s licence is unverified (12 §4).assessment_use_descriptorUSED_AS_CODE/USED_AS_DESC (F09 ‘Light mfg’, F03 ‘Dstr wrhouse’, E02 ‘Walk-up off’ all seen on class 710).assessed_valueassessed, land, taxable, market_estimate.land_use (claim or refusal beside the class, as in the Welland fixture). Default us (Ontario’s MPAC property class is usable under HARD-RULES 4/5 (amended 2026-10-17, #61); assessed value is not_in_coverage in the layers read).TOTAL_AV/LAND_AV; Monroe totalassessedvalue; Rochester CURRENT_TOTAL_VALUE.FULL_MARKET_VAL and CURRENT_TAXABLE_VALUE are near, not assessed value. Keep apart in any calculation.assessment_roll_contextobservation_on.ROLL_YR (2025), SPATIAL_YR; Monroe rollyear (2026); ROLL_SECTION (code) / rollsection (label ‘Taxable’).constraints)constraint_overlay (family parent; no rows of its own)zone_polygon (join by point_in_polygon, containment or overlap with a stated threshold), but the read layers show three geometries: polygons (NPCA, FEMA, PSEZ, BOA), a polyline hazard limit (Haldimand Flood Hazard Limit) and points (Niagara heritage). Lines and points need a stated distance or side rule, not point_in_polygon.not_joined or not_in_coverage, never “clear”. NPCA says its floodplain layer is not an exhaustive inventory, so absence there proves nothing. One HeavyMap concept spans many services, one per publisher/family (NES publishes one service per family, keyed by series_cod).Children (each row names its authority; authority_scale is proposed in 12):
flood_hazard_overlay: FEMA NFHL zones (FLD_ZONE, SFHA_TF; read from a mirror), NPCA regulation lands (2,537) and regulated floodplain (1,316; almost attribute-free), Haldimand Flood Hazard Limit (polyline with Elevation, Uprush, layer id 31).natural_heritage_overlay: Niagara NES series (series_cod, layername), NHS, wetlands and woodlands.heritage_designation_overlay: Niagara Designated Heritage Properties (318 points: SITE_NAME, ADDRESS, MUNICIPALITY), Welland Designated Heritage Parcels (31 polygons with Parcel_No).planning_policy_overlay: PSEZ (31 polygons Ontario-wide, dated 2019/2020; Hamilton 3, Brantford 2, Haldimand 1, none in Niagara Region), growth-boundary flags (Brant Within_SAB/Within_BUA), NY BOA (BOA_Name, Date_des), Niagara Falls Brownfield CIP (three attributes). Band: constraints (decided by Morgen, 2026-09-25), each claim named by its authority. “Brownfield” is a four-way false friend across BOA, CIP, Ontario RSC and OSM.derived_readings; never copied forward as raw fields)floor_area_publishedGFA (integer sq ft; populated on 1,046 of 1,159 Erie 700-series parcels); NEI indoorgfa (premises indoor area, unit unstated: near; absent from the 2022 CSV header read this pass).SQFT_LIVING and Monroe squarefeetlivingarea are habitable residential area (false friend, null on industrial rows). Monroe offers no GFA. NYS SQ_FT is lot area (lot_area_published), even though INTEGRATION.md groups it with floor area.lot_area_publishedACRES (assessor) vs CALC_ACRES (geometry), SQ_FT; Monroe acres; Norfolk Acres; Rochester STATEDAREA; Niagara Falls AREA_SQM.SQ_FT = 0, STATEDAREA ‘0.00’, ACRES 0.01 beside CALC_ACRES 11.59). A zero is never carried forward as a quantity (12 §3).owner_of_recordPRIMARY_OWNER, ADD_OWNER, MAIL_*; Rochester OWNERNME1; NPCA Parcels Cityview Owner (field present, values deliberately not sampled). Per 08, the Ontario municipal layers checked carry no owner field, and the Ontario municipal parcel layers read here (Norfolk, Haldimand, Brant, St. Catharines, Niagara Falls) showed none. The NPCA layer is the exception, which makes its licence question (12 §4) a D-13 question too.owner_categoryOWNER_TYPE (value ‘8’ on every sampled Erie row; meaning not verified). Candidate for an earlier tier than the name.| Pair | Relation | Note |
|---|---|---|
premises_register_key (local) ↔ premises_register_key (regulatory) |
near |
Same job, different registers, no shared key. |
zoning_district ↔ assessment_property_class |
different concepts, false-friend pair | “Industrial” appears in both and means a use regime vs an assessed class. |
official_plan_designation ↔ zoning_district |
different concepts | Policy vs regulation. |
zoning_site_modifier ↔ official_plan_designation (SiteSpec) |
near |
Plan-level vs by-law-level exception. |
assessed_value (assessed) ↔ assessed_value (market, taxable) |
near |
Facets of one concept; not interchangeable. |
floor_area_published ↔ lot_area_published |
different concepts | NYS SQ_FT sits on the lot side. |
assessment_roll_key ↔ assessment_roll_context |
different concepts | The “roll” false friend. |
flood_hazard_overlay (FEMA zone) ↔ (NPCA regulation limit) |
near |
Hazard zone vs regulatory limit. |
ESTAB as a register key. False friend, filed under aggregate.| Reading | Inputs (concepts) | Notes / refusal |
|---|---|---|
floor_area_m2 (existing) |
floor_area_published |
Keep source unit on the stamp. not_in_coverage when none published (Monroe, Ontario municipalities in this dig). |
coverage_ratio (existing) |
footprint area, lot_area_m2 |
Never 0: refuse with the missing input’s reason. |
employment_interval (existing) |
employment_size_band |
Carry the band as a range; not a point value. |
lot_area_m2 (proposed new) |
lot_area_published |
Needed as the denominator of coverage_ratio. Reject sentinel zeros (see 12 §3). |
Other readings from 04-uk-capability-glean.md (containment deltas, register-agreement confidence, gap distance) are deliberately left for a later ticket.
establishment_register_key, or rename to premises_register_key?premises_register_key, with the old name kept as an alias.assessment_roll_key, parcel_gis_key, assessment_property_class (changed from us) and statistical_geography_code default to neutral; assessed_value to us; everything else ca.planning_policy_overlay bandconstraints.lot_area_m2 welcome as a named reading?12 §4): does OGL v2 as stated on the item actually cover HeavyMap’s use? Resolved 2026-10-17 by HARD-RULES 4/5 (amended 2026-10-17, #61): licences don’t gate, so the MPAC roll is no longer not_licensed; the “no parcel fabric” statements for Welland and Hamilton should be revisited.?f=json field lists and a few value samples for NYS Tax Parcels Public, Monroe Parcels_Public, Rochester TaxParcel2024, Norfolk, Haldimand, Brant, St. Catharines, Niagara Falls, Welland, Hamilton, NES; NEI 2017/2019/2022 CSV headers via HTTP Range; EPA Envirofacts tri_facility; Census CBP variables.json. Pass 2: Hamilton licence tables, Welland licence and heritage layers, NYS DEC registries, BOA and Brownfield CIP, Niagara heritage, Haldimand flood limit (layer 31), NPCA’s ArcGIS Online services (fields, counts, item metadata), the PSEZ shapefile (DBF read), FEMA flood zones via an ArcGIS Living Atlas mirror, and NPRI via the ECCC data mart’s real API (data-donnees.az.ec.gc.ca/api, found in the page’s JavaScript bundle; CSV headers by Range). Raw responses were kept in the session scratchpad, not in the repo.hazards.fema.gov reset the connection on three paths); the NPCA licence PDF (the item’s link returns 404); Niagara County NY parcels (still Token Required on a re-check); CBP data queries (need an API key); NYS Building Footprints layer 0 (index moved); NPCA owner values (deliberately not sampled) and the MPAC property-code table. The ledger now has no unverified or catalog_only rows; the remaining documented rows are repo-doc evidence not re-read live.niagara-atlas/logs/2026-08-23.md), D-13, INTEGRATION.md crosswalk, MCS v4 rows, 07/08/09 (read-only, not edited).07, 08, 09, docs/, PR #13, the Linear ticket state.