Skip to content

feat: generic agents array in brand.json#1973

Merged
bokelley merged 1 commit into
mainfrom
bokelley/brand-agent-registry-clean
Apr 7, 2026
Merged

feat: generic agents array in brand.json#1973
bokelley merged 1 commit into
mainfrom
bokelley/brand-agent-registry-clean

Conversation

@bokelley

@bokelley bokelley commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds a generic agents array to brand.json for both house and brand objects, replacing the pattern of adding named agent fields per agent type
  • New brand-agent-type enum: brand, rights, measurement, governance, creative, buying, signals
  • Deprecates brand_agent and rights_agent named fields (backward compatible — both still validate)
  • Establishes brand.json as the canonical source for public agent discovery

Design decisions

  • No independent AAO registry — assembled from crawled brand.json files and community-hosted brand.json
  • One agent per type — no "primary" flag; filter by type to find the right agent
  • Sales agents stay in adagents.json — publisher authorization, not brand declaration
  • Buying agents in brand.json — "here's my media buying agent"
  • House-level agents — apply to all brands unless overridden at brand level

What's NOT in this PR

This is part 1 of #1972. Part 2 (measurement agent task interface — live rate queries) depends on this.

Server-side changes (crawler, registry, brand-manager) to consume the new agents array are a follow-up.

Test plan

  • npm run test:schemas passes — all 452 schemas valid, refs resolve
  • npm run test:json-schema passes — all 218 schema examples validate
  • Existing brand.json examples with brand_agent still validate (backward compat)
  • New example with agents array validates against variant 3
  • House portfolio example with house-level agents validates

🤖 Generated with Claude Code

Replace named agent fields (brand_agent, rights_agent) with a typed
agents array on both house and brand objects. Supports brand, rights,
measurement, governance, creative, buying, and signals agent types.

Establishes brand.json as the canonical source for public agent
discovery — the AAO registry becomes an aggregator of crawled
brand.json files, not an independent registry.

Refs #1972

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bokelley bokelley force-pushed the bokelley/brand-agent-registry-clean branch from c9fa376 to 0f0faa3 Compare April 7, 2026 10:37
@bokelley bokelley merged commit 5e9a748 into main Apr 7, 2026
12 checks passed
bokelley added a commit that referenced this pull request Apr 7, 2026
PR #1973 added a generic agents array to brand.json. Update
accountability docs and performance-standard schema to reference
the agents array with type: 'measurement' instead of the deprecated
named brand_agent/rights_agent fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request Apr 8, 2026
* feat: structured measurement terms and cancellation policy for guaranteed buys

Add measurement_terms schema as a negotiation surface for media buys:
billing measurement vendor, IVT threshold, and viewability floor. Sellers
declare defaults on products, buyers propose overrides at create_media_buy,
sellers accept/reject/adjust. Agreed terms on confirmed packages enforce
creative verification tag requirements.

Add cancellation_policy schema for guaranteed products to declare notice
periods and penalties. Extract viewability standard enum from inline
delivery-metrics into reusable viewability-standard.json. Add TERMS_REJECTED
error code for measurement terms negotiation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: add changeset for measurement terms

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: clarify IO cancellation_policy is seller-populated

The insertion order is seller-generated, so cancellation_policy there
represents seller-set overrides for a specific deal (e.g., shorter
notice period for a key advertiser), not buyer-proposed terms.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: remove cancellation_policy from insertion-order

Cancellation policy originates on the product. The IO is generated from
products via proposals — having a second place to set cancellation terms
is redundant and confusing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: remove measurement_terms from insertion-order

The IO is a legal signing wrapper around a committed proposal. Measurement
terms are negotiated per-package at create_media_buy, not at IO signing
time. Products and packages are the right surfaces.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: structured cancellation penalty types

Replace free-text penalty_description with structured penalty object.
Four types: percent_remaining (with rate), full_commitment, fixed_fee
(with amount), none. Eliminates interpretation disputes and makes
penalties machine-readable for buyer agents.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: performance guarantees array and makegood policy

Replace fixed viewability field with performance_guarantees array that
supports any rate-based metric: viewability, completion_rate,
brand_safety, attention_score. Each guarantee has a metric, min_rate,
optional standard, and vendor.

Add makegood_policy with closed menu of three remedies:
additional_delivery, credit, invoice_adjustment. Seller declares which
remedies they support; proposes from the menu when a breach occurs;
buyer accepts or disputes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: promote performance_guarantees to peer of measurement_terms

Performance guarantees (viewability, IVT, completion rate, brand safety,
attention score) are the deal terms. Measurement terms (billing vendor,
makegood policy) are the counting and resolution mechanics. These are
separate concerns and should be separate fields.

IVT is now a guaranteed metric like viewability, not a special case.
Single threshold field with floor/ceiling direction determined by metric.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: align naming with IAB Standard Terms and Conditions

Rename to match IAB T&Cs v3.0 terminology:
- performance_guarantees → performance_standards (Section XI)
- penalty → cancellation_fee (Section XII)
- performance-guarantee.json → performance-standard.json
- guaranteed-metric.json → performance-standard-metric.json

The IAB deliberately avoids "guarantee" (implies legal warranty) and
"penalty" (implies punitive damages).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: required_performance_standards filter on get_products

Buyers can now filter products at discovery time by performance standard
requirements: "only show me products where DoubleVerify can measure
viewability at 70% MRC." Products that cannot meet the threshold or
do not support the specified vendor are excluded.

Follows the existing required_features and required_geo_targeting
filter pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: accountability lifecycle and IO as signing wrapper

Add accountability.mdx documenting the full lifecycle: discovery with
required_performance_standards filter, product defaults, refinement,
buy creation negotiation, confirmed package as contract, creative
enforcement, and breach/makegood resolution.

Clarify insertion-order.json: the IO is a signing wrapper, not a
negotiation surface. All deal terms live on products and packages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: cross-reference accountability from existing pages

Add brief mentions and links to the accountability page from:
- media-buy overview (agency language table)
- media-products (after delivery measurement providers)
- media-buys creation (package model bullets)

No new content — just cross-references to avoid doc sprawl.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: measurement agents and content standards relationship

Position vendor field as discovery point for measurement agents via
brand.json. Clarify relationship between content standards (what was
delivered) and performance standards (how well). Reference issue #1972
for measurement agent interface follow-up.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: trailing comma in insertion-order.json

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: vendor field as brand.json discovery key for measurement agents

The vendor's brand.json is where their measurement agent will be
advertised, consistent with brand_agent and rights_agent. This
positions the schema correctly for issue #1972 without requiring
changes when the agent interface lands.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* docs: update vendor discovery to reference brand.json agents array

PR #1973 added a generic agents array to brand.json. Update
accountability docs and performance-standard schema to reference
the agents array with type: 'measurement' instead of the deprecated
named brand_agent/rights_agent fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant