Skip to content

epic: make proposal negotiation easy to implement, teach, and verify #6556

Description

@bokelley

Goal

Make structured proposal negotiation straightforward to implement, teach, and verify across the official AdCP SDKs and reference tooling after #6450 / #6547.

The protocol now distinguishes mechanically verifiable dimensions (total_budget, product_changes, alternatives, and criteria) from the free-text ask, with deterministic partial/unable outcomes, immutable proposal lineage, and atomic finalization. Implementors still need reusable SDK workflows, a reference seller that exercises the complete surface, implementation guidance, and conformance scenarios.

Workstreams

Shared design requirements

  • Typed helpers MUST preserve the protocol distinction between task-level errors and per-proposal revised, partial, unable, and finalized outcomes.
  • SDKs MUST validate capabilities and cardinality before mutation, including the protocol maxima of 10 alternatives and 25 refinements.
  • SDKs SHOULD provide verification and orchestration primitives, but MUST NOT embed commercial policy or silently reinterpret a seller counteroffer.
  • Buyer APIs MUST handle capability discovery, exact idempotent retries, changed-request retry keys, response verification, finalization, and expiry-aware acceptance.
  • Seller APIs MUST support capability declaration, preflight validation, immutable successor creation, response validation, and atomic finalization hooks.
  • The training agent MUST consume the TypeScript SDK primitives rather than maintaining a second incompatible implementation.
  • Docs and storyboards MUST use the same scenarios and expected outcomes.

Definition of done

  • All official SDK repositories expose documented, tested proposal-negotiation support for their supported client/server surfaces.
  • The public training seller offers both ask-only and deterministic typed-negotiation profiles.
  • An implementor can follow one guide from capabilities through negotiation, finalization, acceptance, amendment, and cancellation.
  • The compliance suite covers success, counteroffer, rejection, limits, mutation safety, idempotency, and atomicity.
  • A buyer agent can run the documented scenario against the training seller and pass the same assertions used by the storyboards.

Dependencies

Contract additions from the pre-merge red team (#6547, efe48f522e)

The wire contract grew before merge; every child ticket should target this surface, not the original four-dimension draft:

  • Typed hard constraints now include cpm (fixed-rate ceiling), impressions (volume floor), and flight (window bounds) alongside total_budget — all verified against commercial_terms.
  • Capability dimension product_selection was renamed product_changes; dimensions now match request fields exactly.
  • unsatisfied_constraints carries open string keys (no closed enum) so future dimensions are additive.
  • reason_code precedence: constraint_unsatisfiable wins over every other code; typed failures never use commercially_declined (ask-level refusals only). New codes hold_unavailable and batch_aborted cover finalize failures in the atomic batch; double-finalize of a held draft is task-level INVALID_STATE.
  • Undeclared-dimension rejection is a MUST (task-level, pre-mutation) with a registered error-details/unsupported-refinement-dimension.json details shape.
  • Every refinement successor requires parent_proposal_id equal to its source proposal — negotiation lineage is reconstructible from proposals alone.
  • terms_digest is buyer-recomputable (RFC 8785 JCS + sha256/base64url); alternative distinctness is defined on commercial_terms, not digest strings.
  • New normative text: partial drafts satisfy every constraint absent from unsatisfied_constraints; only commercial_terms is contractual; ask is untrusted input to fence from pricing authority; deterministic constraint responses form a price oracle sellers should rate-limit; legacy budget_range (soft) vs compact total_budget (hard) share a shape with inverted semantics.

Activity

  1. added this to the 3.2.0 milestone on Aug 15, 2026
  2. added
    epicMajor deliverable — auto-adds to roadmap board
    media-buyIssue concerns the media-buy protocol domain
    on Aug 15, 2026
  3. added
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    on Aug 15, 2026
  4. bokelley commented on Aug 15, 2026

    @bokelley
    ContributorAuthor

    Triage

    Classification: Epic
    Bucket(s): spec-adjacent enablement, media-buy
    Status: deferred

    Blocked-on: #6547 — resurfaces on merge.


    Triaged by Claude Code. Session: https://claude.ai/code/cse_01HzR7nggUxCVDQMwGm7XJri


    Generated by Claude Code

  5. added
    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.
    and removed
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    on Aug 15, 2026
  6. garvitkaushik-123 commented on Aug 27, 2026

    @garvitkaushik-123
    Collaborator

    Epic status update — triage label says blocked on #6547, but that merged 2026-08-15.

    Current workstream status:

    Workstream Status
    Protocol design (#6450) Closed
    Protocol implementation (#6547) Merged
    TypeScript SDK (adcp-client#2542) Closed
    Python SDK (adcp-client-python#1023) Closed
    Training agent (#6558) Closed
    Compliance storyboards (#6559) Closed
    Docs guide (#6557) Content complete, SDK status table and version pin updated — ready to close
    Go SDK (adcp-go#459) Open
    Java SDK (adcp-sdk-java#36) Open

    5 of 7 original workstreams closed. Docs guide is completable now. Remaining: Go and Java SDK ports in external repos.

    The docs guide now includes an SDK status table linking the open Go and Java tickets so implementors can track availability.

  7. added
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    and removed
    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.
    on Aug 27, 2026
  8. bokelley commented on Aug 27, 2026

    @bokelley
    ContributorAuthor

    Triage (updated)

    Classification: Epic
    Bucket(s): spec-adjacent enablement, media-buy
    Status: deferred

    My take: #6547 merged 2026-08-15 — prior blocker is resolved. 5 of 7 workstreams closed; #6557 (docs guide) is content-complete and can be closed independently. Epic stays open pending Go and Java SDK ports in external repos.

    Blocked-on: adcp-go#459 and adcp-sdk-java#36 — resurfaces when either closes.


    Triaged by Claude Code. Session: https://claude.ai/code/session_01FKDwVw2YcFKa35AGcmWwac


    Generated by Claude Code

  9. added
    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.
    and removed
    claude-triagingTriage routine is actively working on this issue (1-3 min)
    on Aug 27, 2026
  10. garvitkaushik-123 commented on Aug 27, 2026

    @garvitkaushik-123
    Collaborator

    Hey @bokelley — both blockers now have PRs up:

    • Go SDK (adcp-go#459): adcp-go#467 — adds full refine_proposals types, ComputeTermsDigest/VerifyTermsDigest, StampSuccessor, and Config.RefineProposals handler wired into Register(). 9 tests, all green.

    • Java SDK (adcp-sdk-java#36): adcp-sdk-java#38 — closes the remaining gaps: TotalBudgetConstraint, RefinementConstraints composite, missing constraints/productChanges/alternatives fields on ProposalRefinement, alternatives count validation (2-10 + seller ceiling), verifyConstraintSatisfaction in ResponseVerifier (budget bounds + CPM ceiling), and server-side ProposalSuccessor utility. 15 new tests, builds clean.

    Once those land, all 7 workstreams should be closeable and the epic can wrap up. The docs guide (#6557) update from our earlier pass is also in — SDK status table added to proposal-negotiation.mdx.

  11. bokelley commented on Aug 30, 2026

    @bokelley
    ContributorAuthor

    Completed. All seven workstreams are closed: TypeScript adcp-client#2542, Python adcp-client-python#1023, Go adcp-go#459 via merged PR #467, Java adcp-sdk-java#36 via merged PR #38, training #6558, implementor documentation #6557, and compliance storyboards #6559. Protocol design #6450, protocol implementation #6547, and lifecycle storyboard dependency #6432 are also complete. The final Go head received clean CodeQL analyses for Go, Actions, JavaScript/TypeScript, and Python before merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.epicMajor deliverable — auto-adds to roadmap boardmedia-buyIssue concerns the media-buy protocol domain

    Type

    No type

    Projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions