Problem
SDK 8.0.0b2 changes the request-signing default to the strict AdCP 3.2 profile, but the high-level client does not derive that profile from its configured/negotiated AdCP version.
ADCPClient(adcp_version="3.1", signing=SigningConfig(...)) injects adcp_version="3.1" into requests while SigningConfig.signing_profile_version independently defaults to "3.2". _sign_outgoing_request() passes that value directly to sign_request().
The resulting request claims 3.1 but uses 3.2 Structured Fields binary encoding. A strict 3.1 peer expects the legacy Base64URL representation and may reject it.
Reproduction
client = ADCPClient(
config,
adcp_version="3.1",
signing=SigningConfig(private_key=key, key_id="buyer-key"),
)
assert client.get_adcp_version() == "3.1"
assert client.signing.signing_profile_version == "3.2"
The migration guide currently tells adopters to override signing_profile_version="3.1" manually. That is easy to miss and makes the high-level client's version pin internally inconsistent.
Proposed behavior
- Make the high-level signing profile default derive from the client's trusted configured/negotiated AdCP version.
- Preserve an explicit
SigningConfig(signing_profile_version=...) override for endpoints whose trusted deployment configuration requires it.
- Apply per-agent pins in
ADCPMultiAgentClient, including mixed 3.1/3.2 fleets.
- Never select a verification profile from an unsigned request-body field; trusted endpoint configuration and negotiated capabilities remain authoritative.
- For low-level
sign_request() / async_sign_request(), either require an explicit signing_profile_version or make the newest-profile default unmistakable in API docs and warnings. Requiring it in SDK 8 is preferable because the low-level function has no negotiation context.
Acceptance tests
- A 3.1-pinned
ADCPClient signs with the 3.1 binary encoding when no profile override is supplied.
- A 3.2-pinned client signs with standard padded Base64.
- Explicit overrides win and are documented as advanced/trusted configuration.
- A heterogeneous multi-agent client signs each endpoint using its own pin.
- Low-level signer behavior is explicit and covered by both 3.1 and 3.2 conformance vectors.
Problem
SDK 8.0.0b2 changes the request-signing default to the strict AdCP 3.2 profile, but the high-level client does not derive that profile from its configured/negotiated AdCP version.
ADCPClient(adcp_version="3.1", signing=SigningConfig(...))injectsadcp_version="3.1"into requests whileSigningConfig.signing_profile_versionindependently defaults to"3.2"._sign_outgoing_request()passes that value directly tosign_request().The resulting request claims 3.1 but uses 3.2 Structured Fields binary encoding. A strict 3.1 peer expects the legacy Base64URL representation and may reject it.
Reproduction
The migration guide currently tells adopters to override
signing_profile_version="3.1"manually. That is easy to miss and makes the high-level client's version pin internally inconsistent.Proposed behavior
SigningConfig(signing_profile_version=...)override for endpoints whose trusted deployment configuration requires it.ADCPMultiAgentClient, including mixed 3.1/3.2 fleets.sign_request()/async_sign_request(), either require an explicitsigning_profile_versionor make the newest-profile default unmistakable in API docs and warnings. Requiring it in SDK 8 is preferable because the low-level function has no negotiation context.Acceptance tests
ADCPClientsigns with the 3.1 binary encoding when no profile override is supplied.