publisher.com/ads.txt listing which ad sellers the publisher authorizes — and whether they're DIRECT (no middleman, premium price) or INTERMEDIARY. claims contradict sellers.jsonsellers.jsonA public file at exchange.com/sellers.json listing each seller the exchange does business with, and whether they classify them as a direct publisher or middleman.. Of 6.43M DIRECT credentials in the corpus, only 11.6% cleanly validate (valid + disclosed). The other 88.4% distributes across phantom, contradicted, impersonated, confidential-unverifiable, and no-registry — see the cascade panel below.1097. Opposite role. Both files public. ≠ contradiction.
Each packet below is one identity-share event sampled at the rate observed in the audit. Red = the seller chain is contradicted (F1). Tan = sent without valid consent (F2). Green = both declared and confirmed.
Earlier audits collapsed each DIRECT claim to one verdict (real / phantom). The v6 cascade unpacks the failure modes. Of 6,431,328 DIRECT credentials in the May 29 corpus, only 11.6% cleanly validate. The other 88% breaks into five qualitatively different failures, each pointing at a different actor in the chain:
Yahoo acquired HuffPost from BuzzFeed in 2024 and operates it as a wholly-owned subsidiary. Six HuffPost regional domains list yahoo.com 96 times each in their ads.txt as DIRECT. Yahoo's own sellers.json classifies ~70% of those seller_ids as INTERMEDIARY. The cascade verdict for each cell: impersonation. This is the cascade defect at maximum embarrassment — the parent company's subsidiary fails the audit against the parent's own registry.
| huffpost domain | cell ssp | n_direct | imp | rate | z-score |
|---|---|---|---|---|---|
| huffpost.com | yahoo.com | 96 | 67 | 69.8% | +29 |
| huffpost.gr | yahoo.com | 96 | 69 | 71.9% | +29 |
| huffingtonpost.com | yahoo.com | 96 | 67 | 69.8% | +29 |
| huffingtonpost.gr | yahoo.com | 96 | 69 | 71.9% | +29 |
| huffingtonpost.jp | yahoo.com | 96 | 67 | 69.8% | +29 |
| huffingtonpost.in | yahoo.com | 96 | 67 | 69.8% | +29 |
OWNERDOMAIN / INVENTORYPARTNERDOMAIN would resolve cleaner. H186 refuted that — the cascade outcome correlates with SSP-count regime (bimodal), not with directive adoption. H187's per-cell resolution then surfaces this HuffPost-Yahoo case as direct counter-evidence: the publisher is a wholly-owned subsidiary of the SSP, the ownership relation is unambiguous, no directive is needed to declare it — and the cascade still fails. The break isn't in publishers neglecting to declare ownership. It's in the registries not reflecting the ownership relations the operators themselves already know.
H187's apex z-score table surfaced a second cluster: 8 cells against buysellads.com at z=25.7–25.9σ, n_direct=528, ~99% impersonation. Primary-source fetch shows the BuySellAds managed-publisher service template-pastes the entire 532-seller PUBLISHER roster into every customer's ads.txt, then declares MANAGERDOMAIN=buysellads.com at the end — the IAB v1.1 directive is correctly present. 1stwebdesigner.com and html.com are byte-identical (same MD5 6e1e0a18cfe9c274deeb3c978eb1c851); gameinfo.io differs by one prepended line and the same 1,316-line template tail. So the cascade's impersonation_undisclosed verdict has at least two distinct generators that need separate remediation:
| class | directive declared? | mechanism | apex example | apex cells (rate≥95%, n≥100) |
|---|---|---|---|---|
| A | none | operator's registry doesn't reflect ownership | HuffPost × Yahoo + yieldlove + stroeer + 60 others | 298 (50.3%) |
| B | MANAGERDOMAIN=$ssp |
manager template-pastes full customer roster | bloxdigital 286 + BSA 8 | 294 (49.7%) |
bloxdigital.com — Freestar propagates the BLOX template into the BLOX-network publishers it co-manages. The remaining 36.5% Class A residual is the registry-mapping problem (HuffPost-Yahoo + yieldlove + stroeer + tail).
MANAGERDOMAIN=M, M's sellers.json should list P as a seller. Of the 8 BSA-victim publishers, 5 declare MANAGERDOMAIN=buysellads.com while BuySellAds' sellers.json does not list them. The directive doesn't validate the template's content — and the manager's registry doesn't reciprocate the declaration.
Surveying the 6 largest managers reveals the pattern; H192 extends to all 85 managers with ≥ 50 publishers. H193 closes the question: the trimodal split is actually bimodal under a stricter threshold. Lowering the apex filter from n_direct ≥ 100 to n_direct ≥ 10 reveals that the "intermediate" tier was just smaller-template paste: themoneytizer 0→212 apex, pubfuture 0→149, pubrev 0→107, yieldmonk 0→97. CafeMedia + Mediavine remain at 0 apex at every threshold. The real split is 2 of 85 hygienic vs 83 of 85 template-paste at some scale.
| manager | pubs | imp% | phantom% | disclosed% | apex cells | verdict |
|---|---|---|---|---|---|---|
| cafemedia.com | 1,846 | 3.61 | 4.02 | 65.16 | 0 | hygienic |
| mediavine.com | 1,481 | 4.23 | 4.90 | 58.60 | 0 | hygienic |
| ezoic.ai | 893 | 8.33 | 11.98 | 28.15 | 0 | intermediate |
| publift.com | 616 | 15.92 | 24.04 | 13.34 | 0 | intermediate |
| themoneytizer.com | 1,013 | 24.34 | 35.27 | 2.37 | 0 | intermediate |
| freestar.com | 960 | 42.55 | 13.80 | 12.47 | 330 | template (BLOX) |
OWNERDOMAIN+MANAGERDOMAIN in 2022–2024; Mediavine experimented with INVENTORYPARTNERDOMAIN from 2023-09 to 2024-06 then abandoned it. Neither uses IPD today. The actual mechanism: upstream SSPs (triplelift contributes 31K disclosed cells to the CafeMedia cohort, sharethrough 6K, indexexchange 4K, …) register seller_ids with reg_domain pointing at the manager (raptive.com/cafemedia.com) or the publisher domain, AND the publisher's MANAGERDOMAIN/OWNERDOMAIN directive matches. Two-side reciprocity at the upstream registry level. CafeMedia's own SSP entry contributes only 447 of 100,502 (0.4%) disclosed credentials in its cohort.
triplelift.com/sellers.json (DUNS 063519038, 7,872 sellers). 23 entries explicitly named "CMI Marketing, Inc. d/b/a Raptive" with domain=cafemedia.com. Single seller_id 4800 is cited by 1,843 of 1,856 publishers (99.3% reciprocity). Each of the 8 sampled CMI sids reaches ≥ 90% of CafeMedia's managed-publisher cohort.
| upstream SSP | CM sids | MV sids | attribution name (sample) |
|---|---|---|---|
| triplelift.com | 23 | — | "CMI Marketing, Inc. d/b/a Raptive" |
| themediagrid.com | 1 | 4 | "CMI Marketing d/b/a Raptive" / "MediaVine" |
| sharethrough.com | 11 | 2 | "CMI Marketing Inc dba Raptive CoinDesk" |
| indexexchange.com | 8 | 5 | "CMI Marketing, Inc. d/b/a Raptive" / "Mediavine, Inc." |
| openx.com | 10 | 5 | "CMI Media Group dba CMI Marketing, Inc. d.b.a Raptive dba CMI Media LLC" |
| media.net | 2 | 3 | "CMI Marketing, Inc. d/b/a Raptive" / "Mediavine, Inc" |
unverifiable_attribution for reg_domain that doesn't itself publish ads.txt — distinguishing structural attribution gaps from genuine impersonation.
The H190 framing implicitly treated A (no directive) and B (MGRDOM declared) as different generators. H191 primary-source-traced the 113 German publishers behind 212 of 216 Class A cells: all carry the #ads.txtfileStroeer2026_05_18 template-generation marker; 4 of 5 sampled files have byte-identical bodies (differing only in glomex timestamp comment); none declare any directive. Same template-paste mechanism as BLOX/BSA, but without the IAB v1.1 declaration. The actual ownership-uncovered residual (HuffPost-Yahoo class) is small — perhaps 16 cells.
| sub-class | mechanism | directive declared? | apex example | apex cells (est.) |
|---|---|---|---|---|
| B-narrow | template paste | MGRDOM = cell SSP | BLOX + BSA | 294 |
| B-broad | template paste | MGRDOM = other manager | Freestar → BLOX | 82 |
| A-template (NEW) | template paste | none declared | Stroeer + yieldlove German cluster | ~200 |
| A-ownership | corporate ownership uncovered | none declared | HuffPost × Yahoo | ~16 |
test_h187_huffpost_yahoo_cell_aberration.py (Class A apex), test_h188_buysellads_template_paste.py (Class B apex specimens), and test_h189_class_b_apex_prevalence.py (Class B share ≥ 30% of the 592-cell apex tier) watch the 6 + 8 + 294 cells respectively. Drops below thresholds surface INFO-level structural shifts — corrective remediation is the desired outcome, not a regression.
97.5% is framework decay — dead SSPs, schema migrations, orphan registries. Only ~2.5% has the shape of misconduct.
see full proof in Exhibit A ↗87 of 721,129 first-visit shares carried valid GDPR consent.
↗3rd-party companies your browser sends your tracking ID to, per page load.
↗Of 100 ad-tech sites: only 5 publish a file and pass the check.
↗195 header-bidding providers graded by the phantom-DIRECT rate of their managed publishers. The wrapper, not the individual publisher, is where templates propagate.
| Provider | Publishers | False-DIRECT rate | Trend 6mo | Grade |
|---|---|---|---|---|
| CafeMedia / Raptivecafemedia.com | 530 | B | ||
| Mediavinemediavine.com | 306 | B | ||
| Playwireplaywire.com | 201 | C | ||
| Freestarfreestar.com | 455 | D | ||
| Ezoicezoic.com | 267 | D | ||
| The Moneytizerthemoneytizer.com | 429 | F | ||
| Publiftpublift.com | 291 | F | ||
| Pubnationpubnation.com | 73 | F |
curl -s https://DOMAIN/ads.txt | grep DIRECT | head
curl -s https://EXCHANGE/sellers.json | jq '.sellers[] | select(.seller_id=="ID")'
python verify.py --domain DOMAIN --strict
python verify.py --domain DOMAIN --output json