# Inference result contract Ethnicolr returns name-pattern estimates under inference contract version 1.0. The contract separates whether a model produced a probability distribution from whether Ethnicolr chose to return a label. This distinction matters because a model can score a name while abstaining from a label when the evidence is ambiguous. The contract is intended to be shared by Pranaam, Instate, Outkast, Naampy, and other name-inference packages. Each package retains its target-specific probability columns; the common columns make results interpretable and testable across packages. If an input column uses a name reserved for estimator output, Ethnicolr preserves the input under `input_`. It adds a numeric suffix when that name already exists. ## Common columns | Column | Meaning | | --- | --- | | `inference_contract_version` | Version of this result contract. | | `estimate_type` | Always `name-pattern estimate`. | | `target` | Quantity estimated, such as `race-ethnicity` or `country-origin`. | | `input_scope` | Name components used: `first-name`, `last-name`, or `full-name`. | | `predicted_label` | Highest-probability returned label, or missing after abstention. | | `predicted_probability` | Probability of `predicted_label` on a 0 to 1 scale. | | `scored` | Whether the model produced a usable probability distribution. | | `script_supported` | Whether the input script is supported. | | `abstained` | Whether the package declined to return a label. | | `abstention_reason` | Machine-readable reason for abstention. | | `model_id` | Stable identifier for the model or dictionary. | | `model_version` | Version of the package producing the estimate. | | `model_revision` | Immutable revision of every artifact used for inference. | | `reference_population` | Population represented by the training or lookup data. | | `calibration_status` | Whether and how probability calibration was validated. | | `calibration_reference` | Data population used to assess or fit calibration. | | `uncertainty_method` | Method used for uncertainty output, when requested. | | `uncertainty_level` | Requested interval, range, or coverage level. | ## Required invariants - An unscored row must abstain. - A row that does not abstain must be scored and have a predicted label and probability. - An unsupported-script row cannot be scored. - Target probabilities on a scored row must be finite, between zero and one, and sum to one, apart from documented rounding. - `predicted_probability` must equal the target probability associated with `predicted_label`. - `model_revision` must identify an immutable, complete artifact bundle. A mutable branch name such as `main` or `latest` is not a revision. - A scored row may still abstain when a package applies an uncertainty rule. In that case the probability distribution remains available but `predicted_label` is missing. ## Abstention reasons The shared vocabulary is `missing-name`, `no-letters`, `unsupported-script`, `out-of-vocabulary`, `out-of-dictionary`, `uncertain-score`, and `insufficient-evidence`. Packages may add a reason only when none of these is accurate. ## Uncertainty columns Statistical interval columns use `_lower` and `_upper`. Monte Carlo dropout summaries use `_mc_mean`, `_mc_std`, `_mc_lower`, and `_mc_upper` because their empirical quantiles are not automatically confidence intervals. ## Intended use These outputs describe patterns associated with names in a stated reference population. They do not establish a person's identity, ancestry, citizenship, religion, caste, race, or ethnicity. Do not use them for individual profiling or consequential decisions. Prefer aggregate analysis, disclose abstention and coverage, and report sensitivity to the reference population.