Skip to content

Conversation

@bokelley
Copy link
Contributor

Summary

This PR prepares for the 2.6.x release by:

  1. Merging 2.6.x into main - brings in all 2.6 features:

    • Property Governance Protocol
    • Content Standards Protocol
    • Media Channel Taxonomy
    • get_capabilities task
    • archived creative status
    • OpenAI Commerce integration
    • Privacy policy URL support
    • Typed extensions infrastructure
  2. Overhauling docs versioning - new sustainable model:

    • docs/ → "2.6" (current/latest, always matches main)
    • dist/docs/2.5.3/ → "2.5" (frozen snapshot)
    • Future releases create dist/docs/{version}/ snapshots
  3. New release-docs workflow - automatically snapshots docs on release tags (works for both main and maintenance branches)

  4. Created 2.5-maintenance branch - for potential 2.5.x patches

Changes

File Change
dist/docs/2.5.3/ Frozen 2.5.3 documentation snapshot
docs.json Updated version paths
.github/workflows/release-docs.yml New workflow for release snapshots
.husky/pre-push Exclude archived docs from link check
.gitignore Allow dist/docs/
v2.6-rc/ Deleted (replaced by versioning model)
sync-versioned-docs.* Deleted (no longer needed)

Testing

  • All 241 tests pass
  • Typecheck passes
  • Mintlify broken-links check passes
  • Mintlify handles mixed paths (tested locally)

🤖 Generated with Claude Code

BaiyuScope3 and others added 30 commits January 2, 2026 14:34
- Add new 'assets' array to format schema with 'required' boolean per asset
- Deprecate 'assets_required' (still supported for backward compatibility)
- Enables full asset discovery for buyers and AI agents
- Update server to include both fields in format responses
- Update documentation across creative and media-buy docs
- Bump version to 2.6.0
- Resolve package-lock.json version to 2.6.0
- Accept main's simplified media-buy/list_creative_formats (points to creative docs)
- Update creative/list_creative_formats with assets field
- Fix asset_type: use 'url' for tracking pixels (valid content type)
…l-discovery

feat: Improve assets discovery
- Keep version 2.6.0
- Add docs versioning support from main
- Add sync workflow triggers for 2.6.x branch
feat: update all document schema reference to 2.6 schema for 2.6-rc
git diff only detects tracked files. Use git add + git diff --cached
to properly detect new v2.6-rc/ folder on first sync.
fix: detect untracked files in sync-versioned-docs workflow
Main branch is protected. Use peter-evans/create-pull-request action
to create a PR for the synced docs instead of direct push.
fix: create PR instead of pushing directly to main
Merged 32 commits from main including:
- Schema: Allow additional properties for forward compatibility (#646)
- Schema versioning: Replace symlinks with HTTP middleware (#644)
- Workflow: Add schema sync to versioned docs (#639)
- Addie: Home button fix, sidebar, thread flow improvements
- Admin: PostHog integration, activity feed, engagement scoring
- Slack: User mentions, leader names, channel fixes
- Members: Search, intro emails, founding badge
- Server: Company type validation, HTML entity parsing

Conflicts resolved:
- .github/workflows/sync-versioned-docs.yml: kept main version with schema sync
- package-lock.json: accepted main version
Rebuilds 2.6.0 schemas to include the relaxed validation from #646.
All schema objects now allow unknown fields for forward compatibility.
…o-2.6.x

chore: catch 2.6.x up with latest main updates
* feat: Add typed extensions infrastructure with auto-discovery

Typed extensions provide formal JSON schemas for vendor-agnostic
extension data in `ext.{namespace}` fields. This enables SDK code
generation, schema validation, and cross-vendor interoperability.

**New features:**
- Extension meta schema defining valid_from/valid_until version bounds
- Auto-discovery of extensions during schema build
- Version-filtered extension registries per schema version
- New `extensions_supported` field in agent card adcp extension
- Comprehensive test suite for extension infrastructure

**How it works:**
1. Extensions are defined in `/schemas/source/extensions/{namespace}.json`
2. Build script auto-discovers extensions and filters by version compatibility
3. Each versioned build includes only compatible extensions in registry
4. Agents declare supported extensions via `extensions_supported` array

This is a MINOR release adding new optional capabilities without
breaking existing functionality.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: Fix A2A extension format and add MCP server card support

Updates documentation to be compliant with both protocol specs:

**A2A Agent Cards:**
- Changed from `extensions.adcp` object to proper A2A `extensions[]` array format
- Each extension now has uri, description, required, and params fields
- Extension URI: https://adcontextprotocol.org/extensions/adcp

**MCP Server Cards:**
- Added support for declaring AdCP via `_meta['adcontextprotocol.org']`
- Supports both `/.well-known/mcp.json` and `/.well-known/server.json`
- Uses reverse DNS namespacing per MCP server.json spec

**Extension Params Schema:**
- Updated description to clarify usage in both protocols
- Same params structure works for both A2A and MCP

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Remove external $schema reference from MCP server card examples

The JSON schema validation test was failing because it tried to
validate against https://registry.modelcontextprotocol.io/server.schema.json
which is an external schema we don't have locally.

Removed the $schema field from MCP server card examples since they
reference an external MCP registry schema, not an AdCP schema.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add reserved namespaces and deprecation policy for extensions

Addresses PR review feedback:

**Reserved Namespaces (@BaiyuScope3)**
- Added RESERVED_NAMESPACES list: adcp, core, protocol, schema, meta, ext, context
- Build script now validates and rejects reserved namespaces
- Documented in extensions reference

**Deprecation Policy (@BaiyuScope3)**
- Added "Extension Deprecation Policy" section with:
  - When extensions may be deprecated (superseded, promoted, low adoption, incompatible)
  - Standard deprecation process (valid_until + 1 minor, CHANGELOG, migration guide)
  - Emergency deprecation for security issues

**Tests**
- Added test verifying reserved namespaces are not used

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Add Property Governance Protocol for AdCP 3.0

This introduces a stateful property list management model for governance agents:

## Key Concepts

- **Property Lists**: Managed resources combining base property sets with dynamic filters
- **Feature Discovery**: Agents advertise scoring capabilities via `list_property_features`
- **Brand Manifests**: Buyers describe their brand identity; agents apply appropriate rules
- **Discriminated Unions**: `base_properties` uses `selection_type` discriminator for type safety

## Design Principles

- **Scores are internal**: Governance agents filter properties; raw scores never leave the agent
- **Setup-time, not bid-time**: Lists resolved during campaign planning, cached for real-time
- **Identifiers-only responses**: `get_property_list` returns identifiers, not full property objects
- **Notification webhooks**: Webhooks provide summary; recipients call `get_property_list` to refresh

## Schemas Added

- Property list CRUD operations (create, update, get, list, delete)
- Property list filters with explicit logic (`countries_all`, `channels_any`, `feature_requirements`)
- Feature requirements for quantitative (`min_value`/`max_value`) and categorical (`allowed_values`)
- Base property source with discriminated union (publisher_tags, publisher_ids, identifiers)
- Webhook notification schema
- Core identifier schema for reuse

## Documentation

- Governance Protocol overview
- Property Governance specification
- Task reference for all CRUD operations
- Brand Standards placeholder

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add changeset for Property Governance Protocol

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Use empty changeset for draft 3.0 proposal

No version bump needed for draft/proposal specs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address review feedback on Property Governance Protocol

Schema fixes:
- Add methodology_url (required) and methodology_version to property-feature-definition
- Add signature field (required) to webhook schema for security
- Make countries_all and channels_any required in property-list-filters
- Move auth_token from get_property_list to create_property_list response

Documentation fixes:
- Add terminology note: Orchestrator = Buyer Agent
- Update examples to show auth_token in create response only
- Add note that auth_token is only returned at creation time

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add validate_property_delivery task for post-campaign compliance validation

Introduces the "what I wanted vs what I got" validation concept:
- validate_property_delivery task validates delivery records against property lists
- Three statuses: compliant, non_compliant, unknown
- Unknown records are valid (detection gaps shouldn't penalize compliance)
- Compliance rate excludes unknown impressions from calculation
- Batch support up to 10,000 records per request

New schemas:
- delivery-record.json: Input record with identifier + impressions
- validation-result.json: Per-record validation result with status and violations
- validate-property-delivery-request.json: Request payload
- validate-property-delivery-response.json: Response with summary and per-record results

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add supply path authorization to validate_property_delivery

Extends validate_property_delivery to validate sales agent authorization:

- Add optional sales_agent_url to delivery records
- Check if sales agent is listed in publisher's adagents.json
- Return authorization status (authorized/unauthorized/unknown) per record
- Add authorization_summary with aggregate stats and authorization_rate
- Two independent checks: property compliance + supply path authorization

New schema:
- authorization-result.json: Per-record authorization validation result

Authorization uses same "unknown excludes from rate" pattern as property
compliance - you cannot penalize for detection gaps or unreachable files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Simplify validation response: raw counts + optional feature details

Changes:
- Remove compliance_rate and authorization_rate from response schemas
- Return raw counts only (1.2M verified, 0.8M unknown, 0.3M invalid)
- Consumers calculate rates as needed, excluding unknowns from denominator

- Add optional feature_id and requirement to violation objects
- For feature_failed violations, shows which feature and what threshold failed
- Helps debugging why a property was marked non-compliant

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Split unknown into unmodeled/unidentified, add optional aggregate metrics

- Split "unknown" status into two distinct statuses:
  - unmodeled: identifier recognized but agent has no data (e.g., property too new)
  - unidentified: identifier type not resolvable (e.g., detection failed)
- Add optional aggregate field for computed metrics:
  - score, grade, label fields for agent-specific measurements
  - methodology_url for transparency
- Update summary to track both unmodeled and unidentified separately
- Update documentation with new statuses and aggregate concept

Inspired by Scope3's inventory_coverage (modeled/unmodeled) pattern. The
distinction helps identify whether gaps are in data coverage vs identifier
resolution.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix include_compliant description to reference new statuses

Updated the description to list non_compliant, unmodeled, and unidentified
(instead of the old "unknown" status).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Move authorized-properties doc to Governance Protocol section

- Moved authorized-properties.mdx from media-buy/capability-discovery to
  governance/property (renamed to "Understanding Authorization")
- Added validate_property_delivery task to navigation
- Navigation now shows conceptual explainer before tech spec

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix broken links to authorized-properties after move

Updated links in media-buy docs to point to new location in
governance/property section.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add property_list filtering to get_products for 2.6.x

- Add optional property_list parameter to get_products request schema
- Add property_list_applied response field to indicate filtering status
- Update get_products docs with new parameter, response field, and usage example
- Mark changeset as minor for 2.6.x release

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add governance overview enhancements for working group alignment

- Change banner from Info to Warning for draft status
- Add mission statement for governance protocols
- Add Working Group Areas table mapping to protocol domains
- Add Prompt-Based Policies section for natural language policy support

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix broken links in v2.6-rc docs after authorized-properties move

Update links from /docs/media-buy/capability-discovery/adagents and
/docs/media-buy/capability-discovery/authorized-properties to their
new locations in /docs/governance/property/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add get_property_features task and property_features discovery

- Add get_property_features task schemas for governance agents to return
  property certification/measurement data (carbon scores, TAG certified, etc.)
- Support two request modes: explicit property list or publisher discovery
- Add publisher_domain, property_types, property_tags filtering for discovery
- Add property_features field to adagents.json for feature provider discovery
- Rename from governance_agents to property_features for flexibility

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add filter semantics for geographic and channel compliance

Clarifies what "compliant in a country" means for property list filters:
- Refers to user location (where impressions are delivered)
- NOT publisher headquarters, server hosting, or incorporation country
- Requires regulatory compliance, ad delivery capability, and valid consent

Also clarifies channel filter semantics (technical capability, availability,
quality standards) and adds cross-references between docs and schema.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Revert filter semantics changes

The Filter Semantics section overstated the meaning of countries_all -
it's about whether the agent has feature data for properties in that
country, not about legal compliance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add if_not_covered handling and standardize on 'covered' terminology

- Add if_not_covered field to feature-requirement.json (exclude|include)
- Add coverage_gaps to get-property-list-response.json for transparency
- Change 'unmodeled' to 'not_covered' throughout for consistency:
  - validation-result.json status enum
  - validate-property-delivery-response.json summary fields
  - specification.mdx and validate_property_delivery.mdx documentation
- Document coverage handling in property_lists.mdx

This allows callers to specify how missing feature data should be handled
(strict vs lenient enforcement) and provides visibility into which
properties were included despite coverage gaps.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Clarify countries_all semantics: feature data, not compliance

Remove "compliant" language from countries_all descriptions to avoid
confusion with legal/regulatory compliance. The field means "property
must have feature data for these countries" - same semantics as content
standards PR 621 ("standards apply in these countries").

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Update 2.6.x with new changes
Includes:
- impressions field in package-request.json and update-media-buy-request.json
- paused field in package-request.json
- Other pending schema updates from 2.6.x source
…mas-with-impressions

chore: Fix/rebuild 2.6.0 schemas with impressions
* docs: clarify inline creative handling (Option B)

- create_media_buy and update_media_buy creatives array creates NEW creatives only
- Add CREATIVE_ID_EXISTS error code when creative_id already exists in library
- Add CREATIVE_IN_ACTIVE_DELIVERY error code to sync_creatives
- Clarify that sync_creatives is the canonical way to update/delete creatives
- Document upsert semantics with active delivery protection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: replace creative_ids with creative_assignments

- Remove creative_ids from package-request.json and update-media-buy-request.json
- Use creative_assignments for assigning existing library creatives (supports optional weight/placement_ids)
- Update documentation and examples to use creative_assignments
- Clarify delete_missing in sync_creatives cannot delete creatives in active delivery

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Extract package update schema and add reporting_webhook support

Split package schema into three clear variants:
- package-request.json (create): Full package with product_id, format_ids, pricing_option_id
- package-update.json (update): Only updatable fields, omits immutable fields
- package.json (response): Reflects current package state

Adds reporting_webhook to update_media_buy, enabling modification of reporting configuration
after campaign creation. Keeps push_notification_config separate for async operation notifications.

This unifies schema definitions, eliminates duplication, and resolves the issue where
reporting setup could not be updated post-launch without recreating the media buy.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* refactor: Extract reporting_webhook to shared schema

- Create /schemas/core/reporting-webhook.json with webhook config for automated reporting delivery
- Update create-media-buy-request.json to use $ref
- Update update-media-buy-request.json to use $ref

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Address code review feedback

- Fix CREATIVE_ID_EXISTS resolution to use creative_assignments (not creative_ids)
- Update Next Steps in update_media_buy to reference creative assignments
- Use $ref for available-metric enum in reporting-webhook.json

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Enables consumer consent flows by providing a link to advertiser/publisher
privacy policies. AI platforms can use this to present explicit privacy
choices to users before data handoff.

Works alongside MyTerms/IEEE P7012 discovery for machine-readable privacy
terms - the privacy_policy_url serves as the human-readable fallback.

Changes:
- Add privacy_policy_url field to brand-manifest.json schema
- Add privacy_policy_url field to adagents.json contact object
- Add Privacy Integration section to brand manifest documentation
- Update adagents.json documentation with new field

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Add support for OpenAI's product feed format and agentic checkout specification, enabling AI agents to discover products and complete purchases through a structured API. Includes field mapping guidance from Google Merchant Center to OpenAI's specification.

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
bokelley and others added 17 commits January 18, 2026 10:42
* Add Content Standards Protocol for content safety evaluation

Introduces the Content Standards Protocol with four tasks:
- list_content_features: Discover available content safety features
- get_content_standards: Retrieve content safety policies
- check_content: Evaluate content context against safety policies
- validate_content_delivery: Batch validate delivery records

Features use a generic type system (binary, quantitative, categorical)
aligned with property governance patterns. Policies use prompt-based
evaluation (like Scope3) rather than keyword lists. Standards can be
scoped by country, brand, channel, and product.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Simplify content standards policy model

- Remove sentiment analysis (subset of suitability)
- Clarify brand safety vs suitability distinction:
  - Safety = safe for ANY brand (universal thresholds)
  - Suitability = safe for MY brand (brand-specific)
- Replace three separate prompts with single policy + examples:
  - Single policy prompt for natural language guidelines
  - Examples object with acceptable/unacceptable URLs as training set
- Update schema and documentation to match

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix broken links in content standards docs

Remove links to Property Governance and Creative Standards which don't
exist in this branch yet.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Align content standards with property protocol patterns

Address review comments:

1. Examples now use typed identifiers with language tags:
   - Uses identifier schema pattern (type: domain, apple_podcast_id, rss_url, etc.)
   - Added language field (BCP 47 tags like 'en', 'en-US')
   - Created content-example.json schema

2. Scope fields aligned with property protocol:
   - brands → brand_ids (references Brand Manifest identifiers)
   - countries → countries_all (must apply in ALL listed countries)
   - channels → channels_any (applies to ANY listed channel)
   - Removed products field (unclear purpose)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Clarify buyer-managed scope selection model

The buyer selects the appropriate standards_id when creating a media buy.
The seller receives a reference to resolved standards - they don't need
to do scope matching themselves. Scope fields are metadata for the buyer's
internal organization, not for seller-side resolution.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address review comments on content standards

1. Scope is targeting, not metadata:
   - Clarified scope defines where standards apply
   - Removed "metadata" language

2. Add CRUD tasks for standards management:
   - Added list_content_standards, create_content_standards,
     update_content_standards, delete_content_standards
   - Organized tasks into Discovery, Management, Evaluation sections
   - Created task documentation pages

3. Clarify evaluation results pattern:
   - Always returns pass/fail verdict first
   - Features array is optional breakdown for debugging
   - Explains use cases: optimization, safety vs suitability,
     debugging third-party standards (GARM, Scope3)
   - Updated check-content-response and validate-content-delivery-response
     schemas to use verdict + optional features pattern

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Refine content standards schema and examples

Address review comments:

1. Rename 'examples' to 'calibration':
   - Better describes the purpose (training/test set for AI interpretation)
   - Add support for text snippets, image/video/audio URLs

2. Create unified content-context.json schema:
   - Used for both calibration examples and check_content requests
   - Supports: domain, text, image_url, video_url, audio_url, rss_url,
     apple_podcast_id, spotify_show_id, podcast_guid
   - Optional metadata: language, title, description, categories, text_content

3. Flatten scope structure:
   - Move brand_ids, countries_all, channels_any to top level
   - Aligns with property protocol pattern

4. Remove fixed response time claims:
   - check_content may be async with webhook callback
   - Let implementations define their own SLAs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Integrate robust content-context schema from sit/adcp

Integrates comprehensive content-context schema improvements:

1. Signals array (replaces simple categories):
   - Structured signals with key, value, confidence
   - Supports version, source, and reasons
   - Examples: iab_category, violence_score, mpaa_rating

2. Structured text_content (replaces simple string):
   - Array of typed blocks: paragraph, heading, image, video, audio
   - Images include alt_text, caption, dimensions, type
   - Video/audio include duration, transcript, transcript_source

3. Rich metadata object:
   - Open Graph, Twitter Card, JSON-LD
   - Author, canonical URL, meta tags

4. Temporal fields:
   - published_time, last_update_time (ISO 8601)

5. artifact_id for cross-reference tracking

6. additionalProperties: true for extensibility

Credit: sit@ca367da

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update changeset to list all 8 tasks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Rename check_content to calibrate_content for collaborative calibration

- Rename task to emphasize dialogue-based alignment vs runtime evaluation
- Add context_id and feedback parameters for multi-turn conversations
- Include verbose explanations with confidence scores and policy alignment
- Add workflow diagram showing Setup → Activation → Runtime phases
- Update schemas with calibrate-content-request/response
- Remove old check-content schemas
- Update related task links across all task docs

Key insight: calibrate_content is low-volume, verbose, dialogue-based;
runtime decisioning happens locally at seller for scale.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Use protocol-level context for calibration dialogue

Remove context_id and feedback from calibrate_content task - dialogue
is handled at the protocol layer via A2A contextId or MCP context_id.

Updated documentation to show how multi-turn calibration conversations
work using the existing protocol mechanisms for conversation management.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Rename content-context to content with assets array

Addresses feedback:
1. Rename "content-context" to "content" - too many "context" terms
2. Restructure to use assets array pattern like creative assets

Content is now represented as a collection of assets (text, images,
video, audio) plus metadata and signals. This aligns with the creative
asset model and avoids overloading "context" terminology.

Key changes:
- content.json replaces content-context.json
- assets array with typed blocks (text, image, video, audio)
- identifiers object for platform-specific IDs (apple_podcast_id, etc.)
- url is now the primary required field
- Updated all docs and schema references

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Rename content to artifact with property_id + artifact_id

Content adjacent to ads is now modeled as an "artifact" - identified by
property_id (using existing identifier types) plus artifact_id (string
defined by property owner). This avoids overloading "content" and enables
identification of artifacts that don't have URLs (Instagram, podcasts,
TV scenes).

Changes:
- Rename content.json to artifact.json with new required fields
- property_id uses existing identifier type schema (type + value)
- artifact_id is a string - property owner defines the scheme
- format_id optional - can reference format registry (like creative formats)
- url now optional since not all artifacts have URLs
- Update all schema references and documentation examples

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove signals field, add secured asset access

Address review feedback:

1. Remove signals from artifact schema and examples - the verification
   agent evaluates content directly without pre-computed classifications.
   This simplifies the model: send content, get responses.

2. Add secured URL access pattern for private assets - supports bearer
   tokens, service accounts, and pre-signed URLs for content that isn't
   publicly accessible (AI-generated images, private conversations,
   paywalled content).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add artifacts page, restructure overview with strategic framework

Restructure Content Standards docs around the key strategic questions:

1. What content? → New artifacts.mdx page with full schema details
2. How much adjacency? → Define in products, negotiate in media buys
3. What sampling rate? → Negotiate coverage vs cost tradeoffs
4. How to calibrate? → Dialogue-based alignment process

Changes:
- Add standalone artifacts.mdx with asset types and secured access
- Replace ASCII workflow with mermaid sequence diagram
- Add adjacency and sampling_rate sections to overview
- Simplify policy examples (remove verbose calibration details)
- Move secured URL access documentation to artifacts page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Simplify artifact schema: assets required, title as asset, add variant_id

- Make assets array required (artifacts without content are meaningless)
- Remove title, language, description top-level fields (they're text assets)
- Add variant_id for A/B tests, translations, and temporal versions
- Add language field to text assets for mixed-language content
- Update all documentation examples to use new pattern
- Fix schema validation test to handle internal $defs references

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address review comments on content standards overview

- Rename content_standards to content_standards_adjacency_definition
- Add Adjacency Units table defining: posts, scenes, segments, seconds, viewports, articles
- Clarify human-in-the-loop aspect of calibration process

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Simplify calibrate_content response schema and examples

Address review comments:
- Remove suggestion field from features (not appropriate for calibration)
- Remove policy_alignment (redundant with features breakdown)
- Make confidence explicitly optional in docs
- Simplify A2A examples to use data-only parts (no text when calling skill)
- Update response field table to show required vs optional

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Clarify validate_content_delivery data flow: buyer as intermediary

Address review comment about who calls validate_content_delivery:
- Delivery records flow from seller → buyer → verification agent
- Buyer aggregates delivery data and knows which standards_id applies
- Verification agent works on behalf of the buyer

Changes:
- Add Data Flow section with mermaid diagram to validate_content_delivery.mdx
- Add media_buy_id field to request schema and delivery records
- Update overview mermaid diagram to show correct flow
- Remove suggestion field from response examples

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add get_media_buy_artifacts task for separate content retrieval

Content artifacts (text, images, video) are separate from delivery
metrics. This new task allows buyers to request content samples from
sellers for validation, keeping the data flow clean:

- Buyer calls get_media_buy_artifacts to get content samples
- Buyer validates samples with verification agent
- Delivery metrics stay in get_media_buy_delivery

Updates validate_content_delivery flow to reference new task.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address review comments on validate_content_delivery schema

1. Remove redundant top-level media_buy_id - keep at record level since
   records can come from multiple media buys

2. Add country and channel fields to delivery records for targeting
   context validation

3. Replace creative_id with brand_context placeholder object - the
   governance agent needs brand/SKU info, not opaque creative IDs.
   Schema marked as TBD pending brand identifier standardization.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Address PR review comments on Content Standards Protocol

- #1/#16: Update artifact description to "content context where placements occur"
- #2: Add STANDARDS_IN_USE error code to delete_content_standards
- #4: Clarify effective_date semantics (null = not yet effective, multiple allowed)
- #5: Add note about calibration data size concerns
- #7: Document scope conflict handling in create_content_standards
- #8/#9: Rename examples to calibration for consistency
- #10: Increase validate_content_delivery response time to 60s
- #11: Clarify artifact_id is opaque/flexible
- #12/#13: Add notes about auth mechanism extraction for large artifacts
- #14/#15: Add effective_date filter and abbreviated response note to list

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add Content Standards implementation guide

Documents implementation patterns for three roles:
- Sales agents: accepting standards, calibration, validation
- Buyer agents: proxy pattern, orchestrating across publishers
- Web publishers: URL-based content with scraper/cache patterns

Also documents the content_access pattern for authenticated
URL namespace access.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix implementation guide flow for list_content_features

Clarifies that:
- Buyers call list_content_features to discover publisher capabilities
  BEFORE creating standards
- Sellers don't need to call back - the standards document contains
  all required features/rules
- Updated step numbering for buyer agent section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove list_content_features - simplify to accept-or-reject model

Content Standards Protocol should be binary: sellers either accept the
standards they can fulfill or reject what they cannot. Feature discovery
adds unnecessary complexity when we don't yet know how adjacency will
play out across different publishers.

- Remove list_content_features task and schemas
- Simplify implementation guide to focus on accept-or-reject model
- Update navigation and schema index

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix calibration and validation flows in implementation guide

- Calibration: Seller sends samples TO buyer's governance agent (not reverse)
- Validation: Governance agent implements validate_content_delivery (not seller)
- Seller's job: Implement get_media_buy_artifacts and support webhooks
- Added artifact webhook and reporting webhook requirements for sellers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add artifact webhook spec and clarify role terminology

Artifact Webhooks:
- Add artifact_webhook config to create-media-buy-request.json
- Add artifact-webhook-payload.json schema for push notifications
- Supports realtime and batched delivery modes with sampling

Role Terminology:
- Orchestrator (not "buyer agent") - DSP, trading desk, agency platform
- Sales Agent - publisher ad server, SSP
- Governance Agent - IAS, DoubleVerify, brand safety service

Implementation Guide:
- Clear roles table showing who does what
- Correct flow: brand → orchestrator → governance agent (setup) → sales agent
- Sales agent calibrates against governance agent, not orchestrator
- Sales agent pushes artifacts to orchestrator, orchestrator forwards to governance agent

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix terminology: artifacts can be push or pull

Changed "push artifacts" to "provide artifacts" since sales agents
can either push via artifact_webhook or respond to get_media_buy_artifacts
(pull).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Simplify content standards: async validation, rename fields, remove competitive separation

1. validate_content_delivery is now async
   - Accept batch immediately, process in background
   - Returns validation_id for status polling

2. Rename calibration → calibration_exemplars
   - More descriptive name for training set
   - Change acceptable/unacceptable → pass/fail for consistency

3. Remove competitive_separation
   - Out of scope for content standards
   - Competitive separation is about ad co-occurrence, not content adjacency
   - Requires knowledge of other ads on page, which content standards doesn't have

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Extract content-standards.json and add lifecycle dates

1. Extract reusable content-standards.json schema
   - Defines brand safety/suitability policies
   - Can be referenced by get/list/create responses
   - Includes scope, policy, calibration_exemplars, floor

2. Add termination_date for lifecycle management
   - effective_date: when standard becomes active (null = draft)
   - termination_date: when standard was archived (null = active)
   - Lifecycle states: Draft → Active → Terminated

3. Document lifecycle states in get_content_standards docs
   - Explains how to identify unused standards for cleanup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add list_content_standards schemas using reusable content-standards.json

- list-content-standards-request.json: filters by brand, channel, country
- list-content-standards-response.json: returns array of content standards
- Response references content-standards.json via $ref, demonstrating reuse
- Supports include_terminated and include_drafts filters for lifecycle queries

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add effective_date filters and document Content Standards errors

- Add effective_before/effective_after filters to list-content-standards-request schema
- Add include_terminated/include_drafts to list_content_standards docs
- Add schema reference links to list_content_standards docs
- Document Content Standards error codes (STANDARDS_NOT_FOUND, STANDARDS_IN_USE, STANDARDS_SCOPE_CONFLICT)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove lifecycle complexity from Content Standards

Simplify by removing effective_date/termination_date lifecycle management:
- These are implementation details, not protocol concerns
- Governance agent returns current active standards via get_content_standards
- Cache-Control headers handle freshness, not effective_date filtering

Removed:
- effective_date, termination_date from content-standards.json schema
- effective_before, effective_after, include_terminated, include_drafts filters
- Lifecycle states documentation

The protocol should be simple: request standards, get current standards.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Refine Content Standards: URI-based floors and validation thresholds

- Change floor from enum to URI-based reference (GARM is defunct)
  - floor now has url, name, and version fields
  - Supports external floor definitions (e.g., Scope3 brand safety)
- Fix calibration_exemplars terminology (pass/fail, not acceptable/unacceptable)
- Add validation threshold concept to product catalog
  - Sellers advertise their calibration accuracy (e.g., 95% aligned)
  - Acts as contractual guarantee for brand safety compliance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Strengthen Content Standards privacy-preserving value proposition

- Make clear this is the ONLY solution for ephemeral/sensitive content
- Add "using agents to protect privacy" framing
- Clarify where each phase runs (calibration, local execution, validation)
- Add table showing phase locations and what happens
- Add "Future: Secure Enclaves" section with TEE/containerized governance vision
- Reference IAB Tech Lab Authentic framework for real-time verification

The key insight: the execution engine runs entirely inside the publisher's
infrastructure - content never leaves. OpenAI conversations stay within their
firewall. This is the fundamental value proposition for AI-generated and
privacy-regulated content.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix IAB Tech Lab reference to ARTF (Agentic RTB Framework)

Update the future vision section to reference the correct IAB Tech Lab
specification - ARTF defines how service providers package containers
deployed into host infrastructure, which is exactly the model Content
Standards uses for privacy-preserving brand safety.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add pinhole interface specification for secure enclaves

The containerized governance agent needs a well-defined narrow interface:

Inbound (verification service → enclave):
- Updated models
- Policy changes and calibration exemplars
- Configuration updates

Outbound (enclave → verification service):
- Aggregated results (pass rates, drift metrics)
- Statistical summaries
- Attestation proofs

Never crosses the boundary:
- Raw content artifacts
- User data / PII
- Individual impressions

This pinhole is the interface that needs standardization for the
reference implementation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Replace ASCII art with mermaid diagram for secure enclaves

ASCII art doesn't render reliably across different fonts and screen sizes.
Mermaid diagrams are supported by Mintlify and render consistently.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…#806)

* feat: Add content standards create/update schemas and languages field

- Add create-content-standards-request/response.json schemas
- Add update-content-standards-request/response.json schemas for incremental updates
- Add languages field (BCP 47 tags) to content standards scope
- Reference channels enum instead of string array for type safety
- Remove version field from content standards response (keep spec clean)
- Add webhook-authentication.json and webhook-config.json schemas
- Update all content standards docs with languages examples

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Address PR feedback on content standards schemas

1. Rename languages to languages_any for consistency with countries_all/channels_any
   - Clarifies OR logic: standards apply to content in ANY of listed languages
   - Content in unlisted languages is not covered by these standards

2. Add URL type to calibration exemplars (alongside domain type)
   - Enables page-level granularity for calibration
   - Example: { "type": "url", "value": "https://espn.com/nba/story/12345" }

3. Clarify floor documentation for vendor standards
   - Floors are industry-standard (GARM) or vendor-defined (IAS, DoubleVerify)
   - Seller agent retrieves floor definition from URL

4. Add language to scope conflict detection docs
   - Scope conflicts now consider country/channel/language combination

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Remove domain type from calibration exemplars

Domain-level references are too coarse for calibration - a domain can have
millions of pages with varying content. Calibration exemplars now support:

1. URL references - specific pages to fetch and evaluate
2. Full artifacts - pre-extracted content (text, images, video, audio)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove floor field and update calibration exemplars

- Remove floor field from content-standards schemas (content-standards.json,
  create-content-standards-request.json, update-content-standards-request.json)
- Add documentation note that implementors MUST apply a brand safety floor,
  but AdCP does not define the floor specification
- Update calibration exemplars to use URL type instead of domain type
  (domain is too coarse for calibration - need specific page URLs)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Absolute links like /docs/governance/... break when docs are
synced to v2.6-rc/ on main. Converting to relative links ensures
they work in both contexts.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Convert `:::note` Docusaurus syntax to Mintlify `<Note>` components
- Add case-insensitivity documentation for country codes (ISO 3166-1 alpha-2)
  and language codes (ISO 639-1/BCP 47)
- Document recommended formats (uppercase for countries, lowercase for languages)
- Remove orphaned webhook-config.json and webhook-authentication.json schemas
  that were never referenced

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Keep version 2.6.0 for package.json, package-lock.json, and schema index
- Add comprehensive 2.6.0 changelog with all merged features:
  - Content Standards Protocol
  - Property Governance Protocol
  - Unified assets field
  - Typed extensions infrastructure
  - OpenAI Commerce integration
  - Privacy policy URL fields
  - creative_assignments refactor
- Keep main's changes for v2.6-rc docs (source of truth)
- Keep main's sync-versioned-docs.yml improvements
chore: rebase 2.6.x with latest main
…hema (#845)

BREAKING CHANGE: Removed `format`, `status`, and `assigned_to_package` fields.
Use array versions instead: `formats`, `statuses`, `assigned_to_packages`.

Arrays with one item work identically to the removed singular fields.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add 'archived' status to creative-status enum

- Add 'archived' to creative-status.json enum
- Document default exclusion behavior in creative-filters.json
- Update list_creatives docs with archived filtering examples
- Add 'processing' to status_summary schema for completeness
- Update data-models.mdx TypeScript types

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Remove erroneous status field from assignment response

Assignments are binary - they exist or they don't. The package/media buy
status determines delivery, not the assignment itself.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Replace approved boolean with status enum in creative-asset

Use the same status field for both input (sync_creatives) and output
(list_creatives) for consistency. The status enum values are:
- approved: finalize generative creative
- rejected: request regeneration
- processing, pending_review, archived: system-set states

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Rename package_name to buyer_ref in assignment response

Package schema has buyer_ref, not name. Updated assignment response
to match.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add Media Channel Taxonomy specification

Introduces a standardized taxonomy distinguishing channels (where ads reach audiences), property types (addressable inventory), formats (how ads render), and buying models (how inventory is purchased).

- Defines 19 media channels: web, ctv, mobile_app, social, search, linear_tv, radio, streaming_audio, podcast, dooh, ooh, print, cinema, email, gaming, influencer, conversational, sponsorship, commerce_media
- Updates channels.json and property-type.json enums with new values and descriptions
- Adds comprehensive specification document with channel definitions and use cases
- Includes migration guidance mapping legacy channel values to new taxonomy
- Updates documentation examples to use new channel taxonomy

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>

* refactor: Rename conversational channel to ai_agents

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: Clarify channel vs property type distinction and add edge cases

- Add "Understanding Channels vs Property Types" section explaining buying context
- Add desktop_app property type for Electron/Chromium wrapper applications
- Refine ai_agents description to clarify it describes buying context, not technology
- Add comprehensive edge cases section covering:
  - In-app browsers (WebViews)
  - Desktop apps as Chromium wrappers (Spotify, Discord)
  - AI widgets on publisher websites
  - Commerce vs web display ambiguity
  - Search vs AI agents distinction
  - Gaming vs mobile app classification
  - Influencer vs social differentiation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Correct edge cases for WebViews and AI widgets

- WebViews: Ads on destination sites (cnn.com via Facebook browser) are
  still web channel, not social - bought through standard web programmatic
- AI widgets: Add user intent/focus dimension, similar to OLV distinction
  (peripheral vs primary focus)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: Update changeset to major (breaking change)

Replacing channel enum values is a breaking change for existing implementations.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add affiliate channel to Media Channel Taxonomy

Adds affiliate as a distinct channel for performance-based publisher
partnerships including affiliate networks, comparison sites, lead gen,
coupon/deal sites, and cashback programs.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Switch to planning-oriented channel taxonomy (19 channels)

Based on media planning expert feedback, channels now represent how
buyers allocate budget rather than technical substrates.

Key changes:
- Remove web, mobile_app, ai_agents (substrates, not planning buckets)
- Add display, olv (OLV = Online Video, distinct from CTV)
- Rename commerce_media → retail_media, sponsorship → product_placement
- Update examples in get_products, list_authorized_properties, and
  quick reference docs to use new channel values

New 19-channel list: display, olv, social, search, ctv, linear_tv,
radio, streaming_audio, podcast, dooh, ooh, print, cinema, email,
gaming, retail_media, influencer, affiliate, product_placement

Future considerations documented: messaging, xr, ai_agents

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
…854)

Add a mermaid sequence diagram and narrative explaining the end-to-end
workflow for property governance across three phases:
- Campaign Planning: orchestrator creates property lists, decisioning platform fetches and caches
- Bid Time: decisioning platform uses local cache only (no governance calls)
- Monitoring: webhooks notify of changes, decisioning platform re-fetches

Notes that AXE segments are an optional implementation mechanism for caching.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Add documentation explaining how publishers declare governance agents
in adagents.json via the property_features field, enabling buyers to
discover which agents (Scope3, TAG, OneTrust, etc.) have compliance,
sustainability, or quality data for properties.

- Add property_features field documentation to adagents.mdx
- Add governance agent discovery workflow with sequence diagram
- Document vendor extension pattern via ext blocks
- Update index.mdx to include discovery as 5th governance concern
- Add discovery section to list_property_features task doc

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: Add get_capabilities task for expanded capability discovery

Introduces get_capabilities task replacing list_authorized_properties with
expanded capability declaration for protocol versions, execution features,
and portfolio information.

Protocol section:
- adcp_major_versions for compatibility
- features (inline_creative_management, property_list_filtering, content_standards)

Execution section:
- axe_integrations for ad exchange support
- creative_specs (VAST/MRAID versions)
- targeting with granular geo support

Geo targeting with named systems:
- Metros: nielsen_dma, uk_itl1, uk_itl2, eurostat_nuts2
- Postal: us_zip, gb_outward, ca_fsa, etc.

Product filters:
- Added regions, metros, postal_areas filters
- Added required_axe_integrations, required_features

Capability contract: If declared, seller MUST honor it.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Move get_capabilities to protocol level for cross-protocol support

Restructure get_capabilities as a protocol-level task that works across
all AdCP domain protocols, not just media-buy.

Response structure changes:
- `adcp.major_versions` - AdCP version compatibility
- `supported_protocols` - Which protocols this seller supports
- `media_buy` section for media-buy specific capabilities
- `signals` section reserved for future use

This enables buyers to discover capabilities for all protocols in a
single call, with protocol-specific details nested appropriately.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* deprecate: Agent card extension in favor of tool-based discovery

AdCP discovery now uses native MCP/A2A tool discovery:
- Presence of 'get_capabilities' tool indicates AdCP support
- Call get_capabilities for version, protocols, features, capabilities
- No need for custom agent card extensions

Deprecates adcp-extension.json - maintained for backward compatibility only.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* rename: get_capabilities → get_adcp_capabilities for unambiguous discovery

The distinctive name 'get_adcp_capabilities' ensures:
- Immediate identification of AdCP support when scanning tool lists
- No collision with other protocols' capability tools
- Self-documenting tool presence

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: Restore v2.6-rc directory after rebase

The v2.6-rc directory was inadvertently modified during the cherry-pick
rebase. Restoring from 2.6.x branch since this content is auto-generated.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add structured geo targeting with named systems

- Update targeting.json: geo_metros and geo_postal_areas now use
  structured format with explicit system specification
- Remove postal_areas from product-filters.json (too granular for
  product discovery; use metros for filtering, postal for execution)
- Update get_adcp_capabilities docs to clarify:
  - Product filters use coarse geography (metros)
  - Targeting overlay uses fine-grained geography (postal areas)
- Capability contract: if seller declares us_zip support, buyer can
  specify ZIP codes in create_media_buy targeting_overlay

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add governance protocol support to get_adcp_capabilities

Governance agents provide property data (compliance scores, brand safety
ratings, sustainability metrics). Their capabilities are now declared in
get_adcp_capabilities:

- Added 'governance' to supported_protocols enum
- Added governance.property_features array for feature definitions
- Each feature has: feature_id, type (binary/quantitative/categorical),
  optional range/categories, description
- Eliminates need for separate list_property_features task

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* deprecate: list_property_features in favor of get_adcp_capabilities

- Remove list-property-features-request.json and response schemas
- Update schema index.json to remove list_property_features entries
- Update list_property_features.mdx with deprecation warning and migration guide
- Update governance tasks index to reference get_adcp_capabilities for discovery
- Update changeset to document the deprecation

Governance agents now declare their capabilities via the property_features
array in get_adcp_capabilities, eliminating the need for a separate
discovery call.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add required_targeting_systems filter to product-filters

Allows buyers to filter products to sellers that support specific
targeting systems (e.g., 'us_zip', 'nielsen_dma') without passing
actual geo values at discovery time.

This enables the pattern:
1. Discovery: Filter by capability ("must support ZIP targeting")
2. Execution: Apply actual targeting ("deliver to these ZIP codes")

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* rename: required_targeting_systems → required_geo_systems

Renamed for clarity and expanded to accept both:
- Capability names: 'geo_countries', 'geo_regions' (boolean capabilities)
- System names: 'us_zip', 'nielsen_dma' (nested system keys)

Example: required_geo_systems: ['geo_regions', 'us_zip']
Filters to sellers supporting region targeting AND ZIP code targeting.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: required_geo_targeting with two-layer structure

Replaces flat `required_geo_systems` with structured `required_geo_targeting`
that cleanly separates:
- level: targeting granularity (country, region, metro, postal_area)
- system: classification taxonomy (only for levels with multiple systems)

Example:
```json
{
  "required_geo_targeting": [
    { "level": "region" },
    { "level": "metro", "system": "nielsen_dma" },
    { "level": "postal_area", "system": "us_zip" }
  ]
}
```

This maps cleanly to capability checks:
- { level: "region" } → targeting.geo_regions === true
- { level: "metro", system: "nielsen_dma" } → targeting.geo_metros.nielsen_dma
- { level: "postal_area", system: "us_zip" } → targeting.geo_postal_areas.us_zip

Adds geo-level.json enum for the supported targeting levels.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: Remove metros/regions from product filters

Products don't have metro-specific coverage - they have country coverage.
Product filters now use:
- `countries` for coverage filtering
- `required_geo_targeting` for capability discovery (what geo systems seller supports)

Actual metro/region/postal values are used at targeting time in create_media_buy,
not at product discovery time.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add regions/metros product filters for local inventory

Two models for product geography:

1. **Coverage filters** (for locally-bound inventory):
   - `countries` - country coverage (all inventory)
   - `regions` - region coverage (ISO 3166-2) for regional OOH, local TV
   - `metros` - metro coverage ({ system, code }) for radio, DOOH, local TV

   Use when products ARE geographically bound (radio station = DMA)

2. **Capability filters** (for digital inventory with broad coverage):
   - `required_geo_targeting` - filter by seller capability

   Use when products have broad coverage and you'll target at buy time

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add extensions_supported to get_adcp_capabilities response

Allows agents to declare which extension namespaces they support.
Buyers can expect meaningful data in ext.{namespace} fields from
agents that declare support.

Replaces extensions_supported from deprecated agent card extension.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: Add methodology_url to property_features

Allows governance agents to link to documentation explaining how
they calculate/measure a feature. Helps buyers understand and
compare methodologies across different vendors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: Update documentation to reference get_adcp_capabilities

Replace references to deprecated list_authorized_properties with
get_adcp_capabilities throughout documentation:

- quickstart.mdx: Update auth section public operations
- intro.mdx: Add capability discovery section
- core-concepts.mdx: Update synchronous operations list
- media-buy-quick-reference.mdx: Replace task reference section
- mcp-guide.mdx: Add Protocol Tools section and discovery note
- a2a-guide.mdx: Add to Available Skills and discovery note
- security.mdx: Update low-risk operations and rate limits
- authentication.mdx: Update public operations list
- implementor-faq.mdx: Update property tag resolution guidance
- adagents.mdx: Update Learn More link
- authorized-properties.mdx: Update property tags workflow
- get_products.mdx: Update code comments
- testing.mdx: Update compliance checklist
- capability-discovery/index.mdx: Mark deprecated task
- task-reference/index.mdx: Add get_adcp_capabilities
- media-buy/index.mdx: Add get_adcp_capabilities
- governance/property/index.mdx: Reference get_adcp_capabilities

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: remove empty changeset file

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
- Merge 2.6.x branch into main (Property Governance, Content Standards, etc.)
- Create dist/docs/2.5.3/ frozen snapshot of 2.5 documentation
- Update docs.json versioning: "2.6" → docs/, "2.5" → dist/docs/2.5.3/
- Add release-docs.yml workflow for future doc snapshots on release
- Remove old v2.6-rc sync workflow (no longer needed)
- Update .gitignore to allow dist/docs/
- Update pre-push hook to exclude archived docs from link check

This establishes a sustainable versioning model where:
- docs/ is always the current/latest version
- dist/docs/{version}/ contains frozen release snapshots
- Maintenance branches can release docs via the release workflow

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Breaking changes require major version bump:
- package.json: 2.6.0 → 3.0.0-beta.1
- schema registry: adcp_version 2.6.0 → 3.0.0-beta.1
- docs.json: version label 2.6 → 3.0-beta
- dist/schemas: renamed 2.6.0 → 3.0.0-beta.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enter changeset pre-release mode with 'beta' tag
- Fix release-docs workflow to handle prerelease versions:
  - Extract "3.0-beta" from "3.0.0-beta.1" for docs.json labels
  - Update regex to match prerelease paths like dist/docs/3.0.0-beta.1/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update intro.mdx banner for v3.0.0-beta.1
- Add comprehensive release notes section covering:
  - Media Channel Taxonomy breaking changes (19 new channels)
  - Creative assignments with weighting
  - Geo targeting with named systems
  - get_adcp_capabilities task
  - Governance Protocol (property lists, content standards)
  - Unified asset discovery
  - Deprecation notices and migration checklist

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@bokelley
Copy link
Contributor Author

Closing as superseded by PR #859 which has been merged. This PR (from bokelley/rebase-2.6.x) was the older version; PR #859 (from rebase-2.6.x) contained the final changes.

@bokelley bokelley closed this Jan 25, 2026
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.

2 participants