Skip to content

EnVar microschema · class

Extreme-Heat-Day Flag Record

ExtremeHeatDayFlagRecord

Canonical record for a daily binary extreme-heat-day flag, defined against a local 95th-percentile Tmax baseline. Pins heat_metric_family = heat_wave_flag, value_data_type = binary_flag, and requires the percentile-reference-period slots in DerivedHeatMetric to be populated.

17 fields 12 core

URI: envar:class/ExtremeHeatDayFlagRecord

Core Conditionally core Recommended Optional
Core Required for a valid record 12 fields
Subject (Patient or Cohort)corerequired

subject · range String · cardinality 1

Who (or what group) the values belong to — a study cohort or an individual patient, named by an anonymous code rather than anything identifying.

The patient or cohort the exposure value is attached to. Carried as an opaque identifier; PHI must not appear here.

Example

cohort:phoenix_aki_2022an opaque cohort handle — no PHI

Why it matters & mappings

An exposure value is meaningless without knowing whose exposure it is. The opaque handle is what lets the sidecar be joined back to the right cohort or patient in the health-data layer while staying PHI-free.

Variable Identitycorerequired

variable_identity · range VariableIdentity · cardinality 1

This block pins down exactly what was measured. Instead of relying on a nickname like "tmax", it uses shared vocabularies to say "daily maximum air temperature, in degrees Celsius", so any tool or researcher reads it the same way.

The variable identity object — what physical quantity is being captured. Bound to VariableIdentity (see envar_variable). Readable rename of the profile's observation_type anatomy slot.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where gaia_db variable_source.variable_name/variable_description + JSON-LD variableMeasured.propertyID (NERC air_temperature); unit_concept_id 8653
Gaia carries variable name, description, unit, and a CF-mirror propertyID, but CF cell_methods has no slot. Conservative: partial.
degaussassertedabsent coverage
Variable identity is implicit in the column header tmax with no CF standard name, cell methods, or unit annotation.
amadeusassertedpartial coverage
where thredds_dataset.xml long_name/standard_name/description + gridmet_tmmx.cf_metadata.json units
Amadeus carries a CF-style blob (long_name, units K), but standard_name is overloaded with the gridMET shortcode, not a real CF term. Conservative: partial.
cherassertedpartial coverage
where table_column_dictionary.column_tag=Value + column_unit_id (+ planned ontology tag)
C-HER tags a Value column with a unit and (planned) ontology tag, but carries no CF standard name / cell-methods identity.
codataassertedout_of_layer coverage
Variable identity is exactly the conceptual/represented layer CODATA EVs occupy, but as a conceptual framework it is excluded from instance-layer scoring.
Why it matters & mappings

Without a standard variable identity, "tmax" in one file and "TMAX" in another cannot be recognised as the same physical quantity, and unit mix-ups (Celsius vs Fahrenheit vs Kelvin) go undetected — pooling and cross-study comparison silently break.

Spatial Referencecorerequired

spatial_reference · range SpatialReference · cardinality 1

This block says where the number applies and how it was pulled out of a map. Environmental data usually comes as a grid of cells covering a region; this records how big those cells are and how the value for a specific place was picked from them.

Spatial reference object describing the native grid and extraction. Bound to SpatialReference (see envar_spatial). Readable rename of the profile's location anatomy slot.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where gaia_db location.geom EPSG:4326 / data_source.srid; meta_etl_*.json epsg / extent; data_source.spatial_coverage
Gaia carries CRS/SRID and dataset spatial coverage, but has no first-class native-resolution or extraction-method slot. Conservative: partial.
degaussassertedpartial coverage
where lat / lon columns on the geocoded CSV (implicit WGS84)
DeGAUSS carries coordinates but no explicit CRS, native resolution, or extraction method.
amadeusassertedpartial coverage
where thredds_dataset.xml coordinate_system=WGS84,EPSG:4326 + axis lat/lon increment + projectionBox/LatLonBox
Amadeus declares source-raster CRS and bbox and grid increment, but no extraction-method slot and resolution is only derivable. Conservative: partial.
cherassertedpartial coverage
where table_name spatial extent + spatial resolution codes (e.g. h08 / k05 / m30); column_tag Spatial-Primary
C-HER encodes spatial extent and organisation resolution in the table_name and tags spatial columns, but carries no per-value extraction method or CRS field. Conservative: partial.
codataassertedout_of_layer coverage
Extraction geometry is instance-layer; out of scope for CODATA's conceptual framework.
Why it matters & mappings

A value without its grid, coordinate system, and extraction method cannot be located or compared: a 1 km neighbourhood average and a ~31 km regional average look identical as numbers but describe very different exposures, and the extraction cannot be re-run without the method.

Mappings: msprofile:location

See also: https://epsg.io/

Temporal Referencecorerequired

temporal_reference · range TemporalReference · cardinality 1

This block explains the time ruler behind each value: how long a period each number summarises (a day, a month), how it was summarised (maximum, mean), and — surprisingly important — when a "day" is considered to start and end.

Temporal reference object describing resolution, aggregation, and day-boundary convention. Bound to TemporalReference (see envar_temporal). Readable rename of the profile's temporality anatomy slot.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where gaia_db variable_source.start_date/end_date; meta_dcat_*.json dct:temporal
Gaia carries the dataset time span but has no first-class temporal-resolution, aggregation-method, or day-boundary slot. Conservative: partial.
degaussassertedabsent coverage
Temporal resolution is implicit (one row per day); aggregation method and day boundary are absent.
amadeusassertedpartial coverage
where thredds_dataset.xml day axis (days since 1900-01-01, calendar=gregorian) + TimeSpan; long_name daily_maximum_temperature
Amadeus carries time-origin, calendar, and dataset span, and aggregation is encoded only in the long_name; day-boundary is pure ambiguity. Conservative: partial.
cherassertedpartial coverage
where table_name temporal extent (YYYYMMDDYYYYMMDD) + temporal resolution code; column_tag Temporal-Primary
C-HER encodes temporal extent and resolution in the table_name and tags temporal columns, but carries no aggregation-method or day-boundary-convention field. Conservative: partial.
codataassertedout_of_layer coverage
Temporal-aggregation semantics are instance-layer; out of scope for CODATA.
Why it matters & mappings

A "daily maximum" is ambiguous without the day-boundary convention: Daymet days end at local midnight while PRISM days end at 12:00 GMT, so the same calendar date can cover different physical hours — the most-omitted detail in the heat literature and a known source of cross-product disagreement.

Exposure Modelcorerequired

exposure_model · range ExposureModel · cardinality 1

Most exposure values are not direct readings from an instrument at someone's house — they are estimates computed from weather stations, satellites, or models. This block says which estimation method produced the numbers and what went into it.

The exposure-model object describing how values were produced. Bound to ExposureModel (see envar_model). Readable rename of the profile's methodology anatomy slot, narrowed to the model itself: other methodology-adjacent concerns (source dataset, tool run, provenance chain, derived heat metric) are surfaced as separate envar-extension slots.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where gaia_db data_source.measurement_technique + meta_dcat_*.json measurementTechnique (free-text)
Gaia carries a free-text method description but no structured exposure-model type or model-inputs list. Conservative: partial.
degaussassertedabsent coverage
DeGAUSS records no exposure-model type or model description.
amadeusassertedabsent coverage
Amadeus records no exposure-model type or model description.
cherassertedpartial coverage
where table_dictionary.data_level codes (dXX calculated / mXX modeled) + description/notes
C-HER's data_level codes signal that a resource is calculated or modeled, but do not carry a structured exposure-model type or inputs. Conservative: partial.
codataassertedout_of_layer coverage
Exposure-model identity is instance-layer; out of scope for CODATA.
Why it matters & mappings

The same quantity can be estimated by station interpolation, satellite retrieval, or model reanalysis, each with different inputs and biases; without the model description, values from different products get pooled as if equivalent and their systematic differences stay invisible.

Data Layoutcorerequired

data_layout · range DataLayout · cardinality 1

The actual numbers live in a separate data table that travels with this record. This block is the map between the two: it names which column holds the values, which holds the person identifier, which holds the date, and so on.

Data-layout object binding this sidecar to the columns of the companion data file — see envar_layout. Required: without it a consumer cannot locate the values the sidecar describes.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where external_exposure.person_id/value_as_number + gaia_db location.csv columns (implicit layout)
Gaia's OMOP/gaia-db tables have value/subject/time columns but no portable sidecar column-binding document. Conservative: partial.
degaussassertedpartial coverage
where geocoded CSV columns id / lat / lon / tmax / date (implicit layout)
DeGAUSS's CSV has value/subject/date columns but no portable sidecar layout describing them. Conservative: partial.
amadeusassertedpartial coverage
where gridmet_tmmx.csv columns person_loc_id / lat / lon / value_kelvin / value_celsius (implicit layout)
Amadeus's CSV has value/subject columns but no portable sidecar column-binding document. Conservative: partial.
cherassertedfull coverage
where table_column_dictionary (column_name, description, column_tag Index/Value/Temporal/Spatial, column_unit)
C-HER's column dictionary is a first-class, portable per-column layout with a role tag and unit for every column — the closest analogue to the sidecar's data-layout block.
codataassertedout_of_layer coverage
Companion-file column binding is instance/packaging-layer; out of scope for CODATA.
Why it matters & mappings

The sidecar describes values that live in a companion CSV/parquet file; without the column bindings a consumer cannot tell which column holds the values, subjects, or dates, so the metadata is unanchored and the data unusable — hence the slot is required.

Source Datasetcorerequired

source_dataset · range SourceDataset · cardinality 1

Exposure values are derived from a published data product (for example Daymet, a daily weather dataset). This block names that product precisely — including its version, citation, and license — so anyone can find it and check its documentation.

Source dataset object — see envar_source.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaverifiedfull coverage
where gaia_db data_source.dataset_name/dataset_version/license/creator/date_published + meta_dcat_*.json dct:title/dct:identifier(DOI)/dct:license
Gaia natively carries full dataset-level discovery metadata (name, version, DOI, license, publisher).
degaussassertedabsent coverage
DeGAUSS carries no dataset name, version, DOI, license, or publisher.
amadeusassertedabsent coverage
Amadeus carries no dataset-identity metadata (no name, DOI, license, publisher) natively.
cherassertedfull coverage
where table_dictionary (dataset, doi, rights, resource_type/format, contributors) + version + source_update_frequency
C-HER's table_dictionary and its foreign-key vocabularies identify the source dataset first-class (dataset, rights, DOI, contributors, version).
codataassertedout_of_layer coverage
Dataset identity/discovery is catalogue-layer; CODATA operates at the conceptual variable layer and is out of scope for scoring.
Why it matters & mappings

Without the upstream product's identity, version, DOI, and license, the record cannot be cited, its documented biases cannot be looked up, and reuse terms are unknown — and two records built from different product versions cannot be told apart.

Tool Runcorerequired

tool_run · range ToolRun · cardinality 1

This block is the receipt for the software step that produced the values: which program ran, which exact version, with what settings, and when. With it, someone else can re-run the same step and get the same numbers.

The current ToolRun — see envar_toolrun.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where gaia_db data_source.created_at/updated_at (load time); spatial_join_log.txt (SQL functions)
Gaia carries per-row load times and a join log, but no tool name/version, container digest, run args, or hashes. Conservative: partial.
degaussassertedpartial coverage
where output filename tool name + container image tag (e.g. daymet_1.0.0); ghcr.io/degauss-org/... reference
DeGAUSS pins tool name and version via the filename/container tag, but no digest, run args, timestamp, or hashes. Conservative: partial.
amadeusassertedpartial coverage
where thredds_response_headers.json HTTP Date header (run timestamp only)
Amadeus records only the HTTP Date header; no tool name/version, container, run args, or hashes natively. Conservative: partial.
cherassertedpartial coverage
where table_dictionary.metadata_created_at/updated_at + uploaded_by + version
C-HER records registration time, uploader, and version, but no per-run producing-tool name/version, container digest, args, or hashes. Conservative: partial.
codataassertedout_of_layer coverage
Tool-run provenance is instance-layer; out of scope for CODATA.
Why it matters & mappings

Without the exact tool name, version, container image, parameters, and timestamp, the record cannot be re-run: "we used the daymet tool" is not reproducible, but a pinned container invocation is.

Linkage Methodcorerequired

linkage_method · range LinkageMethod · cardinality 1

Environmental data describes places, but health research is about people. This block records how the value for a place was attached to a particular person — for example, by looking up the map cell containing their home address — since that step involves real choices that affect the result.

Linkage-method object — see envar_linkage.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where working.spatial_join_exposure (st_within with hard-coded buffer), captured in gaia_db/spatial_join_log.txt
Gaia's linkage lives in the SQL-join semantics and its NOTICE log, not as a documented linkage-strategy column. Conservative: partial.
degaussverifiedfull coverage
where geocoded CSV columns score, precision, geocode_result, matched_street/zip/city/state
DeGAUSS's linkage event (geocoding precision, match score, result flag, matched address) is first-class per row.
amadeusassertedabsent coverage
Amadeus collapses the address to lat/lon at the THREDDS request and records no linkage/geocoding quality.
cherassertedpartial coverage
where table_column_dictionary reference_column_id + column_tag Foreign Reference / Spatial-Primary (cross-table join descriptors)
C-HER models cross-table join references and spatial-column tags, but no patient-to-place linkage-strategy field. Conservative: partial.
codataassertedout_of_layer coverage
Patient-to-place linkage is instance-layer; out of scope for CODATA.
Why it matters & mappings

Attaching a place-based value to a person is a lossy, choice-laden step (geocoding, point vs buffer extraction, date alignment) — the "linkage descriptor" gap the GECC/EIRENE forum names as central. Without it, two studies using the same data product can differ solely through undocumented joins.

Schema Versioncorerequired

schema_version · range String · cardinality 1

Schemas change over time, like editions of a paper form. This is the edition number stamped on the document, so anyone reading it knows exactly which version of the form was filled in and can interpret the fields accordingly.

The version of the EnVar micro-schema this document conforms to. Required on every sidecar so downstream consumers can branch on schema evolution.

Example

0.1

Covered by — 5 standards
omop_gaiaassertedabsent coverage
No native gaia output carries a sidecar schema-version field; this is an EnVar-sidecar-level construct.
degaussassertedabsent coverage
DeGAUSS produces no metadata sidecar and carries no schema-version field.
amadeusassertedabsent coverage
Amadeus's native metadata carries no sidecar schema-version field.
cherassertedabsent coverage
C-HER's version code versions the data resource, not a metadata sidecar schema, so no EnVar-style schema-version field exists.
codataassertedout_of_layer coverage
Sidecar schema versioning is packaging-layer; out of scope for CODATA's conceptual framework.
Why it matters & mappings

Downstream consumers must branch on schema evolution: a parser built for one version will silently misread or wrongly reject sidecars written against another. Without this slot there is no way to tell which iteration of the schema a document targets.

Record Identifiercorerequired

provenance_id · range String · cardinality 1

A unique serial number for this metadata document, like the tracking number on a parcel. Wherever the data value ends up, that number lets you look up exactly where it came from and how it was made.

Stable identifier for this sidecar / record (ULID recommended). This is the value the downstream health-data layer's source-value field carries to link a row back to its provenance (for OMOP, that field is external_exposure.exposure_source_value).

Example

01HFA7K8R3M6XP-daymet-depositULID-based sidecar identifier for the Daymet Tmax deposit

Covered by — 5 standards
omop_gaiaassertedpartial coverage
where external_exposure.exposure_source_value (empty slot that could carry a provenance id) + gaia_db data_source id
The OMOP source-value field exists as the natural carrier, but gaia populates no per-sidecar stable record id into it. Conservative: partial.
degaussassertedabsent coverage
DeGAUSS produces no sidecar and no stable per-record provenance id.
amadeusassertedabsent coverage
Amadeus produces no stable per-record provenance id; only file hashes for citation.
cherassertedpartial coverage
where table_name reproducible resource identifier (org_dataset_..._version) + osti_id / ornl_res_pub_id
C-HER assigns each resource a reproducible identifier, but it names the dataset resource, not an EnVar sidecar that a health layer's source-value field carries. Conservative: partial.
codataassertedout_of_layer coverage
A per-sidecar provenance id is packaging-layer; out of scope for CODATA.
Why it matters & mappings

This identifier is what the downstream health-data layer's source-value field carries (for OMOP, external_exposure.exposure_source_value); it is the only hook that links an exposure value in the health layer back to its full spatial, temporal, and model provenance. Omit it and the value becomes untraceable — its metadata can never be recovered.

PHI Statuscorerequired

phi_status · range PhiStatusEnum · cardinality 1

PHI (protected health information) means private medical details about an identifiable person. This flag is a written promise on the document saying "no private patient information inside", so it can be passed around and published safely.

Whether the sidecar carries any Protected Health Information. A record-level safety assertion; by design, sidecars are PHI-free.

Example

no_phi

Allowed values

no_phi The sidecar carries no PHI aggregated_no_phi The sidecar carries aggregated values with no PHI phi_present The sidecar carries PHI
Covered by — 5 standards
omop_gaiaassertedabsent coverage
Gaia carries PHI in OMOP person/location tables but emits no per-record PHI-free assertion flag on its metadata.
degaussassertedabsent coverage
DeGAUSS's privacy-preserving design keeps PHI on-site, but it emits no per-record PHI-status assertion flag.
amadeusassertedabsent coverage
Amadeus handles no PHI and emits no per-record PHI-status flag.
cherassertedpartial coverage
where PostgreSQL schemas private / embargo (access-tier separation) + rights FK
C-HER separates private/embargoed resources into dedicated schemas and records rights, but has no per-record PHI-status assertion flag. Conservative: partial.
codataassertedout_of_layer coverage
Per-record PHI assertion is packaging/governance-layer; out of scope for CODATA.
Why it matters & mappings

Sidecars are designed to be PHI-free, and this slot is the explicit machine-readable assertion of that. Without it, every sharing, deposit, or export step must treat the document as potentially containing patient data and re-review it manually before it can leave a protected environment.

Conditionally core Required in specific contexts 1 field
Derived Heat Metricconditionally corerequired

derived_heat_metric · range DerivedHeatMetric · cardinality 1

Some heat measures are not read from a thermometer but calculated from several ingredients (temperature, humidity, wind, sunshine) using a chosen formula. This block records which formula and ingredients were used — it is only needed when the variable is one of these computed heat metrics.

Heat-metric methodology, present when the variable is a derived heat metric — see envar_heat_metric. Omitted for non-heat variables.

Example

Noneillustrative outdoor-WBGT methodology block — not part of the tmax scenario, where this slot is omitted

Why it matters & mappings

Heat metrics like WBGT or Heat Index can be computed by several non-equivalent equations from different inputs, and heat-wave flags depend on the threshold definition; the heat-epidemiology literature flags these choices as the main sources of cross-study disagreement, so omitting the block for a heat metric makes the record uncomparable.

Recommended Strongly encouraged 3 fields
Optional Include when available 1 field
FAIR Deposit Metadataoptional

deposit_metadata · range DepositMetadata · cardinality 0..1

If this record and its data are published in a public archive (such as Zenodo), this block holds the publication details: the permanent DOI link, where it lives, and the license saying how others may use it.

FAIR-deposit metadata, present when the sidecar is intended to travel with a published deposit — see envar_health_layer.

Example

Noneabridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance

Why it matters & mappings

When the sidecar travels with a published deposit, the DOI, repository, and license are what make the object findable, citable, and legally reusable — omitting them strands a public artifact without citation or reuse terms. Optional because most records are never deposited.

Full field reference — every slot, cardinality & inheritance
Field Name Tier Cardinality / Range Description
Subject (Patient or Cohort) subject core 1
String
The patient or cohort the exposure value is attached to
Variable Identity variable_identity core 1
VariableIdentity
The variable identity object — what physical quantity is being captured
Spatial Reference spatial_reference core 1
SpatialReference
Spatial reference object describing the native grid and extraction
Temporal Reference temporal_reference core 1
TemporalReference
Temporal reference object describing resolution, aggregation, and day-boundar...
Exposure Model exposure_model core 1
ExposureModel
The exposure-model object describing how values were produced
Uncertainty uncertainty recommended 0..1
Uncertainty
Uncertainty object — see envar_uncertainty
Derived Heat Metric derived_heat_metric conditionally core 1
DerivedHeatMetric
Heat-metric methodology, present when the variable is a derived heat metric —...
Data Layout data_layout core 1
DataLayout
Data-layout object binding this sidecar to the columns of the companion data ...
Source Dataset source_dataset core 1
SourceDataset
Source dataset object — see envar_source
Tool Run tool_run core 1
ToolRun
The current ToolRun — see envar_toolrun
Provenance Chain provenance_chain recommended 0..1
ProvenanceChain
Ordered W3C-PROV-style chain of upstream tool runs — see envar_toolrun
Linkage Method linkage_method core 1
LinkageMethod
Linkage-method object — see envar_linkage
Health-Layer Linkage health_layer_linkage recommended 0..1
HealthLayerLinkage
Downstream health-data-layer linkage hooks (OMOP, BDC, …) — see envar_health_...
FAIR Deposit Metadata deposit_metadata optional 0..1
DepositMetadata
FAIR-deposit metadata, present when the sidecar is intended to travel with a ...
Schema Version schema_version core 1
String
The version of the EnVar micro-schema this document conforms to
Record Identifier provenance_id core 1
String
Stable identifier for this sidecar / record (ULID recommended)
PHI Status phi_status core 1
PhiStatusEnum
Whether the sidecar carries any Protected Health Information
Conditional rules on this class
Rule Applied Preconditions Postconditions
slot_conditions {'derived_heat_metric': {'value_presence': 'PRESENT'}} {'derived_heat_metric': {'any_of': [{'range': 'DerivedHeatMetric'}]}}
Diagram & LinkML source
 classDiagram
    class ExtremeHeatDayFlagRecord
    click ExtremeHeatDayFlagRecord href "../../classes/ExtremeHeatDayFlagRecord/"
      EnvironmentalExposureRecord <|-- ExtremeHeatDayFlagRecord
        click EnvironmentalExposureRecord href "../../classes/EnvironmentalExposureRecord/"

      ExtremeHeatDayFlagRecord : data_layout





        ExtremeHeatDayFlagRecord --> "1" DataLayout : data_layout
        click DataLayout href "../../classes/DataLayout/"



      ExtremeHeatDayFlagRecord : deposit_metadata





        ExtremeHeatDayFlagRecord --> "0..1" DepositMetadata : deposit_metadata
        click DepositMetadata href "../../classes/DepositMetadata/"



      ExtremeHeatDayFlagRecord : derived_heat_metric





        ExtremeHeatDayFlagRecord --> "1" DerivedHeatMetric : derived_heat_metric
        click DerivedHeatMetric href "../../classes/DerivedHeatMetric/"



      ExtremeHeatDayFlagRecord : exposure_model





        ExtremeHeatDayFlagRecord --> "1" ExposureModel : exposure_model
        click ExposureModel href "../../classes/ExposureModel/"



      ExtremeHeatDayFlagRecord : health_layer_linkage





        ExtremeHeatDayFlagRecord --> "0..1" HealthLayerLinkage : health_layer_linkage
        click HealthLayerLinkage href "../../classes/HealthLayerLinkage/"



      ExtremeHeatDayFlagRecord : linkage_method





        ExtremeHeatDayFlagRecord --> "1" LinkageMethod : linkage_method
        click LinkageMethod href "../../classes/LinkageMethod/"



      ExtremeHeatDayFlagRecord : phi_status





        ExtremeHeatDayFlagRecord --> "1" PhiStatusEnum : phi_status
        click PhiStatusEnum href "../../enums/PhiStatusEnum/"



      ExtremeHeatDayFlagRecord : provenance_chain





        ExtremeHeatDayFlagRecord --> "0..1" ProvenanceChain : provenance_chain
        click ProvenanceChain href "../../classes/ProvenanceChain/"



      ExtremeHeatDayFlagRecord : provenance_id

      ExtremeHeatDayFlagRecord : schema_version

      ExtremeHeatDayFlagRecord : source_dataset





        ExtremeHeatDayFlagRecord --> "1" SourceDataset : source_dataset
        click SourceDataset href "../../classes/SourceDataset/"



      ExtremeHeatDayFlagRecord : spatial_reference





        ExtremeHeatDayFlagRecord --> "1" SpatialReference : spatial_reference
        click SpatialReference href "../../classes/SpatialReference/"



      ExtremeHeatDayFlagRecord : subject

      ExtremeHeatDayFlagRecord : temporal_reference





        ExtremeHeatDayFlagRecord --> "1" TemporalReference : temporal_reference
        click TemporalReference href "../../classes/TemporalReference/"



      ExtremeHeatDayFlagRecord : tool_run





        ExtremeHeatDayFlagRecord --> "1" ToolRun : tool_run
        click ToolRun href "../../classes/ToolRun/"



      ExtremeHeatDayFlagRecord : uncertainty





        ExtremeHeatDayFlagRecord --> "0..1" Uncertainty : uncertainty
        click Uncertainty href "../../classes/Uncertainty/"



      ExtremeHeatDayFlagRecord : variable_identity





        ExtremeHeatDayFlagRecord --> "1" VariableIdentity : variable_identity
        click VariableIdentity href "../../classes/VariableIdentity/"



name: ExtremeHeatDayFlagRecord
description: Canonical record for a daily binary extreme-heat-day flag, defined against
  a local 95th-percentile Tmax baseline. Pins `heat_metric_family = heat_wave_flag`,
  `value_data_type = binary_flag`, and requires the percentile-reference-period slots
  in DerivedHeatMetric to be populated.
title: Extreme-Heat-Day Flag Record
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
is_a: EnvironmentalExposureRecord
slot_usage:
  derived_heat_metric:
    name: derived_heat_metric
    required: true
attributes:
  subject:
    name: subject
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: An exposure value is meaningless without knowing whose exposure it
          is. The opaque handle is what lets the sidecar be joined back to the right
          cohort or patient in the health-data layer while staying PHI-free.
      explanation:
        tag: explanation
        value: Who (or what group) the values belong to — a study cohort or an individual
          patient, named by an anonymous code rather than anything identifying.
      open_question:
        tag: open_question
        value: '`subject` is the only field in this group that is not a per-value
          predicate: every other field explains an individual value, but a single
          scalar subject is dataset-scoped and cannot distribute over the sidecar''s
          rows (per-row subject identity lives in `subject_column`). Under review
           should it be dropped, or demoted to a dataset-level cohort handle? Feedback
          welcome.'
    description: The patient or cohort the exposure value is attached to. Carried
      as an opaque identifier; PHI must not appear here.
    title: Subject (Patient or Cohort)
    examples:
    - value: cohort:phoenix_aki_2022
      description: an opaque cohort handle — no PHI
    from_schema: https://w3id.org/linkml/microschemas/envar
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    - MicroschemaDefinition
    slot_group: exposure_description
    range: string
    required: true
  variable_identity:
    name: variable_identity
    implements:
    - msprofile:observation_type
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: Without a standard variable identity, "tmax" in one file and "TMAX"
          in another cannot be recognised as the same physical quantity, and unit
          mix-ups (Celsius vs Fahrenheit vs Kelvin) go undetected — pooling and cross-study
          comparison silently break.
      explanation:
        tag: explanation
        value: This block pins down exactly what was measured. Instead of relying
          on a nickname like "tmax", it uses shared vocabularies to say "daily maximum
          air temperature, in degrees Celsius", so any tool or researcher reads it
          the same way.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gaia_db variable_source.variable_name/variable_description
                  + JSON-LD variableMeasured.propertyID (NERC air_temperature); unit_concept_id
                  8653
              note:
                tag: note
                value: 'Gaia carries variable name, description, unit, and a CF-mirror
                  propertyID, but CF cell_methods has no slot. Conservative: partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Variable identity is implicit in the column header tmax with
                  no CF standard name, cell methods, or unit annotation.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: thredds_dataset.xml long_name/standard_name/description + gridmet_tmmx.cf_metadata.json
                  units
              note:
                tag: note
                value: 'Amadeus carries a CF-style blob (long_name, units K), but
                  standard_name is overloaded with the gridMET shortcode, not a real
                  CF term. Conservative: partial.'
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_column_dictionary.column_tag=Value + column_unit_id (+
                  planned ontology tag)
              note:
                tag: note
                value: C-HER tags a Value column with a unit and (planned) ontology
                  tag, but carries no CF standard name / cell-methods identity.
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Variable identity is exactly the conceptual/represented layer
                  CODATA EVs occupy, but as a conceptual framework it is excluded
                  from instance-layer scoring.
    description: The variable identity object — what physical quantity is being captured.
      Bound to VariableIdentity (see envar_variable). Readable rename of the profile's
      `observation_type` anatomy slot.
    title: Variable Identity
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        variable_name: tmax
        standard_name: CF:air_temperature
        cf_cell_methods: 'time: maximum'
        units_ucum: Cel
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://cfconventions.org/
    - https://ucum.org/
    aliases:
    - observation_type
    exact_mappings:
    - msprofile:observation_type
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: exposure_description
    range: VariableIdentity
    required: true
    inlined: true
  spatial_reference:
    name: spatial_reference
    implements:
    - msprofile:location
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: 'A value without its grid, coordinate system, and extraction method
          cannot be located or compared: a 1 km neighbourhood average and a ~31 km
          regional average look identical as numbers but describe very different exposures,
          and the extraction cannot be re-run without the method.'
      explanation:
        tag: explanation
        value: This block says where the number applies and how it was pulled out
          of a map. Environmental data usually comes as a grid of cells covering a
          region; this records how big those cells are and how the value for a specific
          place was picked from them.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gaia_db location.geom EPSG:4326 / data_source.srid; meta_etl_*.json
                  epsg / extent; data_source.spatial_coverage
              note:
                tag: note
                value: 'Gaia carries CRS/SRID and dataset spatial coverage, but has
                  no first-class native-resolution or extraction-method slot. Conservative:
                  partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: lat / lon columns on the geocoded CSV (implicit WGS84)
              note:
                tag: note
                value: DeGAUSS carries coordinates but no explicit CRS, native resolution,
                  or extraction method.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: thredds_dataset.xml coordinate_system=WGS84,EPSG:4326 + axis
                  lat/lon increment + projectionBox/LatLonBox
              note:
                tag: note
                value: 'Amadeus declares source-raster CRS and bbox and grid increment,
                  but no extraction-method slot and resolution is only derivable.
                  Conservative: partial.'
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_name spatial extent + spatial resolution codes (e.g.
                  h08 / k05 / m30); column_tag Spatial-Primary
              note:
                tag: note
                value: 'C-HER encodes spatial extent and organisation resolution in
                  the table_name and tags spatial columns, but carries no per-value
                  extraction method or CRS field. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Extraction geometry is instance-layer; out of scope for CODATA's
                  conceptual framework.
    description: Spatial reference object describing the native grid and extraction.
      Bound to SpatialReference (see envar_spatial). Readable rename of the profile's
      `location` anatomy slot.
    title: Spatial Reference
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        native_spatial_resolution_m: 1000
        crs: EPSG:4326
        extraction_method: inverse_distance_weighted_4_nearest_cells
        target_geography_type: point_residence
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://epsg.io/
    aliases:
    - location
    exact_mappings:
    - msprofile:location
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: exposure_description
    range: SpatialReference
    required: true
    inlined: true
  temporal_reference:
    name: temporal_reference
    implements:
    - msprofile:temporality
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: 'A "daily maximum" is ambiguous without the day-boundary convention:
          Daymet days end at local midnight while PRISM days end at 12:00 GMT, so
          the same calendar date can cover different physical hours  the most-omitted
          detail in the heat literature and a known source of cross-product disagreement.'
      explanation:
        tag: explanation
        value: 'This block explains the time ruler behind each value: how long a period
          each number summarises (a day, a month), how it was summarised (maximum,
          mean), and  surprisingly important  when a "day" is considered to start
          and end.'
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gaia_db variable_source.start_date/end_date; meta_dcat_*.json
                  dct:temporal
              note:
                tag: note
                value: 'Gaia carries the dataset time span but has no first-class
                  temporal-resolution, aggregation-method, or day-boundary slot. Conservative:
                  partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Temporal resolution is implicit (one row per day); aggregation
                  method and day boundary are absent.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: thredds_dataset.xml day axis (days since 1900-01-01, calendar=gregorian)
                  + TimeSpan; long_name daily_maximum_temperature
              note:
                tag: note
                value: 'Amadeus carries time-origin, calendar, and dataset span, and
                  aggregation is encoded only in the long_name; day-boundary is pure
                  ambiguity. Conservative: partial.'
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_name temporal extent (YYYYMMDDYYYYMMDD) + temporal resolution
                  code; column_tag Temporal-Primary
              note:
                tag: note
                value: 'C-HER encodes temporal extent and resolution in the table_name
                  and tags temporal columns, but carries no aggregation-method or
                  day-boundary-convention field. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Temporal-aggregation semantics are instance-layer; out of scope
                  for CODATA.
    description: Temporal reference object describing resolution, aggregation, and
      day-boundary convention. Bound to TemporalReference (see envar_temporal). Readable
      rename of the profile's `temporality` anatomy slot.
    title: Temporal Reference
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        temporal_resolution: daily
        temporal_aggregation_method: maximum
        day_boundary_convention: local_midnight
        calendar: gregorian
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://cfconventions.org/
    aliases:
    - temporality
    exact_mappings:
    - msprofile:temporality
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: exposure_description
    range: TemporalReference
    required: true
    inlined: true
  exposure_model:
    name: exposure_model
    implements:
    - msprofile:methodology
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: The same quantity can be estimated by station interpolation, satellite
          retrieval, or model reanalysis, each with different inputs and biases; without
          the model description, values from different products get pooled as if equivalent
          and their systematic differences stay invisible.
      explanation:
        tag: explanation
        value: Most exposure values are not direct readings from an instrument at
          someone's house — they are estimates computed from weather stations, satellites,
          or models. This block says which estimation method produced the numbers
          and what went into it.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gaia_db data_source.measurement_technique + meta_dcat_*.json
                  measurementTechnique (free-text)
              note:
                tag: note
                value: 'Gaia carries a free-text method description but no structured
                  exposure-model type or model-inputs list. Conservative: partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS records no exposure-model type or model description.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus records no exposure-model type or model description.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_dictionary.data_level codes (dXX calculated / mXX modeled)
                  + description/notes
              note:
                tag: note
                value: 'C-HER''s data_level codes signal that a resource is calculated
                  or modeled, but do not carry a structured exposure-model type or
                  inputs. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Exposure-model identity is instance-layer; out of scope for
                  CODATA.
    description: 'The exposure-model object describing how values were produced. Bound
      to ExposureModel (see envar_model). Readable rename of the profile''s `methodology`
      anatomy slot, narrowed to the model itself: other methodology-adjacent concerns
      (source dataset, tool run, provenance chain, derived heat metric) are surfaced
      as separate envar-extension slots.'
    title: Exposure Model
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        exposure_model_type: spatial_interpolation
        exposure_model_inputs:
        - GHCN-Daily station observations
        exposure_model_paper_doi: 10.3334/ORNLDAAC/2129
        bias_correction_applied: none
    from_schema: https://w3id.org/linkml/microschemas/envar
    aliases:
    - methodology
    exact_mappings:
    - msprofile:methodology
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: exposure_description
    range: ExposureModel
    required: true
    inlined: true
  uncertainty:
    name: uncertainty
    annotations:
      tier:
        tag: tier
        value: recommended
      justification:
        tag: justification
        value: Exposure values are model estimates with error; without recorded per-value
          or aggregate uncertainty and missing-data handling, downstream analyses
          treat estimates as exact, and exposure-measurement error propagates invisibly
          into health-effect estimates.
      explanation:
        tag: explanation
        value: No estimate is perfect. This block says how far off the numbers might
          be and what was done about gaps in the data, so users know how much confidence
          to place in each value.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: No gaia output carries per-value or model-aggregate uncertainty
                  (per-value uncertainty is ❌ across all pipelines).
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS carries no uncertainty block.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus carries no uncertainty block; only a _FillValue sentinel.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: C-HER null taxonomy (structural/derived null) + data_level
                  QA codes (aXX/bXX)
              note:
                tag: note
                value: 'C-HER classifies null cells and encodes QA level, but carries
                  no per-value uncertainty or completeness percentage. Conservative:
                  partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Per-value uncertainty is instance-layer; out of scope for CODATA.
    description: Uncertainty object — see envar_uncertainty.
    title: Uncertainty
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        per_value_uncertainty_type: standard_error
        per_value_uncertainty_units_ucum: Cel
        missing_data_handling_method: spatiotemporal_interpolation
        data_completeness_pct: 100
    from_schema: https://w3id.org/linkml/microschemas/envar
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: exposure_description
    range: Uncertainty
    inlined: true
  derived_heat_metric:
    name: derived_heat_metric
    annotations:
      tier:
        tag: tier
        value: conditionally_core
      justification:
        tag: justification
        value: Heat metrics like WBGT or Heat Index can be computed by several non-equivalent
          equations from different inputs, and heat-wave flags depend on the threshold
          definition; the heat-epidemiology literature flags these choices as the
          main sources of cross-study disagreement, so omitting the block for a heat
          metric makes the record uncomparable.
      explanation:
        tag: explanation
        value: Some heat measures are not read from a thermometer but calculated from
          several ingredients (temperature, humidity, wind, sunshine) using a chosen
          formula. This block records which formula and ingredients were used — it
          is only needed when the variable is one of these computed heat metrics.
    description: Heat-metric methodology, present when the variable is a derived heat
      metric — see envar_heat_metric. Omitted for non-heat variables.
    title: Derived Heat Metric
    examples:
    - description: illustrative outdoor-WBGT methodology block — not part of the tmax
        scenario, where this slot is omitted
      object:
        heat_metric_family: wbgt_outdoor
        equation_variant: liljegren_2008
        indoor_outdoor: outdoor
        solar_radiation_basis: surface_downwelling_shortwave_flux
    from_schema: https://w3id.org/linkml/microschemas/envar
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: variable_specific_extensions
    range: DerivedHeatMetric
    required: true
    inlined: true
  data_layout:
    name: data_layout
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: The sidecar describes values that live in a companion CSV/parquet file;
          without the column bindings a consumer cannot tell which column holds the
          values, subjects, or dates, so the metadata is unanchored and the data unusable
          — hence the slot is required.
      explanation:
        tag: explanation
        value: 'The actual numbers live in a separate data table that travels with
          this record. This block is the map between the two: it names which column
          holds the values, which holds the person identifier, which holds the date,
          and so on.'
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: external_exposure.person_id/value_as_number + gaia_db location.csv
                  columns (implicit layout)
              note:
                tag: note
                value: 'Gaia''s OMOP/gaia-db tables have value/subject/time columns
                  but no portable sidecar column-binding document. Conservative: partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: geocoded CSV columns id / lat / lon / tmax / date (implicit
                  layout)
              note:
                tag: note
                value: 'DeGAUSS''s CSV has value/subject/date columns but no portable
                  sidecar layout describing them. Conservative: partial.'
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gridmet_tmmx.csv columns person_loc_id / lat / lon / value_kelvin
                  / value_celsius (implicit layout)
              note:
                tag: note
                value: 'Amadeus''s CSV has value/subject columns but no portable sidecar
                  column-binding document. Conservative: partial.'
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: full
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_column_dictionary (column_name, description, column_tag
                  Index/Value/Temporal/Spatial, column_unit)
              note:
                tag: note
                value: C-HER's column dictionary is a first-class, portable per-column
                  layout with a role tag and unit for every column — the closest analogue
                  to the sidecar's data-layout block.
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Companion-file column binding is instance/packaging-layer;
                  out of scope for CODATA.
    description: 'Data-layout object binding this sidecar to the columns of the companion
      data file  see envar_layout. Required: without it a consumer cannot locate
      the values the sidecar describes.'
    title: Data Layout
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        table_orientation: wide
        value_column: tmax
        subject_column: subject_id
        time_column: date
    from_schema: https://w3id.org/linkml/microschemas/envar
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: dataset_and_provenance
    range: DataLayout
    required: true
    inlined: true
  source_dataset:
    name: source_dataset
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: Without the upstream product's identity, version, DOI, and license,
          the record cannot be cited, its documented biases cannot be looked up, and
          reuse terms are unknown — and two records built from different product versions
          cannot be told apart.
      explanation:
        tag: explanation
        value: Exposure values are derived from a published data product (for example
          Daymet, a daily weather dataset). This block names that product precisely
          — including its version, citation, and license — so anyone can find it and
          check its documentation.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: full
              status:
                tag: status
                value: verified
              where:
                tag: where
                value: gaia_db data_source.dataset_name/dataset_version/license/creator/date_published
                  + meta_dcat_*.json dct:title/dct:identifier(DOI)/dct:license
              evidence:
                tag: evidence
                value: COMPARISON.md §I — dataset name ✅, version ✅, DOI ✅, license
                  ✅, publisher ✅, date published/modified ✅
              note:
                tag: note
                value: Gaia natively carries full dataset-level discovery metadata
                  (name, version, DOI, license, publisher).
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS carries no dataset name, version, DOI, license, or
                  publisher.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus carries no dataset-identity metadata (no name, DOI,
                  license, publisher) natively.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: full
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_dictionary (dataset, doi, rights, resource_type/format,
                  contributors) + version + source_update_frequency
              note:
                tag: note
                value: C-HER's table_dictionary and its foreign-key vocabularies identify
                  the source dataset first-class (dataset, rights, DOI, contributors,
                  version).
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Dataset identity/discovery is catalogue-layer; CODATA operates
                  at the conceptual variable layer and is out of scope for scoring.
    description: Source dataset object — see envar_source.
    title: Source Dataset
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        source_dataset_name: Daymet V4 Daily Surface Weather Data
        source_dataset_short_code: daymet_v4
        source_dataset_doi: 10.3334/ORNLDAAC/2129
        source_license_spdx: public-domain-us-gov
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://spdx.org/licenses/
    - https://www.doi.org/
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: dataset_and_provenance
    range: SourceDataset
    required: true
    inlined: true
  tool_run:
    name: tool_run
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: 'Without the exact tool name, version, container image, parameters,
          and timestamp, the record cannot be re-run: "we used the daymet tool" is
          not reproducible, but a pinned container invocation is.'
      explanation:
        tag: explanation
        value: 'This block is the receipt for the software step that produced the
          values: which program ran, which exact version, with what settings, and
          when. With it, someone else can re-run the same step and get the same numbers.'
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gaia_db data_source.created_at/updated_at (load time); spatial_join_log.txt
                  (SQL functions)
              note:
                tag: note
                value: 'Gaia carries per-row load times and a join log, but no tool
                  name/version, container digest, run args, or hashes. Conservative:
                  partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: output filename tool name + container image tag (e.g. daymet_1.0.0);
                  ghcr.io/degauss-org/... reference
              note:
                tag: note
                value: 'DeGAUSS pins tool name and version via the filename/container
                  tag, but no digest, run args, timestamp, or hashes. Conservative:
                  partial.'
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: thredds_response_headers.json HTTP Date header (run timestamp
                  only)
              note:
                tag: note
                value: 'Amadeus records only the HTTP Date header; no tool name/version,
                  container, run args, or hashes natively. Conservative: partial.'
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_dictionary.metadata_created_at/updated_at + uploaded_by
                  + version
              note:
                tag: note
                value: 'C-HER records registration time, uploader, and version, but
                  no per-run producing-tool name/version, container digest, args,
                  or hashes. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Tool-run provenance is instance-layer; out of scope for CODATA.
    description: The current ToolRun — see envar_toolrun.
    title: Tool Run
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        tool_name: daymet
        tool_version: 1.0.0
        container_image_repository: ghcr.io/degauss-org/daymet
        run_timestamp_utc: '2026-05-23T14:18:42Z'
    from_schema: https://w3id.org/linkml/microschemas/envar
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: dataset_and_provenance
    range: ToolRun
    required: true
    inlined: true
  provenance_chain:
    name: provenance_chain
    annotations:
      tier:
        tag: tier
        value: recommended
      justification:
        tag: justification
        value: The final tool run is rarely the whole story — downloads, geocoding,
          and intermediate transforms precede it; without the ordered chain back to
          the raw source, end-to-end reproduction and error tracing are impossible
          even when the last step is pinned.
      explanation:
        tag: explanation
        value: Data usually passes through several tools before the final value appears
          — download, geocode, extract. This block lists those earlier steps in order,
          like a chain of custody reaching back to the original raw source.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: gaia_catalog/meta_etl_*.json (ETL recipe) + gaia_db/spatial_join_log.txt
              note:
                tag: note
                value: 'Gaia''s ETL descriptor plus join log capture upstream steps
                  but not as an ordered per-run W3C-PROV chain. Conservative: partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS emits no ordered upstream-run chain.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus emits no ordered upstream-run chain.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: dataset_lineage (parent-child links) + lineage_notes
              note:
                tag: note
                value: 'C-HER''s dataset_lineage links parent and child resources,
                  but is a dataset-lineage graph, not an ordered per-run W3C-PROV
                  chain. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Ordered tool-run provenance is instance-layer; out of scope
                  for CODATA.
    description: 'Ordered W3C-PROV-style chain of upstream tool runs  see envar_toolrun.
      Recommended (not required): a record is reproducible in principle without the
      full chain, but real reproduction needs it.'
    title: Provenance Chain
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        provenance_chain_terminus_type: raw_source_download
        provenance_chain_steps:
        - tool_name: geocoder
          tool_version: 3.3.0
          run_timestamp_utc: '2026-05-23T14:02:11Z'
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://www.w3.org/TR/prov-o/
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: dataset_and_provenance
    range: ProvenanceChain
    inlined: true
  linkage_method:
    name: linkage_method
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: Attaching a place-based value to a person is a lossy, choice-laden
          step (geocoding, point vs buffer extraction, date alignment) — the "linkage
          descriptor" gap the GECC/EIRENE forum names as central. Without it, two
          studies using the same data product can differ solely through undocumented
          joins.
      explanation:
        tag: explanation
        value: Environmental data describes places, but health research is about people.
          This block records how the value for a place was attached to a particular
          person — for example, by looking up the map cell containing their home address
          — since that step involves real choices that affect the result.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: working.spatial_join_exposure (st_within with hard-coded buffer),
                  captured in gaia_db/spatial_join_log.txt
              note:
                tag: note
                value: 'Gaia''s linkage lives in the SQL-join semantics and its NOTICE
                  log, not as a documented linkage-strategy column. Conservative:
                  partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: full
              status:
                tag: status
                value: verified
              where:
                tag: where
                value: geocoded CSV columns score, precision, geocode_result, matched_street/zip/city/state
              evidence:
                tag: evidence
                value: COMPARISON.md §B — geocoder match score ✅, precision ✅, geocode-result
                  flag ✅ on every row
              note:
                tag: note
                value: DeGAUSS's linkage event (geocoding precision, match score,
                  result flag, matched address) is first-class per row.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus collapses the address to lat/lon at the THREDDS request
                  and records no linkage/geocoding quality.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_column_dictionary reference_column_id + column_tag Foreign
                  Reference / Spatial-Primary (cross-table join descriptors)
              note:
                tag: note
                value: 'C-HER models cross-table join references and spatial-column
                  tags, but no patient-to-place linkage-strategy field. Conservative:
                  partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Patient-to-place linkage is instance-layer; out of scope for
                  CODATA.
    description: Linkage-method object — see envar_linkage.
    title: Linkage Method
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        linkage_strategy: point_extraction_at_residence
        address_period_alignment: address_history_from_emr
        clinical_date_assignment_convention: local_midnight
        lag_alignment_applied: none
    from_schema: https://w3id.org/linkml/microschemas/envar
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: health_data_integration
    range: LinkageMethod
    required: true
    inlined: true
  health_layer_linkage:
    name: health_layer_linkage
    annotations:
      tier:
        tag: tier
        value: recommended
      justification:
        tag: justification
        value: Naming the downstream health-data layer (OMOP, BDC, …) and the join
          field makes the exposure record findable from the clinical side; without
          it the sidecar and the health records it serves drift apart, and the link
          must be reconstructed by hand.
      explanation:
        tag: explanation
        value: Health studies keep patient data in large standard databases. This
          block notes which of those systems the exposure values were wired into and
          through which field, so someone browsing the health data can find their
          way back to this record.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: external_exposure.exposure_source_value / exposure_concept_id
                  + external_exposure.person_id
              note:
                tag: note
                value: 'Gaia lands values in OMOP external_exposure with a person
                  link and a source-value hook, but names no explicit sidecar provenance-id
                  join field. Conservative: partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS appends geomarker columns to the cohort CSV but names
                  no downstream health-layer target or join field.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus emits a data CSV with no downstream health-layer target
                  or join field.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: PostgreSQL schema=health + table_column_dictionary.reference_column_id
                  (cross-table join to health resources)
              note:
                tag: note
                value: 'C-HER has a health schema and cross-table reference columns,
                  but no sidecar-to-health-layer link-field declaration. Conservative:
                  partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Health-layer linkage hooks are instance/integration-layer;
                  out of scope for CODATA.
    description: 'Downstream health-data-layer linkage hooks (OMOP, BDC, …)  see
      envar_health_layer. Optional: its members are Recommended/Optional, and the
      Core PHI assertion lives at the record root (`phi_status`).'
    title: Health-Layer Linkage
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        health_layer_target: omop_external_exposure
        health_layer_link_field: exposure_source_value
        cohort_size_anchored: 3
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://ohdsi.github.io/CommonDataModel/
    - https://biodatacatalyst.nhlbi.nih.gov/
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: health_data_integration
    range: HealthLayerLinkage
    inlined: true
  deposit_metadata:
    name: deposit_metadata
    annotations:
      tier:
        tag: tier
        value: optional
      justification:
        tag: justification
        value: When the sidecar travels with a published deposit, the DOI, repository,
          and license are what make the object findable, citable, and legally reusable
          — omitting them strands a public artifact without citation or reuse terms.
          Optional because most records are never deposited.
      explanation:
        tag: explanation
        value: 'If this record and its data are published in a public archive (such
          as Zenodo), this block holds the publication details: the permanent DOI
          link, where it lives, and the license saying how others may use it.'
    description: FAIR-deposit metadata, present when the sidecar is intended to travel
      with a published deposit — see envar_health_layer.
    title: FAIR Deposit Metadata
    examples:
    - description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
        for a full instance
      object:
        deposit_doi: 10.5281/zenodo.9999999
        deposit_repository: zenodo
        deposit_license_spdx: CC-BY-4.0
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://www.go-fair.org/fair-principles/
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: health_data_integration
    range: DepositMetadata
    inlined: true
  schema_version:
    name: schema_version
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: 'Downstream consumers must branch on schema evolution: a parser built
          for one version will silently misread or wrongly reject sidecars written
          against another. Without this slot there is no way to tell which iteration
          of the schema a document targets.'
      explanation:
        tag: explanation
        value: Schemas change over time, like editions of a paper form. This is the
          edition number stamped on the document, so anyone reading it knows exactly
          which version of the form was filled in and can interpret the fields accordingly.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: No native gaia output carries a sidecar schema-version field;
                  this is an EnVar-sidecar-level construct.
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS produces no metadata sidecar and carries no schema-version
                  field.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus's native metadata carries no sidecar schema-version
                  field.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: C-HER's version code versions the data resource, not a metadata
                  sidecar schema, so no EnVar-style schema-version field exists.
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Sidecar schema versioning is packaging-layer; out of scope
                  for CODATA's conceptual framework.
    description: The version of the EnVar micro-schema this document conforms to.
      Required on every sidecar so downstream consumers can branch on schema evolution.
    title: Schema Version
    examples:
    - value: '0.1'
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://semver.org/
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: record_bookkeeping
    range: string
    required: true
  provenance_id:
    name: provenance_id
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: This identifier is what the downstream health-data layer's source-value
          field carries (for OMOP, `external_exposure.exposure_source_value`); it
          is the only hook that links an exposure value in the health layer back to
          its full spatial, temporal, and model provenance. Omit it and the value
          becomes untraceable — its metadata can never be recovered.
      explanation:
        tag: explanation
        value: A unique serial number for this metadata document, like the tracking
          number on a parcel. Wherever the data value ends up, that number lets you
          look up exactly where it came from and how it was made.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: external_exposure.exposure_source_value (empty slot that could
                  carry a provenance id) + gaia_db data_source id
              note:
                tag: note
                value: 'The OMOP source-value field exists as the natural carrier,
                  but gaia populates no per-sidecar stable record id into it. Conservative:
                  partial.'
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS produces no sidecar and no stable per-record provenance
                  id.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus produces no stable per-record provenance id; only file
                  hashes for citation.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: table_name reproducible resource identifier (org_dataset_..._version)
                  + osti_id / ornl_res_pub_id
              note:
                tag: note
                value: 'C-HER assigns each resource a reproducible identifier, but
                  it names the dataset resource, not an EnVar sidecar that a health
                  layer''s source-value field carries. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: A per-sidecar provenance id is packaging-layer; out of scope
                  for CODATA.
    description: Stable identifier for this sidecar / record (ULID recommended). This
      is the value the downstream health-data layer's source-value field carries to
      link a row back to its provenance (for OMOP, that field is `external_exposure.exposure_source_value`).
    title: Record Identifier
    examples:
    - value: 01HFA7K8R3M6XP-daymet-deposit
      description: ULID-based sidecar identifier for the Daymet Tmax deposit
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://github.com/ulid/spec
    - https://ohdsi.github.io/CommonDataModel/
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: record_bookkeeping
    range: string
    required: true
  phi_status:
    name: phi_status
    annotations:
      tier:
        tag: tier
        value: core
      justification:
        tag: justification
        value: Sidecars are designed to be PHI-free, and this slot is the explicit
          machine-readable assertion of that. Without it, every sharing, deposit,
          or export step must treat the document as potentially containing patient
          data and re-review it manually before it can leave a protected environment.
      explanation:
        tag: explanation
        value: PHI (protected health information) means private medical details about
          an identifiable person. This flag is a written promise on the document saying
          "no private patient information inside", so it can be passed around and
          published safely.
      covered_by:
        tag: covered_by
        annotations:
          omop_gaia:
            tag: omop_gaia
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Gaia carries PHI in OMOP person/location tables but emits no
                  per-record PHI-free assertion flag on its metadata.
          degauss:
            tag: degauss
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: DeGAUSS's privacy-preserving design keeps PHI on-site, but
                  it emits no per-record PHI-status assertion flag.
          amadeus:
            tag: amadeus
            annotations:
              extent:
                tag: extent
                value: absent
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Amadeus handles no PHI and emits no per-record PHI-status flag.
          cher:
            tag: cher
            annotations:
              extent:
                tag: extent
                value: partial
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: PostgreSQL schemas private / embargo (access-tier separation)
                  + rights FK
              note:
                tag: note
                value: 'C-HER separates private/embargoed resources into dedicated
                  schemas and records rights, but has no per-record PHI-status assertion
                  flag. Conservative: partial.'
          codata:
            tag: codata
            annotations:
              extent:
                tag: extent
                value: out_of_layer
              status:
                tag: status
                value: asserted
              where:
                tag: where
                value: no column
              note:
                tag: note
                value: Per-record PHI assertion is packaging/governance-layer; out
                  of scope for CODATA.
    description: Whether the sidecar carries any Protected Health Information. A record-level
      safety assertion; by design, sidecars are PHI-free.
    title: PHI Status
    examples:
    - value: no_phi
    from_schema: https://w3id.org/linkml/microschemas/envar
    see_also:
    - https://www.hhs.gov/hipaa/for-professionals/privacy/index.html
    rank: 1000
    owner: ExtremeHeatDayFlagRecord
    domain_of:
    - EnvironmentalExposureRecord
    slot_group: record_bookkeeping
    range: PhiStatusEnum
    required: true
rules:
- preconditions:
    slot_conditions:
      derived_heat_metric:
        name: derived_heat_metric
        value_presence: PRESENT
  postconditions:
    slot_conditions:
      derived_heat_metric:
        name: derived_heat_metric
        any_of:
        - range: DerivedHeatMetric
  description: The DerivedHeatMetric inner object must pin heat_metric_family = heat_wave_flag,
    heat_wave_threshold_definition = percentile_local, and supply percentile_reference_period_start
    / _end and percentile_reference_geographic_scope.

Identifier and Mapping Information

Schema Source

Mappings

Mapping Type Mapped Value
self envar:ExtremeHeatDayFlagRecord
native envar:ExtremeHeatDayFlagRecord