Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
9dcf7aa
chore(3.0.x): re-cherry-pick #3461 and #3462 (envelope_field_present …
bokelley Apr 30, 2026
22a69cf
Version Packages (#3615)
aao-release-bot[bot] Apr 30, 2026
a83a2aa
docs(creative-channels): fix url_type tracker → tracker_pixel (#2986)…
bokelley Apr 30, 2026
dabd223
feat(storyboard): provides_state_for cascade-rescue field (closes #37…
bokelley May 1, 2026
8dc3d15
Version Packages (#3696)
aao-release-bot[bot] May 1, 2026
1aec78c
ci(release): auto-upload protocol tarball to GitHub Release (#3786) (…
bokelley May 1, 2026
78b1dc4
chore(3.0.x): cherry-pick + adapt 7 spec fixes from main (#3784) (#3789)
bokelley May 2, 2026
59db032
ci(release): un-exclude dist/compliance + forward-merge auto-resoluti…
bokelley May 2, 2026
4a0ed6e
ci(release): forward-merge package.json --ours, not --theirs (#3807) …
bokelley May 2, 2026
89bf772
ci(release): bridge cherry-pick divergence in forward-merge (#3811) (…
bokelley May 2, 2026
4555f01
Version Packages (#3799)
aao-release-bot[bot] May 2, 2026
d794f2b
ci(release): push forward-merge branch before peter-evans runs (#3818…
bokelley May 2, 2026
d98c9e4
spec(storyboard-schema): add optional default_agent field (closes #38…
bokelley May 2, 2026
a4bd513
spec(capabilities): relax identity.additionalProperties to true (3.0.…
bokelley May 2, 2026
b0aa07d
fix(storyboard): capture rights_id from acquire_rights response (clos…
bokelley May 2, 2026
1cb57a6
Version Packages (#3898)
aao-release-bot[bot] May 2, 2026
e4af188
docs(skill): document implementation-dependent issues[] fields (3.0.x…
bokelley May 3, 2026
91b6e2c
3.0.6 cherry-picks: governance wire-placement + ctx_metadata reservat…
bokelley May 3, 2026
525c7e9
3.0.6 follow-up cherry-picks: task_completion. prefix docs + comply_t…
bokelley May 3, 2026
2cea1dc
Version Packages (#3933)
aao-release-bot[bot] May 3, 2026
28ada0b
docs(release-notes): catch 3.0.x's release-notes.mdx up from 3.0.1 to…
bokelley May 3, 2026
b841e62
ci(storyboards): fall back to @adcp/client compliance cache path on 3…
bokelley May 3, 2026
1f46a2f
fix(compliance): chain proposal_id through proposal_finalize storyboa…
bokelley May 4, 2026
866abe2
docs(creative): backport #4153 list_creatives filter-types fix to 3.0…
bokelley May 7, 2026
d22bdc1
ci(release): extend forward-merge auto-resolution for known 3.1-track…
bokelley May 7, 2026
24c09c0
docs(skill): correct issues[] field names + split spec-optional from …
bokelley May 7, 2026
b2f7a3d
fix(compliance): measurement_terms_rejected — UUID-aliased idempotenc…
bokelley May 8, 2026
7d656da
Version Packages (#4185)
aao-release-bot[bot] May 8, 2026
8f82d46
fix(compliance): UUID-aliased idempotency_keys across remaining story…
bokelley May 8, 2026
13f8f4b
Version Packages (#4233)
aao-release-bot[bot] May 8, 2026
5f3a4f4
ci(release): backport storyboard-schema.yaml forward-merge allowlist …
bokelley May 8, 2026
5d2e7be
fix(schema,skill): align HMAC framing to RFC 9421 default in reportin…
bokelley May 9, 2026
753dbe3
docs(accounts): propagate account discovery MUST to overview (#4304)
bokelley May 9, 2026
ea2025f
Version Packages (#4289)
aao-release-bot[bot] May 9, 2026
e06b623
ci(release): narrow forward-merge auto-resolve to metadata-only files…
bokelley May 9, 2026
d931796
ci(changeset-check): backport forward-merge/* skip rule to 3.0.x (#4317)
bokelley May 10, 2026
fa86695
fix(compliance): finish $generate:uuid_v4 sweep across error/gov/sign…
bokelley May 10, 2026
d48ca0e
Version Packages (#4354)
aao-release-bot[bot] May 10, 2026
e03978d
fix(compliance): collapse key_reuse_conflict into replay_same_payload…
bokelley May 11, 2026
d805fa2
Version Packages (#4366)
aao-release-bot[bot] May 11, 2026
7b7a89f
forward-merge: 3.0.x → main (post-3.0.11)
bokelley May 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## 3.0.11

### Patch Changes

- e03978d: Collapse the `key_reuse_conflict` phase of `universal/idempotency.yaml` into
`replay_same_payload` as a fourth step. The conflict step deliberately shares
the `$generate:uuid_v4#replay_key` alias with the replay steps so the seller
receives one cached entry that the conflict request probes with a different
body. With adcp-client#1658's phase-boundary alias reset, the conflict step
must live in the same phase as the replay steps — a separate phase mints a
fresh UUID and the seller treats the request as new, defeating the
IDEMPOTENCY_CONFLICT assertion. Companion to adcp-client#1657 / #1658; no
behavior change for sellers, only restructures the storyboard so the runner
fix is safe to land.

## 3.0.10

### Patch Changes
Expand Down
163 changes: 163 additions & 0 deletions dist/compliance/3.0.11/domains/brand/index.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
id: brand_baseline
version: "1.0.0"
title: "Brand baseline"
protocol: brand
category: brand_baseline
summary: "Baseline protocol storyboard — every brand agent must declare the brand protocol in capabilities and return a schema-valid brand identity."
track: brand
required_tools:
- get_brand_identity

narrative: |
Brand protocol agents are the identity layer of AdCP. Their job is to hold
brand identity data (names, logos, colors, fonts, tone) and expose it to
other agents — buyer agents, creative agents, DSPs — that need to render
on-brand creative or verify who a campaign is for.

The baseline tests the minimum contract that every brand agent honors,
regardless of what additional capabilities (rights licensing, creative
approval) it layers on top:

1. Declare `brand` in `supported_protocols` on `get_adcp_capabilities`.
2. Respond to `get_brand_identity` with a schema-valid identity manifest.
3. Reject unknown `brand_id` values with a structured error.

Rights licensing (`get_rights`, `acquire_rights`, `update_rights`,
`creative_approval`) ships experimentally in 3.0 and is covered by the
`brand-rights` specialism storyboard, not this baseline.

agent:
interaction_model: brand_agent
capabilities: []
examples:
- "Any brand agent (simple identity host or full rights platform)"
- "Brand-owned agents (Acme Outdoor)"
- "Third-party brand identity platforms"
- "Agency-hosted brand agents"

caller:
role: buyer_agent
example: "Any buyer, creative agent, or DSP needing brand identity"

prerequisites:
description: |
The test kit provides a sample brand (Nova Motors) that any brand agent
can serve identity for.
test_kit: "test-kits/nova-motors.yaml"

phases:
- id: capability_discovery
title: "Capability discovery"
narrative: |
The buyer calls `get_adcp_capabilities` to confirm the agent declares
the brand protocol before issuing any brand-identity call.

steps:
- id: get_capabilities
title: "Check agent capabilities"
narrative: |
Verify that the agent declares `brand` in `supported_protocols`.
Without this claim the buyer MUST NOT send `get_brand_identity`.
task: get_adcp_capabilities
schema_ref: "protocol/get-adcp-capabilities-request.json"
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
doc_ref: "/protocol/get_adcp_capabilities"
comply_scenario: capability_discovery
stateful: false
expected: |
Return capabilities declaring `brand` in `supported_protocols`.

sample_request:
context:
correlation_id: "brand_baseline--get_capabilities"
validations:
- check: response_schema
description: "Response matches get-adcp-capabilities-response.json schema"
- check: field_present
path: "supported_protocols"
description: "Response declares supported_protocols"

- id: brand_identity_retrieval
title: "Brand identity retrieval"
narrative: |
The buyer calls `get_brand_identity` to retrieve the brand's identity
manifest. The minimum contract is a schema-valid response that echoes
the requested `brand_id` and carries at least one name.

steps:
- id: get_brand_identity
title: "Retrieve brand identity"
narrative: |
The buyer calls `get_brand_identity` with a known `brand_id`. The
response MUST match the brand-identity schema and echo the
requested `brand_id`. Rich fields (logos, colors, fonts, tone,
visual_guidelines) are optional at the baseline level — the
minimum bar is that identity resolution works and is schema-valid.
task: get_brand_identity
schema_ref: "brand/get-brand-identity-request.json"
response_schema_ref: "brand/get-brand-identity-response.json"
doc_ref: "/brand-protocol/tasks/get_brand_identity"
stateful: false
expected: |
Return a schema-valid brand identity that echoes the requested
brand_id and includes at least one name.

sample_request:
brand_id: "nova_motors"
context:
correlation_id: "brand_baseline--get_brand_identity"
context_outputs:
- path: "brand_id"
key: "brand_id"

validations:
- check: response_schema
description: "Response matches get-brand-identity-response.json schema"
- check: field_present
path: "brand_id"
description: "Response includes brand_id"
- check: field_value
path: "brand_id"
value: "nova_motors"
description: "Returned brand_id echoes the requested brand"
- check: field_present
path: "names"
description: "Response includes brand names"

- id: unknown_brand_rejection
title: "Unknown brand rejection"
narrative: |
Agents MUST reject unknown `brand_id` values with a structured
AdCP error rather than returning an empty or fabricated manifest.

steps:
- id: get_brand_identity_unknown
title: "Reject unknown brand ID"
narrative: |
The buyer calls `get_brand_identity` with a `brand_id` the agent
does not serve. The response MUST be a structured error with a
recovery classification — not a success response with empty
fields.
task: get_brand_identity
schema_ref: "brand/get-brand-identity-request.json"
response_schema_ref: "brand/get-brand-identity-response.json"
doc_ref: "/brand-protocol/tasks/get_brand_identity"
stateful: false
expected: |
Return an AdCP error response indicating the brand is not known
to this agent.

sample_request:
brand_id: "brand_that_does_not_exist_12345"
context:
correlation_id: "brand_baseline--get_brand_identity_unknown"

expect_error: true
negative_path: payload_well_formed
validations:
- check: error_code
allowed_values:
- "brand_not_found"
- "BRAND_NOT_FOUND"
- "NOT_FOUND"
description: "Error code indicates brand-not-found"
Loading
Loading