diff --git a/spec.bs b/spec.bs
index 7eb26cbe6..0f50cf25d 100644
--- a/spec.bs
+++ b/spec.bs
@@ -2917,7 +2917,7 @@ and a [=global object=] |global|:
to |winner|'s [=generated bid/selected buyer and seller reporting ID=].
1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is not null, [=map/set=]
|browserSignals|["{{ReportingBrowserSignals/buyerAndSellerReportingId}}"] to it.
- 1. Otherwise, if the result of running [=query reporting ID k-anonymity count=] with |winner|'s
+ 1. Otherwise, if the result of running [=query reporting ID k-anonymity count=] with |winner|'s
[=generated bid/interest group=], |igAd|, and null is true:
1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is not null, [=map/set=]
|browserSignals|["{{ReportingBrowserSignals/buyerAndSellerReportingId}}"] to it.
@@ -3468,6 +3468,13 @@ A server auction response is a [=struct=] that contains auction resul
: selected buyer and seller reporting id
:: Null or a [=string=], initially null. When not null, this will be verified with the winning bid's
[=generated bid/ad=]'s [=interest group ad/selectable buyer and seller reporting IDs=].
+ : winner join candidates
+ :: Null or [=server auction join candidates=]. When not null, contains the
+ k-anonymity hashes corresponding to the winning bid and indicates which
+ k-anonymity hashes were used for k-anonymity enforcement on the server.
+ : ghost winner
+ :: Null or [=server auction ghost winner=]. When not null, contains information
+ about the non-k-anonymous winner of a server auction.
: error
:: Null or [=string=]. When not null, contains an error message from the
auction executed on the trusted auction server. May be used to provide
@@ -3485,6 +3492,57 @@ A server auction response is a [=struct=] that contains auction resul
:: A [=map=] whose [=map/keys=] are [=origins=] and whose [=map/values=] are [=lists=] of [=urls=].
+server auction join candidates is a [=struct=] with the following [=struct/items=]:
+
+ : ad render url hash
+ :: A [=SHA-256=] hash of the [=k-anonymity key=] for the ad in the winning bid,
+ as calculated using [=compute the key hash of ad=].
+ : ad component render url hashes
+ :: A [=list=] of [=SHA-256=] hashes for each of the ad components in the
+ winning bid, as calculated using [=compute the key hash of component ad=].
+ : reporting id hash
+ :: A [=SHA-256=] hash of the [=k-anonymity key=] for the reporting ID in the
+ winning bid, as calculated using [=compute the key hash of reporting ID=].
+
+
+server auction ghost winner is a [=struct=] with the following [=struct/items=]:
+
+ : candidates
+ :: [=server auction join candidates=] associated with this winner.
+ : interest group owner
+ :: An [=origin=]. The non-k-anonymous winning bid's interest group [=interest group/owner=].
+ : interest group name
+ :: A [=string=]. The non-k-anonymous winning bid's interest group [=interest group/name=].
+ : ghost winner bid info
+ :: Null or a [=server auction ghost winner bid info=]. Contains information needed for
+ ghost winners in component auctions.
+
+
+A server auction ghost winner bid info is a [=struct=] with the following [=struct/items=]:
+
+ : ad render url
+ :: [=URL=]. The [=leading bid info/leading non-k-anon-enforced bid=]'s [=generated bid/ad descriptor=]'s [=ad descriptor/url=] from the
+ auction.
+ : ad components
+ :: A [=list=] of [=URLs=]. A list of the non-k-anonymous winning bid's
+ [=generated bid/ad component descriptors=]'s [=ad descriptor/urls=] from the
+ auction.
+ : modified_bid
+ :: [=bid with currency=]. Contains the non-k-anonymous winning bid's [=generated bid/modified bid=]
+ when not null, otherwise the non-k-anonymous winning bid's [=generated bid/bid=].
+ : ad metadata
+ :: Null or a JSON [=string=]. Contains the component auction's non-k-anonymous winning bid's [=generated bid/ad=].
+ : buyer reporting id
+ :: Null or a [=string=]. When not null, this will be verified with the non-k-anonymous winning bid's
+ [=generated bid/ad=]'s [=interest group ad/buyer reporting ID=].
+ : buyer and seller reporting id
+ :: Null or a [=string=]. When not null, this will be verified with the non-k-anonymous winning bid's
+ [=generated bid/ad=]'s [=interest group ad/buyer and seller reporting ID=].
+ : selected buyer and seller reporting id
+ :: Null or a [=string=], initially null. When not null, this will be verified with the non-k-anonymous winning bid's
+ [=generated bid/ad=]'s [=interest group ad/selectable buyer and seller reporting IDs=].
+
+
A server auction reporting info is a [=struct=] with the following [=struct/items=]:
: reporting url
@@ -4921,7 +4979,7 @@ dictionary StorageInterestGroup : AuctionAdInterestGroup {
is a one-time canonical [=string=] representation of a [=version 4 UUID=] that is uniquely
associated with a single call to {{Window/navigator}}.{{Navigator/runAdAuction()}}. For multi-seller
auctions, a distinct auction nonce can be uniquely associated with each of the
-{{AuctionAdConfig/componentAuctions}}. The auction nonce(s) will need to be passed back in via a
+{{AuctionAdConfig/componentAuctions}}. The auction nonce(s) will need to be passed back in via a
subsequent call to {{Window/navigator}}.{{Navigator/runAdAuction()}} via the {{AuctionAdConfig}}.
This is currently only needed for [=auctions=] that use [=additional bids=], in which the auction
nonce is combined with a [=signed additional bid with metadata/seller nonce=] to construct a bid
@@ -5401,17 +5459,17 @@ from querying the server during an auction.
1. If [=query k-anonymity cache=] for |adHashCode| returns true:
1. If |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] is not null:
1. Let |kAnonRestrictedSelectableReportingIds| be a new empty [=list=] of [=string=]s.
- 1. [=list/For each=] |selectableReportingId| in |igAd|'s
+ 1. [=list/For each=] |selectableReportingId| in |igAd|'s
[=interest group ad/selectable buyer and seller reporting IDs=]:
1. Let |reportingHashCode| be the result of [=query reporting ID k-anonymity count=]
- given |ig|, |igAd|, and |selectableReportingId|.
+ given |ig|, |igAd|, and |selectableReportingId|.
1. If [=query k-anonymity cache=] for |reportingHashCode| returns true, then
[=list/append=] |selectableReportingId| to |kAnonRestrictedSelectableReportingIds|.
1. Set |igAd|'s [=interest group ad/selectable buyer and seller reporting IDs=] to
|kAnonRestrictedSelectableReportingIds|.
1. [=list/Append=] |igAd| to |kAnonRestrictedIG|'s [=interest group/ads=].
1. If |ig|'s [=interest group/ad components=] is not null:
- 1. Set |kAnonRestrictedIG|'s [=interest group/ad components=] to an empty [=list=] of
+ 1. Set |kAnonRestrictedIG|'s [=interest group/ad components=] to an empty [=list=] of
[=interest group ad=].
1. [=list/For each=] |igAdComponent| of |ig|'s [=interest group/ad components=]:
1. Let |adComponentHashCode| be the result of running [=compute the key hash of component ad=] given |ig| and
@@ -5476,11 +5534,11 @@ from querying the server during an auction.
* "SelectedBuyerAndSellerReportId"
* |middle|
* The result of [=compute the key part for one of multiple reporting ids=] given |selectedReportingId|
- * The result of [=compute the key part for one of multiple reporting ids=] given |igAd|'s
+ * The result of [=compute the key part for one of multiple reporting ids=] given |igAd|'s
[=interest group ad/buyer and seller reporting ID=]
* The result of [=compute the key part for one of multiple reporting ids=] given |igAd|'s
[=interest group ad/buyer reporting ID=]
- 1. Otherwise:
+ 1. Otherwise:
1. If |igAd|'s [=interest group ad/buyer and seller reporting ID=] is not null, set |keyString|
to be the [=string/concatenation=] of the following strings separated with U+000A (LF):
* "BuyerAndSellerReportId"
@@ -7474,7 +7532,7 @@ The following algorithm will be added to the [[FETCH#fetching]] section:
1. Let |bidWithMetadata|'s [=signed additional bid with metadata/signed additional bid=] be
|parts|[2].
1. [=list/Append=] |bidWithMetadata| to |storedAdditionalBidsHeaders|[|auctionNonce|].
- 1. Otherwise, if |parts|'s [=list/size=] is 2:
+ 1. Otherwise, if |parts|'s [=list/size=] is 2:
1. Let |auctionNonce| be |parts|[0].
1. If |auctionNonce|'s [=string/length=] is not 36, then [=iteration/continue=].
1. Let |bidWithMetadata|'s [=signed additional bid with metadata/signed additional bid=] be
@@ -7652,12 +7710,12 @@ dictionary ReportingBrowserSignals {
and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with
interest group owner, bidding script URL, [=ad creative=] URL, and null.
* Set if the wining bid had a [=generated bid/selected buyer and seller reporting ID=] and the
- winning ad had a [=interest group ad/buyer and seller reporting ID=] set in its listing in the
+ winning ad had a [=interest group ad/buyer and seller reporting ID=] set in its listing in the
interest group, and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=]
combined with interest group owner, bidding script URL, [=ad creative=] URL, the and winning bid's
[=generated bid/selected buyer and seller reporting ID=].
- {{ReportingBrowserSignals/selectedBuyerAndSellerReportingId}}
-
- A selected reporting id returned by "`generateBid()`".
+
- A selected reporting id returned by "`generateBid()`".
Set if the winning bid had a [=generated bid/selected buyer and seller reporting ID=] set,
and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with
[=interest group ad/buyer and seller reporting ID=], interest group owner,
@@ -7726,7 +7784,7 @@ enum KAnonStatus { "passedAndEnforced", "passedNotEnforced", "belowThreshold", "
and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=] combined with
interest group owner, bidding script URL, [=ad creative=] URL, and null.
* Set if the wining bid had a [=generated bid/selected buyer and seller reporting ID=] and the
- winning ad had a [=interest group ad/buyer reporting ID=] set in its listing in the
+ winning ad had a [=interest group ad/buyer reporting ID=] set in its listing in the
interest group, and that value was [=query reporting ID k-anonymity count|jointly k-anonymous=]
combined with interest group owner, bidding script URL, [=ad creative=] URL,
[=interest group ad/buyer and seller reporting ID=], and
@@ -7909,9 +7967,9 @@ An interest group ad is a [=struct=] with the following [=struct/item
: buyer and seller reporting ID
:: Null or a [=string=]. Will be passed in place of interest group name or
[=interest group ad/buyer reporting ID=], or alongside the
- [=generated bid/selected buyer and seller reporting ID=], to [=report win=] and
- [=report result=], subject to [=k-anonymity=] checks. Also passed alongside
- [=generated bid/selected buyer and seller reporting ID=] to `scoreAd()` if
+ [=generated bid/selected buyer and seller reporting ID=], to [=report win=] and
+ [=report result=], subject to [=k-anonymity=] checks. Also passed alongside
+ [=generated bid/selected buyer and seller reporting ID=] to `scoreAd()` if
[=generated bid/selected buyer and seller reporting ID=] is present. Only meaningful in
[=interest group/ads=], but ignored in [=interest group/ad components=].
: selectable buyer and seller reporting IDs
@@ -8846,11 +8904,11 @@ result of [=evaluating a bidding script=], or an [=additional bid=] provided by
in the auction. Must be null if the interest group making this bid has a null
[=interest group/ad components=] field.
: selected buyer and seller reporting ID
- :: Null or [=string=]. The selected reporting id from the
+ :: Null or [=string=]. The selected reporting id from the
[=interest group ad/selectable buyer and seller reporting IDs=] within the
[=generated bid/interest group=]. If present, this will be:
* Passed alongside [=interest group ad/buyer reporting ID=] and
- [=interest group ad/buyer and seller reporting ID=] to [=report win=]
+ [=interest group ad/buyer and seller reporting ID=] to [=report win=]
subject to [=k-anonymity=] checks.
* Passed alongside [=interest group ad/buyer and seller reporting ID=]
to [=report result=] subject to [=k-anonymity=] checks.
@@ -8927,13 +8985,13 @@ To adjust bid list based on k-anonymity given a [=list=] of [=generat
1. [=Apply any component ads target to a bid=] given |bidCopy|.
1. [=list/Append=] |bidCopy| to |bidsToScore|
1. Let |selectedReportingId| be a [=string=]-or-null that is set to null.
- 1. If |generatedBid|'s [=generated bid/selected buyer and seller reporting ID=] is not null, set
+ 1. If |generatedBid|'s [=generated bid/selected buyer and seller reporting ID=] is not null, set
|selectedReportingId| to it.
1. Let |igAd| be the [=interest group ad=] from |generatedBid|'s [=generated bid/interest group=]'s
[=interest group/ads=] whose [=interest group ad/render url=] is |generatedBid|'s
[=generated bid/ad descriptor=]'s [=ad descriptor/url=].
1. Let |isBidKAnon| be the result of [=query generated bid k-anonymity count=] given |generatedBid|.
- 1. If |isBidKAnon| is true and running [=query reporting ID k-anonymity count=] with |generatedBid|'s
+ 1. If |isBidKAnon| is true and running [=query reporting ID k-anonymity count=] with |generatedBid|'s
[=generated bid/interest group=], |igAd|, |selectedReportingId| is true:
1. [=list/Append=] |generatedBid| to |bidsToScore|.