Skip to main content

Quality issue types

python scripts/builder.py analyze-quality emits one row per finding. Codes live in ISSUE_PRIORITY_MAP in scripts/builder.py. Enrichment-track codes are listed in ENRICHMENT_ISSUE_TYPES / ENRICHMENT_ISSUE_PREFIXES in scripts/constants.py — they are reported but do not fail the CI regression guard.

Integrity-track CRITICAL and IMPORTANT counts must not grow (dataquality/baseline_counts.json). How to fix reports: metadata-quality.md.

CRITICAL (integrity)​

CodeFix
MISSING_REQUIRED_FIELDAdd the core schema field (id, uid, name, link, catalog_type, status, software, owner). Missing access_mode and coverage are reported separately as MISSING_ACCESS_MODE / MISSING_COVERAGE.
INVALID_URLSet link to a valid http/https URL
INVALID_OWNER_URLFix owner.link
INVALID_ENDPOINT_URLFix endpoints[].url
INVALID_UIDRun python scripts/builder.py assign; do not invent UIDs
INVALID_IDMake id match the filename (lowercase letters and digits)
CATALOG_SOFTWARE_MISMATCHAlign catalog_type with software.category, or retag software.id
DUPLICATE_RECORD_IDMerge or rename colliding id values
INVALID_NESTED_TYPERestore a single type on nested leaves: quote 'NO' (Norway), M49 ids ('155'), and numeric tags ('911'); tags are strings not {tag: ...} maps; dataset_count_reported is an integer

IMPORTANT (integrity)​

CodeFix
MISSING_OWNER_NAMESet owner.name
MISSING_OWNER_TYPESet canonical owner.type from data/reference/owner_types.yaml
INVALID_OWNER_TYPEReplace illegal owner.type with a canonical value
MISSING_OWNER_LOCATIONSet owner.location.country.{id,name}
OWNER_LOCATION_SUBREGION_REQUIREDRegional/local owners: owner.location.level 30+ and a subregion
OWNER_SUBREGION_FEDERAL_DIRECTORY_MISMATCHMove regional/local catalogs out of Federal/ into a subregion folder
MISSING_COVERAGEAdd at least one coverage[].location.country
COVERAGE_NORMALIZATIONNormalize country / macroregion ids and names
PLACEHOLDER_CATALOG_TYPEReplace placeholder catalog_type
PLACEHOLDER_STATUSReplace placeholder status
PLACEHOLDER_SOFTWAREReplace placeholder software with a real software.id or custom
INCOMPLETE_IDENTIFIEREach identifier needs id and value
INCONSISTENT_LICENSEAlign rights.license_id / license_name / license_url
API_STATUS_MISMATCHIf api is true, set a coherent api_status
COVERAGE_LEVEL_NONSTANDARDSet coverage[].location.level to 10, 20, 30, 40, 50, or 60. Level 0, 1, and 2 are not in the vocabulary
OWNER_LEVEL_MISSINGCentral and federal owners need owner.location.level (usually 20). Regional and local owners are covered by OWNER_LOCATION_SUBREGION_REQUIRED
GOV_COVERAGE_COUNTRY_MISMATCHA government owner whose coverage is a single sovereign country must use that same country. Multi-country coverage and supranational coverage ids (World, EU, Africa, …) are not flagged
MISSING_API_STATUSSet api_status when api: true
MISSING_ENDPOINTSAdd at least one endpoints[] entry when api: true
SOFTWARE_ID_UNKNOWNUse an id from data/software/ or custom
SOFTWARE_NAME_MISMATCHMatch software.name to the software definition
STATUS_DIRECTORY_MISMATCHScheduled records belong under data/scheduled/; verified under data/entities/
SUBREGION_INVALID_ISO3166_2Use a valid ISO 3166-2 subregion id
SUBREGION_UNK_PLACEHOLDERReplace UNK / placeholder subregion codes
UNKNOWN_COUNTRY_OR_MACROREGIONReplace Unknown country or macroregion
INVALID_ACCESS_MODEUse values from data/reference/access_modes.yaml
INVALID_CATALOG_TYPEUse values from data/reference/catalog_types.yaml
INVALID_STATUSUse active, inactive, scheduled, or deprecated
CATALOG_TYPE_DIRECTORY_MISMATCHMove the file into the type folder that matches catalog_type
DUPLICATE_LINKKeep one record for the exact same link
DUPLICATE_LINK_NORMALIZEDKeep one record after URL canonicalization (https, no www, no trailing slash)

MEDIUM​

CodeTrackFix
MISSING_DESCRIPTIONEnrichmentAdd a short description
SHORT_DESCRIPTIONEnrichmentExpand descriptions shorter than the quality threshold
MISSING_LANGSEnrichmentAdd langs as {id, name} (e.g. EN / English)
INVALID_LANGUAGEIntegrityFix langs entries that lack id and name
MISSING_CONTENT_TYPESEnrichmentAdd content_types (e.g. dataset)
MISSING_ACCESS_MODEIntegritySet access_mode (prefer open / restricted)
TAG_HYGIENEEnrichmentNormalize messy tags
TOPIC_INCOMPLETEEnrichmentComplete topics[].{type,id,name}
STATUS_API_STATUS_MISMATCHIntegrityInactive or deprecated catalogs must not have api_status: active. An active catalog with endpoints must not have api_status: inactive
ENDPOINT_TYPE_ALIASEnrichmentReplace retired endpoints[].type names (customapi, custom_api, api, opendatasoft, geonetwork, stac, csw, oaipmh, socrata:opendata) with the preferred type
IS_NATIONAL_EXCESSEnrichmentMore than two properties.is_national: true records for the same owner country and catalog_type. Keep one current catalog and one legacy
TOPIC_TYPE_NONCANONICALEnrichmenttopics[].type must be eudatatheme or iso19115
BOILERPLATE_DESCRIPTIONEnrichmentDescription is shared by 5 or more catalogs (longer than 80 characters) or says the site is a template / “City of Ca”
RIGHTS_INCOMPLETEEnrichmentAdd license / ToS / privacy URLs when known
PLACEHOLDER_TITLEEnrichmentReplace placeholder name
PLACEHOLDER_OWNER_NAMEIntegrityReplace placeholder owner.name
INVALID_API_STATUSIntegrityUse active, inactive, or uncertain
TRUST_SCORE_OUT_OF_BOUNDSIntegrityRecalculate trust_score (0–100)
INVALID_IDENTIFIER_URLIntegrityFix identifiers[].url
INVALID_RIGHTS_URLIntegrityFix rights URLs
INVALID_CATALOG_EXPORT_URLIntegrityFix catalog_export if it is a URL
INVALID_COUNTRY_CODEIntegrityUse ISO 3166-1 alpha-2 or an allowed special root
COUNTRY_NAME_ID_MISMATCHIntegrityMatch country id to the reference name
SUBREGION_NAME_ID_MISMATCHIntegrityMatch subregion id to the reference name
OWNER_TYPE_NONCANONICALEnrichmentMap synonyms (NGO → Civil society, University → Academy)
PATH_COUNTRY_MISMATCHIntegrityDirectory country must match owner/coverage country
IS_NATIONAL_AGENCY_OR_TOPICEnrichmentSet properties.is_national: false. The flag is only for the official national catalog of that type (open-data portal, NSDI/geoportal, or NSO product), not agency/thematic/scientific/subnational catalogs. See data-model.md
SOFTWARE_EXPECTED_ENDPOINTS_MISSING_*EnrichmentAdd the harvest endpoints typical for that software.id

LOW (enrichment unless noted)​

CodeFix
MISSING_TOPICSAdd EU data themes or ISO 19115 topics
MISSING_TAGSAdd keywords (government, has_api, …)
MISSING_OWNER_LINKSet owner.link
DUPLICATE_TAGSDeduplicate tags
DUPLICATE_COVERAGERemove repeated coverage entries (same country, level, and subregion)
MISSING_CONTACT_INFOAdd owner.link on active catalogs with restricted in access_mode (there is no catalog contact field; checker: check_contact_info in scripts/builder.py)
TOPIC_SCHEMA_VIOLATIONFix topics shape (type, id, name)
LANGUAGE_NAME_NONCANONICALSet langs[].name to the English name in data/reference/langs.csv
LANGUAGE_CODE_UNKNOWNUse a code from data/reference/langs.csv (ZH for Chinese, not CN)
ACCESS_MODE_NONPREFERREDPrefer open or restricted over limited, public, protected, closed, private
CONTENT_TYPE_NONCANONICALUse a value from data/reference/content_types.yaml
MISSING_RIGHTSThe official national open-data portal (properties.is_national: true, active, access_mode: open, central or federal owner) needs rights.license_id, license_name, or license_url. Agency and thematic catalogs are not flagged

Software definition issues​

python scripts/builder.py validate-software emits its own codes for data/software/ records (they are not part of analyze-quality priorities):

CodeFix
SOFTWARE_SUBTYPE_MISSINGSet a subtype from the allowed list
SOFTWARE_SUBTYPE_INVALIDUse a subtype from data/schemes/software.json
SOFTWARE_SUBTYPE_CATEGORY_MISMATCHPick a subtype compatible with category
SOFTWARE_VERSION_FORMATUse a valid version string
SOFTWARE_INVALID_URLFix website / documentation_url / repository_url
SOFTWARE_INVALID_DATE / SOFTWARE_INVALID_DATETIMEFix date-formatted fields
SOFTWARE_INVALID_PLUGINS / SOFTWARE_INVALID_PLUGIN_ITEM / SOFTWARE_PLUGIN_MISSING_NAMEFix the plugins list shape
SOFTWARE_INVALID_CAPABILITIES / SOFTWARE_INVALID_CAPABILITY_ITEMFix the capabilities list shape
SOFTWARE_INVALID_EXPORT_FORMATS / SOFTWARE_INVALID_EXPORT_FORMAT_ITEMFix the export_formats list shape
SOFTWARE_INVALID_LICENSE / SOFTWARE_LICENSE_MISSING_TYPEGive license a valid type
SOFTWARE_FOLDER_CATEGORY_MISMATCHPut the YAML under data/software/{opendata,geo,scientific,indicators,microdata,metadata}/ matching category

validate-software also fails when data/reference/software_ids.yaml does not match data/software/ (run python scripts/builder.py sync-software-maps). metadata_support values must be strings (Yes / No / …), not booleans.

version and repository_url coverage thresholds in validate-software are scoped to OSS subtypes. SaaS viewers, CMS shells, and geospatial catalog platforms are excluded from those two denominators.