The missing hundred

Consider two groups of one thousand applicants. In each group, six hundred would repay a modest loan under the proposed terms. Both groups therefore begin with the same relevant base rate. Their applications enter the same digital process: document capture, evidence retrieval, risk scoring and human confirmation.

The risk model behaves identically for every applicant it receives. Among qualified applicants, it recommends approval 80 per cent of the time. Among unqualified applicants, it recommends approval 10 per cent of the time. The human confirmation rate is also identical. A model audit reports equal opportunity, equal false-positive rates and equal positive predictive value.

Yet the final process approves only 47.88 per cent of qualified people in the second group, compared with 64.98 per cent in the first. The gap arose before scoring. The evidence service built a usable file for 95 per cent of the first group and 70 per cent of the second, perhaps because one route supplied machine-readable payslips while the other relied on photographed documents, translated records or fragmented employment histories.

The central answer is that fairness is a property of a decision, population and path through a system. A component metric is evidence about one conditional slice. It becomes misleading when the slice silently excludes people lost upstream, treated differently downstream or denied a usable remedy.

Opening case
The disappearing denominator Two equally qualified populations enter a four-stage pipeline. The second group loses more people at evidence capture, while later conditional rates remain equal. Equal model metrics can hide unequal reach Synthetic expected counts from two populations of 1,000, each with 600 qualified people Atlas Beacon Eligible qualifiedEvidence availableRetrievedFinal positive 600100% denominator 57095% pass 51390% pass 39064.98% end-to-end 600100% denominator 42070% pass 37890% pass 28747.88% end-to-end model parity, pipeline ratio 0.737 equal conditional pass rate disparity introduced
Figure 1. The disappearing denominator. Synthetic expected counts. Both groups have the same number of qualified people and identical retrieval, model and review rates. Evidence capture alone creates the final opportunity gap.
Part I
The argument in one passChart · flow
flowchart TD
  A["The missing hundred"] --> B["On this page"]
  B --> C["The model is one gate"]
  C --> D["Fairness metrics are policy<br/>choices expressed as equations"]
  D -. "re-test" .-> A
  classDef first fill:#0a1424,stroke:#D95545,stroke-width:2px,color:#e6f3ff
  classDef step fill:#0a1424,stroke:#3f7da0,stroke-width:1px,color:#e6f3ff
  class A first
  class B,C,D step
A structural route through Fairness Across the Decision Pipeline, from The missing hundred to Sources. Reading use: follow the relation, then test it against the surrounding evidence and limits.

The model is one gate

Most fairness dashboards begin after a dataset has been assembled. They compare predictions with labels, split by a protected attribute, and calculate rates. Those calculations can be correct while answering a narrower question than the organisation believes.

A consequential decision usually starts earlier. Someone must know that an opportunity exists, reach an application route, satisfy an identity or eligibility screen, provide evidence in an accepted form, appear in a retrieval result, receive a score, survive a policy rule, obtain review capacity, and execute the approved outcome. An appeal or correction route may reopen the path. Every transition changes the effective population.

Causal claim

Conditional fairness does not compose automatically. A fair stage can sit inside an unfair path because each stage conditions on the survivors of earlier stages.

A serial gate has exact accounting

Let S0=1 denote membership in the in-scope population. Let Sk=1 mean that a person has passed stage k. Let Q=1 denote the legitimate positive condition, such as being able to repay under the offered terms. For group g, end-to-end opportunity through K serial gates is:

TPRgend = P(SK=1 | Q=1, A=g) = ∏k=1..K P(Sk=1 | Sk-1=1, Q=1, A=g)

The symbols do modest work. A is the group attribute used for audit; it is not presumed to cause the result. Each factor asks what fraction of qualified survivors pass the next gate. The product returns the fraction of qualified people in the original scope who receive the final positive decision.

Compare group b with reference group a. Taking logarithms turns multiplication into an additive ledger:

log(TPRbend / TPRaend) = Σk log(pk,b+ / pk,a+)

If both groups pass a stage at the same conditional rate, that stage contributes zero to the log gap. A rate ratio below one contributes a negative amount. This does not establish why the gap exists or whether it is unlawful. It prevents the gap from disappearing inside changing denominators.

Worked example: one fair model, two unequal decisions

The opening case can be read as expected counts. Begin with 10,000 people in each group, of whom 6,000 are qualified under the same ground-truth definition. Atlas supplies usable evidence for 5,700 qualified people; Beacon supplies it for 4,200. The shared retrieval process keeps 90 per cent. The model then correctly recommends 80 per cent of the qualified cases it sees, and review confirms 95 per cent of those recommendations.

Qualified-person stageAtlas survivorsBeacon survivorsConditional pass ratio, B/A
Original in-scope population6,0006,0001.000
Usable evidence5,7004,2000.737
Retrieved into decision context5,1303,7801.000
Positive model proposal4,1043,0241.000
Final positive decision3,899 expected2,873 expected1.000

Every row after evidence preserves the inherited ratio because the conditional transition is equal. The model’s audit population begins at 5,130 and 3,780, so it correctly sees identical 80 per cent true-positive rates. The decision audit begins at 6,000 and 6,000, so it sees 64.98 per cent and 47.88 per cent end-to-end opportunity.

This distinction also explains why a fairness dashboard needs both conditional and population views. Conditional rates identify the stage where behaviour differs. Population rates show the accumulated consequence. Reporting only the first can hide attrition; reporting only the second can blame the wrong component.

Mechanism
An additive disparity ledger for a multiplicative pipeline A waterfall shows the log opportunity ratio contributed by evidence, retrieval, model and review stages. Only evidence contributes to the final gap. The gap can be located without pretending it is explained Qualified-person log rate ratio, Beacon relative to Atlas +0.100.00−0.20−0.40 −0.305 Evidence Retrieval Model Review 0.737 rate ratio The ledger attributes the arithmetic gap. Causal and normative interpretation comes next.
Figure 2. An additive disparity ledger for a multiplicative pipeline. Synthetic values from the opening case. Zero contributions do not prove that a stage is harmless in other slices, only that its qualified-person pass ratio is equal here.

Thought experiment: move only the scanner

Imagine the same lender runs two branches. Every policy, model and reviewer is shared. In Branch One, applicants upload payroll PDFs directly. In Branch Two, staff photograph printed records under uneven lighting. Move only the document scanner from Branch One to Branch Two. If the opportunity gap follows the scanner, model retraining becomes an implausible first remedy.

Now keep the scanner fixed and swap applicant populations between branches. If the gap remains with the branch process, the evidence points towards channel quality or operating practice. If it follows a particular document type, the construct may be measured less reliably for people whose income is expressed that way. One causal feature changes at a time.

This experiment illustrates the lifecycle view developed by Suresh and Guttag, who distinguish sources of downstream harm across data collection, development and deployment rather than reducing bias to training data.[1] NIST likewise separates systemic, computational and statistical, and human-cognitive bias.[2]

Part II

Fairness metrics are policy choices expressed as equations

A metric does not discover fairness by itself. It formalises a particular concern using an observed population and label. The choice determines whose error matters, which comparison is relevant and what can compensate for what.

Allocation

Demographic parity compares the rate of receiving a benefit or burden. It asks who gets through, without conditioning on an outcome label.

Error burden

Equal opportunity compares true-positive rates. Equalised odds adds false-positive parity. These ask how errors are distributed among labelled cases.

Score meaning

Calibration or predictive parity asks whether the same score or positive decision carries the same observed outcome frequency across groups.

Treatment and causation

Individual or counterfactual criteria ask whether similarly situated people receive similar treatment, or whether changing a protected attribute in a causal model changes the decision.

Hardt, Price and Srebro formalised equal opportunity and equalised odds as group criteria over predictions, outcomes and a protected attribute.[3] Dwork and colleagues instead begin from a task-specific similarity metric and require similar individuals to receive similar treatment.[4] Kusner and colleagues use causal models to define counterfactual fairness.[5] These are different claims, with different informational burdens.

Let the harm choose the first metric

Metric selection becomes clearer when the decision is stated as a harm question. In a screening programme where missing a treatable condition is the dominant concern, equal opportunity may be the first group diagnostic because it compares sensitivity among people who have the condition. It does not settle whether the programme reaches both groups, whether the clinical label is measured equally, or whether false positives impose unequal follow-up burdens.

In a scarce apprenticeship programme, allocation may be the immediate policy object. Demographic parity can reveal who receives places, but it says nothing about whether the qualification construct reflects the skills the programme could develop. A representation target might be defensible as a temporary corrective policy, yet it should be described as an allocation choice rather than evidence that the score became intrinsically fair.

In a fraud queue, reviewers consume a ranked list. Exposure, false-positive burden and delay may matter more than a binary threshold measured after review. Equal average scores would be a weak control if one group’s cases are consistently placed at the top and subjected to more intrusive investigation. The correct unit may be attention minutes, holds, escalations or customer friction.

These examples show why there is no universal ordering of fairness metrics. The first metric should correspond to the first material harm, then be accompanied by checks for reach, measurement, competing errors and remedy. Formal criteria make the chosen concern testable. They do not remove the obligation to justify the concern.

Why several attractive criteria conflict

Suppose two groups have different observed base rates for the labelled outcome. A calibrated risk score means that a score of 0.2 corresponds to the same observed event rate in both groups. Equalised odds requires equal error rates at the chosen decision threshold. In general, a non-perfect score cannot satisfy all calibration and error-balance conditions when base rates differ. Kleinberg, Mullainathan and Raghavan prove a related incompatibility among three risk-score conditions; Chouldechova derives the tension for recidivism instruments.[6][7]

The impossibility result transfers the burden from optimisation to governance. A team must state which harm it is controlling and why that choice fits the decision. Selecting whichever metric looks best after training is outcome shopping.

Signature figure
Fairness trade-off surface across decision stages A contour-like field maps allocation parity against error parity. Interventions at evidence, threshold and review occupy different positions and have different consequences. The same headline parity can be purchased at different stages Illustrative fairness surface. Position is directional, not a measured benchmark. allocation parity in the original eligible population → error parity among labelled cases → T threshold patch raises reach and false positives E evidence repair restores people before scoring R review calibration reduces override asymmetry unequal allocationmore equal allocation unequal errorsmore equal errors preferred region high trade-off
Figure 3. Fairness trade-off surface across stages. Illustrative geometry. A downstream threshold change, upstream evidence repair and reviewer intervention can move similar aggregate rates while changing different people, errors and operating costs.

A serious negative control

Now give both groups identical stage treatment and identical true-positive and false-positive rates, but set observed qualification prevalence to 60 per cent in one group and 40 per cent in the other. Their final selection rates will differ. That difference may arise from historical injustice, label distortion, a legitimate scope distinction or some combination. The rate alone cannot decide which.

This is the necessary negative control for a pipeline audit: an observed disparity is not proof that the measured component caused unfair treatment. Corbett-Davies and colleagues argue that equitable system design requires context-specific consequences rather than automatic allegiance to an axiomatic metric.[8] The audit must test rival explanations, including whether the label and population represent the policy goal.

The label is already a theory

“Creditworthy”, “high potential”, “likely fraud” and “needs support” are not directly observed substances. They are constructs operationalised through measurements. Repayment may reflect product terms, income volatility, collection practices and access to refinancing. Past promotion may reflect opportunity and managerial judgement. A label can be reliable in repetition and still invalid for the construct the decision claims to measure.

Jacobs and Wallach use measurement modelling to show how mismatches between a theoretical construct and its operationalisation create fairness harms.[9] This is why changing a fairness metric cannot repair a target that encodes the wrong concept.

Part III

Where disparity enters, compounds and changes form

The pipeline view does not mean every stage deserves the same test. Each stage creates a different object and therefore a different failure mode. The useful question is: what relation should this stage preserve, and what harm follows when it does not?

System anatomy
Bias entry points across a compound decision A pipeline runs from access through data, retrieval, model, rules, review and outcome. Each stage has a distinct failure signature and evidence source. One outcome, seven distinct places to look Conceptual system boundary. The lower row names the evidence needed to test each stage. Accessreach Datameasure Retrieveexpose Modelscore Rulespermit Reviewoverride Outcomeeffect channel mixabandonmentin-scope count missingnesslabel validitymeasurement error recall by slicerank exposureauthority mix TPR and FPRcalibrationuncertainty eligibility effectpolicy versionexception rate referral mixoverride directionblind agreement executed stateappeal successlong-term effect A single model card covers only one circle in this decision.
Figure 4. Bias entry points across a compound decision. Conceptual model. Different stages require different denominators, tests and owners. An aggregate output disparity cannot identify which circle created the result.

Access and data determine who can become a case

Access failures include language, disability, device, location, timing, awareness and the cost of supplying evidence. If a service begins its denominator at “completed applications”, it treats abandonment as outside the system. That may be operationally convenient and substantively wrong.

Data then converts lives into variables. Sampling can under-represent a group. Features can measure the same construct with different error. Labels can inherit previous decisions. Aggregation can force distinct subpopulations into one relation. Buolamwini and Gebru’s intersectional evaluation of commercial gender classifiers showed how aggregate accuracy concealed far larger errors for darker-skinned women than for lighter-skinned men.[10] The enduring lesson is methodological: test intersections where the mechanism suggests different error, rather than assuming one protected axis at a time is sufficient.

Retrieval and ranking allocate evidence and attention

Retrieval is often described as a neutral prelude to reasoning. In a decision pipeline it allocates visibility. A candidate outside the top k, a policy document not retrieved, or a weak entity match cannot influence the next stage. Singh and Joachims formalise fairness in ranking as the allocation of exposure, making clear that relevance and attention are distinct quantities.[11]

For a hiring assistant, audit recall of qualified candidates before auditing the ranking of retrieved candidates. For a credit investigation, audit whether contradictory or exculpatory evidence appears with comparable probability and authority. For a language-model workflow, inspect whether context truncation, chunking or query formulation removes evidence unevenly across document types.

Models and thresholds distribute error

The model stage is where familiar group metrics are most useful. Report confusion matrices by relevant groups and intersections, calibration with uncertainty, abstention, and performance under realistic shift. Keep the score separate from the decision threshold. A score may be calibrated while the threshold creates an unacceptable error burden. Conversely, a threshold may equalise one error rate while damaging calibration or another error rate.

Removing a protected attribute is not a general solution. Other features can act as proxies, and the protected attribute may be needed to detect or correct unequal performance. The right question is whether a feature, pathway or decision rule is justified for the specific purpose, with legal and ethical review where required.

Tools and policy rules can reverse a model result

A compound system may call income calculators, identity services, sanctions screens, pricing engines or eligibility rules after scoring. These components are frequently deterministic, which makes them auditable, not automatically fair. A postcode rule, minimum document age, name-matching threshold or exception policy can have group-specific reach and consequences.

Audit the effective decision function, including rules that dominate the model. A perfectly balanced score is irrelevant when a later rule rejects all applicants with a form of evidence concentrated in one group.

Human review changes the joint system

Human oversight can catch model errors, interpret context and preserve accountable judgement. It can also introduce anchoring, automation bias, inconsistency, capacity constraints and differential willingness to override. Green and Chen’s work on algorithm-in-the-loop decision making centres the actual interaction between people and risk assessments rather than assuming the human is a corrective oracle.[12]

Measure who is referred to review, what evidence reviewers see, override direction, time spent, requests for more information, agreement on blind cases and outcomes after appeal. If one group reaches review mostly through borderline adverse cases while another reaches it through random quality sampling, raw override rates are not comparable.

Human-machine system
Review can repair, preserve or amplify disparity A decision tree shows cases routed to automatic acceptance, human review or rejection. Different referral mixes and override propensities change final outcomes. “Human in the loop” names a location, not a guarantee Illustrative review topology. Every branch needs a denominator and an observed postcondition. model proposalscore, uncertainty, cited evidence automatic positiveonly within authorised range independent reviewaccept, amend, reject, seek evidence adverse proposalreason, notice, contest route Audit:• group-specific route rate• false negatives in random sample Audit:• evidence opened before decision• override direction and blind agreement Audit:• reason fidelity and execution• appeal and correction outcome
Figure 5. Review can repair, preserve or amplify disparity. Illustrative topology. Fairness depends on referral, information presentation, reviewer action and the executed outcome, not on the mere presence of a human.

Intersections, uncertainty and missing group data

Single-axis averages can conceal a mechanism concentrated at an intersection. Document extraction may work well across gender in aggregate and across language in aggregate, yet fail for older applicants using one language through a low-resolution mobile channel. The relevant slice is suggested by the failure mechanism, not by an unlimited search for the worst cell.

Intersectional analysis creates a statistical burden. As cells shrink, point estimates become unstable and the apparent worst group changes across samples. Report raw counts, intervals and suppression rules. Use hierarchical or pooled estimates where appropriate, but retain the distinction between a modelling assumption and observed evidence. A small group deserves protection; it does not deserve a confident percentage invented from three cases.

Protected attributes may be unavailable, inaccurate or restricted. That limitation should be recorded in the assurance case. Operational slices such as channel, evidence type, disability accommodation request, language route or service location can reveal quality-of-service mechanisms, but they are not substitutes for every protected group. Proxy inference can create fresh privacy and classification harms. Where direct fairness measurement is lawful and necessary, sensitive attributes should be purpose-bound, access-controlled and separated from operational decision use.

Selbst and colleagues warn that abstraction can detach a technical fairness solution from the social system in which it acts.[15] The practical response is not to abandon metrics. It is to bind each metric to the institutional process, people and remedy it is meant to improve.

Outcome and remedy complete the path

An approval that never reaches the system of record is not a benefit. An adverse decision with an inaccessible appeal route is not fully characterised by its initial confusion matrix. Observe execution, pricing or terms, delay, abandonment after approval, appeals, corrections and downstream outcomes. Where the decision changes future data, monitor feedback loops: previous denials can reduce later evidence, opportunity or labels.

Thought experiment: two routes to the same parity

Return to the opening case. Intervention A repairs evidence capture for the second group from 70 to 95 per cent. Intervention B leaves evidence capture untouched but lowers the downstream threshold so that every qualified person who reaches the model is approved, while false positives rise from 10 to 18 per cent at the model stage.

The threshold patch improves the final selection ratio, yet it cannot recover people whose evidence never entered the model. It also raises the second group’s end-to-end false-positive rate above the first and lowers positive predictive value. The upstream repair restores opportunity without purchasing parity through extra erroneous approvals. Equal-looking output rates can encode different causal stories and different people harmed.

Intervention comparison
Upstream repair and downstream compensation diverge Three trajectories compare the baseline, an evidence repair and a threshold patch on end-to-end true-positive and false-positive rates. Fixing reach and compensating after exclusion are not equivalent Synthetic rates from the executable audit 0%20%40%60%80% baseline 47.88 TPR5.99 FPR evidence repair 64.98 TPR8.12 FPR threshold patch 59.85 TPR10.77 FPR qualified pass rate unqualified pass rate
Figure 6. Upstream repair and downstream compensation diverge. Synthetic values. The threshold patch approaches the target true-positive rate only by increasing false positives, and still cannot reach people excluded before the model.
Part IV
How the claim changes under pressureChart · state
stateDiagram-v2
  [*] --> Claim
  state "A serial gate has exact accounting" as Claim
  state "Worked example: one fair<br/>model, two unequal decisions" as Test
  state "Thought experiment, move only<br/>the scanner" as Revision
  Claim --> Test: expose mechanism
  Test --> Decision: evidence survives
  Test --> Revision: rival survives
  Revision --> Claim: narrow or rebuild
  Decision --> [*]
The revision loop begins with A serial gate has exact accounting and keeps counterexamples inside the reasoning path. Reading use: follow the relation, then test it against the surrounding evidence and limits.

Audit the decision, then choose the intervention

An end-to-end fairness programme needs more than a longer metric dashboard. It needs an explicit contract that fixes the meaning of the claim before results are inspected, plus evidence that lets a reviewer trace disparity to stages without mistaking arithmetic attribution for causal proof.

The fairness contract

The contract is a small governance artefact. It should be approved by the decision owner, domain and legal or policy specialists, measurement experts, system builders and people able to represent affected experience. At minimum it records:

  1. Decision and authority. What benefit, burden, rank, price, route or escalation is being decided, and who remains accountable?
  2. Population and denominator. Who could reasonably be affected, who enters each stage, and which exclusions are intentional?
  3. Construct and label. What property is the system trying to estimate, how is it observed, and where can measurement differ?
  4. Harm and fairness claim. Which allocation, error, exposure, treatment, quality-of-service or remedy concern is primary?
  5. Groups and intersections. Which legally or ethically relevant slices can be measured lawfully and with adequate statistical power?
  6. Metric and threshold. Which quantity operationalises the concern, what uncertainty is acceptable, and which criteria are deliberately not being guaranteed?
  7. Path and intervention point. Which stages can create or amplify the harm, and which owner can change each one?
  8. Monitoring and remedy. What outcome, appeal, complaint, drift or incident evidence can invalidate the release claim?

NIST’s AI Risk Management Framework recommends context-specific fairness measures, disaggregation, intersectional analysis and lifecycle attention, while warning that a system with harmful bias mitigated is not necessarily fair.[13] Raji and colleagues similarly frame internal algorithmic auditing as an end-to-end organisational process whose stage records combine into an audit report.[14]

Decision instrument
A fairness contract connects values to release evidence A layered lens connects decision purpose, population and harm to metrics, stage evidence, intervention and release authority. A metric earns authority only through a declared contract Conceptual release instrument 1. Decision, population, authority 2. Construct, harm, affected groups 3. Metric, stage, uncertainty claim eligible for release only when evidence supports the declared scope • end-to-end and conditional measures • competing explanation and negative control expiry, withdrawal, remedy and revalidation Outer layers cannot be inferred from the inner metric.
Figure 7. A fairness contract connects values to release evidence. Conceptual instrument. Metrics sit inside decisions, constructs and authority. Monitoring, expiry and remedy remain part of the claim.

Run the audit in six passes

First, map the path. Start from the affected population and draw every gate, branch, retry, review queue, action and appeal. Name the authoritative record for each transition. A diagram without event counts is architecture; the audit needs both.

Second, preserve denominators. Record the original in-scope count and the survivor count by stage, group and relevant outcome label. Missing protected attributes, lawful-use constraints and small samples become visible limitations rather than silent blanks. Do not infer sensitive attributes merely to make a dashboard complete.

Third, measure stage relations. For each gate, compare reach, missingness, quality, exposure, TPR, FPR, calibration, abstention, rule effect, referral and override as appropriate. Report confidence intervals and raw counts. A percentage based on twelve cases should not carry the same authority as one based on twelve thousand.

Fourth, reconnect the outcome. Calculate end-to-end allocation and error from the original denominator. Verify executed state, terms, delay and remedy. Compare predicted fairness with observed operating outcomes.

Fifth, test explanations. Swap channels, replay cases under alternative evidence, blind reviewers, perturb ranking position, remove a disputed feature, hold qualification constant, or randomise a non-material presentation detail. Each intervention should separate at least two plausible causal stories.

Sixth, release a bounded claim. State which metric, groups, stages, time window and decision configuration the evidence supports. Name defeaters, monitoring limits and the owner authorised to pause or change the process.

A production-shaped credit case

A lender wants to audit a credit-assist workflow. The system ingests applications and documents, extracts income, retrieves bureau and internal records, calculates affordability, generates a risk recommendation, applies policy rules, assembles reasons and routes exceptions to an underwriter. The final decision is written to the origination platform and can be reconsidered when the applicant supplies corrected evidence.

The fairness contract sets the original denominator as complete expressions of interest meeting product scope, not only scored applications. The primary concern is opportunity among applicants who would satisfy policy under accurate evidence. Secondary concerns are false approvals, pricing differences, time to decision and reason fidelity. The audit disaggregates by lawful protected groups and by operational slices such as channel, document type and employment pattern.

The first result shows equal model TPR among scored cases. The stage ledger shows lower income-extraction success for photographed records and a higher exception-queue abandonment rate for applicants asked to resubmit evidence. Blind replay with corrected extraction removes most of the opportunity gap. A threshold intervention improves headline approvals but increases false approvals and fails to reach abandoned applicants.

The architecture decision changes. The lender funds document-quality detection, a supported resubmission path and queue service levels before changing the model threshold. It adds an end-to-end opportunity metric, an extraction-quality metric and a remedy completion metric to release evidence. Model parity remains useful, but it no longer stands in for the process.

Monitor the path after release

Pre-release evaluation freezes a population and process long enough to measure them. Production changes both. Channel mix shifts, document formats change, a policy rule is amended, review queues age and applicants adapt to requests. Fairness monitoring therefore needs leading indicators from the path as well as lagging outcome measures.

Track stage coverage, missingness, extraction confidence, retrieval recall samples, score and uncertainty distributions, rule-trigger frequency, referral rate, queue time, override direction, executed decisions, terms, appeals and corrections. Compare them by the groups and operational slices named in the contract. A sudden gap in evidence completion may be more actionable than waiting for quarterly approval rates to move.

Monitoring also needs stable controls. Keep randomly sampled cases that bypass risk-based selection, because a model-selected review stream cannot estimate its own false negatives. Re-run fixed positive, negative and boundary cases after component changes. Preserve versioned policy, model, retrieval and interface identifiers so that a disparity can be reconstructed rather than debated from screenshots.

Triggers should connect to authority. A threshold breach can pause one route, widen human review, disable a document parser, revert a ranking change or start a lookback. The response should fit the suspected stage. A global model rollback is a poor remedy for a broken scanner, and an interface adjustment cannot correct an invalid label. Monitoring earns control status only when someone can act on what it detects.

The executable disparity ledger

The companion Python artefact implements the opening case using only the standard library. It calculates conditional model metrics, end-to-end metrics and the additive log-rate ledger. It includes a positive case that repairs evidence capture, a negative case that attempts downstream threshold compensation, and an attribution control with identical stage treatment but different qualification prevalence.

Save the code as fairness_pipeline_audit.py and run python3 fairness_pipeline_audit.py. All names, rates and outcomes are synthetic. The assertions are the important part: model parity must coexist with a large end-to-end gap; the ledger must reconstruct that gap; upstream repair must close it; threshold compensation must leave a residual and raise false positives.

Open the complete runnable Python artefact
"""Synthetic fairness pipeline audit for 'Fairness Across the Decision Pipeline'.

Python 3.10+. Standard library only.
All names, rates and outcomes are synthetic teaching fixtures.

The lab demonstrates three claims:
1. A model can have equal conditional TPR/FPR while the end-to-end decision does not.
2. In a serial gate, group disparity decomposes exactly across stage transition ratios.
3. A downstream threshold patch cannot recover people excluded upstream and can worsen FPR.
"""

from __future__ import annotations

from dataclasses import dataclass, replace
from math import exp, log
from typing import Iterable


@dataclass(frozen=True)
class Rates:
    """Pass probabilities for qualified (+) and unqualified (-) people."""

    qualified: float
    unqualified: float

    def validate(self) -> None:
        for value in (self.qualified, self.unqualified):
            if not 0.0 <= value <= 1.0:
                raise ValueError(f"rate outside [0, 1]: {value}")


@dataclass(frozen=True)
class GroupPipeline:
    name: str
    population: int
    qualified_prevalence: float
    evidence: Rates
    retrieval: Rates
    model: Rates
    review: Rates

    def validate(self) -> None:
        if self.population <= 0:
            raise ValueError("population must be positive")
        if not 0.0 <= self.qualified_prevalence <= 1.0:
            raise ValueError("qualified_prevalence must be in [0, 1]")
        for stage in self.stages():
            stage[1].validate()

    def stages(self) -> tuple[tuple[str, Rates], ...]:
        return (
            ("evidence", self.evidence),
            ("retrieval", self.retrieval),
            ("model", self.model),
            ("review", self.review),
        )


@dataclass(frozen=True)
class Metrics:
    end_to_end_tpr: float
    end_to_end_fpr: float
    selection_rate: float
    positive_predictive_value: float
    model_conditional_tpr: float
    model_conditional_fpr: float


def product(values: Iterable[float]) -> float:
    result = 1.0
    for value in values:
        result *= value
    return result


def evaluate(group: GroupPipeline) -> Metrics:
    group.validate()
    tpr = product(stage.qualified for _, stage in group.stages())
    fpr = product(stage.unqualified for _, stage in group.stages())
    prevalence = group.qualified_prevalence
    selection = prevalence * tpr + (1.0 - prevalence) * fpr
    ppv = (prevalence * tpr / selection) if selection else 0.0
    return Metrics(
        end_to_end_tpr=tpr,
        end_to_end_fpr=fpr,
        selection_rate=selection,
        positive_predictive_value=ppv,
        model_conditional_tpr=group.model.qualified,
        model_conditional_fpr=group.model.unqualified,
    )


def disparity_ledger(reference: GroupPipeline, comparison: GroupPipeline) -> list[tuple[str, float]]:
    """Return additive log-rate contributions for qualified people.

    For a serial gate:
      log(TPR_comparison / TPR_reference)
        = sum_k log(pass_k_comparison / pass_k_reference)
    """

    rows: list[tuple[str, float]] = []
    for (name_a, rate_a), (name_b, rate_b) in zip(reference.stages(), comparison.stages()):
        if name_a != name_b:
            raise ValueError("stage mismatch")
        if rate_a.qualified == 0.0 or rate_b.qualified == 0.0:
            raise ValueError("log ledger requires non-zero qualified pass rates")
        rows.append((name_a, log(rate_b.qualified / rate_a.qualified)))
    return rows


def pct(value: float) -> str:
    return f"{100.0 * value:6.2f}%"


def print_comparison(title: str, atlas: GroupPipeline, beacon: GroupPipeline) -> None:
    a = evaluate(atlas)
    b = evaluate(beacon)
    print(f"\n{title}")
    print("metric                         Atlas     Beacon    B/A")
    print("-" * 58)
    rows = (
        ("model TPR, conditional", a.model_conditional_tpr, b.model_conditional_tpr),
        ("model FPR, conditional", a.model_conditional_fpr, b.model_conditional_fpr),
        ("end-to-end TPR", a.end_to_end_tpr, b.end_to_end_tpr),
        ("end-to-end FPR", a.end_to_end_fpr, b.end_to_end_fpr),
        ("final selection rate", a.selection_rate, b.selection_rate),
        ("positive predictive value", a.positive_predictive_value, b.positive_predictive_value),
    )
    for label, x, y in rows:
        ratio = y / x if x else float("nan")
        print(f"{label:29} {pct(x)}  {pct(y)}  {ratio:5.3f}")


BASE_ATLAS = GroupPipeline(
    name="Atlas",
    population=10_000,
    qualified_prevalence=0.60,
    evidence=Rates(qualified=0.95, unqualified=0.95),
    retrieval=Rates(qualified=0.90, unqualified=0.90),
    model=Rates(qualified=0.80, unqualified=0.10),
    review=Rates(qualified=0.95, unqualified=0.95),
)

BASE_BEACON = GroupPipeline(
    name="Beacon",
    population=10_000,
    qualified_prevalence=0.60,
    evidence=Rates(qualified=0.70, unqualified=0.70),
    retrieval=Rates(qualified=0.90, unqualified=0.90),
    model=Rates(qualified=0.80, unqualified=0.10),
    review=Rates(qualified=0.95, unqualified=0.95),
)


def main() -> None:
    print_comparison("BASE CASE: model parity, pipeline disparity", BASE_ATLAS, BASE_BEACON)

    ledger = disparity_ledger(BASE_ATLAS, BASE_BEACON)
    total_log_gap = sum(value for _, value in ledger)
    observed_ratio = evaluate(BASE_BEACON).end_to_end_tpr / evaluate(BASE_ATLAS).end_to_end_tpr
    reconstructed_ratio = exp(total_log_gap)

    print("\nqualified-person disparity ledger (log rate ratio, Beacon / Atlas)")
    for stage, contribution in ledger:
        print(f"  {stage:10} {contribution:+.4f}")
    print(f"  {'total':10} {total_log_gap:+.4f}  -> rate ratio {reconstructed_ratio:.3f}")

    # Positive case: repair the upstream evidence channel rather than only the model.
    repaired = replace(BASE_BEACON, evidence=Rates(qualified=0.95, unqualified=0.95))
    print_comparison("POSITIVE CASE: upstream evidence repair", BASE_ATLAS, repaired)

    # Negative case: compensate downstream. It cannot recover people never observed.
    patched = replace(BASE_BEACON, model=Rates(qualified=1.00, unqualified=0.18))
    print_comparison("NEGATIVE CASE: downstream threshold patch", BASE_ATLAS, patched)

    # Attribution negative control: equal treatment with different prevalence can still
    # create a demographic-parity gap. A rate gap alone is not proof of unfairness.
    prevalence_control = replace(BASE_ATLAS, name="Beacon-control", qualified_prevalence=0.40)
    print_comparison(
        "ATTRIBUTION CONTROL: identical stages, different qualified prevalence",
        BASE_ATLAS,
        prevalence_control,
    )

    # Assertions turn the article's claims into executable checks.
    a = evaluate(BASE_ATLAS)
    b = evaluate(BASE_BEACON)
    p = evaluate(patched)
    r = evaluate(repaired)
    c = evaluate(prevalence_control)

    assert a.model_conditional_tpr == b.model_conditional_tpr
    assert a.model_conditional_fpr == b.model_conditional_fpr
    assert b.end_to_end_tpr / a.end_to_end_tpr < 0.75
    assert abs(observed_ratio - reconstructed_ratio) < 1e-12
    assert abs(r.end_to_end_tpr - a.end_to_end_tpr) < 1e-12
    assert p.end_to_end_tpr < a.end_to_end_tpr  # excluded people remain unrecoverable
    assert p.end_to_end_fpr > a.end_to_end_fpr  # compensation raises false positives
    assert abs(c.end_to_end_tpr - a.end_to_end_tpr) < 1e-12
    assert c.selection_rate != a.selection_rate

    print("\nAll assertions passed.")


if __name__ == "__main__":
    main()
Open the recorded expected output
BASE CASE: model parity, pipeline disparity metric Atlas Beacon B/A ---------------------------------------------------------- model TPR, conditional 80.00% 80.00% 1.000 model FPR, conditional 10.00% 10.00% 1.000 end-to-end TPR 64.98% 47.88% 0.737 end-to-end FPR 8.12% 5.99% 0.737 final selection rate 42.24% 31.12% 0.737 positive predictive value 92.31% 92.31% 1.000 qualified-person disparity ledger (log rate ratio, Beacon / Atlas) evidence -0.3054 retrieval +0.0000 model +0.0000 review +0.0000 total -0.3054 -> rate ratio 0.737 POSITIVE CASE: upstream evidence repair metric Atlas Beacon B/A ---------------------------------------------------------- model TPR, conditional 80.00% 80.00% 1.000 model FPR, conditional 10.00% 10.00% 1.000 end-to-end TPR 64.98% 64.98% 1.000 end-to-end FPR 8.12% 8.12% 1.000 final selection rate 42.24% 42.24% 1.000 positive predictive value 92.31% 92.31% 1.000 NEGATIVE CASE: downstream threshold patch metric Atlas Beacon B/A ---------------------------------------------------------- model TPR, conditional 80.00% 100.00% 1.250 model FPR, conditional 10.00% 18.00% 1.800 end-to-end TPR 64.98% 59.85% 0.921 end-to-end FPR 8.12% 10.77% 1.326 final selection rate 42.24% 40.22% 0.952 positive predictive value 92.31% 89.29% 0.967 ATTRIBUTION CONTROL: identical stages, different qualified prevalence metric Atlas Beacon B/A ---------------------------------------------------------- model TPR, conditional 80.00% 80.00% 1.000 model FPR, conditional 10.00% 10.00% 1.000 end-to-end TPR 64.98% 64.98% 1.000 end-to-end FPR 8.12% 8.12% 1.000 final selection rate 42.24% 30.87% 0.731 positive predictive value 92.31% 84.21% 0.912 All assertions passed.

Decision instrument: where to test next

Observed patternFirst credible stageDiscriminating testPreferred first response
Model metrics equal, final opportunity unequalAccess, evidence, retrieval or reviewRecalculate from original denominator; replay lost casesRepair earliest unequal transition before threshold tuning
Equal selection, unequal false-positive harmThreshold or labelCompare confusion matrices and consequence by groupChoose harm-specific constraint; improve measurement or model
Scores calibrated, error rates unequalMetric choice under different base ratesQuantify incompatibility and policy consequencesDocument the chosen criterion and rejected trade-off
Offline parity, production disparityShift, route, tool or human interactionTrace stage mix and executed outcomes in productionUpdate deployment design and monitoring, not only training
Aggregate parity, intersectional failureRepresentation or evaluation designTest mechanism-relevant intersections with uncertaintyCollect better evidence; avoid unstable conclusions from tiny cells
High override disparityReferral mix, interface or reviewer practiceBlind review, case-mix adjustment, evidence-opening analysisCalibrate review and redesign information presentation
Selection disparity with equal stage treatmentBase rate, construct, policy scope or upstream societyMeasurement validation and causal or policy analysisDo not declare the component discriminatory from rate alone
Release gate
A bounded fairness release claim A release gate accepts a fairness claim only when population, metric, stage evidence, competing explanation, remedy and monitoring are present. Release the claim with its boundary and withdrawal path Conceptual assurance flow populationand decision metric anduncertainty stage andoutcome evidence rival accounttested remedy andmonitoring bounded release claim valid for named groups, path, version and time pause, correct, compensate or withdraw when a defeater, incident or drift trigger appears
Figure 8. A bounded fairness release claim. Conceptual assurance flow. The result is neither “the model is fair” nor permanent certification. It is a versioned claim with evidence, limits and authority to act when the claim stops holding.

Failure boundary

Where the mechanism stops helping

The multiplicative ledger is exact for a serial gate whose stages and denominators are observed. It is insufficient for feedback loops, dynamic pricing, strategic behaviour, network effects, repeated decisions, branch-and-rejoin workflows or cases where the protected attribute and qualification label are missing or measured differently. In those systems, use event-level path analysis, causal models, longitudinal outcomes and policy evaluation. Do not force a neat stage contribution onto an unidentified process.

Even in a serial path, the ledger attributes the numerical gap, not moral blame or legal causation. A low stage ratio may reflect an unjust barrier, a justified safety requirement, label error, different demand, selective missingness or an upstream inequality beyond the current system’s control. The organisation still has to decide which effects it has a duty and ability to change.

The strongest observation against the pipeline approach would be consistent evidence that model-level measures predict end-to-end outcomes after upstream coverage, downstream rules and human review change. In that environment, the extra ledger may add little. High-consequence systems rarely earn that shortcut without first measuring the path.

Compact glossary
Demographic parity
Equal positive decision rates across groups, without conditioning on the outcome label.
Equal opportunity
Equal true-positive rates across groups among people labelled as qualified or positive.
Equalised odds
Equal true-positive and false-positive rates across groups.
Calibration
The same score corresponds to the same observed outcome frequency across groups.
Predictive parity
The same positive decision has the same positive predictive value across groups.
Exposure
The attention or opportunity allocated by ranking position, retrieval or presentation.
Construct validity
The degree to which an operational measure supports the interpretation claimed for an underlying concept.
Disparity ledger
A stage-wise accounting of conditional rate ratios that reconstructs an end-to-end gap in a serial pipeline.

The fairness decision moves upstream

A fairness metric becomes useful when it is tied to a specific benefit, harm, population and decision right. Detached from that contract, it can be precise and still function as theatre.

The pipeline view changes the architecture. Preserve the original denominator. Treat evidence capture and retrieval as allocative stages. Audit deterministic rules and human overrides. Observe the executed outcome and remedy. Keep model metrics, because they isolate important error. Refuse to let them certify stages they never measured.

The practical decision is to intervene at the earliest stage that credible evidence identifies, then replay the whole path. A threshold should not compensate for a broken evidence channel unless the organisation has consciously accepted the new error trade-off and the people excluded upstream have another route. A human review label should not satisfy oversight unless referral, information, authority and outcome are tested.

The defensible release statement is deliberately bounded: for this decision, population, configuration, time window and set of groups, the observed path meets the chosen fairness constraints within stated uncertainty, while named criteria and open harms remain outside the claim. That statement is less dramatic than “fair AI”. It is also one an accountable organisation can test, challenge, withdraw and improve.

The evidence conversationChart · sequence
sequenceDiagram
  participant Q as Question
  participant M as Mechanism
  participant E as Evidence
  participant D as Decision
  Q->>M: The missing hundred
  M->>E: A serial gate has exact accounting
  E-->>M: compare rival explanations
  E->>D: Sources
  D-->>Q: revise scope or act
Question, mechanism, evidence and decision exchange the burdens developed in Fairness Across the Decision Pipeline. Reading use: follow the relation, then test it against the surrounding evidence and limits.

Sources

  1. Harini Suresh and John V. Guttag. “A Framework for Understanding Sources of Harm throughout the Machine Learning Life Cycle.” FAccT, 2021. Primary paper.
  2. Reva Schwartz et al. “Towards a Standard for Identifying and Managing Bias in Artificial Intelligence.” NIST SP 1270, 2022. Official publication.
  3. Moritz Hardt, Eric Price and Nathan Srebro. “Equality of Opportunity in Supervised Learning.” NeurIPS, 2016. Primary paper.
  4. Cynthia Dwork et al. “Fairness Through Awareness.” ITCS, 2012. Primary paper.
  5. Matt J. Kusner et al. “Counterfactual Fairness.” NeurIPS, 2017. Primary paper.
  6. Jon Kleinberg, Sendhil Mullainathan and Manish Raghavan. “Inherent Trade-Offs in the Fair Determination of Risk Scores.” ITCS, 2017. Primary paper.
  7. Alexandra Chouldechova. “Fair Prediction with Disparate Impact.” Big Data, 2017. Primary paper record.
  8. Sam Corbett-Davies et al. “The Measure and Mismeasure of Fairness.” Journal of Machine Learning Research, 2023. Primary paper.
  9. Abigail Z. Jacobs and Hanna Wallach. “Measurement and Fairness.” FAccT, 2021. Primary paper.
  10. Joy Buolamwini and Timnit Gebru. “Gender Shades.” Proceedings of Machine Learning Research, 2018. Primary paper.
  11. Ashudeep Singh and Thorsten Joachims. “Fairness of Exposure in Rankings.” KDD, 2018. Primary paper.
  12. Ben Green and Yiling Chen. “Disparate Interactions.” FAT*, 2019. Primary paper record.
  13. National Institute of Standards and Technology. “AI RMF Playbook: Measure.” Official guidance.
  14. Inioluwa Deborah Raji et al. “Closing the AI Accountability Gap.” FAccT, 2020. Primary paper.
  15. Andrew D. Selbst et al. “Fairness and Abstraction in Sociotechnical Systems.” FAT*, 2019. Primary paper record.