AI pricing compliance and algorithmic fairness

The algorithm never sees race or income. It sees ZIP code and device. Same product, matched demand signals. A 26% higher price.

When the Civil Investigative Demand arrives, the answer should be a file. Equity is a pricing-defensibility audit layer that sits on top of whatever pricing engine a retailer already runs. It replays the engine's own decision log, scores every pricing input for protected-class leakage including the compound proxies per-feature checks cannot see. It gates the outcome against the EEOC four-fifths rule in deterministic code, measures what the fairness constraint costs in revenue, shows why the obvious fix gets gamed, and seals the record into a SHA-256-hashed, regulation-mapped evidence pack built for exactly that demand.

+26.2%

Higher price for the majority-minority-ZIP, old-device cohort, same SKU

Cohort means over 3,037 and 2,880 seeded synthetic decisions, matched demand signals

0.43 to 0.82

EEOC four-fifths ratio, Fail to Pass, after fairness-aware reward shaping

At a measured 1.3% revenue cost on this synthetic engine and scenario

0.73

Joint mutual information of a compound proxy whose two components each pass

Referral × Dwell Time; dropping ZIP and device alone still fails the gate at 0.59

Every demo figure on this page is synthetic and seeded. ShopMart Dynamic Pricing is a LinUCB contextual bandit we built as the stand-in for the engine a client would run, the Aura Wireless Earbuds and the 10,000 shoppers are generated, and the proxy structure is planted so the audit has something real to catch. No real retailer was audited and no real shopper was overcharged.

Regulators stopped needing intent. Enforcement now turns on what the engine did, and a pricing team that never logged the right data cannot show it.

A General Counsel or Head of Pricing at an e-commerce platform with New York and California volume runs a dynamic-pricing engine that never ingests race or income and is still exposed, because the engine prices on ZIP code, device tier and session behaviour, and each of those carries demographic signal. A contextual bandit optimizing revenue will find every input that predicts willingness to pay, including the ones that are really predicting who the shopper is. ZIP predicts income; income predicts price sensitivity; an old Android phone predicts less comparison shopping. None of those is race. All of them move with it. By the time the Civil Investigative Demand lands, a team with none of this on record spends months in reactive forensic extraction.

The FTC case turned on what the algorithm did

The FTC's $60M settlement with Instacart over its Eversight pricing experiments (FTC, December 2025) was an outcome-based action. The complaint documented different shoppers being shown different prices for identical items, up to 23% apart. It was not a finding of group-based discrimination, and it did not depend on what the algorithm had been told.

Disclosure and impact-assessment duties are already on the books

New York's Algorithmic Pricing Disclosure Act, effective November 10, 2025, requires conspicuous disclosure when personal data moves a price and carries a civil penalty of up to $1,000 per violation. Colorado's SB 24-205, effective June 30, 2026, treats pricing as a consequential decision that needs an impact assessment.

The EU obligations apply from August 2, 2026, with a statutory ceiling attached

The EU AI Act's high-risk obligations apply from August 2, 2026. Articles 13 and 14 cover high-risk transparency and anti-discrimination documentation, and high-risk non-compliance carries penalties up to a statutory maximum of €15M or 3% of global turnover.

Every statistic, every verdict and the hash live in deterministic code. The agents write prose and cannot reach any of them.

The pipeline is one pass over the engine's own decision log: 10,000 pricing decisions from the engine under audit, a deterministic input audit, a four-fifths gate, a fairness-constraint synthesis compared against a gameable cap, agent narration, a SHA-256-hashed evidence pack, and a labeled benchmark. Agents advise, code decides, and that split is what keeps the pack filable whichever model sits underneath.

01 / THE ENGINE UNDER AUDIT

A revenue-optimal bandit that never sees the protected attribute

The engine under audit is ShopMart Dynamic Pricing, a 7-arm LinUCB contextual bandit seeded at 42, pricing one SKU, the Aura Wireless Earbuds at a $79.00 list, for a synthetic labeled population of 10,000 shoppers. It prices on ZIP income index, device tier, referral, dwell time, cart size, repeat rate, session count, premium membership and hour, plus referral by dwell cross-terms of the kind many real engines carry. The protected cohort is a latent label the audit never receives. In the demo, this bandit is the engine under audit.

02 / THE DETERMINISTIC INPUT AUDIT

Three scores per input, and a fourth that sees pairs

Run Audit computes, in pure numpy, the absolute Pearson correlation of every pricing input against the protected cohort, its normalized mutual information, a joint mutual information for feature pairs, and a counterfactual price move: overwrite one input for the protected cohort with the advantaged cohort's reference value, hold everything else constant, re-run the engine's own policy and measure how far the protected cohort's price moves. The verdict rules are code, checked in order: an input whose effective sample falls under 400 is returned as insufficient evidence rather than given a proxy verdict, a rule no input in this run triggers; the dual-use loyalty signal with any material association is an ABSTAIN routed to legal review before the violation test runs; an absolute correlation of at least 0.30 or a mutual information of at least 0.05 is a VIOLATION; a correlation from 0.20 up to 0.30 is an ABSTAIN; everything else is a PASS. For every other input the counterfactual corroborates and never triggers a verdict on its own; only for the dual-use signal does a material counterfactual move count toward the ABSTAIN.

03 / THE GATE AND THE CONSTRAINT

An external legal standard, then a fix with no edge to game

The Disparate-Impact Gate applies the EEOC four-fifths rule (29 CFR 1607.4(D)) adapted to price tiers: the protected cohort's rate of receiving the favorable price tier divided by the advantaged cohort's, against a 0.80 threshold. Remediation then synthesizes Fairness-Aware Reward Shaping, which pulls each price continuously toward a proxy-free reference price from a second bandit trained with the four proxy inputs dropped, and binary-searches the smallest pull weight that clears 0.80. It is shown beside a Hard-Cap Baseline at 115% of the fair price, the naive fix, with the gaming signature measured for both.

04 / THE CREW AND THE PACK

Narration on top, a sealed record underneath

A Feature Auditor explains each flagged input and an Adversarial Challenger argues the case for treating the abstained input as a legitimate signal; the Regulatory Mapper role is a fixed table that attaches each VIOLATION to five regimes and the ABSTAIN to a single legal-review line. The crew is provider-swappable, falls back to deterministic templates when no model provider is configured so the app runs identically, and cannot compute a number or set a verdict. Evidence Pack seals the engine name and version, the population audited, the gate, every finding with its rationale, the regulatory mapping, the remediation result and the narration summary into JSON plus a printable HTML pack, with a SHA-256 digest of the pack body as its tamper-evident hash.

The console is two views plus dialogs. The manual view holds the Pricing Outcome Comparison card and an activity panel that streams each stage; every result opens as a dialog titled Audit Results, Remediation Results or Evidence Pack Results, and Remediation and Evidence Pack stay disabled until Run Audit completes. Run Benchmark switches to a separate Benchmark Results view. About Demo states the scenario boundary on screen: a synthetic engine with known ground truth, whose results demonstrate the method and are not evidence of field-validated intent. Every number below sits inside that boundary.

Same product, matched demand signals, a 26% gap. This is where the audit finds it, gates it, fixes it and seals it.

The demo audits 10,000 seeded synthetic pricing decisions on one SKU. What follows is what the run puts on screen, in the order it puts it there.

The Equity console with the Pricing Outcome Comparison card open before any audit runs. Decision Set A, Reference, shows the Aura Wireless Earbuds at a displayed price of $74.06 against a $79.00 list, with the representative profile ZIP 10021 Upper East Side NYC, iPhone new, a basket of 3 items with organic referral, a green Reference Cohort badge, and a footer reading Matched Cohort · n=2,880 and No Proxy Lift. Decision Set B, Exposed, shows the same earbuds at $93.47 with the profile ZIP 10456 South Bronx NYC, Android old, a red Proxy Risk Identified badge and a footer reading Matched Cohort · n=3,037 and Review Required. Between them a Measured Variance of +26.2% is labeled Same SKU, Matched Demand Signals. The header buttons read About Demo, Run Benchmark, Remediation, Evidence Pack and Run Audit, and a subtitle band at the bottom reads Set A is a high-income-zip, new-device cohort.
This card is on screen before anything runs: two matched cohorts, one SKU. The high-income-ZIP, new-device cohort sees $74.06; the majority-minority-ZIP, old-device cohort sees $93.47, a 26.2% gap on the same earbuds with matched demand signals. These are cohort means over 2,880 and 3,037 synthetic decisions, not two cherry-picked shoppers, and the ZIP and device on each card are the cohort's representative profile; the cohorts themselves span several ZIPs and both device families. The engine that produced this gap was never told anything a lawyer would recognise as protected.
The Audit Results dialog showing the Input Audit: Which Features Are Demographic Proxies? table with columns Pricing Input, |r| vs Protected, Mutual Information, Counterfactual and Verdict. Zip Income Idx reads 0.95, 1.00, +7.8%, VIOLATION. Device Tier reads 0.32, 0.08, +2.9%, VIOLATION. Referral × Dwell Time, tagged Interaction, reads 0.00, 0.73, +1.7%, VIOLATION, with the cursor resting on it. Premium Member reads 0.24, 0.04, -1.3%, ABSTAIN. Referral, Dwell Time, Cart Size, Repeat Rate, Session Count and Hour all read PASS. A legend beneath reads Violation: Flagged Proxy, Abstain: Routed To Legal Review, Cleared: Legitimate Demand Signal, followed by three Feature Auditor notes.
Zip Income Idx and Device Tier are the obvious proxies, at a Pearson of 0.95 and 0.32. A per-feature audit cannot produce the third VIOLATION row. Referral alone shows 0.00 correlation and 0.00 mutual information, Dwell Time alone shows 0.17 and 0.03, and both PASS. Their joint mutual information with the protected class is 0.73, an interaction gain of 0.71 over the best single feature. The population is built so that an organic arrival with a long dwell and a comparison arrival with a short dwell both mark the protected cohort: neither input separates the groups, the pair does. A compliance program that audits inputs one at a time is auditing the wrong object. Cart size, repeat rate, session count and hour clear as legitimate demand signals; the audit does not flag everything it sees.
The Audit Results dialog scrolled to its bottom. Above sit the PASS rows for Referral, Dwell Time, Cart Size, Repeat Rate, Session Count and Hour, the verdict legend, three Feature Auditor notes and an Adversarial Challenger note about premium_member. Below them the Disparate-Impact Gate: EEOC Four-Fifths Rule card shows a red dial reading 0.43, Four-Fifths Ratio (Threshold 0.80), Fail, and four tiles: 36% Protected Cohort Receiving The Favorable Price Tier, 83% Advantaged Cohort Receiving The Favorable Price Tier, 64% Protected Cohort In The Highest Price Tier, and +15.6% Mean Overcharge: Protected Versus Advantaged.
The gate applies a legal standard, computed in code, and favorable here means the not-top price tier. 36% of the protected cohort receives it against 83% of the advantaged cohort, and 0.36 divided by 0.83 is 0.434, well under the 0.80 four-fifths threshold in 29 CFR 1607.4(D). 64% of the protected cohort sits in the top price tier and the mean overcharge is 15.6% across the population. Above the dial, the Adversarial Challenger argues the loyalty-benefit case for Premium Member, an input the code has already routed to legal review. The code neither flags nor removes it, and the verdict rule set the ABSTAIN before that note was written. Show Audit Results rewrites the Set B badge on the Pricing Outcome Comparison card the moment this dialog opens; close it and the card now reads Gate Failed, 0.43 < 0.80.
The Remediation Results dialog titled Fairness Constraint: From Detection To Remediation. A red tile reads 0.43, Four-Fifths Before, Fail, Engine As Shipped; an arrow points to a green tile reading 0.82, Four-Fifths After, Pass, Revenue Cost -1.3%. Below, Fairness-Aware Reward Shaping, tagged Recommended Control, lists Four-Fifths Ratio 0.82 Pass, Revenue Cost -1.3%, Gaming Signature 2% and Pull Weight 0.65. Beside it, Hard-Cap Baseline (115% Of Fair Price) lists Four-Fifths Ratio 0.59 Fail, Revenue Cost -0.2%, Gaming Signature 29% Priced At The Cap and Verdict Gamed To The Boundary. Fine print reads that a threshold cap is optimized to its edge, that reward shaping pulls each price toward a proxy-free reference without creating a boundary to game, and that revenue impact is specific to this synthetic engine and scenario.
A hard cap at 115% of the fair reference price costs 0.2% of revenue and still fails the gate at 0.59, because the revenue-maximizer treats the cap as a target: 29% of the protected cohort is re-priced to within 1% of it, and the dialog calls that Gamed To The Boundary. Fairness-Aware Reward Shaping pulls every price continuously toward a proxy-free reference price, gives the engine no edge to price up against, and clears the gate at 0.82 with a pull weight of 0.65 and a gaming signature of 2%. On this synthetic engine that costs 1.3% of revenue, and the app's own fine print says the figure is specific to this engine and scenario.
The Evidence Pack Results dialog headed CID-Ready Evidence Pack with an Open Full Pack link. Five tiles read 10 Inputs Audited And Recorded, 0.43 Four-Fifths Ratio As Shipped, 0.82 Four-Fifths Ratio After Remediation, 4 Findings Mapped To Regulation, and <2s Evidence-Pack Generation Time. Beneath them a fine-print line about the regulatory mapping and the record being append-only and tamper-evident, a SHA-256 hash box, and a saved-path line naming data/cid_evidence_pack.json and data/cid_evidence_pack.html. The header buttons now read Remediation Complete, Pack Exported and Rerun Audit.
This dialog is the receipt. The pack records 10 inputs audited, the gate as shipped and after remediation, and 4 findings mapped to regulation: the three VIOLATIONs each attached to the five regimes in the pack's regulatory mapping and the ABSTAIN attached to a single legal-review line. The hash is a SHA-256 digest of the pack body: a tamper-evident seal that changes on every export because the pack carries its generation time. The <2s tile is the dialog's label for a build that is effectively instantaneous, not a benchmark timing.
The printable evidence pack opened in a browser tab, headed Pricing Defensibility: CID-Ready Evidence Pack. A header line names the vp-cid-pack/1.0 schema, the engine ShopMart Dynamic Pricing (contextual MAB) linucb-7arm seed=42, 10,000 audited decisions and a cached claude-opus-4-8 narration. Under Disparate-Impact Gate (EEOC four-fifths) four tiles read Four-fifths ratio 0.43 threshold 0.8, Favorable-tier rate protected 0.36 advantaged 0.83, Protected in top tier 64%, and Representative gap +26% Aura Wireless Earbuds. A Findings table lists each input with verdict, |r|, MI, counterfactual and rationale, VIOLATION rows tinted red, PASS rows green and the premium_member ABSTAIN row amber, ending with the referral × dwell_time compound-proxy row. A Regulatory Mapping section begins beneath it.
Open Full Pack is the form counsel would receive: the same JSON rendered as a printable document, listing which engine and which build, how many decisions, the gate figures, every input's verdict with its rationale, and the regulatory mapping line by line. The header states that the narration came from a cached model output; every number beside it came from the deterministic audit, and the same seed reproduces them on every run. The answer to a Civil Investigative Demand becomes this file.
The Benchmark Results view with the Benchmark Results dialog open over it, headed Validation Benchmark: Labeled Evaluation Set. A note explains that the proxy structure is planted in this labeled synthetic set so recovery, abstention and remediation can be scored against ground truth the audit does not inspect. Four tiles read 100% Precision: Proxies Correctly Flagged, 100% Recall: Planted Proxies Recovered, 0 Legitimate Signals Incorrectly Flagged, and 1/1 Dual-Use Signals Correctly Abstained. Below, Baseline: Fairness Through Unawareness lists Remove ZIP And Device Inputs, Four-Fifths Ratio 0.59 Fails, Reason Compound Proxy Still Leaks; beside it Equity Constraint lists Four-Fifths Ratio 0.82 Pass, Revenue Cost -1.3% and Hard-Cap Baseline 0.59 Fails. A Back To Manual Testing button sits at the top right.
Run Benchmark is the method's self-check, and its scope is stated on the dialog itself. It rebuilds the same seed-42 population and engine from scratch and scores the audit against the planted labels it never sees: 3 of 3 planted proxies recovered, 0 legitimate signals flagged, 1 of 1 dual-use signals abstained. The baseline beside it is the standard defence: remove ZIP and device and retrain. The ratio moves from 0.43 to 0.59 and still fails, because the compound proxy survives the deletion.

What the demo shows, and what stays outside it.

The numbers above come from one seeded synthetic population of 10,000 pricing decisions on one SKU with a planted, reproducible proxy structure. The figures show that the method recovers planted structure with labeled-set accuracy. They are not an accuracy rate on real pricing data, not a benchmark against competitors, and not a claim about any real retailer.

QuestionWhat Equity does in this demoWhat remains outside the demo
IntegrationAudits the LinUCB bandit the demo app carries as its stand-in engine, and is designed so a client's engine can be swapped in behind an adapter.Any adapter code or live pricing-platform connector. None exists in this build, and no named vendor is a customer or partner.
Demographic dataReads a curated reference table of ten New York and California ZIPs and a seeded device skew hard-coded in the app.A live census or device-ownership feed. The table is small and hand-curated, and the protected cohort is a planted label.
FindingsRecovers the planted proxy structure and records every input's verdict with its rationale in the pack.Proof of real-world discrimination or intent; the machinery issues no verdict of intent.

What this demo does NOT do

Equity does not set a price for any customer and does not replace Pricefx, PROS, Zilliant or Competera; the engine prices, Equity audits and constrains. It does not certify compliance, guarantee a pass or give legal advice; the pack is evidence for the client's counsel. The build covers one SKU and the disparate-impact track from audit to evidence pack; algorithmic collusion, multi-jurisdiction disclosure middleware, streaming monitoring and a checkout surface are outside it. The South Bronx and Upper East Side profiles on the Pricing Outcome Comparison card are representative labels for multi-ZIP, multi-device cohorts, not claims about any real neighbourhood.

What legal and pricing leaders ask before putting an audit layer over the engine.

Our pricing model never uses race or income. How can it be discriminatory?

Because the engine does not need to see race or income to price by it. In the demo the engine under audit prices on ZIP income index, device tier and session behaviour, and those inputs carry the protected class: ZIP income index correlates with it at 0.95 and device tier at 0.32. The result on the seeded synthetic population is a 26.2% higher price for the majority-minority-ZIP, old-device cohort on the same earbuds with matched demand signals, and a four-fifths ratio of 0.43 against the 0.80 threshold. The FTC's Instacart action was an outcome case about different shoppers seeing different prices for identical items, not a finding about what the algorithm had been told.

We already dropped ZIP code from the model. Isn't that enough?

On this engine, no. The Fairness Through Unawareness baseline in the benchmark retrains without the ZIP and device inputs, and the four-fifths ratio only climbs from 0.43 to 0.59, still a fail. How the shopper arrived and how long they lingered each pass on their own yet jointly encode the cohort at a mutual information of 0.73. Per-feature correlation is blind to that pair; a joint mutual-information check is not, which is why the audit scores interactions as well as single inputs.

Can't we just cap prices at some percentage over baseline?

You can, and the demo shows what a revenue-maximizer does with it. The Hard-Cap Baseline forbids any price above 115% of the fair reference price. The engine gives up 0.2% of revenue to comply with the letter of it and lands 29% of the protected cohort inside 1% of the cap, so the four-fifths ratio only reaches 0.59 and the gate still fails. A cap is a target. Fairness-Aware Reward Shaping has no boundary to aim at, and it passes at 0.82 for a 1.3% revenue cost on this synthetic engine.

Does this replace Pricefx or PROS? We are not swapping out our pricing engine.

No. Equity never sets a price. It audits the engine's decisions and proposes a constraint; your engine, whether Pricefx, PROS, Zilliant, Competera or a custom bandit, keeps doing the pricing. The seam for a client's engine is a documented swap point; in the demo there is no adapter code and no live integration, so the LinUCB bandit we built is the engine, and it is audited directly.

There is an LLM in this. How does that hold up in discovery?

Nothing a lawyer would have to defend is model output: the statistics, the threshold comparison, each verdict, the constraint and the pack hash all come from deterministic numpy code outside the agent layer. The Feature Auditor and Adversarial Challenger write prose; they never compute a number and cannot set or change a verdict, and the regulatory mapping is a fixed table rather than model output. With no model provider the crew falls back to deterministic templates and the app produces the same verdicts. The narration in the recorded walkthrough is a validated, cached model output, and the pack header says so.

What do we actually hand our lawyers when the CID lands?

A CID-ready evidence pack as JSON and printable HTML. It records the engine name and version, the 10,000 decisions audited, the four-fifths gate before and after remediation, every input's verdict with its rationale, the mapping of each flagged input to the EEOC four-fifths rule, the NY Algorithmic Pricing Disclosure Act, the Colorado AI Act SB 24-205, EU AI Act Articles 13 and 14 and FTC Act Section 5, the remediation result, and a SHA-256 digest of the pack body. We provide the evidence; your legal team makes the call.

You show 100% precision and recall. Is that a real accuracy number?

It is a labeled-set self-check, and it should be read as one. The benchmark regenerates the demo's seeded 10,000-decision synthetic population and asks one question of it: did the audit find the three proxies we planted and nothing else? It did. All three were flagged, none of the four legitimate demand signals was flagged, and the single dual-use signal was abstained rather than flagged or cleared. That shows the method recovers planted structure. Real pricing logs are confounded, and you cannot ethically A/B-test charging demographic groups different prices, so on an engagement the same machinery produces evidence for legal review, never an automated verdict.

Technical Research

The research behind this demo — the architecture, the verification design, and the enterprise blueprint.

Start with the inputs your pricing engine already uses, and find out which of them are carrying the protected class.

We are an AI engineering team, not a pricing vendor and not a compliance certifier. We start from your engine's own decision log and end at a pack your counsel can file; the call on what it shows stays with them.

A useful first conversation is concrete: which engine prices your catalog, which inputs it sees, whether it carries cross-terms or trees that could price on a compound proxy, and which of New York, California, Colorado or the EU your volume touches. We can work through the audit, the constraint synthesis and the evidence-pack format alongside your pricing, legal and data teams.

Pricing-proxy exposure assessment

  • ✓ Inputs the engine prices on, and which carry demographic signal
  • ✓ Compound proxies that per-feature checks miss
  • ✓ A four-fifths read on your own decision log, as evidence for counsel
  • ✓ Regimes your volume actually touches

Build the audit-and-proof layer

  • ✓ Deterministic input audit with counterfactual replay
  • ✓ Disparate-impact gate in plain code
  • ✓ Fairness constraint with a measured revenue cost
  • ✓ SHA-256-hashed, regulation-mapped evidence pack