CommunityMech LinkML Schema Documentation

Schema for modeling microbial community structure, function, and ecological interactions

Schema URI: https://w3id.org/communitymech • Name: communitymech • View LinkML YAML source

Classes (28)

LinkML classes defined in the CommunityMech schema
Class Description Attributes
BiologicalProcessDescriptorDescribes a biological process with GO termnotes, preferred_term, term
CommonTaxonA reusable taxon record: an NCBITaxon-grounded organism together with its reference genome(s) and the genes known to support its community role(s) or specific ecological interactions. Maintained once and referenced by many community records.curation_history, genes, genomes, id, notes, taxon_term
CommunityEngineeringDesignDesign intent and implementation details for engineered or synthetic communitiesassembly_strategy, counter_selection, evidence, inoculation_strategy, measurement_endpoints, notes, objective, passaging_regimen, perturbation_design, protocol_url
ComputationalProvenanceProvenance for a computationally derived claim — the method category, the tool chain (each with an optional version and citation), and the model / inputs / simulated conditions behind a prediction. Attach to an EvidenceItem whose evidence_source is COMPUTATIONAL (e.g. cross-feeding predicted from a genome-scale metabolic model under flux balance analysis).input_accession, model_name, model_source, parameters, prediction_type, simulated_medium, tools
ComputationalToolA single software tool used in a computational prediction, with optional version and citation.role, tool_name, tool_reference, tool_version
CounterSelectionA candidate, or set of candidates, excluded from a community during assembly, with the criterion that excluded it (#307). Screening is how most synthetic communities are built, and "we excluded X because it antagonised Y" is often the most informative sentence in the paper. Recording it makes the design constraint queryable and evidence-backed rather than prose.criterion, evidence, excluded_count, excluded_taxon
CultivationSetupHardware/instrumentation and cultivation mode used to grow or sustain the community. Optional — not all communities have a defined setup. Captures both the system (e.g. stirred-tank bioreactor, photobioreactor, microbial fuel cell) and the operating approach (batch, fed-batch, continuous, …). Complements GrowthMedia (medium composition/conditions); the controlled cultivation_mode/system_type values are the preferred standardized home for vessel/reactor information going forward (vs the legacy free-text GrowthMedia.vessel_type).applied_potential, applied_potential_unit, controls_notes, cultivation_mode, do_controlled, electrode_detail, evidence, feed_or_dilution_rate, feed_or_dilution_rate_unit, instrument_detail, manufacturer_model, notes, operating_temperature, operating_temperature_unit, ph_controlled, protocol_url, retention_time, retention_time_type, retention_time_unit, system_type, temperature_controlled, working_volume, working_volume_unit
CultureCollectionIDA culture collection identifier with accession numberaccession, collection, notes, url
CurationEventA timestamped curator action on a MicrobialCommunity. Mirrors the shape used by sibling Mech repos (CultureMech, MediaIngredientMech, TraitMech) so cross-repo tooling can read curation events uniformly.action, changes, curator, llm_assisted, timestamp
EcologicalInteractionAn interaction between organisms or metabolic processesbiological_processes, description, downstream, evidence, interaction_type, metabolites, name, participating_taxa, scope, source_taxon, target_taxon
EnvironmentDescriptorDescribes an environment with ENVO termnotes, preferred_term, term
EnvironmentalFactorAn environmental condition or parameterdescription, evidence, name, unit, value
EvidenceItemAn evidence item linking a claim to a publicationcomputational_provenance, confidence_score, evidence_source, explanation, reference, snippet, supports
ExternalResourceAn external model or narrative resource linked to the communitydescription, evidence, name, repository, resource_id, url
GeneAnnotationA gene that supports a taxon's community role or a specific ecological interaction, with standardized identifiers and supporting evidence.evidence, gene_id, gene_symbol, genome, go_terms, kegg_ortholog, locus_tag, product, supports_interaction, supports_roles
GenomeRecordA reference genome assembly for a taxon.id, label, notes, strain_designation
GrowthMediaGrowth media used for cultivation of the community or its membersatmosphere, composition, culturemech_id, culturemech_url, evidence, headspace_gas, incubation_time, incubation_time_unit, inoculum_size, inoculum_source, inoculum_unit, light_intensity, light_intensity_unit, light_regime, name, ph, ph_range, preparation_notes, pressure, pressure_unit, protocol_url, redox_potential, redox_potential_unit, salinity, salinity_unit, shaking_speed, shaking_speed_unit, temperature, temperature_range, temperature_unit, vessel_type
GrowthMediaComponentA component of growth media (nutrient, salt, buffer, etc.)chebi_term, concentration, from_source, media_ingredient_mech_id, media_ingredient_mech_url, name, unit
GtdbClassificationGTDB grounding for a taxon: the canonical GTDB CURIE, its taxon name and full lineage, the NCBITaxon id it was mapped from, and the mapping confidence. GTDB CURIEs follow the kg-microbe / Bioregistry scheme (GTDB:<rank>__<name-with-underscores>, e.g. GTDB:s__Bacillus_velezensis) and resolve at https://gtdb.ecogenomic.org/tree?r={id}. GTDB names are only best-effort stable across releases, so mapping_source records the release/provenance. Not an OAK-validated ontology term (no id↔label gate).curated, curation_note, gtdb_id, gtdb_lineage, gtdb_taxon, is_reclassified, majority_fraction, mapping_source, ncbi_source_id, support_genomes, total_genomes
InteractionDownstreamA downstream target in a causal interaction graphdescription, target
MetaboliteDescriptorDescribes a metabolite with CHEBI termconcentration, notes, preferred_term, term
MicrobialCommunityA microbial community with composition and interactionsassociated_datasets, community_category, community_origin, cultivation_setup, curation_history, description, discussions, ecological_interactions, ecological_state, engineering_design, environment_term, environmental_factors, external_resources, growth_media, id, metal_notes, metal_relevance, metals_present, modeled_environment, name, rare_earth_elements_present, related_ingredients, related_media, taxonomy
RelatedIngredientA MediaIngredientMech ingredient relevant to this community's environment or metabolism. Complements GrowthMediaComponent (which captures ingredients in actual cultivation media) by linking to environmentally significant compounds that may not be in any currently used medium.chebi_term, evidence, mediaingredientmech_id, preferred_term, relevance, shared_environment_term
RelatedMediaA CultureMech medium relevant to this community through shared environment, organism overlap, or study context. Complements GrowthMedia (which captures media actually used for cultivation) by enabling environment-based discovery of potentially useful media across the CultureMech repository.culturemech_id, evidence, preferred_term, relationship_type, relevance_notes, shared_environment_term
StrainDesignationDetailed strain-level information for reproducibilityculture_collections, genetic_modification, genome_accession, genome_url, isolation_source, notes, strain_name, type_strain
TaxonDescriptorDescribes an organism with NCBITaxon termgtdb_candidates, gtdb_classification, gtdb_grounding_status, notes, preferred_term, term
TaxonomicCompositionA taxon present in the community with abundance and roleabsolute_abundance, absolute_abundance_unit, abundance_level, abundance_value, common_taxon, evidence, functional_role, relative_abundance, relative_abundance_unit, strain_designation, taxon_term
TermAn ontology term with ID and labelid, label

Slots & Class Attributes (230)

LinkML slots and class attributes in CommunityMech
Slot / Attribute Range Description
BiologicalProcessDescriptor.notesstringAdditional notes
BiologicalProcessDescriptor.preferred_termstringHuman-readable process name
BiologicalProcessDescriptor.termTermGO biological process term
CommonTaxon.curation_historyCurationEventAppend-only audit trail of curation actions on this record.
CommonTaxon.genesGeneAnnotationGenes known to support this taxon's community role(s) or specific interactions, with standardized gene/genome ids and evidence.
CommonTaxon.genomesGenomeRecordReference genome assembly(ies) for this taxon.
CommonTaxon.idstringUnique identifier for this common-taxon record.
CommonTaxon.notesstringAdditional notes about this taxon record.
CommonTaxon.taxon_termTaxonDescriptorNCBITaxon-grounded organism this record describes.
CommunityEngineeringDesign.assembly_strategystringHow member strains were selected and assembled
CommunityEngineeringDesign.counter_selectionCounterSelectionCandidates deliberately excluded during assembly, and why. The schema could express what a community IS but not what it was deliberately NOT, so a screening constraint had only two homes: an `ecological_interaction`, which asserts an edge between members and is wrong when the excluded strains are not members, or prose in `notes`, which no consumer can query (#307). Not an interaction: these subjects are outside the community by construction, which is why they live here rather than in `ecological_interactions` (#300, #305).
CommunityEngineeringDesign.evidenceEvidenceItemEvidence supporting the engineering-design description
CommunityEngineeringDesign.inoculation_strategystringHow the initial inoculum was composed and introduced
CommunityEngineeringDesign.measurement_endpointsstringPrimary readouts used to evaluate design outcomes
CommunityEngineeringDesign.notesstringAdditional engineering-design details
CommunityEngineeringDesign.objectivestringPrimary design objective or experimental hypothesis
CommunityEngineeringDesign.passaging_regimenstringSerial transfer or cultivation regimen used for stabilization and selection
CommunityEngineeringDesign.perturbation_designstringPlanned perturbations applied to probe or tune community behavior
CommunityEngineeringDesign.protocol_urlstringURL to an assembly or cultivation protocol, if available
ComputationalProvenance.input_accessionstringAccession(s) or DOI for the model or its input data (e.g. genome/SRA accessions, a model repository DOI). Free text to allow ranges.
ComputationalProvenance.model_namestringName of a specific published/named model used, if any (e.g. iML1515). Leave empty for de-novo reconstructions with no published identifier.
ComputationalProvenance.model_sourcestringHow the model was obtained (e.g. "de-novo draft genome-scale models reconstructed from strain genomes").
ComputationalProvenance.parametersstringOther salient method parameters or objective (e.g. "FBA to identify all potentially exchangeable metabolites"); free text.
ComputationalProvenance.prediction_typeComputationalPredictionTypeEnumCategory of computational method that produced the prediction.
ComputationalProvenance.simulated_mediumstringIn-silico medium / condition under which the prediction was run (e.g. LBGM).
ComputationalProvenance.toolsComputationalToolSoftware/tools in the prediction chain, in order of use (e.g. GEM reconstruction, model refinement, flux simulation).
ComputationalTool.rolestringWhat this tool did in the chain (e.g. "GEM reconstruction", "model refinement/validation", "flux balance analysis").
ComputationalTool.tool_namestringTool / software name (e.g. CarveMe, COBRA Toolbox, SMETANA).
ComputationalTool.tool_referencestringCitation for the tool itself (PMID:/doi:/bioproject:/GITHUB: format).
ComputationalTool.tool_versionstringVersion string if reported (e.g. "3.0"). Leave empty when the source does not report a version — do not infer one.
CounterSelection.criterionstringWhy these candidates were excluded - the screen they failed. Required: an exclusion without a reason records that something was dropped while losing the only part that is informative.
CounterSelection.evidenceEvidenceItemEvidence for the exclusion
CounterSelection.excluded_countintegerHow many candidates were excluded, when the source gives a number but not resolvable identities. Carries the fact that the screen removed three isolates even where `excluded_taxon` must stay empty.
CounterSelection.excluded_taxonTaxonDescriptorThe excluded candidate, where the source resolves it. Optional on purpose. The motivating case cannot fill it: three Bacillus isolates were excluded for inhibiting Bradyrhizobium, and at the genus-level grounding the source supports they are indistinguishable from the retained ones, so naming a taxon here would assert an identity the paper does not (#305, #307). Use `excluded_count` when the number is known but the identity is not.
CultivationSetup.applied_potentialfloatApplied electrode potential (bioelectrochemical / fuel-cell systems).
CultivationSetup.applied_potential_unitPotentialUnitEnumUnit for applied_potential. The unit only - the reference electrode a potential is quoted against goes in electrode_detail (#514).
CultivationSetup.controls_notesstringFree-text notes on process control not captured by the boolean flags.
CultivationSetup.cultivation_modeCultivationModeEnumOperating mode / approach used to cultivate the community.
CultivationSetup.do_controlledbooleanWhether dissolved oxygen was actively controlled.
CultivationSetup.electrode_detailstringElectrode configuration/materials for bioelectrochemical systems (anode/cathode material, surface area, etc.).
CultivationSetup.evidenceEvidenceItemEvidence supporting the cultivation-setup description.
CultivationSetup.feed_or_dilution_ratefloatFeed rate (fed-batch) or dilution rate (continuous/chemostat); disambiguated by cultivation_mode.
CultivationSetup.feed_or_dilution_rate_unitRateUnitEnumUnit for feed_or_dilution_rate (e.g. h^-1, mL/h).
CultivationSetup.instrument_detailstringDistinguishing detail about the system not captured by system_type.
CultivationSetup.manufacturer_modelstringManufacturer and/or model designation of the instrument.
CultivationSetup.notesstringAdditional notes about the cultivation setup.
CultivationSetup.operating_temperaturefloatOperating/setpoint temperature of the cultivation system.
CultivationSetup.operating_temperature_unitTemperatureUnitEnumUnit for operating_temperature (e.g. C, K).
CultivationSetup.ph_controlledbooleanWhether pH was actively controlled.
CultivationSetup.protocol_urlstringURL to the cultivation protocol.
CultivationSetup.retention_timefloatHydraulic or solids retention time (see retention_time_type).
CultivationSetup.retention_time_typeRetentionTimeTypeEnumWhich retention time is reported (e.g. "HRT" or "SRT").
CultivationSetup.retention_time_unitTimeUnitEnumUnit for retention_time (e.g. h, d).
CultivationSetup.system_typeCultivationSystemEnumInstrumentation / vessel system used.
CultivationSetup.temperature_controlledbooleanWhether temperature was actively controlled.
CultivationSetup.working_volumefloatWorking (culture) volume.
CultivationSetup.working_volume_unitVolumeUnitEnumUnit for working_volume (e.g. mL, L).
CultureCollectionID.accessionstringThe accession number in this collection
CultureCollectionID.collectionCultureCollectionEnumThe culture collection name
CultureCollectionID.notesstringAdditional information about this collection entry
CultureCollectionID.urlstringDirect URL to the strain in the collection catalog
CurationEvent.actionstringSCREAMING_SNAKE_CASE action label minted by the curation tool that produced this event (e.g. ``"ADD_COMMUNITY_IDS"``, ``"FIX_NETWORK_INTEGRITY"``).
CurationEvent.changesstringDescription of what changed.
CurationEvent.curatorstringWho performed this action (script name or human identifier).
CurationEvent.llm_assistedbooleanWhether LLM assistance was used.
CurationEvent.timestampdatetimeWhen this action occurred (ISO-8601 UTC).
EcologicalInteraction.biological_processesBiologicalProcessDescriptorBiological processes involved
EcologicalInteraction.descriptionstringDetailed description of the interaction
EcologicalInteraction.downstreamInteractionDownstreamDownstream effects in causal graph
EcologicalInteraction.evidenceEvidenceItemEvidence for this interaction
EcologicalInteraction.interaction_typeInteractionTypeEnumType of ecological interaction
EcologicalInteraction.metabolitesMetaboliteDescriptorMetabolites involved in the interaction
EcologicalInteraction.namestringName of this interaction
EcologicalInteraction.participating_taxaTaxonDescriptorWhich members a COMMUNITY_LEVEL interaction is actually about, when it is about some of them rather than all. Optional and usually absent: a statement that genuinely holds across the whole community should leave it empty, and an empty list means "every member", not "none". Exists because the connectivity audit credits a COMMUNITY_LEVEL interaction as connecting every member of the record, which is unavoidably coarse - in a record carrying both kinds of edge, a taxon in no pairwise edge is credited by an unrelated community-level one. Naming participants narrows the credit to them (#312). Not a second way to write a pairwise edge. If an interaction is between two named organisms it wants `source_taxon`/`target_taxon` and PAIRWISE scope; this is for a statement over a named subset, such as three of eight members cross-feeding while the rest do not. Name participants by `preferred_term`, not by CURIE alone. Entries resolve by preferred_term, term.label or term.id, and in strain-level records the id does not identify a member: GLBRC_Populus_Variovorax_SynCom28 has 28 taxa under one NCBITaxon id, so naming two of them by CURIE credits all 28 and the slot appears to do nothing. That is the sound reading of an ambiguous reference, and it is also exactly the record shape where narrowing matters most (#524).
EcologicalInteraction.scopeInteractionScopeEnumWhether this interaction is a pairwise organism-to-organism edge or a community-level/emergent phenomenon. PAIRWISE interactions require a source_taxon. COMMUNITY_LEVEL interactions describe behaviors that emerge from the whole consortium (or are driven by abiotic inputs such as electrolysis-supplied H2) and need not have source_taxon set.
EcologicalInteraction.source_taxonTaxonDescriptorSource organism (if applicable; required for PAIRWISE interactions, omitted for COMMUNITY_LEVEL interactions)
EcologicalInteraction.target_taxonTaxonDescriptorTarget organism (if applicable)
EnvironmentDescriptor.notesstringAdditional notes
EnvironmentDescriptor.preferred_termstringHuman-readable environment name
EnvironmentDescriptor.termTermENVO ontology term
EnvironmentalFactor.descriptionstringDescription of this factor
EnvironmentalFactor.evidenceEvidenceItemEvidence for this condition
EnvironmentalFactor.namestringName of the environmental factor
EnvironmentalFactor.unitstringUnit of measurement
EnvironmentalFactor.valuestringMeasured or specified value
EvidenceItem.computational_provenanceComputationalProvenanceStructured provenance for a computationally predicted claim (tool chain, versions, model, in-silico medium). Populate when evidence_source is COMPUTATIONAL so model-derived claims are queryable rather than described only in prose.
EvidenceItem.confidence_scorefloatConfidence in this evidence (0.0-1.0), based on snippet validation
EvidenceItem.evidence_sourceEvidenceSourceEnumType of evidence (in vitro, computational, etc.)
EvidenceItem.explanationstringHow this evidence supports or refutes the claim
EvidenceItem.referencestringThe publication or article-linked repository reference.
EvidenceItem.snippetstringExact quote from the publication supporting the claim (required for proper evidence)
EvidenceItem.supportsEvidenceItemSupportEnumLevel of support this evidence provides
ExternalResource.descriptionstringDescription of the resource and its relevance
ExternalResource.evidenceEvidenceItemEvidence linking this resource to the community
ExternalResource.namestringHuman-readable name for this resource
ExternalResource.repositoryExternalResourceRepositoryEnumRepository or platform where this resource is hosted
ExternalResource.resource_idstringRepository identifier (e.g., MODEL2405300001, ws.73218.obj.75)
ExternalResource.urlstringDirect URL to the resource
GeneAnnotation.evidenceEvidenceItemEvidence linking this gene to the role/interaction.
GeneAnnotation.gene_idstringPrimary standardized gene/protein identifier, as a CURIE. Accepted prefixes: NCBIGene (e.g. NCBIGene:948242), UniProtKB (e.g. UniProtKB:P0A6F5), or KEGG gene (e.g. KEGG:eco:b3987). For genes best identified per-assembly, give locus_tag; for the orthologous function, give kegg_ortholog.
GeneAnnotation.gene_symbolstringGene symbol / short name (e.g. dsrA, nifH, mtrC).
GeneAnnotation.genomestringNCBI Assembly accession (GCF_/GCA_) of the genome this gene is annotated in; should match one of the parent CommonTaxon.genomes[].id.
GeneAnnotation.go_termsTermGO molecular-function / biological-process terms describing this gene's activity (canonical id↔label, checked by the term gate).
GeneAnnotation.kegg_orthologstringKEGG Orthology id for the gene's function (e.g. K00370).
GeneAnnotation.locus_tagstringGenome locus tag tying the gene to a specific assembly (e.g. b3987, SO_1776).
GeneAnnotation.productstringGene product or functional description.
GeneAnnotation.supports_interactionstringSpecific community interaction(s) this gene mediates, as a free-text description (may name an EcologicalInteraction from a community record).
GeneAnnotation.supports_rolesFunctionalRoleEnumCommunity functional role(s) this gene supports.
GenomeRecord.idstringNCBI Assembly accession for the genome (RefSeq GCF_ or GenBank GCA_), e.g. GCF_000005845.2.
GenomeRecord.labelstringHuman-readable assembly name (e.g. "ASM584v2").
GenomeRecord.notesstringNotes about this assembly (assembly level, source, etc.).
GenomeRecord.strain_designationStrainDesignationStrain this assembly corresponds to.
GrowthMedia.atmosphereAtmosphereEnumAtmospheric/oxygen requirements
GrowthMedia.compositionGrowthMediaComponentComponents of the growth medium
GrowthMedia.culturemech_idstringIdentifier in CultureMech media database (e.g., CultureMech:000001)
GrowthMedia.culturemech_urlstringURL to CultureMech media entry
GrowthMedia.evidenceEvidenceItemEvidence for this growth medium
GrowthMedia.headspace_gasstringGas composition in headspace (e.g., "N2/CO2 80:20", "H2/CO2 80:20")
GrowthMedia.incubation_timestringDuration of incubation
GrowthMedia.incubation_time_unitstringUnit for incubation time (hours, days, weeks)
GrowthMedia.inoculum_sizestringInitial cell density or transfer percentage
GrowthMedia.inoculum_sourcestringSource of inoculum
GrowthMedia.inoculum_unitstringUnit for inoculum (cells/mL, OD600, %v/v, CFU/mL)
GrowthMedia.light_intensitystringLight intensity value
GrowthMedia.light_intensity_unitstringUnit for light intensity (μmol photons/m²/s, lux, W/m²)
GrowthMedia.light_regimestringLight/dark cycle (e.g., "16h/8h", "continuous", "dark")
GrowthMedia.namestringName of the growth medium
GrowthMedia.phstringpH of the medium
GrowthMedia.ph_rangestringpH range for growth (e.g., "5.5-7.0")
GrowthMedia.preparation_notesstringAdditional preparation details or modifications
GrowthMedia.pressurestringPressure for cultivation (relevant for extremophiles)
GrowthMedia.pressure_unitstringUnit for pressure (atm, bar, MPa, psi)
GrowthMedia.protocol_urlstringURL to detailed protocol (e.g., protocols.io, dx.doi.org)
GrowthMedia.redox_potentialstringOxidation-reduction potential
GrowthMedia.redox_potential_unitstringUnit for redox (mV vs SHE, Eh)
GrowthMedia.salinitystringSalinity of the medium (NaCl equivalent)
GrowthMedia.salinity_unitstringUnit for salinity (%, M, g/L, ppt)
GrowthMedia.shaking_speedstringShaking/agitation speed for liquid cultures
GrowthMedia.shaking_speed_unitstringUnit for shaking (rpm, oscillations/min)
GrowthMedia.temperaturestringIncubation temperature
GrowthMedia.temperature_rangestringTemperature range for growth (e.g., "25-37")
GrowthMedia.temperature_unitstringUnit for temperature (e.g., °C, K)
GrowthMedia.vessel_typestringType of cultivation vessel (flask, tube, bioreactor, plate, etc.)
GrowthMediaComponent.chebi_termMetaboliteDescriptorCHEBI term for the component
GrowthMediaComponent.concentrationstringConcentration value
GrowthMediaComponent.from_sourcestringSource of this ingredient (e.g., "CultureMech", "community_curated")
GrowthMediaComponent.media_ingredient_mech_idstringMediaIngredientMech identifier. NOTE: the `MediaIngredientMech:NNNNNN` scheme is vestigial — MIM's canonical ingredient CURIE is `MIM:<name>` (confirmed MediaIngredientMech#119), so no pattern is enforced. Prefer `chebi_term` for the compound identity.
GrowthMediaComponent.media_ingredient_mech_urlstringURL to MediaIngredientMech ingredient entry
GrowthMediaComponent.namestringName of the component
GrowthMediaComponent.unitstringUnit of measurement for concentration
GtdbClassification.curatedbooleanTrue when a curator chose this grounding against what `gtdb_ground.py` computes, so the tool must not overwrite it. The reason belongs in `curation_note`. A hard-coded list in the script protects only what someone remembered to add: `NCBITaxon:340177` (*Chlorobium*) was curated and unlisted, and survived a whole-KB refresh only because its recompute happened to yield no id — a side effect, not a decision (#384). Marking the block keeps the decision with the data.
GtdbClassification.curation_notestringWhy this grounding was curated against the tool. Required in practice whenever `curated` is true — a pin whose reason lives only in a commit message is one re-run away from looking like an error. Enforced by `communitymech.validators.gtdb_coherence`, since a conditional requirement is one of the relations the JSON-Schema backend cannot express (#387).
GtdbClassification.gtdb_idstringCanonical GTDB CURIE (spaces in the taxon name become underscores), e.g. GTDB:s__Bacillus_velezensis or GTDB:g__Agrobacterium. The single letter before `__` is the rank — d, p, c, o, f, g, s — and it is the way to filter by rank. Required, so it is always there to read: the pattern below constrains the value but says nothing when the key is absent, which is why this slot is the one required attribute here (#414 review). **Filter `d__` out of any coverage figure.** The domain groundings (`d__Bacteria`, `d__Archaea`) are true but carry no information beyond the NCBITaxon id, and counting them as "grounded" moves coverage by about seven percentage points (#393, #403). They are not the whole tautological population: a higher-rank grounding whose GTDB name equals the NCBI name at the same rank says as little — `Actinomycetota` -> `p__Actinomycetota`. Filtering on `is_reclassified: false` above genus rank catches those too. Current counts live in `.claude/skills/ground-taxa-gtdb/SKILL.md` and are pinned by `tests/test_gtdb_support_counts.py`, not written here: pythongen drops attribute descriptions, so a count in this text reaches no generated artifact and nothing would fail when it goes stale.
GtdbClassification.gtdb_lineagestringFull GTDB lineage string (domain..species), e.g. "d__Bacteria;p__Bacillota;c__Bacilli;o__Bacillales;f__Bacillaceae;g__Bacillus;s__Bacillus velezensis".
GtdbClassification.gtdb_taxonstringGTDB taxon name (human-readable, spaces preserved), e.g. "Bacillus velezensis".
GtdbClassification.is_reclassifiedbooleanTrue when the GTDB name differs from the NCBITaxon name at the rank this block is grounded at. A string comparison, and nothing more, so the name is a poor guide to what it holds. It said "species name ... (a GTDB reclassification/rename)". Neither half held. Of the 141 blocks currently true, 42 are grounded above species — through genus, family, order, class and phylum — so the rank is wrong for nearly a third of them. And it does not mean GTDB reclassified anything. Partitioning the 141 by why the names differ (#441): * 0 dropped strain designations. There were 40 — `Escherichia coli K-12` -> `Escherichia coli` — and #480 removed them: GTDB carries no strain suffixes, so the names differed while the placement did not. `name_differs` now treats that as no difference. * 34 GTDB polyphyly suffixes — `Bacillota` -> `Bacillota_A`. A split marker on the same name, not a rename. * 13 that are both at once — `Buchnera aphidicola BCc` -> `Buchnera aphidicola_F`. * 3 GTDB placeholders for an unnamed species within the same genus — `Dyadobacter sp.` -> `Dyadobacter sp017744695`. * 3 rank-appropriate nomenclatural endings on one stem — `Chlorobiota` -> `Chlorobiia`, `Nitrososphaerota` -> `Nitrososphaeria`. * 88 genuinely different names, and only some of those are GTDB reclassifications. `Allobosea` -> `Bosea` is an *NCBI* rename: both databases place the organism in the same genus concept, and NCBI moved its label because the bacterial name was a later homonym of the plant *Bosea*. Orthographic and gender variants also sit here — `Nitrosotalea devaniterrae` -> `Nitrosotalea devanaterra`, `Methylocystis parvus` -> `Methylocystis parva`. So 53 of 141 — 38% — are not reclassifications under any reading, and that is a floor: the 88 "genuinely different" include an unknown number of NCBI renames and spelling variants. Filter on this slot to find "the two labels are not identical", which is what it computes. Do not read it as provenance. #480 narrowed it: dropping the 40 strain-designation cases took the non-reclassification share from 54% to 38% at that time, and the genuinely-different share from 46% to 62%. The current block counts are the ones counted above, not these historical rounded percentages. Polyphyly suffixes are deliberately still reported — `Bacillota` -> `Bacillota_A` is a real GTDB distinction, and #480 records that folding it in here is the arguable middle rather than the obvious next step. An enum (#480 option 3) is where this wants to end up. ONE call site computes it now, `name_differs` (#482). Two used to: `bool(sp and ref and sp != ref)` on the species path, which produced 121 of the then-154, and `top != _clean_label(label)` on the genus-and-higher path. They disagreed — the first had a crosswalk fallback for `ref` and a null-guard returning False where the second returned True, so a missing label read as a name change at genus rank and not at species rank. Counts are pinned by `tests/test_is_reclassified_semantics.py`, which fails when they drift; a count in this text reaches no generated artifact, since pythongen drops attribute descriptions.
GtdbClassification.majority_fractionfloatFraction of genomes under the NCBI taxon that map to this GTDB taxon (0.0-1.0), from the kg-microbe NCBI2GTDB table — a confidence for the mapping. 1.0 means an unambiguous 1:1 correspondence.
GtdbClassification.mapping_sourcestringProvenance of the mapping: the source table and a content digest of it, e.g. "kg-microbe NCBI2GTDB.tsv.gz sha256:761d5537a7edb4b0 (file mtime 2026-07-25)". The digest is what identifies the input -- an earlier form recorded "GTDB release latest (built <mtime>)", where "latest" was a literal nothing read and the mtime is a filesystem attribute rather than a property of the data, so a block that differs from today's crosswalk could not be told from one that is wrong (#624). Blocks written before that change still carry the old string.
GtdbClassification.ncbi_source_idstringThe NCBITaxon id this GTDB classification was mapped from.
GtdbClassification.support_genomesintegerNumber of genomes supporting the chosen GTDB taxon — the numerator behind majority_fraction. The schema bounds this on its own but cannot relate it to total_genomes or majority_fraction: that is cross-field arithmetic, which LinkML's JSON-Schema backend has no way to express (#387, with the spike recorded in the class rules above). `support_genomes: 99, total_genomes: 3` passes `just validate` and is caught by `just validate-gtdb` and by `validate-strict` in CI. Present only on genus-and-higher groundings, where this majority is computed from the mapping rows directly. Absent on species-level groundings: there majority_fraction comes from the crosswalk's own column, which carries two decimal places, so any numerator derived from it would assert a precision the source lacks (~170 genomes of slack on a 17191-genome taxon).
GtdbClassification.total_genomesintegerNumber of genomes the majority was computed over — the denominator behind majority_fraction, and the answer to "0.571 of what?". For genus-and-higher, the genomes across every candidate GTDB taxon at that rank, excluding rows dropped by the named-species filter (sp./uncultured/informal), so it is the evidence actually considered rather than every genome under the NCBI taxon. For species, the genomes in the crosswalk rows this grounding was resolved from — the taxon's own rows when it matched by NCBI id, the name group when it matched by species name. Those scopes differ, so an id-matched block can report far less than the evidence that exists for its species; widening it needs a key as stable as the id, which the crosswalk does not offer (#389). Counted at a single depth: a species-rank row and its strain rows overlap, so the larger of the two is taken and never their sum. Note majority_fraction is rounded, so neither count can be recovered from it.
InteractionDownstream.descriptionstringDescription of the causal link
InteractionDownstream.targetstringName of the downstream interaction
MetaboliteDescriptor.concentrationstringMeasured concentration or amount
MetaboliteDescriptor.notesstringAdditional notes
MetaboliteDescriptor.preferred_termstringHuman-readable metabolite name
MetaboliteDescriptor.termTermCHEBI ontology term
MicrobialCommunity.associated_datasetsDatasetOmics and other datasets associated with this community
MicrobialCommunity.community_categoryCommunityCategoryEnumBroad functional or ecological category
MicrobialCommunity.community_originCommunityOriginEnumOrigin of the community (natural, engineered, or synthetic)
MicrobialCommunity.cultivation_setupCultivationSetupHardware setup and cultivation mode(s) used to grow/sustain the community. Optional; not all communities have a defined setup.
MicrobialCommunity.curation_historyCurationEventAppend-only audit trail of curation actions that modified this community record. Populated by ``record_curation_event()`` from ``communitymech.curate.curation_event``.
MicrobialCommunity.descriptionstringOverview of the community
MicrobialCommunity.discussionsDiscussionOpen questions, knowledge gaps, controversies, emerging hypotheses, or curation todos attached to this community or its sub-objects (via the Discussion.attaches_to hash-anchors, e.g. `ecological_interactions#<name>`). Captures the discourse / knowledge-gap layer — e.g. a proposed-but-not- demonstrated causal edge that should not be asserted as an interaction.
MicrobialCommunity.ecological_interactionsEcologicalInteractionInteractions between organisms and processes
MicrobialCommunity.ecological_stateEcologicalStateEnumState of the community (stable, engineered, etc.)
MicrobialCommunity.engineering_designCommunityEngineeringDesignExplicit engineering design and implementation details for this community
MicrobialCommunity.environment_termEnvironmentDescriptorEnvironment where community exists
MicrobialCommunity.environmental_factorsEnvironmentalFactorEnvironmental conditions
MicrobialCommunity.external_resourcesExternalResourceExternal model and narrative resources linked to this community
MicrobialCommunity.growth_mediaGrowthMediaGrowth media used for cultivation
MicrobialCommunity.idstringUnique identifier for this community (e.g., CommunityMech:000001)
MicrobialCommunity.metal_notesstringAdditional context on metal/REE processing mechanisms or significance
MicrobialCommunity.metal_relevanceMetalRelevanceEnumOverall relevance of this community for metal/REE processing
MicrobialCommunity.metals_presentMetalElementEnumMetals present or processed by this community
MicrobialCommunity.modeled_environmentEnvironmentDescriptorThe natural or applied environment(s) this community derives from, models, or represents — as distinct from `environment_term` (where it physically exists / was studied). For an engineered or synthetic community, `environment_term` is often "laboratory environment" while this captures the real habitat it stands in for (e.g. a groundwater enrichment → groundwater; a synthetic infant-gut consortium → intestine environment; a space-agriculture SynCom → regolith). Leave empty for de-novo assemblies with no specific habitat. ENVO-grounded, so it also serves as an environment-based cross-repo join key (issue #30).
MicrobialCommunity.namestringCommunity name
MicrobialCommunity.rare_earth_elements_presentRareEarthElementEnumRare earth elements present or processed by this community
MicrobialCommunity.related_ingredientsRelatedIngredientMediaIngredientMech ingredients relevant to this community's environment or metabolism. For ingredients in actual cultivation media, see growth_media.composition instead.
MicrobialCommunity.related_mediaRelatedMediaCultureMech media relevant to this community through shared environment, organism overlap, or study context. For media actually used in cultivation, use the growth_media field instead.
MicrobialCommunity.taxonomyTaxonomicCompositionOrganisms present in the community — its membership, not everything it interacts with. A host and an antagonist are **not** members (#319). The community lives on or in its host and is applied against its antagonist; both can be named in `ecological_interactions` as outside-community participants without appearing here. The mirror-image question is #307: candidates deliberately screened *out* are likewise not members, and live in `engineering_design.counter_selection`. Both answers are the same, for the same reason — this slot records what the community is made of, and an edge to something outside it is not evidence that it should be inside it.
RelatedIngredient.chebi_termTermCHEBI ontology term for the ingredient compound
RelatedIngredient.evidenceEvidenceItemEvidence supporting the ingredient-community relationship
RelatedIngredient.mediaingredientmech_idstringMediaIngredientMech identifier. NOTE: the `MediaIngredientMech:NNNNNN` scheme is **vestigial** — MIM confirmed (MediaIngredientMech#119) its canonical ingredient CURIE is `MIM:<name>` (SSSOM registry) and the `NNNNNN` form appears in zero canonical records. No schema pattern is enforced. The equivalence-safe join is `chebi_term` (MIM's `skos:exactMatch` CHEBI); prefer it. Deprecated — likely to be removed.
RelatedIngredient.preferred_termstringHuman-readable ingredient name (should match MediaIngredientMech record)
RelatedIngredient.relevancestringWhy this ingredient is relevant to the community
RelatedIngredient.shared_environment_termTermENVO term for the shared environment linking this ingredient to the community. Enables environment-based joins between CommunityMech environment_term and MediaIngredientMech environmental_context, mirroring RelatedMedia.shared_environment_term.
RelatedMedia.culturemech_idstringCultureMech identifier for this medium
RelatedMedia.evidenceEvidenceItemEvidence supporting the media-community relationship
RelatedMedia.preferred_termstringHuman-readable media name (should match CultureMech record name)
RelatedMedia.relationship_typeMediaRelationshipEnumHow this medium relates to the community
RelatedMedia.relevance_notesstringWhy this medium is relevant to the community
RelatedMedia.shared_environment_termTermENVO term for the shared environment linking this medium to the community. Enables SPARQL joins between CommunityMech environment_term and CultureMech source_environment.
StrainDesignation.culture_collectionsCultureCollectionIDCulture collection identifiers for this strain
StrainDesignation.genetic_modificationstringDescription of genetic modifications (for engineered strains)
StrainDesignation.genome_accessionstringNCBI Assembly accession (e.g., GCF_000203695.1)
StrainDesignation.genome_urlstringDirect URL to NCBI Assembly
StrainDesignation.isolation_sourcestringOriginal isolation source of the strain
StrainDesignation.notesstringAdditional strain-specific information
StrainDesignation.strain_namestringThe formal strain designation (e.g., "DSM 8584", "PCC 7942", "ATCC 12345")
StrainDesignation.type_strainbooleanWhether this is the nomenclatural type strain for the species
TaxonDescriptor.gtdb_candidatesstringThe competing GTDB taxa when gtdb_grounding_status is AMBIGUOUS, best supported first, as `GTDB:` CURIEs at the rank the grounding was attempted at. Carried so a curator can choose in place instead of re-running the tool to rediscover what it already computed. Empty for every other status. These were plain names until #415, on the reasoning that "they are candidates, not identifiers". That does not hold up: a candidate names a real GTDB taxon, and being unchosen does not make it identify nothing. The cost was concrete — no rank, so the 85 AMBIGUOUS taxa could not be filtered or counted the way #414 filters groundings; and nothing resolvable, so `RDYJ01`, an alphanumeric GTDB placeholder genus, sat in a record meaning nothing to a reader. `GTDB:g__RDYJ01` resolves and carries its rank. Spelled by the same `_curie()` the grounding uses, so a candidate is written exactly as it will appear in `gtdb_id` once chosen — promoting one is a copy, not a re-derivation.
TaxonDescriptor.gtdb_classificationGtdbClassificationOptional GTDB (Genome Taxonomy Database) grounding for this taxon, derived from the NCBITaxon term via the kg-microbe NCBI2GTDB mapping. Complements the NCBITaxon term with a genome-based classification — useful because GTDB frequently renames/reclassifies relative to NCBI (e.g. NCBITaxon "Agrobacterium deltae" -> GTDB "Agrobacterium leguminum"). Populate with the ground-taxa-gtdb skill.
TaxonDescriptor.gtdb_grounding_statusGtdbGroundingStatusEnumWhy this taxon does or does not carry a gtdb_classification (#294). Populated by `gtdb_ground.py --apply-status`. GROUNDED must accompany a gtdb_classification and every other value must accompany its absence — a relation the schema cannot express, checked by `communitymech.validators.gtdb_coherence` and so by `just validate-strict` (#387).
TaxonDescriptor.notesstringAdditional notes about this organism
TaxonDescriptor.preferred_termstringHuman-readable organism name
TaxonDescriptor.termTermNCBITaxon ontology term
TaxonomicComposition.absolute_abundancefloatAbsolute abundance of this taxon (e.g. cell count, CFU/mL, read count, gene copies). Optional and independent of relative_abundance; pair with absolute_abundance_unit.
TaxonomicComposition.absolute_abundance_unitstringUnit/basis for absolute_abundance (e.g. cells/mL, CFU/mL, reads, copies/g).
TaxonomicComposition.abundance_levelAbundanceEnumOrdinal prominence of this taxon among the members of this record. Not a percentage: see AbundanceEnum, and use `relative_abundance` for a measured share (#748).
TaxonomicComposition.abundance_valuestringDEPRECATED free-text quantitative abundance. Prefer the typed absolute_abundance / relative_abundance fields below; retained for back-compatibility with records that used a single combined value.
TaxonomicComposition.common_taxonstringReference to a reusable CommonTaxon record (kb/taxa/) that holds the genome and gene annotations for this organism, so the same curated gene set can be shared across community records.
TaxonomicComposition.evidenceEvidenceItemEvidence for this organism's presence and role
TaxonomicComposition.functional_roleFunctionalRoleEnumRole(s) in the community
TaxonomicComposition.relative_abundancefloatRelative abundance of this taxon within the community. Optional and independent of absolute_abundance. Interpreted as a fraction in [0, 1] unless relative_abundance_unit says otherwise (e.g. percent).
TaxonomicComposition.relative_abundance_unitstringUnit/basis for relative_abundance (e.g. "fraction", "percent", "16S rRNA reads", "metagenome relative abundance"). Defaults to a fraction in [0, 1] when omitted.
TaxonomicComposition.strain_designationStrainDesignationStrain-level identification and culture collection info
TaxonomicComposition.taxon_termTaxonDescriptorThe organism
Term.idstringThe ontology term ID (e.g., NCBITaxon:1140, CHEBI:17992)
Term.labelstringThe CANONICAL ontology label for `id` (e.g. "activated sludge" for ENVO:00002046). Verified against the ontology by the id↔label gate; free/project names belong in the sibling `preferred_term`, not here.

Enumerations (26)

Controlled vocabulary enumerations in CommunityMech
Enumeration Description Permissible Values
AbundanceEnumHow prominent a member is **within its own record** - an ordinal rank among that community's members, not a measured share of it (#748). These values used to name percentage bands: DOMINANT >1%, ABUNDANT 0.1-1%, COMMON 0.01-0.1%, RARE <0.01%. Nothing enforced them and the corpus never meant them. Restricting to `community_origin: SYNTHETIC` records of at most four members, where the arithmetic admits no doubt because every member of a closed four-member community exceeds 1%, **76 of 91 assignments claimed the member was below 1%**. Both members of a two-species coculture marked ABUNDANT is the characteristic shape, and it is not a curation error - it says "these two are co-equal partners", which is a useful thing to record and is what the words were being used for. **For a measured number use `relative_abundance`** (a fraction in [0, 1], or another basis via `relative_abundance_unit`) or `absolute_abundance`. Those slots have existed since #161 and are, as of #748, used by 0 of the 1068 taxa in the corpus - which is the other half of why this enum drifted into carrying a job it was never checked on.ABUNDANT, COMMON, DOMINANT, RARE
AtmosphereEnumAtmospheric/oxygen requirements for growthAEROBIC, ANAEROBIC, CAPNOPHILIC, FACULTATIVE_AEROBIC, FACULTATIVE_ANAEROBIC, MICROAEROBIC
CommunityCategoryEnumBroad functional/ecological category of the communityAMD, BIOMINING, BIOREMEDIATION, BIOTECHNOLOGY, CARBON_SEQUESTRATION, DIET, EXTREME_ENVIRONMENT, LIGNOCELLULOSE, METAL_REDUCTION, METHANOGENESIS, ORAL, OTHER, PHAGE_PREDATION, PHYTOPLANKTON, RHIZOSPHERE, SYNTROPHY
CommunityOriginEnumThe origin or source of the communityENGINEERED, NATURAL, SYNTHETIC
ComputationalPredictionTypeEnumCategory of computational method that produced a predicted claim. Used to make model-derived evidence (e.g. cross-feeding predicted from a genome-scale metabolic model) queryable rather than buried in free text. Populate ComputationalProvenance.prediction_type when EvidenceItem.evidence_source is COMPUTATIONAL.FLUX_BALANCE_ANALYSIS, GENOME_SCALE_METABOLIC_MODEL, MACHINE_LEARNING, METABOLIC_INTERACTION_SIMULATION, OTHER, PHYLOGENETIC_INFERENCE, POPULATION_DYNAMIC_MODEL, SEQUENCE_HOMOLOGY, STATISTICAL_INFERENCE, THERMODYNAMIC
CultivationModeEnumOperating mode / approach used to cultivate the community. Standardized terms maintained in vocab/cultivation_terms.yaml (kept in sync by tests/test_cultivation_vocab_sync.py) and staged for a METPO proposal.BATCH, CHEMOSTAT, CONTINUOUS, FED_BATCH, OTHER, PERFUSION, RETENTOSTAT, SEMI_CONTINUOUS, SEQUENCING_BATCH, TURBIDOSTAT
CultivationSystemEnumInstrumentation / vessel system used to grow the community. Standardized terms maintained in vocab/cultivation_terms.yaml (kept in sync by tests/test_cultivation_vocab_sync.py) and staged for a METPO proposal.BIOELECTROCHEMICAL_SYSTEM, BIOREACTOR_UNSPECIFIED, CHEMOSTAT_VESSEL, FLASK, GAS_LIFT_REACTOR, HOLLOW_FIBER_REACTOR, MEMBRANE_BIOREACTOR, MICROBIAL_FUEL_CELL, MICROFLUIDIC_DEVICE, OTHER, PACKED_BED_REACTOR, PHOTOBIOREACTOR, SERUM_BOTTLE, STIRRED_TANK_BIOREACTOR
CultureCollectionEnumMajor microbial culture collections worldwideATCC, BCRC, CBS, CCUG, CGMCC, CIP, DSM, JCM, KCTC, LMG, NBRC, NCIMB, NCTC, OTHER, PCC, VKM
EcologicalStateEnumThe ecological or health state of the communityENGINEERED, PERTURBED, STABLE, TRANSIENT
EvidenceItemSupportEnumHow the cited reference relates to the curated claim. Distinct from the validity of the claim itself: REFUTE means the cited paper actively contradicts the claim, while WRONG_STATEMENT means the cited paper is misattributed (it does not address the claim).NO_EVIDENCE, PARTIAL, REFUTE, SUPPORT, WRONG_STATEMENT
EvidenceSourceEnumThe provenance/source of the evidenceCOMPUTATIONAL, DATABASE, EXPERT_OPINION, FIELD_STUDY, IN_VITRO, IN_VIVO, LABORATORY, LONG_TERM_MONITORING, MESOCOSM, META_ANALYSIS, OTHER, REMOTE_SENSING, REVIEW
ExternalResourceRepositoryEnumExternal repositories and platforms that host community model resourcesBIGG, BIOMODELS, GITHUB, KBASE, MODELSEED, OTHER, VMH
FunctionalRoleEnumFunctional role in the communityCROSS_FEEDER, ELECTROGEN, ELECTRON_ACCEPTOR, ELECTRON_DONOR, ELECTROTROPH, LYTIC_PHAGE, NITROGEN_FIXING_SYMBIONT, PATHOGEN_ANTAGONIST, PRIMARY_DEGRADER, PRIMARY_PRODUCER, SECONDARY_FERMENTER, SYNTROPHIC_PARTNER
GtdbGroundingStatusEnumWhy a taxon does or does not carry a gtdb_classification. Absence alone cannot say: a virus GTDB will never classify, an NCBI taxon GTDB splits with no majority, and a taxon nobody has grounded yet all look identical as a missing block (#294). Only NOT_ATTEMPTED is unambiguously outstanding work — 0 taxa since #401 closed the last nine, against the 317 that a missing block implies. How much of UNRESOLVED is final rather than a tool limitation is not yet determined (#393). Exact counts live in `.claude/skills/ground-taxa-gtdb/SKILL.md` and in the tests rather than here, because a description baked into the generated datamodel goes stale every time the KB is swept.AMBIGUOUS, GROUNDED, NOT_ATTEMPTED, NO_GTDB_EQUIVALENT, UNRESOLVED, WITHHELD
InteractionScopeEnumWhether an interaction is a pairwise organism-to-organism edge or a community-level phenomenonCOMMUNITY_LEVEL, PAIRWISE
InteractionTypeEnumType of ecological interaction between organismsCOLONIZATION_FACILITATION, COMMENSALISM, COMPETITION, COMPETITIVE_RELEASE, CROSS_FEEDING, KILL_THE_WINNER, LYSOGENIC_INFECTION, LYTIC_INFECTION, MUTUALISM, NICHE_PARTITIONING, PREDATION, STRAIN_COMPETITION, SYNTROPHY
MediaRelationshipEnumType of relationship between a microbial community and a growth medium. Distinguishes actual cultivation media from environmentally related media.CULTIVATION_MEDIUM, ENVIRONMENT_ANALOG, ISOLATION_MEDIUM, REFERENCED_IN_STUDY, SELECTIVE_ENRICHMENT
MetalElementEnumMetal elements relevant to microbial communitiesCHROMIUM, COBALT, COPPER, GALLIUM, GOLD, INDIUM, IRON, LEAD, LITHIUM, MERCURY, NICKEL, PALLADIUM, SILVER, TITANIUM, URANIUM, VANADIUM, ZINC
MetalRelevanceEnumRelevance of metals/REE to community functionINCIDENTAL, NOT_APPLICABLE, PRIMARY, SIGNIFICANT
PotentialUnitEnumUnit for `applied_potential`. The unit only: the reference electrode a potential is quoted against ("vs SHE", "vs Ag/AgCl") is not a unit and belongs in `electrode_detail`, where it can be stated in full (#514).V, mV
RareEarthElementEnumRare earth elements (lanthanides + Y, Sc)CERIUM, DYSPROSIUM, ERBIUM, EUROPIUM, GADOLINIUM, HOLMIUM, LANTHANUM, LUTETIUM, NEODYMIUM, PRASEODYMIUM, SAMARIUM, SCANDIUM, TERBIUM, THULIUM, YTTERBIUM, YTTRIUM
RateUnitEnumUnit for `feed_or_dilution_rate`. Two shapes are legitimate here: a dilution rate is a reciprocal time, a feed rate is a volume per time, and the slot carries both (#514).1/d, 1/h, L/day, mL/min
RetentionTimeTypeEnumWhich retention time `retention_time` reports. Not a unit, but the same drift: the slot description has always said "HRT" or "SRT", and a record still arrived saying HYDRAULIC because nothing checked (#514).HRT, SRT
TemperatureUnitEnumUnit for `operating_temperature`. Symbols, matching how the corpus already writes them, rather than SCREAMING_CASE names (#514).K, °C
TimeUnitEnumUnit for a duration slot such as `retention_time`. Symbols, matching how the corpus already writes them (#514).d, h, min
VolumeUnitEnumUnit for a volume slot such as `working_volume` (#514).L, mL, uL