feat(compliance): macro-identifier substitution storyboard (parked: Live Integration RFC)#5646
feat(compliance): macro-identifier substitution storyboard (parked: Live Integration RFC)#5646BaiyuScope3 wants to merge 1 commit into
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
|
Took a careful pass over this + adcontextprotocol/adcp-client#2263 against the schemas. The helper and the guide are solid — the open question is the storyboard, and I think it's pointed at a surface that can't actually observe the behavior. Recommend a split. Keep here: the SDK helper + guide
Pull from here:
|
|
Checked both claims against the schemas/spec independently — both hold. Wrong surface. Not wire-observable. Net: agreed on the split. Live Integration RFC is the right home for an impression-observable check. I don't have push access to this branch (only diff --git a/docs/creative/universal-macros.mdx b/docs/creative/universal-macros.mdx
index 15e93663..bd828751 100644
--- a/docs/creative/universal-macros.mdx
+++ b/docs/creative/universal-macros.mdx
@@ -569,6 +569,15 @@ Behavior:
omit a tracker the agent can't fill than to emit a broken one.
- **Already-minted parameters pass through untouched** — `pkg_id=123456` (no macro) is
left exactly as-is.
+- **Map only build-time AdCP identifiers (`{MEDIA_BUY_ID}`, `{PACKAGE_ID}`,
+ `{CREATIVE_ID}`) as `value`** — every impression-time macro (privacy/consent macros
+ like `{GDPR_CONSENT}`, `{US_PRIVACY}`, `{GPP_STRING}`, plus device, geo,
+ `{CACHEBUSTER}`, and `{TIMESTAMP}`) needs `native` instead, since the real value
+ differs per impression. Mapping a consent macro to a fixed `value` would freeze one
+ user's consent string into every impression it's served.
+- **`native` strings are inserted without encoding or validation** — only point them at
+ ad-server config tokens you control, never at buyer-supplied input, since `native`
+ bypasses the RFC-3986 encoding that protects `value` entries from injection.(Verified the build-time-ID vs. impression-time-macro split against the existing catalog tables in the same doc — "Common Macros" vs. "Privacy & Compliance"/"Device & Environment" — so this isn't introducing a new classification, just stating the rule the catalog already implies.)
🤖 Generated with Claude Code Generated by Claude Code |
|
Applied the fix as three follow-up commits on this branch:
No protocol-scoped change ships once the storyboard is gone, so no changeset is needed — verified via Verified locally before pushing: Generated by Claude Code |
…red)
Seller-scoped storyboard asserting {MEDIA_BUY_ID}/{PACKAGE_ID} substitution in
creative tracking URLs. Parked pending the Live Integration check — the driving
assertion was pulled from @adcp/sdk (adcontextprotocol/adcp-client#2263) because a
build_creative preview can't certify serve-time substitution.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3802f7f to
e664a1f
Compare
This storyboard (
macro-identifier-substitution.yaml) verifies a seller substitutes{MEDIA_BUY_ID}/{PACKAGE_ID}in creative tracking URLs. It was built against theexpect_universal_macro_substitutedassertion, which has since been pulled from@adcp/sdkin adcontextprotocol/adcp-client#2263.Reason (per @bokelley's review on #2263): the assertion observed a
build_creativepreview, but those identifiers resolve at serve time and aren't serialized on the wire, so the check skip-dominates for conformant sellers. The substitution we actually want to certify is a decisioning roundtrip — a Live Integration check (RFC incoming). The macro-alignment logic from the SDK assertion is reusable on the collector side of that check.Next step: rework this storyboard against the Live Integration surface once that RFC lands. Keeping it open as a tracking placeholder.
Related:
translateUniversalMacroshelper + parser fix (assertion removed).🤖 Generated with Claude Code