Skip to content

October release candidate (DO NOT MERGE) - #1228

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

ChristianPavilonis wants to merge 375 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 e034e5de contains main through 9cf30558 (#1213), every open PR in milestone 202610 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
#1175 changes requested 3add18d8 included; carries the EdgeZero v0.0.9 store-link changes
#1183 approved 9db1d720 included
#1222 changes requested 514a617a included; host validation adapted to #1251's trusted origin sources
#1225 changes requested c3a33e67 included
#1226 approved 5d423a23 included
#1238 changes requested d824a42d included
#1239 changes requested 5c5e92f8 included
#1251 changes requested 3993b725 included; stacked on #1107
#1252 none 7c5eca0d included; its shared rewrite_clicks code is superseded by #1253's
#1253 none e210f623 included; carries its own copy of #1252's rewrite_clicks commits
#1254 approved ab4c378c included
#1257 changes requested 9f139a0a included
#1259 changes requested b445b7b8 included
#1260 draft 16b6d09a included
#1291 review required 1cf83d98 included
#1300 review required a102c121 included; replaces #1052

#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, #1176, #1177, #1179, #1180, #1181, #1182, #1209, #1210, #1213, #1214, #1220, #1221, #1223, #1227 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.

#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 e034e5de 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,118 Rust tests, 0 failures), plus 72 vitest files (1,813 tests), ESLint, JS, docs and Markdown formatting, the docs build, the wasm clock lint, the CI Node-pin check and the documentation proposal script tests. 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 57 lines in 18 files. Every line comes from an included PR, not from an RC integration change: #1238 (19), #1253 (12), #1252 (10), #1107 and #1251 (8), #1222 (3) and the carried timing stack (5). Each PR has to clear its own lines before it lands on main after #1254.

aram356 and others added 30 commits September 23, 2026 23:15
Cover zero height separately from missing dimensions, accept u32::MAX exactly, skip negative dimensions, rename the shared oversized dimension variable, and document why the raw upstream value is logged with Debug formatting.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Add a fallible try_parse_args test helper and check error.kind() against DisplayHelpOnMissingArgumentOrSubcommand instead of matching a should_panic substring from clap's private ErrorInner Debug output.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
An invocation with flags but no usable rewrite rule (for example ts dev proxy --insecure) previously ran the Safari system-proxy restore, and could attempt sudo, before failing on the missing rule. Resolve the config first so it fails without touching system proxy state; a proxy stranded by a hard-killed run is still restored on the next valid run.

Add a regression test using a malformed restore file, which the restore path deletes without running networksetup, and soften the guide so it no longer promises the concise one-line error output.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
…rsion on Fastly

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Reuse parse_optional_bid_dimension so integral float dimensions are accepted like in the other auction providers, and pin that behavior with a test.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Build the requested-dimension index from the auction request and run mediated bids through resolve_bid_dimensions, so the mock provider rejects unrequested impressions and mismatched sizes and infers missing dimensions like the other auction providers.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Check every tracked Markdown file outside docs/ with Prettier, and reformat the two files that failed. In pr-reviewer.md, escape BRANCH-* so Prettier does not read it as emphasis, and keep long code spans on one line so they are not split across list-item wraps.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Let the partner test helper take an api_token, and assert that one partner with placeholder api_token and ts_pull_token values reports both fields in a single error.

Signed-off-by: dhruv8sh <dhruv8sh@proton.me>
Apply matching script stages in sequence and emit each fragment once.
Keep GTM buffering response-local and bounded, and rewrite captured
Flight payloads only after reading their original record boundaries.
Preserve unsafe originals and recompute decoded record lengths.

Cover Pages and App Router data, bootstrap controls, escaped queries,
source-order fallback, and complete identity/gzip adapter responses.

Refs #1206, #1207, #1208
Brings #1107 to b4a20f4, its first revision in this RC that carries
the trace implementation rather than only the spec.

Integration decisions:
- EdgeZero moves to 78439fd4 on spec/pre-dispatch-request-fidelity. It
  contains v0.0.9 (#1175) and the pre-dispatch ingress hooks #1107 and
  #1251 pin at 965d482f; no released tag carries both.
- scheduleInitialAdInit takes (bids, slots, auctionDiagnostics,
  traceAuctionTransport). One builder emits both payloads, so the RC's
  diagnostics-only scripts are unchanged and trace moves to the fourth
  argument. recordTrustedServerOpportunity likewise takes auctionFacts
  then traceIdentity; #1107's positional tests and the bootstrap
  fallback were shifted to match.
- The Fastly trace terminal path sends through the timed delivery
  function without Server-Timing, sandbox counters or access telemetry.
- build.rs embeds trace assets from #1214's private bundle directory.
  The viewer rebuilds byte-identical; the pinned source digest changes
  only because build-all.mjs gained --out-dir.
- The trace projection does not copy the RC's auction evidence fields,
  so the classification test marks them excluded.
- The retained diagnostics toolbar resyncs its filter select after
  selectRequest.
- Shim size guard raised to 55.5 KB for diagnostics plus trace.
Conflict resolutions:
- Fastly imports keep the RC's timing, telemetry and trace imports
  alongside the version-header imports.
- CHANGELOG keeps both sides' entries.
- getting-started keeps #1175's managed ts deploy command. ts deploy
  consumes a prebuilt release, so TRUSTED_SERVER__GIT_VERSION is
  documented as a build input for the release package rather than a
  prefix on the deploy command.
The RC's GPT diagnostics stack adds auctionType, auctionWinner,
prebidAuction, serverAuctionTimings and serverAuctionTimingOrigin to
each request cycle. The trace projection rejects unknown cycle keys, so
any cycle with auction evidence failed report capture and the overlay's
trace handoff never navigated. Accept these members and drop them, as
the projection already does for adManager.

The viewer bundle is unchanged; only the pinned trace source digest
moves with the projection source.
EdgeZero marks each request from its own listener so it can record the
request's inbound origin, and #1107's trace actions require that origin.
The marker is crate-private, so the RC's custom timing server produced
no origin and every trace action returned 403. Restore main's entry
point. The Axum dev server loses the request-timing Server-Timing
header until EdgeZero offers a seam to wrap its service.
#1052 was closed in favor of #1300, which reimplements the APS render failure reasons against current main. Removing #1052's merge first keeps none of its superseded code beside #1300.
#1300 replaces #1052, reverted from this RC in the previous commit.

Integration decisions:
- gpt_diagnostics/store.ts keeps the trace imports beside #1300's
  creative failure list import.
- #1300 adds eight aps_* creative failure reasons that #1107's trace
  projection does not accept, so any cycle carrying one failed trace
  capture. The projection now validates against the full diagnostics
  list and drops the APS reasons; unknown values are still rejected.
  The viewer bundle is unchanged; the pinned trace source digest moves.
ESLint's import/order rule requires a blank line between the core types
import and the local trace imports. The pinned trace source digest moves
with the file; the viewer bundle is unchanged.
Brings in the squash-merged #1213 (9cf3055), replacing the RC's
earlier #1213 branch revision.

Conflict resolutions:
- #1213's own code (middleware Fastly version header, core build.rs,
  design spec) takes main's final form.
- CHANGELOG keeps #1107's entries beside main's.
- Fastly main.rs keeps the RC's timing, telemetry and trace imports.
- getting-started keeps #1175's managed ts deploy command and the
  build-input wording for TRUSTED_SERVER__GIT_VERSION.
Brings #1222 at 514a617.

Integration decisions:
- RequestInfo::from_request keeps #1251's source order (authenticated
  forwarder, immutable ingress, runtime origin, Host) and applies
  #1222's host syntax check to whichever host is selected. It returns
  BadRequest for a malformed or non-text selected host. Raw Forwarded
  and X-Forwarded-Host are never selected in the RC, so #1222's tests
  for those headers now assert they are ignored instead of rejected.
- RC-only callers (DataDome protection, Fastly compat, Spin, forwarder,
  orchestrator and publisher tests) handle the fallible signature.
  DataDome only reads RequestInfo behind an authenticated origin and
  keeps its request_host fallback.
- The first-party sign path prefers the authenticated forwarder scheme
  (#1251) and propagates #1222's host error.
- The GTM rewriter takes #1222's per-document GtmScriptState, which
  supersedes main's ScriptTextAccumulator use from #1179; state still
  lives in IntegrationDocumentState, and #1179's two-document residue
  tests remain.
Brings #1225 at c3a33e6.

Integration decisions:
- .gitignore, AGENTS.md and scripts/README.md keep both sides: #1254's
  lint-domains gate stays CI gate 10 and #1225's documentation proposal
  scripts become gate 11; the scripts table keeps #1257's
  check-ci-node-pin.py row beside #1225's docs-proposal rows.
- The lint-domains job from #1254 now uses #1259's setup-rust action and
  pins Node before cargo, so #1257's check-ci-node-pin gate passes. The
  two PRs merged cleanly but the combination failed that gate.
Brings #1226 at 5d423a2.

Integration decisions:
- AGENTS.md lists #1226's wasm clock lint as CI gate 12, after #1254's
  lint-domains (10) and #1225's documentation proposal scripts (11).
- The integration fixture builder keeps #1226's table-customizing
  app_config_envelope and gains #1107's trace flag as a parameter;
  integration_app_config_envelope_with_trace and #1226's auction
  fixture both build on it.
- The Cloudflare environment keeps #1226's spawn_with_config_json and
  shared wrangler launcher, and threads #1107's readiness probe through
  it, so spawn_with_readiness and the default spawn path still use their
  own readiness checks.
- scripts/lint-wasm-clock.sh passes across the RC's Cloudflare build.
Brings #1238 at d824a42.

Integration decisions:
- CHANGELOG.md, lib.rs and publisher.rs imports keep both sides: the
  RC's request_timing module and #1238's response_header_rewrite module
  sit side by side.
- The header rewrite runs where #1238 placed it, after the RC's trace
  extension and unexpected-304 handling and before the template-cache
  gate.
Brings #1252 at 7c5eca0, including the design spec and plan from its
spec/1234-creative-click-rewrite-switch base.

Integration decisions:
- Settings normalization runs #1252's rewrite.normalize() and keeps
  main's fallible image_optimizer.normalize()? from #1221.
- CHANGELOG.md keeps the RC's entries and replaces the older
  rewrite_creatives entry with #1252's version, which defers click
  wrapping to rewrite_clicks.
Brings #1253 at e210f62, including the design spec and plan from its
spec/1231-creative-asset-host-allowlist base.

#1253 carries its own copy of #1252's rewrite_clicks commits plus the
include_domains allowlist, so its conflicts with #1252 are two versions
of the same change.

Integration decisions:
- proxy.rs, creative.rs and settings.rs take a clean three-way merge of
  #1253 against the RC before #1252. #1253's versions of the shared
  rewrite_clicks code supersede #1252's, and they also carry #1252's
  suffix-spoofing test case and doc-link fix. Every other file #1253
  touches matches that re-merge exactly, so nothing is duplicated.
- Settings normalization keeps main's fallible image_optimizer
  normalize()? beside rewrite.normalize().
- CHANGELOG.md keeps the RC's entries and takes #1253's exclude_domains,
  include_domains, rewrite_clicks and rewrite_creatives entries.
Brings #1260 at 16b6d09 (draft).

Integration decisions:
- Fastly delivery uses #1260's send_identity_response, extended with
  the RC's SendContext and post-send steps: identity effects apply after
  send, pull sync runs only when capture storage is available, and
  access telemetry always reports the delivered response.
- require_identity_graph stays untimed; its doc now names identity
  capture as a second post-send caller.
- The /auction response keeps #1107's trace cache privacy and drops the
  x-ts-eids headers, as #1260 does.
- The integration proxy route reads #1260's integration id from the RC's
  three-field route tuple.
- #1260 removes server-side ts-eids cookie parsing. #1107's trace cookie
  health now checks the ts-eids format with a local validator that
  accepts the same shapes the removed parser did.
- ec_finalize_kv_lands_before_freeze drives its KV round trip with a
  SharedID cookie instead of the removed ts-eids ingestion.
default:
return unhandledCase(cycle.delivery);
return unhandledCase(cycle.delivery) ?? 'Delivery evidence: Not observed';
const items = traceItems(item, maximumBytes);
if (!items || !add('[')) okay = false;
else {
for (let index = 0; index < items.length && okay; index += 1) {
for pattern in &self.exclude_domains {
if let Err(reason) = check_include_domain(pattern) {
log::warn!(
"rewrite.exclude_domains: entry `{pattern}` never matches a URL host ({reason})"

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