Skip to content

docs(media-buy): publish buyer and seller proposal negotiation guide #6557

Description

@bokelley

Goal

Publish an implementation guide that lets buyer-agent and seller-agent developers implement AdCP 3.2 proposal negotiation correctly without reconstructing behavior from schemas and review history.

Parent program: #6556
Protocol implementation: #6547

Required content

Shared model

  • Proposal state and immutable-lineage diagram: draft → revised drafts → committed hold → accepted proposal → amendment/cancellation successor.
  • Capability table for total_budget, product_changes, criteria, alternatives, and ask-only fallback.
  • Clear separation of task-level validation/capability errors from per-proposal outcomes.
  • Limits, batching, idempotency, source visibility, authorization, expiry, and atomicity rules.

Buyer guide

  • Capability discovery and request construction.
  • Typed-first negotiation with ask reserved for subjective commercial preferences.
  • Error-first response handling and safe discriminated-union access.
  • Independent verification of budgets, product changes, targeting resolution, alternative count/digests, and unsatisfied subsets.
  • Counteroffer selection, exact retry versus changed-request keys, finalization, expiry-aware acceptance, amendment, cancellation, and decline.

Seller guide

  • Capability declaration and batch-wide preflight before mutation.
  • Separation between SDK/protocol validation and application-owned commercial policy.
  • Immutable successor generation, source lineage, digest generation, staged persistence, per-source outcomes, and atomic finalization.
  • Security and operational guidance for cardinality, authorization, replay, logging, and transaction boundaries.

Examples

  • One shared fictional scenario using Sam, Pinnacle Agency, and StreamHaus.
  • Runnable examples for TypeScript, Python, Go, and Java as their SDK work lands.
  • Exact revised, partial, unable, task-error, finalize, accept, amendment, and cancellation payloads.
  • Link each example to the matching training-agent profile and storyboard.

Acceptance criteria

  • Examples validate against current source schemas and are exercised in CI where possible.
  • Documentation distinguishes normative requirements from recommendations and commercial-policy examples.
  • A new implementor can run the documented buyer against the public training seller and reproduce the storyboard outcomes.
  • Specialist training module S1 links to the guide and uses the same scenario terminology.

Dependencies

Additional required content (contract hardening in #6547, efe48f522e)

  • Constraint semantics table for all four typed constraints: total_budget, cpm (every purchase fixed cpm/vcpm in currency at or under max; auction/non-CPM pricing is unsatisfied), impressions (summed purchase impressions at or over min), flight (start_no_later_than needs a concrete start — asap is unsatisfied; end_no_earlier_than).
  • The partial invariant: every draft on a partial satisfies every constraint absent from unsatisfied_constraints, whatever the reason_code — this is what lets buyers skip prose parsing.
  • Reason-code selection guide: constraint_unsatisfiable precedence, commercially_declined is ask-only, hold_unavailable vs batch_aborted, double-finalize INVALID_STATE.
  • Digest verification how-to: recompute sha256:base64url(sha256(JCS(commercial_terms))) and compare; treat digest agreement, not seller assertion, as the comparability guarantee.
  • Lineage: parent_proposal_id chain walking for audit and amendment history.
  • Hold governance for sellers: refusal semantics, concurrent-hold caps, choosing expires_at, when to answer submitted for re-underwriting.
  • Negotiation security section for both sides: fence ask from pricing authority; rate-limit un-held constraint probing (price-oracle risk); only commercial_terms binds — prose never does.
  • Adapter warning: legacy budget_range is a soft filter, compact total_budget a hard constraint — same shape, inverted semantics; more_like_this maps only lossily to ask.

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.documentationImprovements or additions to documentationmedia-buyIssue concerns the media-buy protocol domain

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions