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.
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
total_budget,product_changes,criteria,alternatives, and ask-only fallback.Buyer guide
askreserved for subjective commercial preferences.Seller guide
Examples
Acceptance criteria
Dependencies
Additional required content (contract hardening in #6547,
efe48f522e)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_thanneeds a concrete start —asapis unsatisfied;end_no_earlier_than).partialsatisfies every constraint absent fromunsatisfied_constraints, whatever thereason_code— this is what lets buyers skip prose parsing.constraint_unsatisfiableprecedence,commercially_declinedis ask-only,hold_unavailablevsbatch_aborted, double-finalizeINVALID_STATE.sha256:base64url(sha256(JCS(commercial_terms)))and compare; treat digest agreement, not seller assertion, as the comparability guarantee.parent_proposal_idchain walking for audit and amendment history.expires_at, when to answersubmittedfor re-underwriting.askfrom pricing authority; rate-limit un-held constraint probing (price-oracle risk); onlycommercial_termsbinds — prose never does.budget_rangeis a soft filter, compacttotal_budgeta hard constraint — same shape, inverted semantics;more_like_thismaps only lossily toask.