Skip to content

September release candidate (DO NOT MERGE) - #1112

Draft
ChristianPavilonis wants to merge 589 commits into
mainfrom
rc/202609
Draft

ChristianPavilonis wants to merge 589 commits into
mainfrom
rc/202609

Conversation

@ChristianPavilonis

@ChristianPavilonis ChristianPavilonis commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Summary

September release candidate.

This PR is an integration branch for release-candidate validation. Do not merge it into main.

Refreshed on 2026-09-18: every included PR is now at its latest commit. main is fully
contained in rc/202609. RC head 76ef421ae.

Release blocker: unreleased EdgeZero dependency. #1175 repoints all six EdgeZero
crates from release tag v0.0.8 to the unmerged upstream branch
fix/fastly-environment-store-selectors (currently 5878eb74). Upstream
EdgeZero PR 381 is still open and
v0.0.8 is still the latest tag. This RC must not ship until that PR merges and the
pin moves to a release tag. The branch head has already moved once during integration
(6258b6b2 to bb4e0040), so re-verify the lock before any release build.

Already included through main

Included PRs

All at latest. The two stacks were integrated at their tips, since the lower PRs are
ancestors of their tip.

PR Branch Merge
#823 feature/ts-cli-ad-templates conflict resolved (1 file)
#900 fix/no-op-kv-reads included via #1157
#901 fix/idempotent-ec-withdrawal-tombstones included via #1157
#902 perf/group-batch-sync-by-ec-id included via #1157
#903 refactor/remove-legacy-consent-store included via #1157
#1052 aps-renderer-failure-diagnostics clean
#1054 issue-355-liveramp-integration conflict resolved (1 file)
#1074 feat/request-phase-timing already in RC
#1076 spec/auction-timeline-offsets included via #1154
#1121 feature/ts-console-improvements included via #1154
#1154 feature/ts-console-clarity conflict resolved (13 files)
#1157 fix/issue-993-eid-kv-conflicts conflict resolved (17 files)
#1159 fix/pbs-stored-requests clean
#1175 fix/align-edgezero-pr-381 conflict resolved (4 files)

Conflict resolution notes

Conflicts were resolved as genuine three-way merges rather than by taking one side.
Each file was audited by commit subject to establish which side carried work the other
had never seen, because several RC-side features postdate the branches.

Deliberate resolutions worth reviewing:

  • gpt/index.ts kept both sides. The RC's delete ts.firstImpression (first-impression
    arbitration, Prevent competing GPT first impressions and resize PUC shells #1079 / Harden PR 1079 first-impression arbitration #1083 / Resolve the GPT bootstrap test fixture without assuming a platform #1162) and the branch's ts.auctionDiagnostics = undefined
    are independent cleanups on the same reset path. Taking the branch alone reverted Prevent competing GPT first impressions and resize PUC shells #1079
    and broke 24 tests.
  • publisher.rs kept the RC's dispatch_auction / collect_dispatched_auction split
    and legacy_provider_map (Add configuration-driven OpenRTB auction providers #1016), and layered the branch's no-argument
    mark_auction_dispatched, auction_wait_placement_wire helper, and two-phase
    BrowserAuctionDiagnostics construction on top.
  • prebid/index.ts kept the RC's first-impression token reconciliation and took the
    branch's removal of the hb_cur currency field, which a later review commit on that
    branch had deliberately dropped.
  • app.rs restored is_publisher_navigation = ec.is_real_browser && is_navigation
    from the merge base. The RC side had dropped the is_real_browser term, which widened
    set_recovery_eligible to non-browser navigations.
  • platform/timed_kv.rs and settings.rs needed repair after auto-merging into a
    non-compiling state: the EcKvStore trait made list_keys_with_prefix required and
    count_keys_with_prefix a provided default, and settings.rs kept two copies of the
    same two tests.
  • Prebid shim size bound raised from 41000 to 43000 bytes, with the comment rewritten
    to name the feature set. The shim is 42158 bytes with LiveRamp and GPT diagnostics both
    shipping. The guard exists to catch a Prebid value-import multiplying the bundle, and its
    Prebid-free assertions still pass.

#1175 (deployment / store selectors). Merged at ae47b4350. The conflicts were the
Fastly store-binding model changing underneath RC-side work:

  • fastly.toml and the Viceroy fixture dropped the edgezero_runtime_env config store,
    which is the selector store Align Fastly staging store selectors with EdgeZero PR 381 #1175 removes. The rename to trusted_server_secrets
    auto-merged around it.
  • app.rs took the branch's RuntimeStoreConfig::logical() body. The RC's conflicted
    side still referenced env, which logical() no longer takes, so the RC side could not
    compile against the merged signature.
  • main.rs took the branch's edgezero_main(req) signature and dropped the dead
    runtime_env_config / RuntimeStoreConfig::from_env plumbing. Four RC-side call sites
    then needed &runtime_stores, since runtime_stores became a local value.
  • app.rs test imports kept the RC's wider set (HeaderValue, response_builder, used
    9 times each) and dropped EnvConfig, now unused.

A fix was also pushed to #1157's own branch (bd0b83a98): its rebase onto main left the
EidConflictEcKv test double missing list_keys_with_prefix, failing trusted-server-core
under cfg(test) with E0046 and taking cargo fmt down as a cascade.

Verification

Run locally against the merged branch:

Gate Result
cargo fmt --all -- --check pass
6 clippy targets (fastly, axum, cloudflare, cloudflare-wasm, spin-native, spin-wasm) pass
cargo test-fastly 3058 pass
cargo test-axum / test-cloudflare / test-spin pass
ts CLI tests 505 pass
cross-adapter parity 13 pass
npx vitest run 1103 pass, 0 fail (baseline before refresh: 1067)
browser integration (Playwright, nextjs) 21 pass, 1 skipped, 0 fail

The table above was measured at 589a8e9b9. After merging #1175 the Rust gates were
re-run at 9297c734b: fmt, all six clippy targets, cargo test-fastly (3057),
axum, cloudflare, spin, parity (13) and the ts CLI suite (505) all pass.

The browser integration tests check that was failing on the previous RC head now passes.
The failure was the nextjs/gpt-diagnostics spec timing out against a stale GPT diagnostics
snapshot, which #1154 updates.

ChristianPavilonis and others added 30 commits August 26, 2026 12:30
Adds section 18 to the request phase timing spec: three first-call-wins
T0 offsets (auction dispatched, resolved, committed) on RequestTimings,
emitted as additive nullable columns on access_logs_raw with auction_id
as the join key to the per-bidder auction dataset. Answers the
overlap-proof questions the two existing clocks cannot: when the
auction started relative to request entry, when the final bid landed,
and when targeting was committed toward GAM.
Implements spec section 18: three first-call-wins marks on
RequestTimings (dispatched at the DispatchAuctionOutcome::Dispatched
arm, resolved after collect at both sites, committed after
write_bids_to_state at both sites), carried through TimingSnapshot into
four additive access_logs_raw columns: auction_dispatched_ms,
auction_resolved_ms, auction_committed_ms, and auction_id as the join
key to the per-bidder auction dataset. Null offsets mean no auction
ran; a failed dispatch records nothing. FORWARD_QUERY fills the new
columns with typed defaults for pre-existing rows.

No header emission, no config surface, no adapter changes: the values
ride the existing snapshot and the tinybird.access_enabled gate.
The Cloudflare integration harness writes
wrangler.integration.generated.toml at test time; it was swept into the
previous commit by accident. Ignore it so local CI=1 runs cannot commit
it again.
* docs: plan PR 1079 review remediation

* fix(js): scope first impression delivery ownership

* fix(js): reject stale creatives and expand nested shells

* Prevent delayed publisher refresh overwrites
Main added the dedicated `[creative_opportunities].enabled` template switch
(#1008) with its own publisher-local ad-stack gate, while this branch moved the
same gate into core as `evaluate_ad_stack_gate`. Resolve in favor of the shared
gate and give it the new switch, so the CLI diagnostics keep reporting the same
verdict the runtime reaches:

- Drop `ServerSideAdStackConfig`/`should_run_server_side_ad_stack` and route the
  publisher call site through `evaluate_ad_stack_gate` with `ad_templates_enabled`.
- Keep `is_server_side_ad_eligible_navigation`; the inactive-template cache
  policy needs the request-only half of the gate.
- Add `AdStackGateName::AdTemplatesEnabled` and widen the exhaustive gate tests
  to the eighth gate, absorbing the coverage of main's deleted unit test.
- Feed the switch from both CLI gate call sites, add the `Gates` JSON field, the
  `explain` gate row, and the `lint` switch line and status.
# Conflicts:
#	crates/trusted-server-cli/src/commands/audit/generate/slot_toml.rs
Unify Tinybird, DataDome, and S3 static credentials under the logical default secret store, resolve them during typed config loading, and remove request-time static secret reads. Honor Fastly logical-to-physical store mappings, preserve deserialize-only selector compatibility, redact runtime values, and document provisioning and migration behavior.
…o issue-355-liveramp-integration

# Conflicts:
#	trusted-server.example.toml
ChristianPavilonis and others added 8 commits September 18, 2026 13:35
The rebase onto main brought EcKvStore::list_keys_with_prefix, but the
EidConflictEcKv test double was not updated alongside its siblings, so
trusted-server-core failed to compile under cfg(test) with E0046.

Delegate to the inner store, matching every other test double in the module.
aram356 and others added 20 commits September 18, 2026 13:42
# Conflicts:
#	docs/guide/integrations/prebid.md
# Conflicts:
#	crates/trusted-server-cli/src/commands/config/ad_templates.rs
Upstream now parses the live Fastly resource-link types (`config`,
`kv-store`, `secret-store`), documents the custom entry point migration,
and moves the release verifier into edgezero-adapter, which adds serde,
serde_json, sha2, and walkdir edges under its cli feature. No public API
used by Trusted Server changed, so this is a lockfile-only update.
# Conflicts:
#	crates/trusted-server-core/src/publisher.rs
#	crates/trusted-server-integration-tests/browser/tests/nextjs/gpt-diagnostics.spec.ts
#	crates/trusted-server-js/lib/src/integrations/gpt/index.ts
#	crates/trusted-server-js/lib/src/integrations/gpt_diagnostics/api.ts
#	crates/trusted-server-js/lib/src/integrations/gpt_diagnostics/badges.ts
#	crates/trusted-server-js/lib/src/integrations/gpt_diagnostics/overlay.ts
#	crates/trusted-server-js/lib/src/integrations/gpt_diagnostics/store.ts
#	crates/trusted-server-js/lib/src/integrations/prebid/index.ts
#	crates/trusted-server-js/lib/test/integrations/gpt_diagnostics/badges.test.ts
#	crates/trusted-server-js/lib/test/integrations/gpt_diagnostics/overlay.test.ts
#	crates/trusted-server-js/lib/test/integrations/prebid/index.test.ts
#	docs/guide/integrations/gpt-diagnostics-dictionary.md
#	docs/guide/integrations/gpt-diagnostics.md
The two upstream commits since 4531aeec touch only the deploy action
script and a demo lockfile. No crate source changed, so this is a
lockfile-only update.
# Conflicts:
#	crates/trusted-server-adapter-fastly/src/app.rs
#	crates/trusted-server-adapter-fastly/src/main.rs
#	crates/trusted-server-adapter-spin/src/platform.rs
#	crates/trusted-server-core/src/ec/batch_sync.rs
#	crates/trusted-server-core/src/ec/finalize.rs
#	crates/trusted-server-core/src/ec/kv.rs
#	crates/trusted-server-core/src/ec/mod.rs
#	crates/trusted-server-core/src/ec/prebid_eids.rs
#	crates/trusted-server-core/src/ec/pull_sync.rs
#	crates/trusted-server-core/src/ec/pull_sync_marker.rs
#	crates/trusted-server-core/src/publisher.rs
#	docs/guide/api-reference.md
#	docs/guide/configuration.md
#	docs/guide/edge-cookies.md
#	docs/guide/fastly.md
#	docs/superpowers/plans/2026-07-13-issue-880-no-op-pull-sync-kv-reads.md
#	docs/superpowers/plans/2026-07-13-issue-881-idempotent-withdrawal-tombstones.md
The two upstream commits since 7162b7e2 only reorganize the EdgeZero CI
test workflows. No crate source changed, so this is a lockfile-only
update.
Upstream replaces the Compute-unsupported version diff snapshot with
per-collection reads and drops the parent service ID comparison from the
staged-source guard and staging rollback. No public API used by Trusted
Server changed, so this is a lockfile-only update.
The only upstream change since fd45db1f corrects the Google Pub/Sub
logging snapshot path to the Fastly API's `logging/pubsub` and adds
`logentries` to the swept endpoint kinds. No public API used by Trusted
Server changed, so this is a lockfile-only update.
The only upstream change since 6258b6b2 switches the Fastly deploy to the
current `service resource-link` and `service version` command spellings,
removing the CLI deprecation notices. No public API used by Trusted
Server changed, so this is a lockfile-only update.
# Conflicts:
#	crates/trusted-server-adapter-fastly/src/app.rs
#	crates/trusted-server-adapter-fastly/src/main.rs
#	crates/trusted-server-integration-tests/fixtures/configs/viceroy-template.toml
#	fastly.toml
The only crate change since bb4e0040 canonicalizes the Fastly
configuration snapshot by sorting object keys before ordering rows, so
the drift check no longer fails on Fastly's random JSON key order. No
public API used by Trusted Server changed, so this is a lockfile-only
update.
The only upstream commit since cf9a96a0 adds a Cargo target cache to
EdgeZero's CI. No crate source changed, so this is a lockfile-only
update.
The build script asked Cargo to rerun on every file under lib/, including
node_modules, which emitted 33,932 rerun-if-changed directives in a 2.8 MB
output that Cargo re-checked on every build and invalidated the crate
after any npm install. Watch the TypeScript sources, package manifests,
and bundler configuration explicitly instead.

Measured on an Apple Silicon host with a warm cache: a no-op
`cargo check -p trusted-server-js` drops from 1.1s to 0.15s, the script
emits 7 directives, touching a node_modules file no longer reruns it,
and touching lib/src or package-lock.json still does.
The only upstream commit since 119fbf80 fixes a shellcheck finding in
EdgeZero's CI cache action. No crate source changed, so this is a
lockfile-only update.
Resolve conflicts from the squashed #823 and #1150 merges.
return 'Delivery evidence: Not observed';
default:
return unhandledCase(cycle.delivery);
return unhandledCase(cycle.delivery) ?? 'Delivery evidence: Not observed';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants