Skip to content

October release candidate (DO NOT MERGE) - #1228

Draft
ChristianPavilonis wants to merge 403 commits into
mainfrom
rc/202610
Draft

ChristianPavilonis wants to merge 403 commits into
mainfrom
rc/202610

Conversation

@ChristianPavilonis

@ChristianPavilonis ChristianPavilonis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

October release candidate, replacing September RC #1112.

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

Contents

The RC head 97bcfa11 contains main through a0b00c72 (#1175), every open PR in milestone 202610 except #1323 at the revision listed below, and the September revisions of the #1074 stack.

Open milestone PRs

PR Review Included revision Status in RC
#1107 changes requested b4a20f49 included; first RC revision with the trace implementation
#1183 approved e03a5a03 included
#1222 changes requested 22ef7ca0 included; host validation adapted to #1251's trusted origin sources
#1225 changes requested c3a33e67 included
#1238 changes requested d824a42d included
#1251 approved 3993b725 included; stacked on #1107
#1252 changes requested 7c5eca0d included; its shared rewrite_clicks code is superseded by #1253's
#1253 changes requested e210f623 included; carries its own copy of #1252's rewrite_clicks commits
#1254 changes requested 7fecdbdd included; restores test-cli's cache read-only through #1259's setup-rust
#1257 changes requested 77bd197b included
#1259 changes requested 8a2f2b48 included
#1260 draft 77dc8c74 included
#1291 changes requested 1cf83d98 included
#1300 changes requested a90f2f80 included; replaces #1052
#1326 approved 65198038 included
#1385 draft d29da660 included
#1387 review required 90662315 included

#1252 and #1253 target the spec/1234-creative-click-rewrite-switch and spec/1231-creative-asset-host-allowlist branches, so their design specs and plans are included too.

Merged milestone PRs

#1137, #1166, #1173, #1175, #1176, #1177, #1179, #1180, #1181, #1182, #1209, #1210, #1213, #1214, #1220, #1221, #1223, #1226, #1227, #1239 and #1256 are in main and reach the RC through the main merge. Earlier RC merges of #1137 and #1173 through #1182 are superseded by their final main versions.

Closed PRs still carried

PR Included revision Note
#1074 a1523675 closed, superseded by #1261
#1076 58f8a354 closed, superseded by #1261; included through #1121
#1121 f951955f closed, superseded by #1261; September revision
#1154 0fa7dfb6 closed, superseded by #1261

#1052 was closed in favor of #1300. Its RC merge was reverted before #1300 was merged, so none of its superseded code remains.

#1323 is not included. It points the EdgeZero dependencies at github.com/IABTechLab/edgezero, which does not exist yet, and its description says not to merge it before the repository moves. Merging it would break every RC build.

#1261 has no milestone and is not in this RC. Swapping the carried stack for #1261 would require rebuilding the branch. #1217 was closed in favor of #1225 and was never included.

Each included revision was verified as an ancestor of the RC head.

EdgeZero pin

The RC pins EdgeZero to 78439fd4 on the unreleased spec/pre-dispatch-request-fidelity branch. It is the only revision that has both the v0.0.9 store bindings #1175 needs and the pre-dispatch ingress hooks #1107 and #1251 need (they pin 965d482f, which predates v0.0.9). A released tag carrying both is a release gate.

RC-only integration changes

These adapt PRs to each other and exist only in this branch:

Verification

At 97bcfa11 on macOS: cargo fmt, all eight clippy gates plus the build-digest clippy, test-fastly, test-fastly-reuse, test-axum, test-cloudflare, test-spin, parity, the CLI suite and the native build-digest test (5,132 Rust tests, 0 failures), the wasm clock lint, the CI Node-pin check, 1,816 vitest tests, ESLint, and JS, docs and Markdown formatting. The full Next.js (49) and WordPress (28) browser suites and the Axum trace browser workflow also pass locally.

ts dev lint domains --changed-vs origin/main, which #1254's lint-domains job runs on this PR, fails on 54 lines in 16 files. Every line comes from an included PR, not from an RC integration change: #1238 (19), #1253 (12), #1252 (10), #1107 and #1251 (8) and the carried timing stack (5). #1222's latest revision cleared its 3. Each PR has to clear its own lines before it lands on main after #1254.

ChristianPavilonis and others added 30 commits September 30, 2026 17:27
Remove an existing x-ts-version when the compiled-in version is unknown or invalid, so a proxied origin header is never reported as the deployed version.

Ignore git metadata unless the repository top level is the workspace root, and watch the nearest existing ancestor of a packed current-branch ref so the next commit re-runs the build script.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Record the design and implementation plan for issue #1105.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Add a Documentation proposal workflow that runs GitHub Copilot CLI on each code merge to main, proposes edits to docs/guide or docs/index.md, and opens one pull request per merge on docs/auto/<sha12>. The publish job runs the docs gates first, skips empty diffs, and never reopens a closed proposal. It also posts a review comment on every hunk that cites the merged source and offers a suggestion reverting the hunk.

Closes #1105.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Keep regex literals after statement blocks inert without hiding Flight calls after object, function, or class expressions. Bound brace and pending-class context alongside existing lexical nesting limits.

Add fragment-boundary and identity/gzip regressions for origin/GTM rewrites and decoded Flight T lengths. Both reported brace/slash regressions were reproduced before the fix.
Preserve main’s resolved credentials, consent-store removal, route-specific EID persistence, and lazy pull-sync while adding request timings. Adapt timing wrappers to the current KV traits and carry September’s config-push expectation for the pinned EdgeZero revision.
Carry f951955, the revision included in September. The newer shared-timing migration pins a diverged EdgeZero revision missing PR #1175 store-selector changes.
Comment thread crates/trusted-server-core/src/settings.rs Fixed
prk-Jr and others added 4 commits October 13, 2026 09:51
Keep browser cookie writers, readers and EID diagnostics alongside body
ingestion; defer their retirement to a separate PR. Preserve consent,
metadata and pending authenticated capture protections.

Allow valid authenticated handoff IDs over known-expired stored records
for auctions without replacing stored state or enabling replay writes.

Verified native and adapter tests, all target Clippy gates, JS tests and
build, and formatting checks.
Co-authored-by: prk-Jr <49094961+prk-Jr@users.noreply.github.com>
aram356 and others added 24 commits October 13, 2026 22:47
The core build script exports TRUSTED_SERVER__GIT_VERSION with
cargo:rustc-env, and Cargo also sets it on every cargo test run of the
crate. The test-only from_toml_and_env loader reads every TRUSTED_SERVER__
variable as a settings override, so the variable is deserialized as an
unknown git_version field and settings loading fails. Native
`cargo test -p trusted-server-core --lib` fails 11 env override tests.

CI runs core unit tests only on wasm32-wasip1 under Viceroy, which does not
pass the host environment to the guest, so it never sees the variable.
Setting it explicitly in the test reproduces the failure on both targets.
from_toml_and_env now reads overrides from a copy of the environment
without TRUSTED_SERVER__GIT_VERSION. That name is a build input that
shares the settings prefix, and Cargo exports it to every cargo test run
of the crate through cargo:rustc-env. Runtime loading is unaffected: the
EdgeZero overlay only overrides keys that already exist in the config.
Trusted Server spans four runtime adapters, consent, identity, auctions,
HTML rewriting, and browser bundles, so design problems are cheaper to
catch in a spec than in code review. Feature pull requests now need a
spec written with the superpowers brainstorming skill and reviewed with
an AI coding agent over at least two rounds.

Add the requirement to CONTRIBUTING.md, a banner to README.md, and a
Spec field and checklist item to the pull request template.
CONTRIBUTING.md pointed to a reviewed real-host exception in CLAUDE.md
that does not exist; AGENTS.md banned real domains outright while the
lint-domains allowlist and allow-domain suppressions are the actual
mechanism. Document that exception in both places.

The pull request template asked for tracing macros, but AGENTS.md and
the runtime crates use log. It also required an issue for every pull
request while CONTRIBUTING.md asked for one only before substantial
changes; both now require an issue for features and substantial
changes. CONTRIBUTING.md now links AGENTS.md by its canonical name.
Review found that the relay recorded nothing in a real browser. Four
independent gaps each dropped the reason, and the new bridge test passed only
because it used keys and a sender that production never produces.

The relay was posted from the wrong realm. Universal Creative runs the
renderer source inside a hidden frame it creates in the creative document, so
a postMessage call made from that source carries the hidden frame as
event.source whatever window it targets: the source is the realm of the
running function, not the window the method is called on. The top-window
listener authenticates a sender by matching it against iframes in the
publisher document, which the hidden frame is not, so every relay was
dropped. Reports now go through Universal Creative's own sendMessage helper,
which is a creative-realm function, so a report arrives as the creative
iframe the listener already recognizes. Verified in headless Chromium against
a page mirroring Universal Creative's structure: the previous call reports the
hidden renderer frame and matches no slot iframe, the helper reports the
creative iframe and matches.

The Prebid path recorded under the publisher's ad unit code, which is a div
id, while the store keys associations by the configured Trusted Server slot
id. Whenever they differ the lookup missed, the failure was dropped, and a
creative_request_without_slot attribution issue was recorded in its place, so
a render failure surfaced as a misleading attribution problem. The relay now
resolves the slot id through divToSlotId.

Server-side APS winners are served the same renderer and emit the same relay,
but are tracked per slot rather than through the Prebid tombstone, so their
relays were dropped. They are now resolved too, requiring the sender to sit in
the slot that consumed the ad ID because hb_adid is not unique per slot.

nonce_mismatch could never be recorded: the report echoed the mismatching
nonce, which no parent accepts. It now echoes the nonce the frame expects,
which only the parent receives, and the parent is the window that set it.

Accepting any nonce-less failure let code running inside the renderer frame
tear the frame down without knowing the nonce. bad_hash is the only report a
frame sends before it has learned one, so nonce-less acceptance is narrowed to
that reason in both parents.

A tombstone could also expire before the frame's timeout fired, dropping the
reason for a capability consumed late in its TTL. Tombstones now live at least
as long as that timeout, which also keeps the ad ID blocked longer.

The browser spec now asserts the reasons the renderer document actually emits,
including the echoed nonce. That is the only coverage that executes the
document rather than matching substrings in its Rust source, and it is where
the nonce_mismatch bug would have been caught.

The direct render path logs the reason instead of reporting every cause as a
load failure. Operator docs describe the ten categories and where each is
observed.
Brings in the squash-merged #1175 (a0b00c7), #1239 (d2f0d8c) and
#1226 (3e85161), replacing the RC's earlier branch revisions.

Conflict resolutions:
- EdgeZero stays pinned to 78439fd4. Main pins v0.0.9, which 78439fd4
  contains; #1107 and #1251 still need its pre-dispatch hooks, and no
  released tag carries them yet. The lockfile needed no changes.
- Fastly main.rs keeps #1107's ingress-capturing signatures, which
  already carry #1175's logical store selection.
- proxy.rs takes #1239's final redirect-limit passthrough test.
- AGENTS.md keeps the RC's gate list, which already includes main's
  wasm clock lint.
- getting-started takes main's final #1175/#1213 deploy wording.
- Integration-test config.rs and cloudflare.rs keep the RC's
  trace-aware envelope and readiness-probe helpers, which carry
  #1226's spawn_with_config_json.
# Conflicts:
#	.github/workflows/test.yml
Brings #1260 to 77dc8c7, which restores browser EIDs and the expired
capture fallback.

Conflict resolutions:
- formats.rs keeps #1260's restored x-ts-eids response header and then
  applies #1107's trace cache privacy last.
- publisher.rs keeps both the chrono and cookie imports.
- The Prebid shim guard stays at 55.5 KB; the shim measures 54,603
  characters with diagnostics, trace and the EID cookie writer.

This branch has not been deployed

No deployments
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.

6 participants