Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
518 commits
Select commit Hold shift + click to select a range
acd6596
Address round-5 review findings on the ad-template CLI
prk-Jr Aug 24, 2026
5ab4a88
Merge remote-tracking branch 'origin/main' into feature/ts-cli-ad-tem…
prk-Jr Aug 24, 2026
54640d8
Merge branch 'main' into issue-355-liveramp-integration
prk-Jr Aug 24, 2026
28881e0
Design ad-template scroll and stale-slot diagnostics
prk-Jr Aug 24, 2026
fcf1023
Plan ad-template scroll and stale-slot diagnostics
prk-Jr Aug 24, 2026
71ab3b1
Add scroll option to ad-template generation
prk-Jr Aug 24, 2026
abf490f
Collect lazy ad slots during generation scroll
prk-Jr Aug 24, 2026
7c6692c
Warn about preserved unobserved ad slots
prk-Jr Aug 24, 2026
02f6e59
Document generation scroll and stale-slot warnings
prk-Jr Aug 24, 2026
f8be6ec
Distinguish refused slots from unobserved slots
prk-Jr Aug 24, 2026
1f9d7d1
Handle implicit div ids in stale diagnostics
prk-Jr Aug 24, 2026
3e2c14a
Enforce the TCF consent signal in the generated Prebid bundle
prk-Jr Aug 24, 2026
d38c602
Reject LiveRamp configuration that omits its Prebid User ID module
prk-Jr Aug 24, 2026
f346767
Harden the managed LiveRamp Prebid configuration wrapper
prk-Jr Aug 24, 2026
f5c68a6
Drop a duplicated auction EID test and widen the consent gating test
prk-Jr Aug 24, 2026
47e774d
Build the injected LiveRamp payload through a From implementation
prk-Jr Aug 24, 2026
e6cc341
Document LiveRamp consent enforcement, network use, and storage
prk-Jr Aug 24, 2026
f4f9a6e
Design creative opportunity div id reconciliation
prk-Jr Aug 24, 2026
8f18102
Add host-target clippy aliases for the CLI and OpenRTB codegen
prk-Jr Aug 24, 2026
11b0130
Plan creative opportunity div id reconciliation
prk-Jr Aug 24, 2026
f819359
Preserve observed literal ad slot siblings
prk-Jr Aug 24, 2026
f0d96bf
Reject shorter high-entropy ad slot tokens
prk-Jr Aug 24, 2026
b73b4d9
Group browser page collection settings
prk-Jr Aug 24, 2026
69e749c
Clarify observed slot reconciliation
prk-Jr Aug 24, 2026
fb4b9db
Match the LiveRamp envelope host exactly in the consent enforcement test
prk-Jr Aug 24, 2026
6f38ba3
Clarify LiveRamp config and consent corrections
prk-Jr Aug 24, 2026
fe9c1ee
Plan LiveRamp review corrections
prk-Jr Aug 24, 2026
f293f71
Clarify LiveRamp consent and config behavior
prk-Jr Aug 24, 2026
8b70964
Record LiveRamp review completion
prk-Jr Aug 24, 2026
1f9cae2
Record LiveRamp PR refresh
prk-Jr Aug 24, 2026
4c9777d
Fix docs format lint
prk-Jr Aug 24, 2026
2f5cae6
Address review findings on ad-template generate origin and merge scope
prk-Jr Aug 24, 2026
00de4e9
feat: add native secret-store config resolution
ChristianPavilonis Aug 17, 2026
0fdfcbe
Fix platform secret-store startup configuration
ChristianPavilonis Aug 18, 2026
2783e00
Resolve static credentials through typed config
ChristianPavilonis Aug 24, 2026
3dc7370
Update EdgeZero static-secret support revision
ChristianPavilonis Aug 24, 2026
0db2e11
Align EdgeZero deployment mapping revision
ChristianPavilonis Aug 24, 2026
cf16418
Add request phase timing design spec and implementation plan (#1069)
jevansnyc Aug 25, 2026
052eada
Add RequestTimings phase collection and Server-Timing rendering
jevansnyc Aug 25, 2026
7505fb8
Add observability settings and decouple tinybird access and auction e…
jevansnyc Aug 25, 2026
4ce413f
Add test coverage for the access_enabled without tinybird.enabled rej…
jevansnyc Aug 25, 2026
f83092a
Emit Server-Timing at the send freeze point on conclusively private r…
jevansnyc Aug 25, 2026
4b19c44
Record filter and geo spans and dedupe the per-request geo lookup
jevansnyc Aug 25, 2026
ce295f1
Record origin, template cache, and KV phase spans in core
jevansnyc Aug 25, 2026
edc80f3
Allow template caching behind edge auth
prk-Jr Aug 25, 2026
c222ae2
Capture stream duration, auction wait placement, and response bytes
jevansnyc Aug 25, 2026
3e2b3d2
Fix secret reference validation and guidance
ChristianPavilonis Aug 25, 2026
2f89a22
Replace typed LiveRamp config with vendor-neutral managed User ID mod…
prk-Jr Aug 25, 2026
8b028bb
Add access telemetry snapshot, route classes, and coarse route templates
jevansnyc Aug 25, 2026
48acd81
Emit confirmed access telemetry rows after pull-sync post-send
jevansnyc Aug 25, 2026
72d5755
Extend access_logs_raw with phase columns and a non-null sorting key
jevansnyc Aug 25, 2026
c50be03
Widen time_elapsed_ms to nullable so dropped snapshots cannot quarant…
jevansnyc Aug 25, 2026
2b4752a
Document config-first auction provider architecture
ChristianPavilonis Aug 11, 2026
ed9210f
Clarify config-first auction provider plan
ChristianPavilonis Aug 11, 2026
943b4ed
Add config-first auction providers
ChristianPavilonis Aug 13, 2026
0a91bd3
Fix generic OpenRTB bidder handling
ChristianPavilonis Aug 14, 2026
ba2eea6
Fix post-rebase compatibility
ChristianPavilonis Aug 25, 2026
0aead79
Emit Server-Timing from the Axum terminal layer with adapter-specific…
jevansnyc Aug 25, 2026
e9cf5b9
Document the observability and access telemetry configuration surface
jevansnyc Aug 25, 2026
7942c74
Normalize telemetry method, guard zero sample rate, and mirror geo wr…
jevansnyc Aug 26, 2026
d8fcb5e
Add a local dev config envelope generator example
jevansnyc Aug 26, 2026
7cf7d86
Add JSONPaths and expression sorting key to the access datasource
jevansnyc Aug 26, 2026
9bf200a
Merge branch 'main' into esi-edge-terminated-auth-main
prk-Jr Aug 26, 2026
af56a10
Prove identity-graph absence before rotating or dropping an EC
prk-Jr Aug 26, 2026
65180a7
Share endpoint identity-graph snapshots with response finalization
prk-Jr Aug 26, 2026
7b71f83
Merge main and order the template cache ahead of the origin overlap
prk-Jr Aug 26, 2026
600746f
Use web_time Instant on request timing paths
jevansnyc Aug 26, 2026
3d7e697
Reject opaque identifier segments in publisher route templates
jevansnyc Aug 26, 2026
38043d7
Address access telemetry review feedback
jevansnyc Aug 26, 2026
35e1897
Address config-first provider review feedback
ChristianPavilonis Aug 26, 2026
b47ced8
Address secret configuration review findings
ChristianPavilonis Aug 26, 2026
58730d7
Make Edge Cookie partner API tokens optional
ChristianPavilonis Aug 26, 2026
274241b
Add auction timeline offsets spec amendment
jevansnyc Aug 26, 2026
29d45e8
Add auction timeline offsets implementation plan
jevansnyc Aug 26, 2026
46911a6
Record T0-anchored auction timeline offsets in the access row
jevansnyc Aug 26, 2026
1fa9f8c
Remove generated integration wrangler config from tracking
jevansnyc Aug 26, 2026
67af9f7
Arbitrate GPT first impressions and resize PUC shells
ChristianPavilonis Aug 26, 2026
1b17ce0
Merge branch 'main' into edgezero-secrets
aram356 Aug 27, 2026
ad011a6
Harden PR 1079 first-impression arbitration (#1083)
prk-Jr Aug 27, 2026
b2fda1f
Merge branch 'main' into issue-355-liveramp-integration
aram356 Aug 27, 2026
fce2233
Merge origin/main into feature/ts-cli-ad-templates
prk-Jr Aug 27, 2026
1e737a8
Normalize Prebid Server provider endpoints
ChristianPavilonis Aug 27, 2026
c00c1fe
Merge ad-template scroll and staleness fixes
prk-Jr Aug 27, 2026
fec84ad
Fix Linux CLI scroll diagnostics build
prk-Jr Aug 27, 2026
e538c8e
Address first-impression arbitration review feedback
ChristianPavilonis Aug 27, 2026
76f6f13
Address remaining secret configuration review feedback
ChristianPavilonis Aug 28, 2026
44e9eaf
feat: add native secret-store config resolution
ChristianPavilonis Aug 17, 2026
3f6e29d
Fix platform secret-store startup configuration
ChristianPavilonis Aug 18, 2026
d71c660
Resolve static credentials through typed config
ChristianPavilonis Aug 24, 2026
6c35ce9
Update EdgeZero static-secret support revision
ChristianPavilonis Aug 24, 2026
43c7577
Align EdgeZero deployment mapping revision
ChristianPavilonis Aug 24, 2026
edfbcb0
Fix secret reference validation and guidance
ChristianPavilonis Aug 25, 2026
22176da
Address secret configuration review findings
ChristianPavilonis Aug 26, 2026
3b2c64c
Make Edge Cookie partner API tokens optional
ChristianPavilonis Aug 26, 2026
c7c382a
Address remaining secret configuration review feedback
ChristianPavilonis Aug 28, 2026
2e7d817
Merge branch 'main' of github.com-prkjr:IABTechLab/trusted-server int…
prk-Jr Aug 28, 2026
4ed78c8
Design managed User ID bundle validation
prk-Jr Aug 28, 2026
d137b0d
Refine managed User ID validation design
prk-Jr Aug 28, 2026
a8db40b
Cover multiple managed User ID entries
prk-Jr Aug 28, 2026
890028f
Plan managed User ID bundle validation
prk-Jr Aug 28, 2026
23a7bb5
Parse managed User ID bundle inputs
prk-Jr Aug 28, 2026
e49001d
Resolve managed User IDs through the bundle registry
prk-Jr Aug 28, 2026
8ba401f
Reject incomplete managed User ID bundles
prk-Jr Aug 28, 2026
22dc5cf
Document managed User ID bundle validation
prk-Jr Aug 28, 2026
b723d56
Align managed User ID examples with registry
prk-Jr Aug 28, 2026
dc98f67
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Aug 28, 2026
002cbf2
Arbitrate GPT first impressions and resize PUC shells
ChristianPavilonis Aug 26, 2026
efcd124
Harden PR 1079 first-impression arbitration (#1083)
prk-Jr Aug 27, 2026
2a79e6a
Address first-impression arbitration review feedback
ChristianPavilonis Aug 27, 2026
fccfcd4
fix(cli): resolve ad-template generation review gaps
prk-Jr Aug 28, 2026
b1954b2
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Aug 28, 2026
ab291a7
Revalidate a stale EC miss and report failed withdrawals
prk-Jr Aug 28, 2026
6d493fb
Merge main and adopt the marked-Authorization cache gate
prk-Jr Aug 28, 2026
fab4adf
Merge remote-tracking branch 'origin/main' into simplify-js-asset-pro…
ChristianPavilonis Aug 28, 2026
55521cd
Harden JavaScript asset proxy response MIME type
ChristianPavilonis Aug 28, 2026
5a1f0c2
Merge branch 'main' into simplify-js-asset-proxy-spec
ChristianPavilonis Aug 28, 2026
2ef7635
Reject single-segment publisher paths in route templates
jevansnyc Aug 28, 2026
082461d
Sample access rows with real randomness at the snapshot rate
jevansnyc Aug 28, 2026
f3ee473
Drop the origin span before error-path auction telemetry
jevansnyc Aug 28, 2026
46b3c7f
Address remaining review feedback on timing surfaces and docs
jevansnyc Aug 28, 2026
37006d7
Merge branch 'main' into feature/ts-cli-ad-templates
aram356 Aug 28, 2026
c484d71
Resolve ad-template generation review findings
prk-Jr Aug 29, 2026
03743c1
Wait for stable GPT slot discovery
prk-Jr Aug 29, 2026
7754e8e
docs: design managed user ID consent activation
prk-Jr Aug 31, 2026
3ebc41a
docs: define managed consent precedence
prk-Jr Aug 31, 2026
ead0dd4
Plan managed User ID consent activation
prk-Jr Aug 31, 2026
07d62c3
Test managed User ID consent activation
prk-Jr Aug 31, 2026
f80dc8d
Activate TCF for managed User IDs
prk-Jr Aug 31, 2026
609e54e
Prove managed-only TCF enforcement
prk-Jr Aug 31, 2026
6b4c497
Align LiveRamp consent and validation status
prk-Jr Aug 31, 2026
a15a31a
Harden managed consent ownership transfer
prk-Jr Aug 31, 2026
72d4ebf
Format consent enforcement test
prk-Jr Aug 31, 2026
4626e99
Guard managed User ID config reads
prk-Jr Aug 31, 2026
c940282
Merge branch 'main' into issue-355-liveramp-integration
prk-Jr Aug 31, 2026
55f0a23
Merge commit 'refs/pull/1036/head' of github.com:IABTechLab/trusted-s…
ChristianPavilonis Aug 31, 2026
5146645
Correct auction migration guidance
ChristianPavilonis Aug 31, 2026
fd59210
Address remaining first-impression review feedback
ChristianPavilonis Aug 31, 2026
87fac8a
Fix browser auction refresh handling
ChristianPavilonis Aug 31, 2026
a0a3af5
Merge remote-tracking branch 'origin/main' into feat/request-phase-ti…
ChristianPavilonis Aug 31, 2026
0306166
Fix provider routing and bid admission
ChristianPavilonis Aug 31, 2026
e45ff8e
Correct proxy secret length guidance
ChristianPavilonis Aug 31, 2026
9831ee4
Correct proxy secret length guidance
ChristianPavilonis Aug 31, 2026
80c1066
Align auction runtime diagnostics
ChristianPavilonis Aug 31, 2026
6cb26df
Pass complete user agent to auction telemetry
ChristianPavilonis Aug 31, 2026
95cb674
Preserve auction failure and mediation identity
ChristianPavilonis Aug 31, 2026
c6235b9
Enforce access telemetry body limit
ChristianPavilonis Aug 31, 2026
d414740
Merge branch 'main' into fix/kv-eid-request-snapshot-ec-ttl
aram356 Sep 1, 2026
017e99f
Merge branch 'main' into fix/gpt-first-impression-aps-shell
aram356 Sep 1, 2026
3c48d39
Merge commit 'refs/pull/1036/head' of github.com:IABTechLab/trusted-s…
ChristianPavilonis Sep 1, 2026
71df1aa
Merge branch 'main' of github.com:IABTechLab/trusted-server into edge…
ChristianPavilonis Sep 1, 2026
8c892e5
Merge remote-tracking branch 'origin/main' into docs/config-first-auc…
ChristianPavilonis Sep 1, 2026
dc34278
Report a reason when an APS creative render fails
jevansnyc Aug 20, 2026
fae9e35
Attribute APS creative delivery in GPT diagnostics
jevansnyc Aug 20, 2026
f783196
Merge PR #1036 into rc/202609
ChristianPavilonis Sep 1, 2026
2ae092c
Merge PR #1016 into rc/202609
ChristianPavilonis Sep 1, 2026
0b222fd
Merge PR #823 into rc/202609
ChristianPavilonis Sep 1, 2026
e90c229
Merge PR #742 into rc/202609
ChristianPavilonis Sep 1, 2026
93c0ffb
Merge PR #885 into rc/202609
ChristianPavilonis Sep 1, 2026
c486f93
Merge PR #1074 into rc/202609
ChristianPavilonis Sep 1, 2026
1fc9a2c
Add auction timeline offsets spec amendment
jevansnyc Aug 26, 2026
4669b72
Add auction timeline offsets implementation plan
jevansnyc Aug 26, 2026
dd36d3a
Record T0-anchored auction timeline offsets in the access row
jevansnyc Aug 26, 2026
c945854
Remove generated integration wrangler config from tracking
jevansnyc Aug 26, 2026
4c4d077
Merge PR #1076 into rc/202609
ChristianPavilonis Sep 1, 2026
da15f2c
Merge PR #1079 into rc/202609
ChristianPavilonis Sep 1, 2026
e095134
Merge PR #1052 into rc/202609
ChristianPavilonis Sep 1, 2026
0669647
Merge PR #1103 into rc/202609
ChristianPavilonis Sep 1, 2026
1ce95ee
Format auction timeline offsets plan
ChristianPavilonis Sep 1, 2026
c255134
Fix RC CI compatibility
ChristianPavilonis Sep 1, 2026
0ede1a1
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Sep 2, 2026
565dd66
Merge origin/main into rc/202609
aram356 Sep 2, 2026
9f3f9c5
Address remaining JavaScript asset proxy review feedback
ChristianPavilonis Sep 2, 2026
b5f91a4
Remove repeated creative rewriting warning
ChristianPavilonis Sep 2, 2026
998f0a4
Merge PR #1117 into rc/202609
ChristianPavilonis Sep 2, 2026
071ece5
Merge branch 'main' into simplify-js-asset-proxy-spec
ChristianPavilonis Sep 2, 2026
5d57373
fix(fastly): scope Viceroy secret mapping
aram356 Sep 3, 2026
a3dd63b
Merge branch 'main' into issue-1089-cli-creative-warning
aram356 Sep 3, 2026
dbf42d2
Merge branch 'main' into auction-telemetry-user-agent
aram356 Sep 3, 2026
d740dcb
Merge updated PR #1036 into rc/202609
aram356 Sep 3, 2026
35cc5de
Merge updated PR #1016 into rc/202609
aram356 Sep 3, 2026
635aca5
Merge updated PR #823 into rc/202609
aram356 Sep 3, 2026
c13a3ad
Merge branch 'main' into fix/kv-eid-request-snapshot-ec-ttl
prk-Jr Sep 3, 2026
1a06f0e
Merge updated PR #742 into rc/202609
aram356 Sep 3, 2026
175e724
Merge updated PR #1076 into rc/202609
aram356 Sep 3, 2026
4fb4020
Merge updated PR #1103 into rc/202609
aram356 Sep 3, 2026
5d50ed2
Merge updated PR #1117 into rc/202609
aram356 Sep 3, 2026
b7b36f1
Merge branch 'main' into issue-355-liveramp-integration
prk-Jr Sep 3, 2026
3b718ca
fix(rc): remove duplicate auction timing tests
aram356 Sep 3, 2026
c0ce947
Merge updated PR #885 into rc/202609
aram356 Sep 3, 2026
e959b49
Merge branch 'main' into fix/gpt-first-impression-aps-shell
aram356 Sep 4, 2026
5f21735
Keep ALL-CAPS placement labels out of the volatile token gate
prk-Jr Sep 4, 2026
ee79a39
Hold the GPT stability wait inside the operator's settle budget
prk-Jr Sep 4, 2026
8f0715c
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Sep 4, 2026
576ef33
Merge remote-tracking branch 'origin/feat/request-phase-timing' into …
ChristianPavilonis Sep 4, 2026
ca46e4f
Format auction timeline implementation plan
ChristianPavilonis Sep 4, 2026
02b77de
Improve GPT auction diagnostics observability
ChristianPavilonis Sep 4, 2026
ffc0438
Fix GPT auction diagnostics timing accuracy
ChristianPavilonis Sep 4, 2026
a07d3e4
Merge PR #1121 into rc/202609
ChristianPavilonis Sep 4, 2026
f44de23
Merge remote-tracking branch 'origin/main' into rc/202609
ChristianPavilonis Sep 4, 2026
36620e1
Merge branch 'main' into fix/gpt-first-impression-aps-shell
aram356 Sep 5, 2026
ad25cc6
Correct audit polling and literal slot routing
prk-Jr Sep 7, 2026
9a00731
Merge main into ad-template audit tooling
prk-Jr Sep 7, 2026
fbacb4c
Enable Tokio test utilities on all native targets
prk-Jr Sep 7, 2026
e61b29b
Merge main into rc/202609 and resolve EC snapshot conflicts
prk-Jr Sep 7, 2026
50df69e
Merge branch 'main' into issue-355-liveramp-integration
prk-Jr Sep 7, 2026
630661b
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Sep 7, 2026
5fffe2f
Merge #1054 in rc/202609
prk-Jr Sep 7, 2026
c18e598
Serve browser audit fixtures for every Chrome connection
prk-Jr Sep 7, 2026
4e70178
Merge branch 'main' into fix/gpt-first-impression-aps-shell
ChristianPavilonis Sep 7, 2026
4d3e02d
Merge branch 'main' into aps-renderer-failure-diagnostics
aram356 Sep 7, 2026
221caea
Merge branch 'main' into rc/202609
prk-Jr Sep 8, 2026
9d69191
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Sep 8, 2026
5cefd43
Fix browser fixtures and share settle budget
prk-Jr Sep 8, 2026
6f133cc
Merge origin/main into feat/request-phase-timing
jevansnyc Sep 8, 2026
bcc1475
Bound route templates by allowlist and harden the telemetry config su…
jevansnyc Sep 8, 2026
a152367
Address round-3 telemetry robustness findings
jevansnyc Sep 8, 2026
237a99f
Merge branch 'main' into fix/gpt-first-impression-aps-shell
aram356 Sep 8, 2026
6b36f92
Merge branch 'main' into aps-renderer-failure-diagnostics
aram356 Sep 8, 2026
c5b038d
Merge branch 'main' into issue-355-liveramp-integration
aram356 Sep 8, 2026
32e99cc
Clarify GPT auction diagnostics evidence
ChristianPavilonis Sep 8, 2026
0d3aa14
Preserve GPT settle budget and report skipped post-scroll waits
prk-Jr Sep 9, 2026
719e566
Merge remote-tracking branch 'origin/main' into feature/ts-cli-ad-tem…
prk-Jr Sep 9, 2026
dfc19e6
Adapt ad-template diagnostics to provider maps and secret references
prk-Jr Sep 9, 2026
6f2ec06
Merge branch 'main' into issue-355-liveramp-integration
prk-Jr Sep 9, 2026
d269ff8
Fail closed on late CMPs and legacy TCF consent for managed User IDs
prk-Jr Sep 9, 2026
bada61d
Merge branch 'main' into rc/202609
prk-Jr Sep 9, 2026
26be91a
Merge remote-tracking branch 'refs/remotes/origin/pr/1154' into rc/20…
ChristianPavilonis Sep 9, 2026
890c2de
Avoid no-op EC pull-sync KV work
ChristianPavilonis Jul 13, 2026
4e9a01e
Address pull-sync marker review feedback
ChristianPavilonis Sep 8, 2026
beee948
Make EC withdrawal tombstones idempotent
ChristianPavilonis Jul 13, 2026
1cc335b
Prevent stale misses from refreshing EC tombstones
ChristianPavilonis Sep 3, 2026
fe13e1d
Group batch sync mappings by EC ID
ChristianPavilonis Jul 13, 2026
aee5bf6
Remove legacy consent KV persistence
ChristianPavilonis Jul 13, 2026
eb0ffdc
Merge branch 'rc/202609' of github.com:IABTechLab/trusted-server into…
ChristianPavilonis Sep 9, 2026
9d0833e
Reduce EID KV write conflicts
ChristianPavilonis Sep 9, 2026
a5aad79
Preserve EID sync state after KV conflicts
ChristianPavilonis Sep 9, 2026
01caf25
Address first-impression review feedback
ChristianPavilonis Sep 9, 2026
129f4d7
Merge branch 'main' into issue-355-liveramp-integration
prk-Jr Sep 10, 2026
cacfb71
Merge branch 'main' into feature/ts-cli-ad-templates
prk-Jr Sep 10, 2026
66da806
Preserve managed IDs and await CMP discovery
prk-Jr Sep 10, 2026
0c390c3
Merge branch 'main' into aps-renderer-failure-diagnostics
aram356 Sep 10, 2026
384d8e0
Merge origin/main into rc/202609
ChristianPavilonis Sep 10, 2026
4123f92
Merge PR #823 into rc/202609
ChristianPavilonis Sep 10, 2026
166ce31
Merge PR #1052 into rc/202609
ChristianPavilonis Sep 10, 2026
9ab611c
Merge PR #1054 into rc/202609
ChristianPavilonis Sep 10, 2026
9218abc
Merge PR #1074 into rc/202609
ChristianPavilonis Sep 10, 2026
10121c8
Merge PR #1079 into rc/202609
ChristianPavilonis Sep 10, 2026
3797f2b
Resolve merge follow-up issues
ChristianPavilonis Sep 10, 2026
2e189f6
Merge PR #1157 into rc/202609
ChristianPavilonis Sep 10, 2026
9b48049
Fix release candidate CI
ChristianPavilonis Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ run_cli_macos = "run --package trusted-server-cli --target aarch64-apple-darwin
test_cli_linux = "test --package trusted-server-cli --target x86_64-unknown-linux-gnu"
test_cli_macos = "test --package trusted-server-cli --target aarch64-apple-darwin"

# --- Host-target lint gates that no adapter alias covers ---
# CI lints these two crates explicitly (see .github/workflows/format.yml), but
# pins the Linux triple, so there was no command a developer could run locally
# to reproduce them. These omit --target and therefore build for the host.
clippy-cli = "clippy -p trusted-server-cli --all-targets --all-features -- -D warnings"
clippy-codegen = "clippy -p trusted-server-openrtb-codegen --all-targets -- -D warnings"

# When a wasm binary IS built, run it under Viceroy.
[target.'cfg(all(target_arch = "wasm32"))']
runner = "viceroy run -C ../../fastly.toml -- "
9 changes: 7 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,14 @@ jobs:
run: |
cargo clippy --manifest-path crates/trusted-server-cli/Cargo.toml --target "$(rustc -vV | sed -n 's/host: //p')" --all-targets -- -D warnings

- name: Set up Chrome for browser fixture tests
id: setup-chrome
uses: browser-actions/setup-chrome@v1

- name: cargo test
run: |
cargo test --manifest-path crates/trusted-server-cli/Cargo.toml --target "$(rustc -vV | sed -n 's/host: //p')"
run: ./scripts/test-cli.sh
env:
CHROME: ${{ steps.setup-chrome.outputs.chrome-path }}

test-typescript:
name: vitest
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,4 @@ src/*.html
# leftover local build artifacts (node_modules, target, dist) that remain on disk.
/crates/js/
/crates/integration-tests/
wrangler.integration.generated.toml
8 changes: 7 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,12 @@ cargo clippy-cloudflare-wasm
cargo clippy-spin-native
cargo clippy-spin-wasm

# The CLI and the OpenRTB codegen crate are host-target members that no adapter
# alias covers. CI lints both with the Linux triple pinned; these aliases omit
# `--target` so they reproduce it on any host.
cargo clippy-cli
cargo clippy-codegen

# Check compilation (per-target aliases — bare `cargo check` fails at the workspace root)
cargo check-fastly && cargo check-axum && cargo check-cloudflare

Expand Down Expand Up @@ -336,7 +342,7 @@ IntegrationRegistration::builder(ID)
Every PR must pass:

1. `cargo fmt --all -- --check`
2. `cargo clippy-fastly && cargo clippy-axum && cargo clippy-cloudflare && cargo clippy-cloudflare-wasm && cargo clippy-spin-native && cargo clippy-spin-wasm`
2. `cargo clippy-fastly && cargo clippy-axum && cargo clippy-cloudflare && cargo clippy-cloudflare-wasm && cargo clippy-spin-native && cargo clippy-spin-wasm && cargo clippy-cli && cargo clippy-codegen`
3. `cargo test-fastly && cargo test-axum && cargo test-cloudflare && cargo test-spin`
4. `cargo test --manifest-path crates/trusted-server-integration-tests/Cargo.toml --test parity`
5. JS build and test (`cd crates/trusted-server-js/lib && npx vitest run`)
Expand Down
11 changes: 9 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ scraper = "0.24.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.149"
sha2 = "0.10.9"
similar = "2.7"
simple_logger = "5"
spin-sdk = { version = "~6.0", default-features = false, features = ["http", "key-value", "variables"] }
subtle = "2.6"
Expand All @@ -109,6 +110,7 @@ tokio-rustls = "0.26"
toml = "1.1"
toml_edit = "0.23.10"
tower = "0.4"
tracing = "0.1"
trusted-server-core = { path = "crates/trusted-server-core" }
trusted-server-js = { path = "crates/trusted-server-js" }
trusted-server-openrtb = { path = "crates/trusted-server-openrtb" }
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ ts config init
ts config validate

# Audit a public page with Chrome/Chromium to bootstrap a draft config
ts audit https://publisher.example
ts audit generate https://publisher.example

# Run tests (Fastly/WASM crates — requires Viceroy)
cargo test-fastly
Expand Down
6 changes: 3 additions & 3 deletions crates/trusted-server-adapter-axum/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,19 @@ path = "src/main.rs"

[dependencies]
async-trait = { workspace = true }
axum = { workspace = true }
edgezero-adapter-axum = { workspace = true, features = ["axum"] }
edgezero-core = { workspace = true }
error-stack = { workspace = true }
futures = { workspace = true }
log = { workspace = true }
reqwest = { workspace = true }
simple_logger = { workspace = true }
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "sync", "time"] }
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "net", "signal", "sync", "time"] }
tower = { workspace = true, features = ["util"] }
trusted-server-core = { workspace = true }

[dev-dependencies]
axum = { workspace = true }
base64 = { workspace = true }
temp-env = { workspace = true }
tokio = { workspace = true, features = ["rt-multi-thread", "macros"] }
tower = { workspace = true, features = ["util"] }
49 changes: 40 additions & 9 deletions crates/trusted-server-adapter-axum/src/app.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use core::future::Future;
use std::sync::Arc;

use edgezero_adapter_axum::service::EdgeZeroAxumService;
use edgezero_core::app::Hooks;
use edgezero_core::context::RequestContext;
use edgezero_core::error::EdgeError;
Expand Down Expand Up @@ -574,15 +575,7 @@ impl Hooks for TrustedServerApp {
}

fn routes() -> RouterService {
let state = match build_state() {
Ok(s) => s,
Err(ref e) => {
log::error!("failed to build application state: {:?}", e);
return startup_error_router(e);
}
};

build_router(&state)
Self::routes_with_server_timing_flag().0
}
}

Expand All @@ -603,6 +596,44 @@ impl TrustedServerApp {
let state = build_state_with_settings(settings)?;
Ok(build_router(&state))
}

/// The dev server's fully configured tower service: the application
/// router wrapped in the terminal timing layer
/// ([`crate::timing::TimingService`]), with `server_timing_enabled`
/// read from the same settings snapshot that built the router.
///
/// This is the standard construction path for serving this adapter.
/// [`Hooks::routes`] satisfies the `Hooks` trait contract and returns
/// the bare router without the timing layer; callers who serve traffic
/// should use this instead so `server_timing_enabled` is never
/// silently discarded.
#[must_use]
pub fn dev_server_service() -> crate::timing::TimingService<EdgeZeroAxumService> {
let (router, server_timing_enabled) = Self::routes_with_server_timing_flag();
crate::timing::TimingService::new(EdgeZeroAxumService::new(router), server_timing_enabled)
}

/// Build the router alongside whether `Server-Timing` emission is
/// enabled, read from the same settings snapshot used to build the
/// router.
///
/// The Axum dev server's terminal timing layer ([`crate::timing`]) needs
/// this flag once at startup: unlike the Fastly adapter, which rebuilds
/// `Settings` per request, the Axum dev server builds its application
/// state once and reuses the same [`RouterService`] for every request.
#[must_use]
fn routes_with_server_timing_flag() -> (RouterService, bool) {
let state = match build_state() {
Ok(s) => s,
Err(ref e) => {
log::error!("failed to build application state: {:?}", e);
return (startup_error_router(e), false);
}
};

let server_timing_enabled = state.settings.observability.server_timing_enabled;
(build_router(&state), server_timing_enabled)
}
}

fn build_router(state: &Arc<AppState>) -> RouterService {
Expand Down
3 changes: 3 additions & 0 deletions crates/trusted-server-adapter-axum/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ pub mod app;
pub mod middleware;
/// Platform-trait implementations backed by env vars and `reqwest`.
pub mod platform;
/// Terminal timing layer wrapping the Axum dev server's tower `Service`
/// boundary with the request-phase `Server-Timing` freeze point.
pub mod timing;
67 changes: 63 additions & 4 deletions crates/trusted-server-adapter-axum/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
use edgezero_adapter_axum::dev_server::{AxumDevServer, AxumDevServerConfig};
use edgezero_core::app::Hooks as _;
use std::net::SocketAddr;

use axum::Router;
use edgezero_adapter_axum::dev_server::AxumDevServerConfig;
use edgezero_adapter_axum::service::EdgeZeroAxumService;
use tokio::net::TcpListener;
use tokio::runtime::Builder as RuntimeBuilder;
use tokio::signal;
use tower::Service as _;
use tower::service_fn;
use trusted_server_adapter_axum::app::TrustedServerApp;
use trusted_server_adapter_axum::timing::TimingService;

#[allow(clippy::print_stderr)]
fn main() {
Expand All @@ -20,13 +29,63 @@ fn main() {
};

log::info!("Listening on http://{}", config.addr);
let router = TrustedServerApp::routes();
if let Err(err) = AxumDevServer::with_config(router, config).run() {
let service = TrustedServerApp::dev_server_service();
if let Err(err) = run(service, config) {
log::error!("trusted-server-adapter-axum failed: {err}");
std::process::exit(1);
}
}

/// Runs the Axum dev server with the request-phase timing terminal layer
/// ([`trusted_server_adapter_axum::timing::TimingService`]) wrapped around
/// `EdgeZeroAxumService`, ahead of `axum::serve`.
///
/// This does not use `edgezero_adapter_axum::dev_server::AxumDevServer::run`:
/// that helper only accepts a bare [`RouterService`] and builds its own
/// `EdgeZeroAxumService` and `axum::Router` internally, with no seam for an
/// outer service wrapper. Router-generated 404/405 responses bypass
/// `RouterBuilder::middleware` (see `trusted_server_adapter_axum::timing`),
/// so the freeze point has to wrap the tower `Service` boundary itself.
/// Driving `axum::serve` directly here mirrors that helper's own internal
/// bind/wrap/serve/shutdown sequence closely enough to keep behavior
/// identical for callers (`PORT` env var, ctrl-c graceful shutdown).
///
/// # Errors
///
/// Returns an error if the Tokio runtime fails to start, the listener fails
/// to bind, or the underlying serve loop errors.
fn run(
service: TimingService<EdgeZeroAxumService>,
config: AxumDevServerConfig,
) -> std::io::Result<()> {
let runtime = RuntimeBuilder::new_multi_thread().enable_all().build()?;
runtime.block_on(serve(service, config))
}

async fn serve(
service: TimingService<EdgeZeroAxumService>,
config: AxumDevServerConfig,
) -> std::io::Result<()> {
let listener = TcpListener::bind(config.addr).await?;

let axum_router = Router::new().fallback_service(service_fn(move |req| {
let mut svc = service.clone();
async move { svc.call(req).await }
}));
let make_service = axum_router.into_make_service_with_connect_info::<SocketAddr>();

let server = axum::serve(listener, make_service);
if config.enable_ctrl_c {
server
.with_graceful_shutdown(async {
let _ctrl_c = signal::ctrl_c().await;
})
.await
} else {
server.await
}
}

/// Read a port number from the `PORT` environment variable.
///
/// Returns `None` when the variable is unset. Exits non-zero if the value
Expand Down
9 changes: 3 additions & 6 deletions crates/trusted-server-adapter-axum/src/platform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -522,16 +522,13 @@ impl PlatformHttpClient for AxumPlatformHttpClient {
///
/// # Degraded features in dev
///
/// KV store is [`trusted_server_core::platform::UnavailableKvStore`] — any route
/// touching synthetic-ID or consent KV will degrade gracefully. A `warn` log is
/// The generic runtime KV slot uses
/// [`trusted_server_core::platform::UnavailableKvStore`]. A `warn` log is
/// emitted once per process.
pub fn build_runtime_services(ctx: &edgezero_core::context::RequestContext) -> RuntimeServices {
static KV_WARNED: std::sync::OnceLock<()> = std::sync::OnceLock::new();
KV_WARNED.get_or_init(|| {
log::warn!(
"Axum dev server: KV store is unavailable (UnavailableKvStore). \
Routes that depend on synthetic-ID or consent KV will degrade gracefully."
);
log::warn!("Axum dev server: generic runtime KV is unavailable (UnavailableKvStore).");
});

let client_ip = edgezero_adapter_axum::context::AxumRequestContext::get(ctx.request())
Expand Down
Loading
Loading