Context
PR #1962 adds structured performance_standards and measurement_terms to guaranteed media buys. The vendor field on performance standards identifies a measurement company by brand-ref (domain). The vendor's brand.json at that domain is the discovery point for their agent capabilities — consistent with how brand_agent and rights_agent are already advertised in brand.json.
Structural Priority: brand.json agent discovery
brand.json already advertises:
brand_agent — brand data via MCP (url + id)
rights_agent — rights licensing via MCP (url + id + available_uses)
Measurement vendors need the same pattern. A measurement_agent entry (or a generic agents array) in brand.json would let any company advertise measurement capabilities:
{
"house": "doubleverify.com",
"measurement_agent": {
"url": "https://api.doubleverify.com/adcp/measurement",
"id": "dv_measurement",
"supported_metrics": ["viewability", "ivt", "brand_safety"]
}
}
This is the structural foundation that must be right before building the task interface. The vendor field on performance-standard.json already points to the domain — brand.json is where the agent URL lives.
Decision: named agents vs generic agents array
Currently brand.json uses named fields (brand_agent, rights_agent). Options:
- Add
measurement_agent as another named field (simple, consistent with existing pattern)
- Add a generic
agents array with typed entries (more extensible, but different pattern)
Recommend option 1 for now — it matches the existing pattern and measurement is a well-defined concept.
Live Measurement Data Flow
Once a buy is active with agreed performance standards, how does the seller (or buyer) query the measurement vendor for current rates?
Consistent with content standards
Content standards already solve the analogous problem:
- Content standards:
validate_content_delivery — "was this ad placed next to safe content?" (batch audit of delivery records)
- Performance standards: measurement agent — "what percentage of impressions were viewable?" (live rates for active buys)
Both should use agent-to-agent workflows. The data flow pattern should be consistent:
Pull model (consistent with content standards):
- Buyer/seller calls measurement agent with media buy reference
- Measurement agent returns current rates per agreed performance standard
- Rates compared against agreed thresholds; breach triggers makegood
Push model (alternative):
- At buy creation, a callback URL is registered
- Measurement agent pushes rate data periodically or on breach
- Similar to existing
push_notification_config pattern
The pull model is more consistent with content standards. The push model might be more practical for real-time breach detection. Both could coexist.
Scope
In this issue
brand.json schema: add measurement_agent (or equivalent)
- Define the measurement agent task interface (query rates for a media buy)
- Ensure consistency with content standards data flow
Not in this issue (done in PR #1962)
- Performance standard schemas
- Makegood policy and remedy types
- Cancellation policy
required_performance_standards filter on get_products
TERMS_REJECTED error code
Follow-up issues
Context
PR #1962 adds structured
performance_standardsandmeasurement_termsto guaranteed media buys. Thevendorfield on performance standards identifies a measurement company bybrand-ref(domain). The vendor'sbrand.jsonat that domain is the discovery point for their agent capabilities — consistent with howbrand_agentandrights_agentare already advertised inbrand.json.Structural Priority: brand.json agent discovery
brand.jsonalready advertises:brand_agent— brand data via MCP (url+id)rights_agent— rights licensing via MCP (url+id+available_uses)Measurement vendors need the same pattern. A
measurement_agententry (or a genericagentsarray) inbrand.jsonwould let any company advertise measurement capabilities:{ "house": "doubleverify.com", "measurement_agent": { "url": "https://api.doubleverify.com/adcp/measurement", "id": "dv_measurement", "supported_metrics": ["viewability", "ivt", "brand_safety"] } }This is the structural foundation that must be right before building the task interface. The
vendorfield onperformance-standard.jsonalready points to the domain —brand.jsonis where the agent URL lives.Decision: named agents vs generic agents array
Currently
brand.jsonuses named fields (brand_agent,rights_agent). Options:measurement_agentas another named field (simple, consistent with existing pattern)agentsarray with typed entries (more extensible, but different pattern)Recommend option 1 for now — it matches the existing pattern and measurement is a well-defined concept.
Live Measurement Data Flow
Once a buy is active with agreed performance standards, how does the seller (or buyer) query the measurement vendor for current rates?
Consistent with content standards
Content standards already solve the analogous problem:
validate_content_delivery— "was this ad placed next to safe content?" (batch audit of delivery records)Both should use agent-to-agent workflows. The data flow pattern should be consistent:
Pull model (consistent with content standards):
Push model (alternative):
push_notification_configpatternThe pull model is more consistent with content standards. The push model might be more practical for real-time breach detection. Both could coexist.
Scope
In this issue
brand.jsonschema: addmeasurement_agent(or equivalent)Not in this issue (done in PR #1962)
required_performance_standardsfilter onget_productsTERMS_REJECTEDerror codeFollow-up issues
update_media_buy)