Skip to content

Conversation

@bokelley
Copy link
Contributor

@bokelley bokelley commented Jan 5, 2026

Summary

Adds the Content Standards Protocol - draft governance protocol for content safety and suitability rules.

  • Documentation in docs/governance/content-standards/
  • JSON schemas in static/schemas/source/content-standards/
  • Task definitions: list_content_features, get_content_standards, list_content_standards, check_content
  • Feature-based verification pattern (binary, quantitative, categorical)
  • Prompt-based policies for AI evaluation

Draft for AdCP 3.0 - Part of the AAO Governance Working Group initiatives.

Test plan

  • Verify docs render correctly with mintlify dev
  • Verify schemas validate with npm test
  • Review schema structure against Property Governance pattern

🤖 Generated with Claude Code

bokelley and others added 8 commits January 5, 2026 08:21
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>
- 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>
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>
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>
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>
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>
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>
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>
@bokelley bokelley changed the title Add Content Standards Protocol for AdCP 3.0 Add Content Standards Protocol Jan 5, 2026
@bokelley bokelley changed the base branch from main to 2.6.x January 5, 2026 23:57
bokelley and others added 13 commits January 7, 2026 04:28
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>
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>
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>
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>
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>
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>
…t_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>
- 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>
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>
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>
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>
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>
bokelley and others added 6 commits January 8, 2026 18:48
- #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>
Resolved conflicts:
- docs.json: Integrated Content Standards into Governance Protocol [3.0] structure
- static/schemas/source/index.json: Merged content-standards tasks into governance section

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
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>
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>
- 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>
bokelley and others added 12 commits January 18, 2026 04:58
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>
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>
…ompetitive 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>
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>
- 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_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>
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>
- 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>
- 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>
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>
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>
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>
@bokelley bokelley merged commit 6afd173 into 2.6.x Jan 18, 2026
7 checks passed
@bokelley bokelley deleted the bokelley/content-standards branch January 18, 2026 15:42

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a request/response schema for this task @bokelley ?

```json
{
"scope": {
"brand_ids": ["nike"],
Copy link

@marekjalovec marekjalovec Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Brand manifest doesn't contain it, so how do you pair content standards with a media buy?

"additionalProperties": true
},
"artifact_webhook": {
"$comment": "Webhook configuration for content artifact delivery - enables governance validation. Same authentication structure as reporting_webhook.",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it's the same, it should be extracted to a new schema file.

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.

4 participants