You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
AdCP's signal schema today models the publishing and authorization of a signal — who published it, who's allowed to resell it, what's discoverable about it. It does not model the epistemic content of the signal: what's being counted, how it was built, against what reference system, in whose vocabulary, with what verifiability.
Two in-flight RFCs (#4472, #4475) and a follow-up question from @lszczesiak on #4475 are each picking off one piece of this gap. This issue exists to frame the full picture so each row-shaped RFC can be evaluated in context, and so the WG can make a small number of shared decisions once instead of re-litigating them per-RFC.
This is not a competing RFC. It does not propose schemas. It exists to organize.
What we already have
The publishing half of the framework is solid:
signal-source — catalog (verifiable via the provider's adagents.json) vs agent (trust-based)
Each is correct on its own row. The umbrella exists so they get factored consistently rather than producing three incompatible per-dimension types.
Three decisions the WG needs to make once
Every row-level RFC will keep re-asking these until they're settled:
1. Reference-system shape
Do we adopt a single primitive — roughly `{ system, id, version? }` — reused across markets, ID graphs, taxonomies, measurement currencies, panel frames? Or do we ship per-dimension types (`market`, `id_graph`, `taxonomy_version`, ...) that happen to look similar?
A shared primitive forces a consistent enum-extension story across signals, deployments, buy terms, and delivery reporting. Per-dimension types are easier to ship one at a time but invite drift.
2. Vocabulary policy
When a signal claims "Female 25-54," whose vocabulary is that?
Adopt a canonical taxonomy (e.g., IAB Audience Taxonomy) and require providers to map to it
Carry the vocabulary by reference (`{ taxonomy: { system, version }, value }`) — the same shape as the reference-frame decision above
Accept fragmentation and rely on description text (the status quo)
Without a decision here, structured fields just relocate the fragmentation from `description` to typed strings.
3. Verifiability model
Authorization is verifiable today (third-party fetch of adagents.json). Content claims — count, freshness, identity unit, model vintage — are self-reported and unfalsifiable. Is the long-term direction:
Declarative-only (what every RFC in flight currently assumes)
Attestation-capable — a primitive for signed claims from independent measurers, layered on top of the declarative fields
The row-level RFCs don't need to solve this, but the umbrella should declare which direction we're heading so we don't paint ourselves into a corner.
Non-goals
Not a redesign of `adagents.json`, `signal-definition`, or `signal-source` / `signal-catalog-type`. Those are the foundation; this fits underneath them.
Next — identity-substrate RFC (@lszczesiak's prompt), using whatever shape Decision 1 produces.
Later — vocabulary policy (Decision 2) once we have ≥2 row-level RFCs in flight that hit the same vocabulary surface.
Research — verifiability / attestation model (Decision 3). Not for this cycle.
Related and adjacent
The same `{ system, id, version }` shape is already showing up in adjacent work — measurement currency in buy terms negotiation, ID-graph references in identity-match flows. Worth deciding the shape once across all of them.
Summary
AdCP's signal schema today models the publishing and authorization of a signal — who published it, who's allowed to resell it, what's discoverable about it. It does not model the epistemic content of the signal: what's being counted, how it was built, against what reference system, in whose vocabulary, with what verifiability.
Two in-flight RFCs (#4472, #4475) and a follow-up question from @lszczesiak on #4475 are each picking off one piece of this gap. This issue exists to frame the full picture so each row-shaped RFC can be evaluated in context, and so the WG can make a small number of shared decisions once instead of re-litigating them per-RFC.
This is not a competing RFC. It does not propose schemas. It exists to organize.
What we already have
The publishing half of the framework is solid:
signal-source—catalog(verifiable via the provider's adagents.json) vsagent(trust-based)signal-catalog-type—marketplace(resold third-party) /custom(agent-built composite) /owned(first-party)signal-definition— published via adagents.json; carriesvalue_type,restricted_attributes,policy_categories,allowed_values,rangeadagents.jsonauthorized_agents— the chain-of-authority primitiveA buyer agent can today verify who is authorized to sell what. That part is done and good.
What's not modeled
adagents.jsonauthorized_agentsHow the in-flight RFCs slot in
Each is correct on its own row. The umbrella exists so they get factored consistently rather than producing three incompatible per-dimension types.
Three decisions the WG needs to make once
Every row-level RFC will keep re-asking these until they're settled:
1. Reference-system shape
Do we adopt a single primitive — roughly `{ system, id, version? }` — reused across markets, ID graphs, taxonomies, measurement currencies, panel frames? Or do we ship per-dimension types (`market`, `id_graph`, `taxonomy_version`, ...) that happen to look similar?
A shared primitive forces a consistent enum-extension story across signals, deployments, buy terms, and delivery reporting. Per-dimension types are easier to ship one at a time but invite drift.
2. Vocabulary policy
When a signal claims "Female 25-54," whose vocabulary is that?
Without a decision here, structured fields just relocate the fragmentation from `description` to typed strings.
3. Verifiability model
Authorization is verifiable today (third-party fetch of adagents.json). Content claims — count, freshness, identity unit, model vintage — are self-reported and unfalsifiable. Is the long-term direction:
The row-level RFCs don't need to solve this, but the umbrella should declare which direction we're heading so we don't paint ourselves into a corner.
Non-goals
Suggested sequencing
Related and adjacent