heavymap

10 — HeavyMap joining concepts v1

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.

1. Ground rules

  1. Concept unity is not joinability. 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”.
  2. A concept is not a band, a reading, or a stamp field.
    • Band (identity … share_export) says where a claim sits on the ladder. A concept lists the bands it may feed.
    • Reading identifier (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).
    • Stamp fields (observation_on …) are separate. One concept, assessment_roll_context, is stamp-adjacent (its year maps to observation_on) and says so.
  3. IDs are lowercase snake_case, ASCII, stable. Renaming needs an aliases: line in this file. A concept ID is never reused for a different job.
  4. Families group concepts for grouping in a UI or a filter. A family has a parent ID only where one is useful (constraint_overlay). Families are not bands.
  5. Same word, different concept is allowed and expected. The ledger records those as false_friend rows.
  6. Grain here means what a claim under the concept attaches to: 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).

Display-genre recommendation (documentation only; the user-selectable rule is a later product decision)

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.

2. Coverage against the ticket’s acceptance list

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)

3. Catalog

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.

Family A — Unit identity (band identity)

assessment_roll_key

parcel_gis_key

assessing_unit_code

municipality_label

statistical_geography_code

civic_address

parcel_fabric_flag

publisher_row_id

Family B — Activity registers (bands identity for the native key, activity_registers for the row)

premises_register_key

industry_classification

employment_size_band

regulatory_activity_register

jurisdiction_activity_aggregate

Family C — Land use and assessment (band land_use)

zoning_district

zoning_site_modifier

official_plan_designation

assessment_property_class

assessment_use_descriptor

assessed_value

assessment_roll_context

Family D — Constraint overlays (band constraints)

constraint_overlay (family parent; no rows of its own)

Children (each row names its authority; authority_scale is proposed in 12):

Family E — Derived-reading inputs (feed band derived_readings; never copied forward as raw fields)

floor_area_published

lot_area_published

Family F — Presentation-tier (D-13)

owner_of_record

owner_category

4. Concept-to-concept relations

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.

5. Deliberately not concepts

6. Reading identifiers (illustrative catalog, not closed)

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.

7. Open questions for Morgen

  1. Keep establishment_register_key, or rename to premises_register_key? Decided 2026-09-25: premises_register_key, with the old name kept as an alias.
  2. Confirm the default genres: 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.
  3. planning_policy_overlay band Decided 2026-09-25: constraints.
  4. Is lot_area_m2 welcome as a named reading?
  5. NPCA’s public MPAC-derived parcel fabric (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.

8. Evidence and method