Skip to content

September release candidate (DO NOT MERGE) - #1112

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

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

Conversation

prk-Jr and others added 30 commits August 18, 2026 18:14
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.
prk-Jr and others added 29 commits September 2, 2026 09:40
A static configuration choice should not emit a warning during every
request-time settings load. Removing the log keeps runtime output focused
without changing validation or creative processing behavior.

Resolves: #1089
# 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
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