# description
One characterization observation of an FFF polymer material: a settings card, a measured specimen, or a moisture response. Unknown = absent/null, never invented; vendor claims are recorded as published and are not verified. Equipment, environment, measurement method and external artifacts are out of scope for this record and are carried by the Applied-System Addendum sidecars at https://open3dpp.org/schemas/addendum/v0.1.0/ , which reference a core record via core_record_ref. A core record is complete without a sidecar and carries no back-link to one. VALIDATION POLICY: this schema is version-exact — it pins schema_version by const and is closed to unknown properties, so validate each record against the schema matching its own schema_version.

# properties.record_id.description
[identity] Our stable row id (uuid5 over the record's natural key).

# properties.material_uuid.description
[identity] OpenPrintTag: deducible from brand_uuid + material_name.

# properties.variant_uuid.description
[identity] Colour/finish variant identifier, for the variant level OFD models between filament and size. Despite the name it is an OPAQUE identifier, not necessarily a UUID: upstream databases key variants by slug (e.g. 'luminous_blue'), and those are recorded verbatim rather than hashed into a synthetic UUID that would break the join back to the source.

# properties.gtin.description
[identity] OpenPrintTag key 4 — barcode / free scan-in.

# properties.sku.description
[identity] Vendor stock code, when the vendor publishes one distinct from GTIN.

# properties.brand_name.description
[identity] OpenPrintTag key 11 (<=31 chars).

# properties.material_name.description
[identity] OpenPrintTag key 10 (<=63 chars).

# properties.material_abbreviation.description
[identity] OpenPrintTag key 52 (<=7) — carries our family when type unspecified.

# properties.material_type.description
[identity] OpenPrintTag key 9 enum abbreviation, or NULL (unspecified).

# properties.color_name.description
[identity] Vendor's name for the colour/finish variant.

# properties.color_hex.description
[identity] A representative '#RRGGBB'. On a variant record it is that variant's colour. On an aggregate settings card it is one deterministically-chosen hex from the material's published variants and is NOT a designated primary — use a variant record when colour matters.

# properties.vendor_material_guid.description
[identity] NON-AUTHORITATIVE alias: the vendor/slicer-assigned GUID, e.g. the Cura fdm_material GUID element. Vendor-generated, one per profile file, and it folds diameter into identity — never join on it alone.

# properties.lifecycle_status.description
[identity] active | discontinued | unknown (see LIFECYCLE_STATUS). 'unknown' and an absent value mean the same thing; prefer absence, and use 'unknown' only to record that a source was consulted and did not say.

# properties.record_kind.description
[identity] settings_card | measured_specimen | moisture_response (see RECORD_KINDS).

# properties.schema_version.description
[identity] Open3DPP schema version this row conforms to.

# properties.base_polymer.description
[composition] Neat resin designation, e.g. 'PLA', 'PA12'.

# properties.filler_type.description
[composition] AUTHORITATIVE for reinforcement: CF | GF | none | ... Reinforcement is never restated in trait_tags.

# properties.density_g_cm3.description
[composition] (g/cm3) OpenPrintTag key 29. Filament (not part) density.

# properties.glass_transition_c.description
[composition] (degC) Tg, from datasheet. A KINETIC relaxation, not a thermodynamic transition: the value depends on method and rate, so keep it with its source and do not compare values obtained by different methods.

# properties.melt_temperature_c.description
[composition] (degC) Tm — crystalline melt, semi-crystalline grades only.

# properties.softening_temperature_c.description
[composition] (degC) VENDOR-DECLARED softening / vitrification point (OrcaSlicer temperature_vitrification). Distinct from Tg (thermodynamic) and hdt_c (standard load-deflection test); record whichever the source actually stated, never convert.

# properties.is_semicrystalline.description
[composition] Semi-crystalline (True) vs amorphous (False) as stated by a morphology source (datasheet or DSC). NOT a percentage — those are crystallinity_nominal_pct / _measured_pct. NOTE: Cura cura:material_crystallinity is NOT a valid source for this field. It governs filament-break behaviour during material-station unload and is only ever written true, so it can neither express nor evidence amorphousness.

# properties.crystallinity_nominal_pct.description
[composition] (%) Nominal/datasheet degree of crystallinity.

# properties.melt_flow_index_g_10min.description
[composition] (g/10min) MFI/MFR. MEANINGLESS without its temperature and load (e.g. 190 degC / 2.16 kg). The schema has no column for them yet: record them in provenance_notes and do not compare values measured under different conditions.

# properties.shore_hardness_a.description
[composition] OpenPrintTag key 31 (flexibles).

# properties.shore_hardness_d.description
[composition] OpenPrintTag key 32 (rigids).

# properties.surface_energy_pct.description
[composition] (%) Vendor-declared surface-energy index (Cura 'surface energy'). Ultimaker-only vocabulary; no OFD or Orca/Prusa equivalent.

# properties.adhesion_tendency_idx.description
[composition] Ordinal bed-adhesion propensity, 0..4 as published by Cura ('adhesion tendency'). Not comparable to Orca's filament_adhesiveness_category, which is a different scale.

# properties.adhesion_note.description
[composition] Vendor's free-text first-layer adhesion guidance, verbatim (Cura <adhesion_info>). Never parsed into a setting.

# properties.break_temperature_c.description
[composition] (degC) Temperature at which the filament fractures cleanly when pulled (Cura 'break temperature'). A thermal-mechanical observable, not a print setting.

# properties.break_preparation_temperature_c.description
[composition] (degC) Pre-conditioning temperature before the break move (Cura 'break preparation temperature').

# properties.neat_tensile_strength_mpa.description
[composition] (MPa) Datasheet intrinsic for the bulk resin (not printed).

# properties.neat_modulus_mpa.description
[composition] (MPa) Datasheet intrinsic for the bulk resin (not printed).

# properties.is_abrasive.description
[composition] Abrades standard brass hardware. Promoted out of trait_tags because it gates hardware selection alongside required_nozzle_hrc.

# properties.is_support_material.description
[composition] Intended as a support/interface material (Cura material_is_support_material, Orca filament_is_support). Independent of solubility — breakaway supports are insoluble.

# properties.solvent_class.description
[composition] Dissolution medium: water | ipa | limonene | other. NULL means insoluble/unknown, so no separate is_soluble flag.

# properties.trait_tags.description
[composition] Controlled non-filler, non-promoted traits (optical, functional, safety, end-of-life). See TRAIT_TAGS and PROMOTED_TRAITS — a trait appears in exactly one place. Safety and functional tags record a claim published by the source or vendor verbatim; they are never inferred, tested or verified here, and carrying one is not a representation of fitness for any purpose.

# properties.min_print_temperature_c.description
[process] (degC) OpenPrintTag key 34 — nozzle range low.

# properties.max_print_temperature_c.description
[process] (degC) OpenPrintTag key 35 — nozzle range high, as published by the source.

# properties.bed_temperature_c.description
[process] (degC) Chosen/consensus bed point. Present for symmetry with print_temperature_c; the range columns remain authoritative.

# properties.min_chamber_temperature_c.description
[process] (degC) Chamber range low. v0.1 stored chamber as a bare point, which broke the schema's own range rule; both are now available.

# properties.chamber_temperature_c.description
[process] (degC) OpenPrintTag key 41 — chosen/ideal chamber point. The Orca/Bambu family writes 0 to mean 'no chamber / unset'; that sentinel is dropped at ingest rather than published as an ideal 0 degC chamber.

# properties.first_layer_print_temperature_c.description
[process] (degC) Nozzle temperature for the FIRST layer, which vendors commonly raise above the bulk value for adhesion. Distinct from print_temperature_c; absent means the source stated one temperature, not that the two are equal.

# properties.first_layer_bed_temperature_c.description
[process] (degC) Bed temperature for the FIRST layer, commonly raised above the bulk value. Distinct from bed_temperature_c; absent means the source stated one temperature.

# properties.standby_temperature_c.description
[process] (degC) Idle/standby nozzle temperature during tool changes (Cura 'standby temperature', Orca/Prusa idle_temperature).

# properties.flow_temp_graph.description
[process] ([[mm3/s,degC]]) Required nozzle temperature as a FUNCTION of volumetric flow, as [[flow, temp], ...]. The only constitutive relation carried by consumer formats (Cura 'processing temperature graph', OrcaSlicer material_flow_temp_graph). The curve is machine-scoped upstream and is NOT bounded by min/max_print_temperature_c — it routinely extends past both ends, so the two must not be reconciled against each other.

# properties.min_nozzle_diameter_mm.description
[process] (mm) MATERIAL-SIDE REQUIREMENT: smallest nozzle the vendor supports (filled/abrasive grades). A constraint, not an as-run value.

# properties.required_nozzle_hrc.description
[process] MATERIAL-SIDE REQUIREMENT: vendor-declared minimum nozzle hardness, from OrcaSlicer/Bambu required_nozzle_HRC, recorded verbatim. CAVEAT: observed upstream values cluster at 0/3 for unfilled grades and 30/40 for filled ones; the low values are not meaningful Rockwell C hardnesses (the scale is not used below ~20 HRC) and behave as an upstream sentinel for "no special nozzle required". Treat as a vendor code, unvalidated.

# properties.filament_diameter_mm.description
[process] (mm) OpenPrintTag key 30 (default 1.75).

# properties.filament_diameter_tolerance_mm.description
[process] (mm) Stated +/- diameter tolerance. Bounds the achievable flow accuracy, so it belongs beside the diameter it qualifies.

# properties.flow_ratio.description
[process] Extrusion multiplier (1.0 = 100%).

# properties.max_volumetric_speed_mm3_s.description
[process] (mm3/s) Vendor/slicer volumetric flow ceiling.

# properties.shrinkage_xy_pct.description
[process] (%) In-plane shrinkage compensation, 100 = no shrink (Cura cura:material_shrinkage_percentage(_xy), Orca/Prusa filament_shrink). First-order dimensional property.

# properties.shrinkage_z_pct.description
[process] (%) Through-thickness shrinkage compensation, 100 = no shrink.

# properties.wall_count.description
[process] Perimeter count; walls carry most load at low infill.

# properties.drying_temperature_c.description
[process] (degC) OpenPrintTag key 57 — drying AS PERFORMED for this observation. The vendor-published limit is max_dry_temperature_c (block M).

# properties.drying_time_min.description
[process] (min) OpenPrintTag key 58 — drying time as performed.

# properties.printer_model_reported.description
[process] Coarse printer identity EXACTLY as the source reported it. This is provenance-grade text, not an equipment record: the exact system, its components, calibration and environment live in the Applied-System Addendum, which links here via core_record_ref.

# properties.specimen_geometry.description
[geometry] 1A | 1BA | Type IV | cube | prism | as-part.

# properties.specimen_length_mm.description
[geometry] (mm) Overall specimen length.

# properties.specimen_thickness_mm.description
[geometry] (mm) Overall specimen thickness.

# properties.gauge_cross_section_mm2.description
[geometry] (mm2) Load-bearing cross-section at the gauge.

# properties.nominal_wall_thickness_mm.description
[geometry] (mm) Designed wall thickness of the printed shell.

# properties.skin_thickness_mm.description
[geometry] (mm) Solid top/bottom skin per side. On thin coupons the skins dominate the solid shell ring (0.8 mm skins on a 3.2 mm D638 bar = 50% of the thickness), so it is not derivable from wall thickness.

# properties.min_feature_size_mm.description
[geometry] (mm) Smallest printed feature.

# properties.layer_time_s.description
[geometry] (s) Per-layer dwell -> interlayer healing window.

# properties.toolpath_length_mm.description
[geometry] (mm) Proxy for layer_time when time is not reported.

# properties.characteristic_length_mm.description
[geometry] (mm) Thermal-mass proxy (V/A).

# properties.build_orientation_code.description
[geometry] X | Y | Z | XY_45 (load vs layers).

# properties.raster_angle_deg.description
[geometry] (deg) Raster/infill angle relative to the load axis.

# properties.is_standard_coupon.description
[geometry] Standard test coupon (True) vs real-part geometry (False). NULL when the source does not say — absence of a named standard is not evidence of a non-standard specimen.

# properties.part_density_g_cm3.description
[structure] (g/cm3) AS-PRINTED part density (not the filament density in block B). The direct observable of infill x flow x (1 - void); when a source reports it, it supersedes every inferred estimate. relative_density_pct and void_fraction_pct are derivable from it given the fully-dense reference.

# properties.relative_density_pct.description
[structure] (%) Part / fully-dense, when a source reports it that way.

# properties.void_fraction_pct.description
[structure] (%) Porosity. Complement of relative_density_pct; store whichever the source stated and do not back-fill the other.

# properties.interlayer_bond_quality.description
[structure] Qualitative interlayer assessment when no number exists.

# properties.crystallinity_measured_pct.description
[structure] (%) Measured (DSC/XRD) degree of crystallinity for this specimen.

# properties.fiber_alignment_factor.description
[structure] 0..1 fibre alignment with the load axis.

# properties.surface_roughness_ra_um.description
[structure] (um) Arithmetic mean roughness Ra.

# properties.tensile_strength_mpa.description
[properties] (MPa) Ultimate tensile strength. On a moisture_response record this is the FITTED dry intercept of the regression, not a value measured on any one specimen — read it with measurement_confidence and record_kind.

# properties.tensile_modulus_mpa.description
[properties] (MPa) Young's modulus in tension.

# properties.interlayer_bond_strength_mpa.description
[properties] (MPa) Z-direction (interlayer) tensile strength — the property most sensitive to thermal history.

# properties.hdt_c.description
[properties] (degC) Heat-deflection temperature. MEANINGLESS without its load and standard (commonly 0.45 or 1.80 MPa; ISO 75 / ASTM D648). The schema has no column for them yet: record them in provenance_notes and do not compare across sources.

# properties.hdt_stddev_c.description
[properties] (degC) Standard deviation of hdt_c.

# properties.n_specimens.description
[properties] Replicates behind the values in this row.

# properties.hygroscopic_class.description
[moisture] low | moderate | high (see HYGROSCOPIC_CLASS). A compact categorical summary of moisture sensitivity, recorded ONLY when a source states it — it is never derived from family, drying temperature or measured uptake. RESERVED: no current source states it, so the reference implementation leaves it NULL in every record.

# properties.max_dry_temperature_c.description
[moisture] (degC) Vendor-published maximum drying temperature (OFD max_dry_temperature, falling back to the material-family default when the product states none; the lowest stated value wins), recorded as published and NOT verified. Distinct from process drying_temperature_c, which is what was actually done. Follow the manufacturer's drying instructions; exceeding them can damage material or equipment.

# properties.filament_moisture_pct.description
[moisture] (%) As-tested filament moisture content by mass.

# properties.filament_moisture_min_pct.description
[moisture] (%) Low end of the conditioned moisture range in this study.

# properties.filament_moisture_max_pct.description
[moisture] (%) High end of the conditioned moisture range in this study.

# properties.moisture_conditioning_path.description
[moisture] How the moisture state was reached, verbatim (e.g. 'dried then humidity-conditioned').

# properties.moisture_uptake_t80_h.description
[moisture] (h) Hours at ambient to reach 80% of equilibrium uptake.

# properties.dtensile_mpa_per_pct_moisture.description
[moisture] (MPa/%) SIGNED regression slope of tensile strength against moisture content — negative when strength falls, which is the usual case. Compare strength_loss_per_pct_moisture, which is the positive normalised magnitude of the same effect.

# properties.dmodulus_gpa_per_pct_moisture.description
[moisture] (GPa/%) SIGNED regression slope of modulus against moisture content (negative when modulus falls).

# properties.strength_loss_per_pct_moisture.description
[moisture] (1/%) POSITIVE magnitude of the relative strength loss per percentage point of moisture, referenced to the dry intercept: a FRACTION per percent, not percent per percent. 0.47 means 47% of dry strength lost per 1 wt% moisture. Model: sigma(w) = sigma0 * (1 - loss * w).

# properties.moisture_response_r.description
[moisture] Correlation coefficient of the reported moisture fit.

# properties.source.description
[provenance] Dataset / repo / paper key. Comma-separated when a record aggregates several sources — split on ',' before matching.

# properties.doi.description
[provenance] DOI of the source publication.

# properties.source_license.description
[provenance] SPDX identifier of the source licence. When a record aggregates several upstream databases this is a comma-separated, sorted list of every SPDX id involved (e.g. 'AGPL-3.0-only,MIT') — split on ',' before matching. Unrecognised upstream strings become SPDX 'LicenseRef-' identifiers rather than being dropped.

# properties.technical_data_sheet_url.description
[provenance] Vendor TDS. Distinct from doi/source_citation: a vendor spec sheet is the primary evidence for datasheet-derived intrinsics.

# properties.certifications.description
[provenance] Certification or compliance claims exactly as published by the source (e.g. "UL94 V-0", "ISO 10993-5", "EU 10/2011"). Never inferred from composition. Marketing phrases with no named scheme ("food-safe", "medical-grade") are preserved verbatim but are vendor claims, not certifications.

# properties.lab_name.description
[provenance] Testing laboratory, when stated.

# properties.measurement_confidence.description
[provenance] measured | calculated | estimated | reported (see MEASUREMENT_CONFIDENCE).

# properties.n_sources.description
[provenance] Number of independent sources that agree on this record's values.

# properties.has_permissive_source.description
[provenance] At least one permissively-licensed source backs this row.

# properties.is_training_ready.description
[provenance] Row is eligible for the MEASURED-property training set: it carries an observation (not recommended settings) under a verified, redistributable licence with attribution where the licence requires it. Settings cards are False by construction — they are recommendations, not measurements. A workflow flag, not a warranty of accuracy.

# properties.is_synthetic.description
[provenance] Row was generated rather than observed.

# properties.outlier_flag.description
[provenance] Flagged as an outlier by a publisher's QA pass. RESERVED: the reference implementation runs no outlier detection, so this is NULL in every record it emits. A NULL means 'not assessed', never 'assessed and clean'.

# properties.raw_data_doi.description
[provenance] DOI of the underlying raw dataset, when separate.

# properties.stress_strain_file.description
[provenance] Pointer to a raw stress-strain artifact.

# properties.record_revision.description
[provenance] Monotonic revision of this record. Mirrors the addendum sidecars, which all carry revision + created_at.

# properties.record_created_at.description
[provenance] ISO-8601 date this record revision was emitted.