From 2f6849b056defed135f43ec305b4d45d0fcde445 Mon Sep 17 00:00:00 2001 From: Matt Menke Date: Fri, 9 Feb 2024 12:55:21 -0500 Subject: [PATCH 1/6] Change how updating IGs to an unknown executionMode behaves. (#927) When joining IGs with unrecognized modes, we use "compatibility" for forward compatibility. Seems like we should do the same for updates. Note that neither this behavior nor the originally described behavior are what currently happens - we currently ignore unrecognized modes. Want to get approval for this before changing behvaior. --- spec.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec.bs b/spec.bs index ac59ebef5..7495a8a49 100644 --- a/spec.bs +++ b/spec.bs @@ -3566,7 +3566,7 @@ The updateAdInterestGroups() method steps are:
1. If |value| is "`compatibility`", "`frozen-context`", or "`group-by-origin`", set |ig|'s [=interest group/execution mode=] to |value|. - 1. Otherwise, jump to the step labeled Abort update. + 1. Otherwise, set |ig|'s [=interest group/execution mode=] to "`compatibility`".
"`biddingLogicURL`"
"`biddingWasmHelperURL`" From 0c75563f8fdc710a9d59fc2558db7c054f5151b3 Mon Sep 17 00:00:00 2001 From: Maks Orlovich Date: Fri, 9 Feb 2024 14:18:19 -0500 Subject: [PATCH 2/6] Spec: increase limit on ad components to 40 and add a feature detection mechanism (#1004) * Spec increase limit 20 -> 40, and also feature detection * Exposed + fix invalid plural --------- Co-authored-by: Maks Orlovich --- spec.bs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/spec.bs b/spec.bs index 7495a8a49..0120ad800 100644 --- a/spec.bs +++ b/spec.bs @@ -1308,6 +1308,7 @@ and a [=moment=] |auctionStartTime|: minus |ig|'s [=interest group/join time=], in milliseconds. 1. [=map/Set=] |browserSignals|["{{BiddingBrowserSignals/bidCount}}"] to the sum of |ig|'s [=interest group/bid counts=] for all days within the last 30 days. + 1. [=map/Set=] |browserSignals|["{{BiddingBrowserSignals/adComponentsLimit}}"] to 40. 1. Let |prevWins| be a new [=sequence=]<{{PreviousWin}}>. 1. [=list/For each=] |prevWin| of |ig|'s [=interest group/previous wins=] for all days within the the last 30 days: @@ -3243,7 +3244,7 @@ To convert GenerateBidOutput to generated bid given a {{GenerateBidOu 1. Let |adComponents| be |generateBidOutput|["{{GenerateBidOutput/adComponents}}"]. 1. Return failure if any of the following conditions hold: * |groupHasAdComponents| is false; - * |adComponents|'s size is greater than 20. + * |adComponents|'s size is greater than 40. 1. Let |adComponentDescriptors| be a new [=list=] of [=ad descriptors=]. 1. For |component| in |adComponents|: 1. Let |componentDescriptor| be a new [=ad descriptor=]. @@ -3690,6 +3691,29 @@ The updateAdInterestGroups() method steps are: +# Feature Detection # {#feature-detection} + +The {{ProtectedAudience/queryFeatureSupport()}} method permits checking what functionality is available in the current implementation, in order to help deploy new features. The return values specified in this specification are for an implementation that fully implements it. + + +[SecureContext] +partial interface Navigator { + [SameObject] readonly attribute ProtectedAudience protectedAudience; +}; + +[SecureContext, Exposed=Window] +interface ProtectedAudience { + any queryFeatureSupport(DOMString feature); +}; + + +
+ +The queryFeatureSupport(feature) method steps are: +1. If feature is "adComponentsLimit", return 40. +2. Return `undefined`. + +
# Common Algorithms # {#common-algorithms} @@ -4139,6 +4163,7 @@ dictionary BiddingBrowserSignals { required long joinCount; required long bidCount; required long recency; + required long adComponentsLimit; USVString topLevelSeller; sequence prevWinsMs; @@ -4708,7 +4733,7 @@ result of [=evaluating a bidding script=], or an [=additional bid=] provided by :: An [=ad descriptor=]. Render URL and size of the bid's ad. : ad component descriptors :: Null or a [=list=] of [=ad descriptors=]. Ad components associated with bid, if any. May have at - most 20 [=list/items=]. Must be null if the interest group making this bid has a null + most 40 [=list/items=]. Must be null if the interest group making this bid has a null [=interest group/ad components=] field. : ad cost :: Null or a {{double}}. Advertiser click or conversion cost passed from `generateBid()` to From adf5cd494388818f58e8bf5b2e3959e1b442b832 Mon Sep 17 00:00:00 2001 From: qingxinwu <6334674+qingxinwu@users.noreply.github.com> Date: Fri, 9 Feb 2024 14:32:20 -0500 Subject: [PATCH 3/6] Spec forDebuggingOnly API (#977) * Spec forDebuggingOnly APIs. * [Spec] Add forDebuggingOnly API. * finish * Some fixes. * Fixes. * Address comments. Add reporting helper. * Fix problems. * small fixes. * update a comment for [=no bid=] * indent fix. * fix more indent * Address comments * revert some unrelated fixes/cleanups * one more tiny revert * Add an id field to generated bid * small fix * Add an issue for generatedBids. * link to an issue. * Apply suggestions from code review Co-authored-by: Dominic Farolino * Address comments --------- Co-authored-by: Qingxin Wu Co-authored-by: Dominic Farolino --- spec.bs | 310 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 255 insertions(+), 55 deletions(-) diff --git a/spec.bs b/spec.bs index 0120ad800..8d69ece9f 100644 --- a/spec.bs +++ b/spec.bs @@ -661,17 +661,24 @@ The runAdAuction(|config|) method steps are: [=auction config/interest group buyers=]. 1. Let |queue| be the result of [=starting a new parallel queue=]. 1. [=parallel queue/enqueue steps|Enqueue the following steps=] to |queue|: + 1. Let |generatedBids| be a new [=list=] of [=generated bids=]. 1. Let |winnerInfo| be the result of running [=generate and score bids=] with |auctionConfig|, - null, |global|, |settings|'s [=environment/top-level origin=], and |bidIgs|. + null, |global|, |settings|'s [=environment/top-level origin=], |bidIgs|, and |generatedBids|. + 1. Let |auctionReportInfo| be a new [=auction report info=]. + 1. If |winnerInfo| is not failure, then set |auctionReportInfo| to the result of running + [=collect forDebuggingOnly reports=] with |generatedBids| and |winnerInfo|. 1. If |winnerInfo| is failure, then [=queue a global task=] on [=DOM manipulation task source=], given |global|, to [=reject=] |p| with a "{{TypeError}}". - 1. If |winnerInfo| is null or |winnerInfo|'s [=leading bid info/leading bid=] is null, then - [=queue a global task=] on [=DOM manipulation task source=], given |global|, to resolve |p| with - null. + 1. Otherwise if |winnerInfo| is null or |winnerInfo|'s [=leading bid info/leading bid=] is null: + 1. [=Queue a global task=] on [=DOM manipulation task source=], given |global|, to [=resolve=] + |p| with null. + 1. [=list/For each=] |reportUrl| of |auctionReportInfo|'s + [=auction report info/debug loss report urls=]: + 1. [=Send report=] to |reportUrl|. 1. Otherwise: 1. Let |winner| be |winnerInfo|'s [=leading bid info/leading bid=]. 1. Let |fencedFrameConfig| be the result of [=filling in a pending fenced frame config=] with - |pendingConfig|, |auctionConfig|, and |winnerInfo|. + |pendingConfig|, |auctionConfig|, |winnerInfo|, and |auctionReportInfo|. 1. [=fenced frame config mapping/Finalize a pending config=] on |configMapping| with |urn| and |fencedFrameConfig|. 1. Wait until |auctionConfig|'s [=auction config/resolve to config=] is a boolean. @@ -771,7 +778,8 @@ To construct a pending fenced frame config given an [=auction config=
To fill in a pending fenced frame config given a [=fenced frame config=] -|pendingConfig|, [=auction config=] |auctionConfig|, and [=leading bid info=] |winningBidInfo|: +|pendingConfig|, [=auction config=] |auctionConfig|, [=leading bid info=] |winningBidInfo|, and +[=auction report info=] |auctionReportInfo|: 1. Let |winningBid| be |winningBidInfo|'s [=leading bid info/leading bid=]. 1. Set |pendingConfig|'s [=fenced frame config/mapped url=]'s [=mapped url/value=] to |winningBid|'s [=generated bid/ad descriptor=]'s [=ad descriptor/url=]. @@ -815,7 +823,8 @@ To fill in a pending fenced frame config given a [=fenced frame confi 1. [=Asynchronously finish reporting=] with |pendingConfig|'s [=fenced frame config/fenced frame reporting metadata=]'s [=fenced frame reporting metadata/value=]'s - [=fenced frame reporting metadata/fenced frame reporting map=] and |winningBidInfo|. + [=fenced frame reporting metadata/fenced frame reporting map=], |winningBidInfo| and + |auctionReportInfo|. 1. Set |pendingConfig|'s [=fenced frame config/nested configs=]'s [=nested configs/value=] to the result of running [=create nested configs=] with |winningBid|'s [=generated bid/ad component descriptors=]. @@ -826,8 +835,8 @@ To fill in a pending fenced frame config given a [=fenced frame confi
To asynchronously finish reporting given a -[=fencedframetype/fenced frame reporting map=] |reportingMap| and [=leading bid info=] -|leadingBidInfo|: +[=fencedframetype/fenced frame reporting map=] |reportingMap|, [=leading bid info=] |leadingBidInfo|, +and [=auction report info=] |auctionReportInfo|. 1. Let |buyerDone|, |sellerDone|, and |componentSellerDone| be [=booleans=], initially false. 1. If |leadingBidInfo|'s [=leading bid info/component seller=] is null, set |componentSellerDone| to true. @@ -871,6 +880,10 @@ To asynchronously finish reporting given a 1. [=Send report=] to |leadingBidInfo|'s [=leading bid info/component seller reporting result=]'s [=reporting result/report url=]. 1. Set |componentSellerDone| to true. +1. [=list/For each=] |reportUrl| of |auctionReportInfo|'s [=auction report info/debug win report urls=]: + 1. [=Send report=] to |report|. +1. [=list/For each=] |reportUrl| of |auctionReportInfo|'s [=auction report info/debug loss report urls=]: + 1. [=Send report=] to |report|.
@@ -1189,7 +1202,7 @@ To validate and convert auction ad config given an {{AuctionAdConfig} 1. If |config|["{{AuctionAdConfig/interestGroupBuyers}}"] [=map/exists=] and is not [=list/empty=], then return failure. 1. [=list/For each=] |component| in |config|["{{AuctionAdConfig/componentAuctions}}"]: - 1. If |isTopLevel| is false, then return failure. + 1. If |isTopLevel| is false, then return failure. 1. Let |componentAuction| be the result of running [=validate and convert auction ad config=] with |component| and false. 1. If |componentAuction| is failure, then return failure. @@ -1343,7 +1356,8 @@ and a [=moment=] |auctionStartTime|: To generate and score bids given an [=auction config=] |auctionConfig|, an [=auction config=]-or-null |topLevelAuctionConfig|, a [=global object=] |global|, an [=origin=] -|topLevelOrigin|, and a [=list=] of [=interest groups=] |bidIgs|: +|topLevelOrigin|, a [=list=] of [=interest groups=] |bidIgs|, and a [=list=] of [=generated bids=] +|generatedBids|: 1. [=Assert=] that these steps are running [=in parallel=]. 1. Let |auctionStartTime| be the [=current wall time=]. 1. Let |decisionLogicScript| be the result of [=fetching script=] with |auctionConfig|'s @@ -1363,9 +1377,9 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Let |topLevelDirectFromSellerSignalsRetrieved| be false. 1. [=list/For each=] |component| in |auctionConfig|'s [=auction config/component auctions=], [=parallel queue/enqueue steps|enqueue the following steps=] to |queue|: - 1. Let |compWinner| be the result of running [=generate and score bids=] with |component|, - |auctionConfig|, |global|, and |topLevelOrigin|. - 1. If |compWinner| is failure, return failure. + 1. Let |compWinnerInfo| be the result of running [=generate and score bids=] with |component|, + |auctionConfig|, |global|, |topLevelOrigin|, |bidIgs|, and |generatedBids|. + 1. If |compWinnerInfo| is failure, return failure. 1. If [=recursively wait until configuration input promises resolve=] given |auctionConfig| returns failure, return failure. 1. If |topLevelDirectFromSellerSignalsRetrieved| is false: @@ -1376,9 +1390,10 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Let |topLevelDirectFromSellerSignalsForSeller| be the result of running [=get direct from seller signals for a seller=] given |topLevelDirectFromSellerSignals|. 1. Set |topLevelDirectFromSellerSignalsRetrieved| to true. - 1. If |compWinner| is not null, then run [=score and rank a bid=] with |auctionConfig|, - |compWinner|, |leadingBidInfo|, |decisionLogicScript|, null, "top-level-auction", null, and - |topLevelOrigin|. + 1. If |compWinnerInfo|'s [=leading bid info/leading bid=] is not null, then run + [=score and rank a bid=] with |auctionConfig|, |compWinnerInfo|'s + [=leading bid info/leading bid=], |leadingBidInfo|, |decisionLogicScript|, null, + "top-level-auction", null, and |topLevelOrigin|. 1. Decrement |pendingComponentAuctions| by 1. 1. Wait until |pendingComponentAuctions| is 0. 1. If |leadingBidInfo|'s [=leading bid info/leading bid=] is null, return null. @@ -1408,7 +1423,7 @@ To generate and score bids given an [=auction config=] |auctionConfig [=report result=] with |leadingBidInfo|, |directFromSellerSignalsForSeller|, null, and |global|. 1. Run [=report win=] with |leadingBidInfo|, |sellerSignals|, |reportResultBrowserSignals|, and |directFromSellerSignalsForBuyer|. - 1. Return |leadingBidInfo|'s [=leading bid info/leading bid=]. + 1. Return |leadingBidInfo|. 1. If [=waiting until configuration input promises resolve=] given |auctionConfig| returns failure, then return failure. @@ -1490,7 +1505,6 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Let |keys| be a new [=ordered set=]. 1. Let |igNames| be a new [=ordered set=]. 1. Let |fetchSignalStartTime| be |settings|'s [=environment settings object/current monotonic time=]. - 1. [=map/For each=] joiningOrigin → |groups| of |perSignalsUrlGenerator|: 1. [=list/For each=] |ig| of |groups|: 1. [=set/Append=] |ig|'s [=interest group/trusted bidding signals keys=] to |keys|. @@ -1517,11 +1531,17 @@ To generate and score bids given an [=auction config=] |auctionConfig 1. Let |generatedBid| be the result of [=generate a bid=] given |allTrustedBiddingSignals|, |auctionSignals|, a [=map/clone=] of |browserSignals|, |perBuyerSignals|, |perBuyerTimeout|, |expectedCurrency|, |ig|, and |auctionStartTime|. + 1. Set |generatedBid|'s [=generated bid/id=] to |generatedBids|'s [=list/size=]. + 1. [=list/Append=] |generatedBid| to |generatedBids|. + + Issue: Instead of inserting to |generatedBids| in each component auction that runs in + parallel, create a strucure InterestGroupAuction that holds data for each auction + separately (WICG/turtledove#1021). 1. Let |generateBidDuration| be the [=duration from=] |generateBidStartTime| to |settings|'s [=environment settings object/current monotonic time=], in milliseconds. 1. If |perBuyerCumulativeTimeout| is not null, decrement |perBuyerCumulativeTimeout| by |generateBidDuration|. - 1. If |generatedBid| is failure, [=iteration/continue=]. + 1. If |generatedBid|'s [=generated bid/no bid=] is true, [=iteration/continue=]. 1. If [=query generated bid k-anonymity count=] given |generatedBid| returns false: Note: [=Generate a bid=] is now rerun with only k-anonymous [=interest group/ads=] to give @@ -1579,7 +1599,7 @@ To generate and score bids given an [=auction config=] |auctionConfig [=interest group/owner=]. 1. Run [=report win=] with |leadingBidInfo|, |sellerSignals|, |reportResultBrowserSignals|, and |directFromSellerSignalsForWinner|. -1. Return |leadingBidInfo|'s [=leading bid info/leading bid=]. +1. Return |leadingBidInfo|.
@@ -1638,7 +1658,6 @@ To convert to an AuctionAd sequence given a [=list=]-or-null |ads|:
- To score and rank a bid given an [=auction config=] |auctionConfig|, a [=generated bid=] |generatedBid|, a [=leading bid info=] |leadingBidInfo|, a [=string=] |decisionLogicScript|, a {{DirectFromSellerSignalsForSeller}} |directFromSellerSignalsForSeller|, an {{unsigned long}}-or-null @@ -1703,10 +1722,20 @@ or "component-auction", a [=currency tag=] |componentAuctionExpectedCurrency|, a
{{ScoringBrowserSignals/adComponents}}
|generatedBid|'s [=generated bid/ad component descriptors=] [=converted to a string sequence=] -1. Let |scoreAdResult| be the result of [=evaluating a scoring script=] with - |decisionLogicScript|, |adMetadata|, |bidValue|'s [=bid with currency/value=], |auctionConfig|'s - [=auction config/config idl=], |trustedScoringSignals|, |browserSignals|, - |directFromSellerSignalsForSeller|, and |auctionConfig|'s [=auction config/seller timeout=]. + +1. Let « |scoreAdResult|, |debugWinReportUrl|, |debugLossReportUrl| » be the result of + [=evaluating a scoring script=] with |decisionLogicScript|, |adMetadata|, + |bidValue|'s [=bid with currency/value=], |auctionConfig|'s [=auction config/config idl=], + |trustedScoringSignals|, |browserSignals|, |directFromSellerSignalsForSeller|, and + |auctionConfig|'s [=auction config/seller timeout=]. +1. If |auctionLevel| is "top-level-auction": + 1. Set |generatedBid|'s [=generated bid/top level seller debug loss report url=] to + |debugLossReportUrl|. + 1. Set |generatedBid|'s [=generated bid/top level seller debug win report url=] to + |debugWinReportUrl|. +1. Otherwise: + 1. Set |generatedBid|'s [=generated bid/seller debug loss report url=] to |debugLossReportUrl|. + 1. Set |generatedBid|'s [=generated bid/seller debug win report url=] to |debugWinReportUrl|. 1. Let |scoreAdOutput| be result of [=processing scoreAd output=] with |scoreAdResult|. 1. If |scoreAdOutput| is failure, return. 1. If |auctionLevel| is not "single-level-auction", and |scoreAdOutput| @@ -1740,6 +1769,7 @@ or "component-auction", a [=currency tag=] |componentAuctionExpectedCurrency|, a 1. Otherwise if |scoreAdOutput|["{{ScoreAdOutput/incomingBidInSellerCurrency}}"] [=map/ exists=], then set |generatedBid|'s [=generated bid/bid in seller currency=] to |scoreAdOutput|["{{ScoreAdOutput/incomingBidInSellerCurrency}}"] +1. Let |score| be |scoreAdOutput|["{{ScoreAdOutput/desirability}}"]. 1. Let |updateLeadingBid| be false. 1. If |leadingBidInfo|'s [=leading bid info/leading bid=] is null, or |score| is greater than |leadingBidInfo|'s [=leading bid info/top score=]: @@ -2159,7 +2189,7 @@ To get direct from seller signals for a buyer given a
To report result given a [=leading bid info=] |leadingBidInfo|, a -[=direct from seller signals=]-or-null |directFromSellerSignals|, an [=auction config=]-or-null +[=direct from seller signals=]-or-null |directFromSellerSignals|, an [=auction config=]-or-null |winningComponentConfig|, and a [=global object=] |global|: 1. Let |config| be |leadingBidInfo|'s [=leading bid info/auction config=]. 1. Let |bidCurrency| be null. @@ -2321,6 +2351,45 @@ a {{ReportingBrowserSignals}} |browserSignals|, and a [=direct from seller signa :: |reportingMacroMap|
+# Reporting # {#reporting} + +## {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}} ## {#for-debugging-only-header} + +*This first introductory paragraph is non-normative.* + +"`generateBid()`" and "`scoreAd()`" can call +{{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionWin(url)}} and +{{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionLoss(url)}} +for event-level forDebuggingOnly reports for winning and losing bids. + +
+ To collect forDebuggingOnly reports given a [=list=] of [=generated bids=] + |generatedBids|, and a [=leading bid info=]-or-null |winnerInfo|: + + 1. Let |auctionReportInfo| be a new [=auction report info=]. + 1. Let |winningBid| be |winnerInfo|'s [=leading bid info/leading bid=] if |winnerInfo| is + not null, null otherwise. + 1. [=list/For each=] |generatedBid| of |generatedBids|: + 1. If |winningBid| is not null and |generatedBid|'s [=generated bid/id=] is |winningBid|'s + [=generated bid/id=]: + 1. If |generatedBid|'s [=generated bid/bidder debug win report url=] is not null, + then [=list/append=] it to |auctionReportInfo|'s [=auction report info/debug win report urls=]. + 1. If |generatedBid|'s [=generated bid/seller debug win report url=] is not null, + then [=list/append=] it to |auctionReportInfo|'s [=auction report info/debug win report urls=]. + 1. If |generatedBid|'s [=generated bid/top level seller debug win report url=] is + not null, then [=list/append=] it to |auctionReportInfo|'s + [=auction report info/debug win report urls=]. + 1. Otherwise: + 1. If |generatedBid|'s [=generated bid/bidder debug loss report url=] is not null, + then [=list/append=] it to |auctionReportInfo|'s [=auction report info/debug loss report urls=]. + 1. If |generatedBid|'s [=generated bid/seller debug loss report url=] is not null, + then [=list/append=] it to |auctionReportInfo|'s [=auction report info/debug loss report urls=]. + 1. If |generatedBid|'s [=generated bid/top level seller debug loss report url=] is + not null, then [=list/append=] it to |auctionReportInfo|'s + [=auction report info/debug loss report urls=]. + 1. Return |auctionReportInfo|. +
+ # Additional Bids and Negative Targeting # {#additional-bids-and-negative-targeting} ## createAuctionNonce() ## {#create-auction-nonce} @@ -2423,7 +2492,7 @@ and a [=global object=] |global|: |encodedSignedAdditionalBid|. 1. If |signedAdditionalBid| is failure, then [=iteration/continue=]. 1. Let |additionalBid| be the result of running [=parse a signed additional bid=] given - |signedAdditionalBid|, |auctionConfig|, |topLevelAuctionConfig|, and |negativeTargetInfo|. + |signedAdditionalBid|, |auctionConfig|, |topLevelAuctionConfig|, and |negativeTargetInfo|. 1. If |additionalBid| is not null, then [=list/append=] |additionalBid| to |additionalBids|. 1. Return |additionalBids|. @@ -3020,17 +3089,29 @@ of the following global objects: 1. If |result| is a [=ECMAScript/normal completion=]: 1. Let |generatedBidIDL| be the result of [=converted to an IDL value|converting=] |result|'s \[[Value]] to a {{GenerateBidOutput}}. - 1. If no exception was [=exception/thrown=] in the previous step, then set |generatedBid| to - the result of [=converting GenerateBidOutput to generated bid=] with |generatedBidIDL|, - |ig|, |expectedCurrency|, |isComponentAuction|, and |global|'s - [=InterestGroupBiddingScriptRunnerGlobalScope/group has ad components=]. - 1. Otherwise, set |generatedBid| to failure. + 1. If no exception was [=exception/thrown=] in the previous step: + 1. Let |bidOutput| be the result of [=converting GenerateBidOutput to generated bid=] with + |generatedBidIDL|, |ig|, |expectedCurrency|, |isComponentAuction|, and |global|'s + [=InterestGroupBiddingScriptRunnerGlobalScope/group has ad components=]. + 1. If |bidOutput| is not failure, then set |generatedBid| to |bidOutput|. + 1. Let |debugLossReportUrl| be |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug loss report url=] if it's not + failure, null otherwise. 1. If |generatedBid| is a [=generated bid=] and |generatedBid|'s [=generated bid/bid=]'s - [=bid with currency/value=] ≤ 0, set |generatedBid| to failure. - 1. If |generatedBid| is null, set it to failure. - 1. If |generatedBid| is not failure: - 1. Set |generatedBid|'s [=generated bid/bid duration=] to |duration|. - 1. Set |generatedBid|'s [=generated bid/interest group=] to |ig|. + [=bid with currency/value=] ≤ 0, then set |generatedBid| to null. + 1. If |generatedBid| is a [=generated bid=]: + 1. Let |debugWinReportUrl| be |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug win report url=] if it's not + failure, null otherwise. + 1. Set |generatedBid|'s [=generated bid/bid duration=] to |duration|, + [=generated bid/interest group=] to |ig|, [=generated bid/bidder debug loss report url=] to + |debugLossReportUrl|, [=generated bid/bidder debug win report url=] to |debugWinReportUrl|. + 1. Otherwise: + 1. Set |generatedBid| to a new [=generated bid=] with the following [=struct/items=]: + : [=generated bid/no bid=] + :: true + : [=generated bid/bidder debug loss report url=] + :: |debugLossReportUrl| 1. Return |generatedBid|. @@ -3048,9 +3129,16 @@ of the following global objects: 1. Let |trustedScoringSignalsJS| be |trustedScoringSignals| [=converted to ECMAScript values=]. 1. Let |directFromSellerSignalsJs| be |directFromSellerSignalsForSeller| [=converted to ECMAScript values=]. - 1. Return the result of [=evaluating a script=] with |realm|, |script|, "`scoreAd`", + 1. Let |scoreAdResult| be the result of [=evaluating a script=] with |realm|, |script|, "`scoreAd`", «|adMetadata|, |bidValue|, |auctionConfigJS|, |trustedScoringSignalsJS|, |browserSignalsJS|, |directFromSellerSignalsJs|», and |timeout|. + 1. Let |debugWinReportUrl| be |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug win report url=] if it's not + failure, null otherwise. + 1. Let |debugLossReportUrl| be |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug loss report url=] if it's not + failure, null otherwise. + 1. Return « |scoreAdResult|, |debugWinReportUrl|, |debugLossReportUrl| ».
@@ -3148,6 +3236,78 @@ interface InterestGroupScriptRunnerGlobalScope { +
+[Exposed=InterestGroupBiddingAndScoringScriptRunnerGlobalScope]
+interface ForDebuggingOnly {
+  undefined reportAdAuctionWin(USVString url);
+  undefined reportAdAuctionLoss(USVString url);
+};
+
+[Exposed=InterestGroupBiddingAndScoringScriptRunnerGlobalScope,
+ Global=InterestGroupBiddingAndScoringScriptRunnerGlobalScope]
+interface InterestGroupBiddingAndScoringScriptRunnerGlobalScope : InterestGroupScriptRunnerGlobalScope {
+
+  readonly attribute ForDebuggingOnly forDebuggingOnly;
+};
+
+
+ +Each {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope}} has an associated +forDebuggingOnly, which is an +{{ForDebuggingOnly}} instance created alongside the +{{InterestGroupBiddingAndScoringScriptRunnerGlobalScope}}. + + +
+The forDebuggingOnly +getter steps are: + + 1. Return [=this=]'s [=relevant global object=]'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly=]. +
+ +Each {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope}} has a +
+ : debug win report url + :: Null, failure, or a [=URL=] whose [=url/scheme=] is "`https`". Initially null. + : debug loss report url + :: Null, failure, or a [=URL=] whose [=url/scheme=] is "`https`". Initially null. +
+ +
+The reportAdAuctionWin(|url|) method steps are: + + 1. Let |global| be [=this=]'s [=relevant global object=]. + 1. Let |parsedUrl| be the result of running the [=URL parser=] on |url|. + 1. If |parsedUrl| is failure, or |parsedUrl|'s [=url/scheme=] is not "`https`", then set |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug win report url=] to failure. + 1. Optionally, return. + + Note: This [=implementation-defined=] condition is intended to allow [=user agents=] to decline + for a number of reasons, for example the |parsedUrl|'s [=site=] not being + enrolled. + + 1. Set |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug win report url=] to |parsedUrl|. +
+ +
+The reportAdAuctionLoss(|url|) method steps are: + + 1. Let |global| be [=this=]'s [=relevant global object=]. + 1. Let |parsedUrl| be the result of running the [=URL parser=] on |url|. + 1. If |parsedUrl| is failure, or |parsedUrl|'s [=url/scheme=] is not "`https`", then set |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug loss report url=] to failure. + 1. Optionally, return. + + Note: This [=implementation-defined=] condition is intended to allow [=user agents=] to decline + for a number of reasons, for example the |parsedUrl|'s [=site=] not being + enrolled. + + 1. Set |global|'s + [=InterestGroupBiddingAndScoringScriptRunnerGlobalScope/debug loss report url=] to |parsedUrl|. +
+ ### InterestGroupBiddingScriptRunnerGlobalScope ### {#bidding-global-scope}
@@ -3155,7 +3315,7 @@ interface InterestGroupScriptRunnerGlobalScope {
  Global=(InterestGroupScriptRunnerGlobalScope,
          InterestGroupBiddingScriptRunnerGlobalScope)]
 interface InterestGroupBiddingScriptRunnerGlobalScope
-        : InterestGroupScriptRunnerGlobalScope {
+        : InterestGroupBiddingAndScoringScriptRunnerGlobalScope {
   boolean setBid(optional GenerateBidOutput generateBidOutput = {});
   undefined setPriority(double priority);
   undefined setPrioritySignalsOverride(DOMString key, optional double? priority);
@@ -3183,9 +3343,9 @@ dictionary GenerateBidOutput {
 Each {{InterestGroupBiddingScriptRunnerGlobalScope}} has a
 
: bid -:: A [=generated bid=] +:: Null, or a [=generated bid=], initially null. : priority -:: Null, failure, or a {{double}}. Defaulting to null. +:: Null, failure, or a {{double}}, initially null. : priority signals :: An [=ordered map=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are {{double}} or null. : interest group @@ -3199,7 +3359,6 @@ Each {{InterestGroupBiddingScriptRunnerGlobalScope}} has a
-
To convert GenerateBidOutput to generated bid given a {{GenerateBidOutput}} @@ -3207,7 +3366,8 @@ To convert GenerateBidOutput to generated bid given a {{GenerateBidOu |isComponentAuction| and a [=boolean=] |groupHasAdComponents|: 1. Let |bid| be a new [=generated bid=]. 1. If |generateBidOutput|["{{GenerateBidOutput/bid}}"] ≤ 0: - 1. Set |bid|'s [=generated bid/bid=] to a [=bid with currency=] with [=bid with currency/value=] |generateBidOutput|["{{GenerateBidOutput/bid}}"] and [=bid with currency/currency=] null. + 1. Set |bid|'s [=generated bid/bid=] to a [=bid with currency=] with [=bid with currency/value=] + |generateBidOutput|["{{GenerateBidOutput/bid}}"] and [=bid with currency/currency=] null. 1. Return |bid|. 1. If |generateBidOutput|["{{GenerateBidOutput/render}}"] does not [=map/exist=], return failure. 1. If |isComponentAuction| is true, and @@ -3215,8 +3375,8 @@ To convert GenerateBidOutput to generated bid given a {{GenerateBidOu 1. Let |bidCurrency| be null. 1. If |generateBidOutput|["{{GenerateBidOutput/bidCurrency}}"] is specified: 1. If the result of [=checking whether a string is a valid currency tag=] on - |generateBidOutput|["{{GenerateBidOutput/bidCurrency}}"] is true, then set |bidCurrency| to |generateBidOutput|["{{GenerateBidOutput/bidCurrency}}"] - 1. Otherwise return failure. + |generateBidOutput|["{{GenerateBidOutput/bidCurrency}}"] is true, then set |bidCurrency| to + |generateBidOutput|["{{GenerateBidOutput/bidCurrency}}"], otherwise return failure. 1. If the result of [=checking a currency tag=] with |expectedCurrency| and |bidCurrency| is false, return failure. 1. Set |bid|'s [=generated bid/bid=] to a [=bid with currency=] with [=bid with currency/value=] @@ -3373,7 +3533,7 @@ To convert GenerateBidOutput to generated bid given a {{GenerateBidOu Global=(InterestGroupScriptRunnerGlobalScope, InterestGroupScoringScriptRunnerGlobalScope)] interface InterestGroupScoringScriptRunnerGlobalScope - : InterestGroupScriptRunnerGlobalScope { + : InterestGroupBiddingAndScoringScriptRunnerGlobalScope { };
@@ -3399,13 +3559,13 @@ available in [=report win=], but not [=report result=]. Each {{InterestGroupReportingScriptRunnerGlobalScope}} has a
: report url -:: Null, failure, or a [=URL=]. Defaulting to null. +:: Null, failure, or a [=URL=] whose [=url/scheme=] is "`https`". Initially null. : reporting beacon map :: Null or an [=ordered map=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are - [=URLs=]. Defaulting to null. + [=URLs=] whose [=url/schemes=] are "`https`". Initially null. : reporting macro map :: Null or an [=ordered map=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are - [=strings=]. Defaulting to null. + [=strings=]. Initially null.
@@ -4302,9 +4462,9 @@ enum KAnonStatus { "passedAndEnforced", "passedNotEnforced", "belowThreshold", " * {{KAnonStatus/belowThreshold}}: The ad was not k-anonymous but k-anonymity was not required to win the auction. * {{KAnonStatus/notCalculated}}: The browser did not calculate the k-anonymity status of the ad, and k-anonymity was not required to win the auction. - From a long-term perspective, the status will always be set to `passedAndEnforced` after - k-anonymity is enforced. However, as a temporary solution, current implementations may set - `kAnonStatus` to one of the other three statuses to allow API users to assess the future + From a long-term perspective, the status will always be set to `passedAndEnforced` after + k-anonymity is enforced. However, as a temporary solution, current implementations may set + `kAnonStatus` to one of the other three statuses to allow API users to assess the future impact of enforcing that ads are k-anonymous. @@ -4717,6 +4877,11 @@ result of [=evaluating a bidding script=], or an [=additional bid=] provided by [:Ad-Auction-Additional-Bid:] response headers.
+ : id + :: An {{unsigned long}}. Used to identify a [=generated bid=]. + : no bid + :: A [=boolean=], initially false. True if there was a failure generating a bid, or the bidder + chose not to bid. When true, [=generated bid/bidder debug loss report url=] is still considered. : bid :: A [=bid with currency=]. If the [=bid with currency/value=] is zero or negative, then this [=interest group=] will not participate in the auction. @@ -4753,8 +4918,32 @@ result of [=evaluating a bidding script=], or an [=additional bid=] provided by :: A [=duration=] in milliseconds. How long it took to run `generateBid()`. : provided as additional bid :: A [=boolean=], initially false. + + : bidder debug win report url + :: Null or a [=URL=], initially null. Set by `generateBid()`'s + {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionWin(url)}}. + : bidder debug loss report url + :: Null or a [=URL=], initially null. Set by `generateBid()`'s + {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionLoss(url)}}. + : seller debug win report url + :: Null or a [=URL=], initially null. In the case of a component auction, these are the values + from component seller that the scored ad was created in. Set by `scoreAd()`'s + {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionWin(url)}}. + : seller debug loss report url + :: Null or a [=URL=], initially null. In the case of a component auction, these are the values + from component seller that the scored ad was created in. Set by `scoreAd()`'s + {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionLoss(url)}}. + : top level seller debug win report url + :: Null or a [=URL=], initially null. Set in the case this bid was made in a component auction, + won it, and was then scored by the top-level seller. Set by top-level seller's `scoreAd()`'s + {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionWin(url)}}. + : top level seller debug loss report url + :: Null or a [=URL=], initially null. Set in the case this bid was made in a component auction, + won it, and was then scored by the top-level seller. Set by top-level seller's `scoreAd()`'s + {{InterestGroupBiddingAndScoringScriptRunnerGlobalScope/forDebuggingOnly}}.{{ForDebuggingOnly/reportAdAuctionLoss(url)}}.
+ A bid with currency is a numeric value of a bid and the currency it is in.
@@ -4901,7 +5090,7 @@ scored bids. :: A [=boolean=], initially true. Whether all bids of `top score` are from the same interest group owner. : leading bid - :: Null or a [=generated bid=]. The leading bid of the auction so far. + :: Null or a [=generate bid=], initially null. The leading bid of the auction so far. : auction config :: An [=auction config=]. The auction config of the auction which generated this [=leading bid info/leading bid=]. @@ -4960,7 +5149,18 @@ A reporting result is a [=struct=] with the following [=struct/items= : reporting macro map :: Null or an [=ordered map=] whose [=map/keys=] are [=strings=] and whose [=map/values=] are [=strings=], initially null. Set by - {{InterestGroupReportingScriptRunnerGlobalScope/registerAdMacro(name, value)}}. + {{InterestGroupReportingScriptRunnerGlobalScope/registerAdMacro(name, value)}}. +
+ +An auction report info is a [=struct=] with the following [=struct/items=]: + +
+ : debug win report urls + :: A [=list=] of [=URLs=] whose [=url/schemes=] must be "`https`". The winning bid's + [=generated bid=]'s debug win report URLs. + : debug loss report urls + :: A [=list=] of [=strings=] whose [=url/schemes=] must be "`https`". Losing bid's + [=generated bid=]'s debug loss report URLs.
# Privacy Considerations # {#privacy-considerations} From eeb06491739b5aefac164bce3092bd30e652c5f1 Mon Sep 17 00:00:00 2001 From: Michael Kleber Date: Tue, 13 Feb 2024 09:53:02 -0500 Subject: [PATCH 4/6] Create 2024-02-07-FLEDGE-call-minutes.md --- meetings/2024-02-07-FLEDGE-call-minutes.md | 401 +++++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 meetings/2024-02-07-FLEDGE-call-minutes.md diff --git a/meetings/2024-02-07-FLEDGE-call-minutes.md b/meetings/2024-02-07-FLEDGE-call-minutes.md new file mode 100644 index 000000000..1526d50b6 --- /dev/null +++ b/meetings/2024-02-07-FLEDGE-call-minutes.md @@ -0,0 +1,401 @@ +# Protected Audience WICG Calls: Agenda & Notes + +Calls take place on most Wednesdays, at 11am US Eastern time; check [#88](https://github.com/WICG/turtledove/issues/88) for exceptions. + +That's 8am California = 5pm Paris time = 4pm UTC (during winter) + +This notes doc will be editable during the meeting — if you can only comment, hit reload + +Notes from past calls are all on GitHub [in this directory](https://github.com/WICG/turtledove/tree/main/meetings). + + +# Next video-call meeting: Wednesday Feb 7, 2024 + +To be added to a Google Calendar invitation for this meeting, join the Google Group https://groups.google.com/a/chromium.org/g/protected-audience-api-meetings/ + + +## Attendees: please sign yourself in! + + + +1. Paul Jensen (Google Privacy Sandbox) +2. Brian May (dstillery) +3. Matt Menke (Google Chrome) +4. Roni Gordon (Index Exchange) +5. David Dabbs (Epsilon) +6. Shankar Venkataraman (Jivox) +7. Wendell Bake (Yahoo) +8. Sven May (Google Privacy Sandbox) +9. Orr Bernstein (Google Privacy Sandbox) +10. Tim Hsieh (Google Ad Manager) +11. Laura Morinigo (Samsung) +12. Ricardo Bentin (Media.net) +13. Jacob Goldman (Google Ad Manager) +14. Miguel Morales (IAB Tech Lab) +15. DavidTam (Relay42) +16. Laurentiu Badea (OpenX) +17. Arthur Coleman (OnlineMatters) +18. Luckey Harpley (Remerge) +19. Pawel Ruchaj (Audigent) +20. Fabian Höring (Criteo) +21. Sathish Manickam (Google Chrome) +22. Rickey Davis (Flashtalking) +23. Tim Taylor (Flashtalking) +24. Becky Hatley (Flashtalking) +25. Tamara Yaeger (BidSwitch) +26. Isaac Foster (MSFT Ads) +27. Kenneth Kharma (OpenX) +28. Warren Fernandes (Media.net) +29. Vedant Seta (Media.net) +30. Gowtham Kommineni (LiveRamp) +31. Amit Gupta (Jivox) +32. Ruturaj Vartak (media.net) +33. Daniel Rojas (Google Chrome) +34. Andrew Pascoe (NextRoll) +35. Taranjit Singh (Jivox) +36. Siddharth VP (Jivox) +37. Laszlo Szoboszlai (Audigent) +38. Garima Mimani (Google Privacy Sandbox) +39. Anthony Yam (Flashtalking) +40. Courtney Johnson (Google Chrome) +41. Kevin Lee (Google Privacy Sandbox) +42. Drew Schoentrup (Big Crunch) +43. Russ Hamilton (Google Chrome) +44. Owen Ridolfi (Flashtalking) +45. Alex Peckham (Flashtalking) +46. Steven Valdez (Google Chrome) +47. Matt Davies (Criteo | Bidswitch) + + +## Note taker: Arthur Coleman + + +# Agenda + + +## Process reminder: Join WICG + +If you want to participate in the call, please make sure you join the WICG: https://www.w3.org/community/wicg/ + + +## Suggest agenda items here: + + + +* Isaac Foster: + * [Revisit Persistent Opt Outs question w/r/t PST](https://github.com/WICG/turtledove/issues/915#issuecomment-1892962819) (see PST specific question [here](https://github.com/WICG/trust-token-api/issues/288)) + * Multi Tag Support via “Mixed Ranking”: (really, this + multi tag + bit leak discussion and how we can be creative) https://github.com/WICG/turtledove/issues/846 + * Optional decouple bidding/reporting function urls to allow smaller k tuple: https://github.com/WICG/turtledove/issues/679#issuecomment-1703973736 +* Tim Hsieh + * Updated proposal for Video and Native support https://github.com/WICG/turtledove/issues/265#issuecomment-1914779917 +* Jacob Goldman + * Reporting and top-level worklet timeouts https://github.com/WICG/turtledove/issues/959 +* David Dabbs + * Is `updateAdInterestGroups()` temporary? It is in the spec but unmentioned in the main explainer. Search [here](https://github.com/search?q=repo%3AWICG%2Fturtledove%20updateAdInterestGroups&type=code) + + +# Reminder of Upcoming Events: + + + +* [Announcement] Chrome Facilitated Testing Webinar + * The Google Chrome team will be hosting our next external webinar sessions where we will focus on the testing and preparing for the current 1% restriction of third-party cookies in Chrome along with use of Mode A and B available as part of Chrome-facilitated testing. + + The first **Americas friendly session** is happening on** Feb. 1st 12-1 pm ET**. A second **Japanese language session** is happening **Feb. 6th 3:30-5:30 pm JST**. A third **EMEA friendly session** takes place on** Feb. 8th 12-1 pm GMT**. + + * To join, please register below: + * AMER-friendly: [Register Here](https://rsvp.withgoogle.com/events/chrome-facilitated-testing-webinar-amer) + * EMEA-friendly: [Register Here](https://rsvp.withgoogle.com/events/chrome-facilitated-testing-webinar-emea) + * Japanese language: [Register Here](https://rsvp.withgoogle.com/events/testing-and-preparing-for-third-party-cookie-restrictions-oh) + + +# Notes + +Note intellectual property rules apply for W3C + +Announcements: + + + +* See above + + +## About [Revisit Persistent Opt Outs question w/r/t PST](https://github.com/WICG/turtledove/issues/915#issuecomment-1892962819) + +Isaac Foster + + + +* Last time we chatted about this a bigger issue around privacy rights +* Issue around being able to honor opt-outs +* Seems like private state tokens are the initial motivator for the ”am I human thing” but it seems like some of the docs seem to say that it is a way to communicate web safety across domains +* Persistent opt-outs can fall into that. +* Seems like private state tokens might be directionally handled to handle coarse grained information +* Haven’t heard back from PST folks on long-term thinking - aware there are limits right now + * Only two private state tokens by partition +* Hoping to get someone official to give their opinion of whether + * A. Pursuing this type of use case for PSTs is one we are open to + * B. If so, then would that potentially align with PST direction? + +Paul Jensen + + + +* PSTs is about users going to an adtech’s website and opting out and being persistent across all sites + +Isaac Foster + + + +* Let me restate for Xandr and other MFST properties +* We have a platform level opt-out (privacy.xandr.com) that basically says “do not show me ads from your platform” +* Different from GDPR, CCPA etc. Different than when we get “per request” per those standards - we get a giant string on request +* In a persistent platform opt out at privacy.xandr.com what we do is we can store this value in your browser and no matter what site we are integrated with we know you say “don’t show me ads” +* Without cookie mechanic, that system goes away. There are few fun tricks you can do, but there is no reliable way to do this. + +David Dobbs + + + +* Is your request to have that specifically for PAAPI or to replace that specific compliance use case under the GPS? + +Isaac Foster + + + +* Not intended to refer to a browser-based API.It is not unrelated. But if someone comes to Xandr - +* Ideally there were be “something” (Privacy sandbox an overused term) - is there an API we can use for this broader use case and PST seems a good way to do that + +Brian May + + + +* Sounds @Isaac Foster sounds like you want a per domain, able to see across partitions solution +* Sounds like private state tokens - talked to --- this morning about this issue + +Steven Valdez + + + +* In terms of information in terms of PSTs, there are a lot of limitations around that. Might make sense to have a different API to do this for that specific use case for that limited amount of data. Given this user case, we could have a slightly different privacy model. PSTs seem like a good place to do this, but it isn’t set up for it exactly right now + +Isaac Foster + + + +* Would be good to see where you see PSTs going - seems like it originated with anti-fraud but it seems like some intentionality naming it PSTs that it was meant for the broader use case +* Clarity here would be helpful +* If there is a similar but different web API that could be restricted to this use case - reliable for that domain - I think that would be fantastic + +Steven Valdez + + + +* This could be incubated separately from PSTs +* But this is a good use case to start with to think about how to approach + +Isaac Foster + + + +* If you envision this as a new thing, how do we go about starting discussions about that (good question!) +* Should we have some rough conversation with people in industry - maybe not immediately - but how would you see this? + +Steven Valdez + + + +* Could have a side meeting and then start on a side proposal to PSTs. +* We can get an email thread set up and see who is interested in chatting about this? +* ACTION ITEM: Set up an email group to discuss + +Brian May + + + +* Why are you starting with PSTs vs. starting with the requirements and then look at the right tech? + +Isaac Foster + + + +* My intention is not to say PSTs are the right place to start +* Digging around PSTs there are a lot of properties there that do seem to be potentially valuable. +* The way it could handle coarse-grained information across sites seems like it could be applicable +* To the extent that it makes sense to have it “shaped like” PSTs that’s fine - +* But I would like to be able to implement this use case for coarse-grained information - that’s how I would frame it + +Brian May + + + +* Is there an analogy between “this web site wants to track you” and “do you want to allow tracking for behavioral targeting”? +* Is that approach insufficient + +Isaac Foster + + + +* I’d prefer that we don’t have to have a browser-controlled popup - my instinct would be to have a separate API to handle in a different context. + +Paul Jensen + + + +* Look for a compromise on some level that is useful for ??? +* If we surface this in some kind of isolated environment, it has a potential to be more private +* Wonder if there is a way to have PAAPI keep track of this using some kind of cross-site identifier + +Issac Foster + + + +* This would have to occur outside of the private auction - because then we wouldn’t want to show them adds from even our contextual auction +* So doing it within the auction would not work for us +* One reason I thought PSTs were interesting that framework currently has some ideas about how you limit bit-leakage that would make it work across 32 different adtechs +* If you could only read it in the context of your domain script, that would work for now although not ideal. + +Shankar Venkataraman + + + +* Question: What about using shared storage? + +Isaac Foster + + + +* Wev’e talked about using shared-storage and exfiltrate that via the 12-bit limit per day, +* When I said reliable earlier there are a few things we could do with shared storage to start with that would give us pretty good coverage. +* I don’t think that would be a good primitive here +* But if you ask me about workarounds for this, but from a more web primitive for this is I don't think shared storage is the way to go + +Isaac Foster + + + +* Request that goes out to any domain could use a special header + +Brian May + + + +* If I go out to an FSP and it doesn’t hit Xandr directly, how does Xandr know about it + +Isaac Foster + + + +* If we get a request form an external SSP and we don’t have that mapped then we couldn’t tell +* But if mapped to an identity I believe we look it up on the back end., + +Brian May + + + +* Problem is these two rarely meet + +Isaac Foster + + + +* That is certainly true + +Paul Jensen + + + +* I think adding this to a discussion of PSTs is useful, but it may be a more general use use case where PAAPI isn’t the right place to do the implementation + +Isaac Foster + + + +* I see this as a Web API not under PAAPI +* I just don’t know what forum to get this thread started + +Brian May + + + +* Have you considered trying to raise this in PATCG? + +Isaac Foster + + + +* Happy to do that if that is the right place + +Paul Jensen + + + +* Feel free to reach out to Steven +* Eric Troutman is the other person to contact + + +## TOPIC 2: Reporting and top-level worklet timeouts https://github.com/WICG/turtledove/issues/959 + +Jacob Goldman: + + + +* There are different timeout controls that the seller can specify (in the auction config) +* Those timeout controls do not seem to work when extended to reporting. +* We were wondering if we could discuss extending new controls to modify that timeout. +* This is coming from seeing a significant uptick in flakiness across our regression testing +* Seems like 50 milliseconds is not enough time to generate a complete event. +* We started a little bit of profiling but were not able to really hone in on it +* We don‘t have a way to measure +* The frequency of this is occuring in production + +David Dabbs + + + +* When we use the report to track our spend - +* What kind of signal loss are we looking at? + +Jacob Goldman + + + +* We don’t know in production +* In our regression testing we experience up to 10-20 percent flakiness . +* We would like our control to … +* We think this is a larger problem and we are looking for guidance on how to handle + +Laurentiu Badea + + + +* Could some of this be due to the fact that generateBid() is not allowed to pass data to reportWin, so reportWin has to redo part of the same calculations to re-generate data for the report? + +Paul Jensen + + + +* + +Matt Menke + + + +* Currently when the frame running the auction is destroyed, any running or pending reporting worklets for auctions run in the frame are aborted, due to their hooks into the frame. This does not affect network requests for sending the reports, which can outlive the frame. +* Fixing this is an item on our to do list. +* Paul later pointed out this is probably not a common corner case, since we start running reporting scripts immediately after an auction completes (even before the ad is actually used), but it may appear in synthetic testing. +* Increasing timeouts is reasonable, but too high a timeout can potentially slow down in the browser after a user has navigated away. + +Paul Jensen + + + +* When we were designing timeouts in the beginning, we had a more simplistic vision +* Initially, just a 50ms timeout by default +* Other work with scoreAd() +* We had 50 ms here so why not there + * We want the auction to take a reasonable amount of time because good for everything + * We need to give people reasonable amount of time to calculate + * Another reason: exfiltration of signals by covert channels + * Example: you could make a signal out of the protected worklets + * Hard to to do to protect against, especially Javascript to Javascript From f42c1c44c0b4933ab5c043efe1908c827793c466 Mon Sep 17 00:00:00 2001 From: masaaki-matsuda <93913125+masaaki-matsuda@users.noreply.github.com> Date: Thu, 15 Feb 2024 11:34:10 +0900 Subject: [PATCH 5/6] Update fledge-tester-list.md (#1037) Adding adstir and Bypass as a Fledge testing partner --- fledge-tester-list.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fledge-tester-list.md b/fledge-tester-list.md index 08b64978e..023865fd3 100644 --- a/fledge-tester-list.md +++ b/fledge-tester-list.md @@ -77,6 +77,8 @@ The usefulness of this page depends on testers sharing information and updates. | Flashtalking | Ad Server & DCO | Testing in progress | | privacysandbox@mediaocean.com | | MediaMath | DSP | 2024 Q1 - | | privacysandbox@infillion.com | | Sharethrough | SSP | March 2024 | | privacysandbox@sharethrough.com | +| adstir | SSP | 2024 Q2 - | | privacysandbox@united.jp | +| Bypass | DSP | 2024 Q2 - | | privacysandbox@united.jp | ## Table - Publishers and Advertisers Interested in Testing or Early Adoption Companies who may be interested in participating in tests and early adoption opportunities provided by ad tech companies. From 7e254c6119469ca432bc318b860cbe567f0be551 Mon Sep 17 00:00:00 2001 From: krzhalovski <43197305+krzhalovski@users.noreply.github.com> Date: Fri, 16 Feb 2024 05:11:10 +0100 Subject: [PATCH 6/6] Update fledge-tester-list.md (#1039) --- fledge-tester-list.md | 1 + 1 file changed, 1 insertion(+) diff --git a/fledge-tester-list.md b/fledge-tester-list.md index 023865fd3..d6de77b50 100644 --- a/fledge-tester-list.md +++ b/fledge-tester-list.md @@ -79,6 +79,7 @@ The usefulness of this page depends on testers sharing information and updates. | Sharethrough | SSP | March 2024 | | privacysandbox@sharethrough.com | | adstir | SSP | 2024 Q2 - | | privacysandbox@united.jp | | Bypass | DSP | 2024 Q2 - | | privacysandbox@united.jp | +| Anonymised | Ad Network | Testing in progress | | privacysandbox@anonymised.io | ## Table - Publishers and Advertisers Interested in Testing or Early Adoption Companies who may be interested in participating in tests and early adoption opportunities provided by ad tech companies.