Replies: 12 comments 3 replies
|
This is a real gap and I think you have drawn the line in the right place, so two notes from the enforcement side and one caveat about where my experience actually applies. The Provenance survives state transitions only if it is inside the artifact that gets authorized. The invariant you wrote ("applying an intervention may change the object to which its provenance applies, but should not erase that provenance") is right, but as stated it binds implementations by good intentions. A One consequence worth being explicit about: that also settles what happens when an intervention is present but its provenance cannot be represented. It should fail closed. The fallback an integrator reaches for otherwise is to drop the record and proceed, which is exactly the state you are trying to prevent. Caveat on where I am speaking from. We run escrow, signed responses and release-on-fulfilment in production for physical goods on merchant-owned stores, so the parts above about signing scope and about what survives into an authorized artifact are things we have actually had to get right. We do not operate a marketplace and have not implemented intermediary-induced provenance, so the specific |
|
This feels useful, but I think it is adjacent to rather than part of CommercialIntervention itself. CommercialIntervention is trying to answer “who commercially influenced this object, and what did that influence affect?” A tie-break receipt answers a different question: "given a caller-declared eligible set, how was the final candidate selected?" I can see those composing cleanly. One concrete flow would be: deterministic buyer-policy filtering produces multiple policy-equivalent candidates; the platform invokes a tie-break process; the resulting receipt binds the candidate-set digest, policy digest, any relevant commercial_intervention_refs, and the selected candidate. If that selection is authorization-relevant, Checkout could preserve a digest/reference to the receipt and AP2 could then bind the resulting Checkout state. I would probably keep the receipt as a sibling evidence artifact rather than add its fields to CommercialIntervention. That also seems closer to the decision-provenance / external-attestation work in #56/#534. And I agree with the claim boundary you drew: such a receipt proves the declared set was resolved by the stated process; it says nothing by itself about whether the candidate set was complete or whether upstream ranking was neutral. A synthetic fixture would be useful for testing that composition. I’d especially want to see who is considered the issuer of candidate_set_digest / eligibility_policy_digest versus who signs the actual selection receipt, since those may be different trust domains. |
|
Thanks — this is a useful finding. I think the Cart → Checkout observation gets at a broader lifecycle issue rather than something specific to the receipt. On propagation, I’d lean against a generic “copy all extension state forward” rule. A better model may be for UCP to define the general expectation that persistence-sensitive extensions declare transition semantics, while the extension itself defines exactly what projects from Cart → Checkout and what happens if required state can’t be preserved. On the carrier, signals seems reasonable for an experimental/reference shape, but semantically I still lean toward a dedicated extension field for the content-bound ref/digest. This is transaction/decision provenance rather than ambient signal data, and having the extension compose onto both Cart and Checkout makes the lifecycle requirement much clearer. The immutable A/B artifacts can stay external. One bit of context that may help as you map this: the core thing I’m trying to preserve in #724 is the CommercialIntervention semantic itself — actor / kind / effect / basis, plus the invariant that provenance survives while its effect remains represented in commerce state. The state-bound Offer work in #738 is the complementary piece for binding the exact proposed Cart change. I’d therefore keep the selection receipt as a sibling evidence artifact that can bind/reference those intervention records, rather than letting it become the carrier for commercial provenance itself. I also agree strongly with "no silent degradation." I’d distinguish evidence recovery from authorization, though: if required evidence can be reconstructed, great; if the system instead transitions to a materially degraded/unknown provenance state, that should be explicit and may require renewed buyer authorization. So yes, I think the private map is pointing at a real protocol question: how an extension declares which authorization-relevant state must survive a resource transition. A public draft/test vector could be useful once that lifecycle shape is concrete enough to evaluate. |
|
Thanks — I think this has reached the point where a separate lifecycle issue would be the most useful next step. I’d keep #724 focused on the CommercialIntervention semantic and its core invariant: commercial provenance should remain independently represented while its effect remains in commerce state. The profile you’ve built now seems to expose a broader UCP question: how persistence-sensitive extension state is projected across a resource transition such as Cart → Checkout. A separate issue could frame that narrowly: should UCP define a general contract requiring cross-capability extensions to declare their projection/preservation and failure semantics, while leaving the actual fields and mapping to each extension? I’d use the selection-evidence profile as one concrete test case, and link #724 as the commercial-provenance case. I’d also reference #738 where Offer evidence identity becomes relevant, but keep CommercialIntervention and the selection receipt as sibling concepts rather than redefining either one in the lifecycle issue. I probably wouldn’t jump to a PR yet. There are still two architectural choices that would benefit from maintainer direction first: general vs extension-specific propagation, and whether a content-bound reference belongs canonically in extension-owned state or signals. So my preference would be: separate lifecycle issue + public profile/test vector, linked back here, then move toward a draft/PR once there’s agreement on the lifecycle contract. The profile sounds useful as evidence for that discussion — especially the preserved/recovered/degraded/missing/mutated cases. |
|
This is the commerce instance of a pattern that's showing up across the agent ecosystem right now, and I think the framing generalises usefully. The load-bearing property is that provenance must survive each derivation step (Catalog → Offer → Cart → Checkout) as a first-class, content-bound field — not be reconstructed at the end. Two rules that have worked for us on the same shape:
Worth flagging for reuse: this is structurally the same problem as permission-through-derivation for MCP tool calls (modelcontextprotocol/modelcontextprotocol#2498) — authority laundering through a summarisation/derivation step. A shared "provenance survives derivation, downgraded unless re-attested" primitive would serve both commerce and tool-authorization, so it may be worth keeping the CommercialIntervention field shape compatible with a general provenance-tier dimension. For what it's worth we implement exactly this as a deterministic decision layer (Quesen — typed context incl. a provenance tier in → PASS/REVIEW/BLOCK + replayable receipt, no model in the scoring path); happy to share the tier-downgrade rules if a concrete reference helps. +1 on splitting the lifecycle question out and keeping #724 on the CommercialIntervention artifact shape. |
|
@arjun2075 Your refinement is the right one and I'll adopt it. The clean split is:
That also keeps the replayable receipt as a sibling evidence artifact (binds the exact originating assertion + source artifact, preserves the original issuer) rather than becoming the carrier of commercial provenance — agreed. @QvxSphere — here are the downgrade/re-attestation examples you asked for, expressed as one rule run against your PRESERVED / RECOVERED / DEGRADED / MISSING / MUTATED vectors. The rule: an inherited assertion keeps its originating authority; crossing a resource boundary without valid re-attestation downgrades how much policy may rely on it; a sensitive effect may not clear on downgraded authority. Mapped to a deterministic decision (these are live/reproducible on our side,
Concretely on our engine today (no signup): an unattested client grant on a On your joint-test proposal — yes, and I think it's the strongest next step. The shape that needs neither side to trust the other's verdict: a shared input vector → each implementation emits its own recomputable receipt (your selection-evidence outcome; our decision + On "a real workflow where independently verifiable cross-domain receipts are a practical requirement": the honest, concrete one is agentic-checkout dispute/audit — when a chargeback or complaint lands, "was this substitution merchant-driven or user-authorized?" has to be recomputable after the fact, not re-asserted by whichever party is answering. The MCP tool-call audit case (#2498) is the same shape on the authorization side. Both are exactly "cross-domain receipt has to survive to dispute time." Agreed on keeping #724 scoped to the CommercialIntervention semantic + its core invariant, and moving the general derivation/lifecycle contract (and these vectors) to the separate lifecycle issue. Happy to drop the 5 vectors above + our receipts into that issue as concrete test cases once it's open — @QvxSphere if you'd rather host them alongside your profile vectors, I'll contribute there instead. |
|
Following up with the concrete vectors I offered — generated live, not hand-written, so anyone can re-run them without signup. Published: https://github.com/Shxnque/quesen/blob/main/evaluation/UCP724-LIFECYCLE-VECTORS.md · machine-readable (full requests + receipts): @QvxSphere — this maps directly onto your PRESERVED / RECOVERED / DEGRADED / MISSING / MUTATED vectors:
Two honest findings worth surfacing rather than hiding, because they matter for the joint test:
For the bounded joint test you proposed: take these six vectors, run your selection-evidence profile's PRESERVED/…/MUTATED cases against them, and have a third party recompute both sides from the vector. Neither imports the other's verdict — mine replays from |
|
Thanks — this is exactly the separation I had in mind. The two findings from the vectors are particularly useful: absence vs. an unverifiable claim clearly needs to remain a policy/lifecycle distinction, and MUTATED being caught structurally by content binding rather than by a trust verdict is a good reason not to collapse all failure states into one provenance status. The fact that the vectors expose those differences is probably more valuable than having every implementation produce the same PASS/REVIEW/BLOCK result. I agree these should move into the separate lifecycle issue rather than expand #724. I’d keep #724 centered on the minimal CommercialIntervention binding and the invariant that derivation must preserve provenance without silently upgrading its authority. Thanks for publishing the vectors — they give us concrete cases to test the lifecycle contract against. |
|
Agreed on keeping #724 minimal. I've opened the separate lifecycle issue so the general contract has a home, framed narrowly around your two open choices (general vs extension-specific propagation; carrier in extension-owned state vs signals): #788. It links the CommercialIntervention case here, @QvxSphere's selection-evidence profile, the deterministic vectors, and the |
|
Thanks — #788 looks like the right home for this. I like keeping #724 focused on the minimal CommercialIntervention semantic and its core invariant, while #788 handles the reusable cross-capability lifecycle contract. One boundary I’d keep as the issue develops: I’d treat provenance_tier as related/test vocabulary rather than a requirement of the lifecycle contract itself. The protocol-level invariant I care about is preserving the originating assertion/issuer and preventing silent authority upgrade; how a consumer weights that authority can remain policy-specific. Otherwise the scope looks right to me. I’ll continue the propagation/carrier discussion in #788 rather than grow it further here. Thanks for splitting it out. |
Uh oh!
There was an error while loading. Please reload this page.
I'd like to explore a gap that seems to sit between several existing UCP discussions:
Offerprimitive for merchant-proposed cart changesThere is also a related AP2 question around when commerce-state changes should require renewed authorization:
The gap I'm interested in is commercial influence introduced by an intermediary such as a marketplace, and whether that provenance survives after the influenced recommendation/offer becomes commerce state.
Motivating example
Consider:
By checkout time, this may simply look like:
The resulting transaction is clear, but the distinction between:
may have disappeared.
For autonomous buyer agents, I think that distinction can be authorization-relevant.
A user saying:
may not mean:
What seems to be missing
The existing discussions cover important parts of this:
Offerand preserving the identity of a proposed commerce mutation.What I don't think is represented yet as a reusable concept is:
Strawman:
CommercialInterventionOne possible abstraction is a small structured record:
{ "id": "ci_123", "actor": { "id": "marketplace.example" }, "kind": "cross_sell", "effect": "proposal", "basis": "platform_merchandising", "applies_to": [ "offer_42" ] }For sponsored ranking:
{ "id": "ci_456", "actor": { "id": "marketplace.example" }, "kind": "ranking", "effect": "ordering", "basis": "paid_placement", "sponsor": { "id": "seller-b.example" }, "applies_to": [ "product_result_7" ] }The exact schema/enums are not the point yet. The important thing is separating a few concepts that otherwise get collapsed.
1. Who induced the intervention?
This is the motivating marketplace case.
Compare:
with:
Both might eventually result in another line item.
But they were induced by different actors, and a buyer may reasonably delegate different authority to each.
The identity of the intervention actor therefore should not necessarily be inferred from whichever participant happens to send the current UCP response.
2. What happened?
A minimal
kindvocabulary might eventually include things such as:This describes the commercial operation rather than its eventual transaction result.
3. What was affected?
I think
kindshould be separate fromeffect.For example:
Suppose paid placement caused a product to appear first, but the buyer agent independently compared all candidates and selected that same product.
It would be too strong to assert:
But it is reasonable to assert:
This lets the protocol record an observable intervention without claiming knowledge of the buyer agent's internal causal reasoning.
4. Under what commercial basis?
A conservative initial vocabulary might distinguish:
This should not imply that any economic relationship automatically affected ranking or recommendation.
For example:
is different from:
That distinction seems consistent with the concern raised in #706.
The key requirement: provenance should survive state transitions
This is the main part of the proposal.
Suppose a marketplace generates:
Today, even if the commercial context is represented at the recommendation/offer stage, it can disappear once the resulting item becomes ordinary commerce state.
I think the useful invariant is:
For example:
After acceptance:
And eventually:
Relationship to
OfferI don't think this needs to replace or compete with #702.
The concepts seem complementary:
For example:
{ "offer": { "id": "offer_42", "operations": [ { "type": "add", "item_id": "usb-hub" } ], "commercial_intervention_ref": "ci_123" } }A seller-induced offer and a marketplace-induced offer could then use the same underlying
Offermechanism while preserving different provenance.Example: marketplace substitution
This also suggests that the abstraction should be broader than "upsell."
Suppose the buyer authorized:
Coffee A becomes unavailable and the marketplace substitutes:
Pure price/category constraints may accept this.
But a buyer could reasonably have a policy like:
That requires knowing not just that a substitution occurred, but who induced it and its relevant commercial context.
Why carry this into Checkout?
If the provenance survives into the authoritative checkout representation, a downstream authorization mechanism such as AP2 can bind authorization to a checkout that includes those facts.
Conceptually:
That keeps the boundary fairly clean:
A future buyer policy could then express semantics such as:
I don't think AP2 constraints need to be part of an initial UCP proposal. The first requirement is simply preserving enough information for authorization policy to reason over later.
Unknown must not mean organic
One issue from #611 seems especially important.
If this capability is unsupported or not negotiated:
That should not silently become:
If complete disclosure semantics are negotiated, then an explicit:
{ "interventions": [] }could mean:
Without such a distinction, a buyer agent cannot tell "organic" from "not disclosed."
Non-goals
I would not propose requiring disclosure of:
The buyer agent does not need the marketplace's ranking implementation.
For many cases it only needs a structured assertion such as:
Trust limitation
This mechanism would not cryptographically prove that a marketplace truthfully characterized its own motivation.
If a marketplace declares:
when an intervention was actually paid placement, the protocol cannot infer the hidden truth.
But it changes the system from:
to:
That seems useful for buyer-agent policy, auditing, dispute evidence, and accountability even if independent verification is a separate problem.
Minimal initial scope
For a v0 experiment, perhaps the required concepts are only:
with one main invariant:
Questions
Is this already representable using an existing UCP concept or extension that I'm overlooking?
Should this be metadata directly on
Offer/Product/LineItem, or a separate object those resources reference?Should ranking/visibility from Sponsored placement / ranking provenance on catalog search results — in scope? #611 and offer/cart provenance share one model, or are those meaningfully different layers?
Is
commercial interventionuseful terminology, or is there a less loaded term for the same concept?Should negotiation support a "complete disclosure" semantic so that
interventions: []can safely mean "none declared" rather than "unknown"?Should provenance be required to persist into Checkout, or is persistence through Cart enough?
Longer term, should AP2 simply bind this provenance into transaction evidence, or should mandate constraints eventually be able to reason over it directly?
The motivating examples are marketplace-induced commerce — sponsored ranking, "frequently bought together," marketplace protection plans, house-brand substitutions, etc. — but I think the underlying requirement is broader:
I'm interested in whether this is best handled as a standalone UCP extension, as a provenance layer around the emerging
Offerwork, or by extending one of the existing proposals rather than introducing another primitive.All reactions