Skip to content

September release candidate (DO NOT MERGE) - #1112

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

September release candidate (DO NOT MERGE)#1112
ChristianPavilonis wants to merge 471 commits into
mainfrom
rc/202609

Conversation

prk-Jr and others added 30 commits August 19, 2026 11:41
The known-per-render slot tests embedded a real GAM network id, ad-unit
path, and div-id token. Replace them with the fictional network id already
used elsewhere in the module, a generic placement path, and a synthetic
token.

The `rh-gam-kso` prefix stays: it is the shipped matcher constant under
test, not fixture data. The token keeps the shape the matcher requires
(eight or more leading digits followed by letters), so both the dynamic
and all-digit branches are still exercised.
`Url::origin()` includes the scheme, so an `http://publisher.example/`
entry URL that canonically redirects to `https://publisher.example/` was
refused as a cross-origin root redirect, forcing operators to find and
enter the canonical URL before generation could run.

Reuse the verify path's `origin_changed`, which already permits only the
same-host default-port `http:80` to `https:443` upgrade and still refuses
host changes, port changes, and HTTPS downgrades. The host is the cookie
boundary, so the upgrade leaves the trust boundary intact.
Blocking:
- Refuse an unreadable `[creative_opportunities]` section instead of reading it
  as absent, which let a merge replace the operator's whole slot array.
- Tell one re-rendered element apart from two colliding elements by comparing
  what the ephemeral markers did not cover, so a React SSR/hydration pair no
  longer refuses itself (a fully per-render publisher generated zero slots).
- Refuse volatile div-id families by token shape rather than a hardcoded vendor
  name, covering every placement after the token instead of two.
- Carry the ambiguous-stem verdict site-wide, so a landing page that renders one
  member of a refused group cannot resurrect the prefix.
- Read only ISO 639-1 codes as a locale prefix, so `/tv`, `/ai` and `/us` stay
  section roots.
- Track line endings past comments and single-line strings, so a stray triple
  quote no longer flips a CRLF config to LF.
- Report evidence truncation instead of dropping entries silently, and align the
  Rust cap with the collector's.
- Escape config-derived slot ids in `ts config ad-templates check` output.

Non-blocking:
- Adopt an inferred section policy when the config has none: a `{section}` slot
  without `section_root` cannot load, so there is no policy to preserve.
- Note a followed root redirect; keep credentials, queries, and origins out of
  per-page notes and the cross-origin refusal.
- Report per-page collection failures once and the consent stub once per run.
- Collapse index-document links onto their section.
- Expose the browser flags on `ts audit generate` and its legacy alias.
- Move the dry-run "no changes" sentence to stderr and build the diff lazily.
- Pace the crawl before announcing the page; scope audit cookies by origin.
- Make the consent stub configurable and enumerable so a CMP that installs via
  `defineProperty` is not aborted, and the stub is not a fingerprint.

Docs and debt: correct the strict-mode claim for sizeless out-of-page slots,
document both new refusal classes and the stderr progress contract, drop the real
publisher and vendor identifiers from the spec, order the manifest dependencies,
and document the arms and fields that are unreachable or reserved.
A placement that only exists on section pages — a sidebar, an in-article unit —
witnessed no `section_root` of its own, so inference fell through to a literal
decision and refused the slot outright. On a live crawl that dropped
`ad-atf_sidebar-0` from the config even though its five observed ad-unit paths
differ only in the section segment, and the reported reason ("used several
ad-unit paths and none generalized") pointed at the wrong cause.

`SlotAnalysis::RootUnwitnessed` now carries the varying segment, so such a slot
templates against the config-level `section_root` another slot witnessed. That is
safe because the slot's page patterns are derived from the paths it was seen on,
all of which carry a section segment: `{section}` never falls back to the root
for it. A note names the borrowed `section_root`. When *no* slot witnessed a
root, nothing templates, and the diagnostic now says that the crawl never
included a page without a section segment instead of blaming generalization.

Verified against a live crawl: the sidebar is written with
`/{network_id}/autoblog/{section}`, matches only its five sections, and does not
match the root, while the previously written slots are unchanged.
ChristianPavilonis and others added 30 commits September 2, 2026 14:43
# Conflicts:
#	crates/trusted-server-adapter-fastly/src/app.rs
# Conflicts:
#	crates/trusted-server-adapter-fastly/src/app.rs
#	crates/trusted-server-core/src/config.rs
#	scripts/template-cache-local-test.sh
#	trusted-server.example.toml
# Conflicts:
#	docs/superpowers/plans/2026-08-26-auction-timeline-offsets.md
# Conflicts:
#	crates/trusted-server-cli/src/commands/audit/mod.rs
#	crates/trusted-server-cli/src/commands/config/init.rs
#	crates/trusted-server-core/src/config.rs
#	crates/trusted-server-core/src/integrations/js_asset_proxy.rs
#	crates/trusted-server-core/src/integrations/mod.rs
#	crates/trusted-server-core/src/platform/test_support.rs
#	docs/guide/getting-started.md
#	docs/superpowers/specs/2026-04-01-js-asset-proxy-design.md
#	docs/superpowers/specs/2026-06-22-ts-audit-js-asset-proxy-config-design.md
#	trusted-server.example.toml
Resolve 146 conflict hunks across 38 files. Most were the same work in two
shapes: rc had already merged the impl branches of #1016, #1103 and #1036
before those branches were force-pushed and took further review fixes, which
then reached main as squashes.

Notable resolutions:

- Upgrade edgezero from the pre-merge feature rev 055f7e94 to the released
  tag v0.0.8, which contains that branch as upstream #344 plus a Fastly CLI
  fix. Reword the now-stale "pinned feature branch" comments.
- Take main's reviewed refinements: the precomputed bid dimension index, the
  separate wait-delay queue in the platform test double, trusted_client_ip
  secret resolution, whitespace-only secret key rejection, and the removal of
  the lgtm annotations.
- Keep rc's later work: access telemetry, managed Prebid User ID modules, and
  request timing instrumentation.
- Keep rc's secret-reference documentation, which stays consistent with the
  surrounding text, and its example.com placeholders.

Fix three semantic conflicts that produced no markers: implement the new
EcKvStore::key_exists on rc's TimedKvStore wrapper, ungate the HashSet import
now used outside tests, and drop duplicate test-scope definitions that only
the target-matched clippy runs surface.
…2609

# Conflicts:
#	crates/trusted-server-core/src/publisher.rs
#	crates/trusted-server-js/lib/src/integrations/prebid/index.ts
#	crates/trusted-server-js/lib/test/integrations/prebid/index.test.ts
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