Skip to content

Conversation

@bokelley
Copy link
Contributor

@bokelley bokelley commented Jan 4, 2026

Summary

This PR introduces the Property Governance Protocol for AdCP 3.0, providing a stateful property list management model for governance agents.

Key Features

  • 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 automatically
  • Discriminated Unions: base_properties uses selection_type discriminator for type-safe generation

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 only; 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
  • Moved adagents.mdx to governance section (from media-buy) with updated links

Test plan

  • All schema validation tests pass
  • All JSON examples in documentation validate
  • No broken links in Mintlify docs
  • TypeScript type check passes

🤖 Generated with Claude Code

bokelley and others added 13 commits January 4, 2026 12:22
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 <[email protected]>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
No version bump needed for draft/proposal specs.

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

Co-Authored-By: Claude Opus 4.5 <[email protected]>
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 <[email protected]>
…dation

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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
…rics

- 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 <[email protected]>
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 <[email protected]>
- 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 <[email protected]>
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 <[email protected]>
- 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 <[email protected]>
- 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 <[email protected]>
@bokelley bokelley changed the base branch from main to 2.6.x January 5, 2026 23:55
@bokelley bokelley self-assigned this Jan 5, 2026
@bokelley bokelley linked an issue Jan 6, 2026 that may be closed by this pull request
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.

Media controls / property lists

2 participants