feat(conformance): native_in_feed storyboard coverage in creative protocol#4810
Merged
Merged
Conversation
…tocol Adds static/compliance/source/protocols/creative/scenarios/native_in_feed.yaml covering the full native_in_feed canonical end-to-end: format discovery via list_creative_formats (asset_types filter), happy-path sync_creatives with all 12 slots + three pixel_tracker entries, four isolated validation-rejection steps (title_max_chars, main_image_sizes, cta_values closed-set → CREATIVE_VALUE_NOT_ALLOWED, pixel_tracker custom without custom_event_name), and preview_creative. Closes #4774. Parent work: #4770 (Taboola fixture + slot-enum fixes), #3307 (native_in_feed GA). https://claude.ai/code/session_01SHXC5MNy7UQCsnvJoUFeXp
Contributor
There was a problem hiding this comment.
Approving. Net-additive conformance file; protocol claims verify cleanly against the schemas.
Things I checked
- All four task names (
get_adcp_capabilities,list_creative_formats,sync_creatives,preview_creative) and theirschema_refpaths resolve againststatic/schemas/source/. The creative-agent variant oflist-creative-formats-request.jsonis the correct one, not themedia-buy/legacy path. asset_types: ["text", "image"]is a real filter oncreative/list-creative-formats-request.json:48-64with both values in the enum.request_type: "single"is valid onpreview-creative-request.json:55-62, and thecreative_manifestpayload satisfies theallOf if/then.interaction_model: stateful_pushis instoryboard-schema.yaml:316. The flip fromstateful_preloadedmatches the buyer-push shape used bycreative_reception.yamlandprovenance_*.yaml— right call for a content-recommendation surface.- Error codes all exist in
enums/error-code.json.CREATIVE_VALUE_NOT_ALLOWED(line 21) explicitly maps to closed-allowed_valuesviolations — the storyboard's claim is verbatim spec. pixel-tracker-asset.json:51-63carries the exactallOf if event=custom then required: [custom_event_name]constraint the reject-path exercises.viewable_mrc_50is in the event enum at line 17.- All 12 slots match
formats/canonical/native_in_feed.json:18-31. Required slots (title, advertiser_name, landing_page_url) are populated on every reject-path step so the targeted constraint is what trips — not a missing-field side effect. - Internal consistency: every
correlation_idinsample_request.contextmatches thevalidations[].valueasserted against it. The fourexpect_error: truesteps correctly drop the echo-check and usecheck: error_codeonly. - Idempotency keys: five mutating calls, five unique
#<tag>suffixes. No collisions. - Creative IDs: happy path reuses
native_trail_pro_full_bundleacross sync and preview (same artifact, correct). All four rejection steps use distinct IDs. - Empty-frontmatter changeset is the established pattern in this repo for non-version-bumping additions (see
2383-test-vector-index-scope-update.md,2487-image-size-cap-for-c2pa-manifest.md). Conformance harness additions don't bump the package.
Safe to merge.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #4774
Adds
static/compliance/source/protocols/creative/scenarios/native_in_feed.yaml— a new storyboard exercising thenative_in_feedcanonical end-to-end for conformance testing. Parent work (#3307 canonical-formats GA, #4770 Taboola fixture + slot-enum fixes) landed the schema foundations; this PR ships the conformance coverage.What this storyboard covers (5 phases, 8 steps):
get_adcp_capabilitiesconfirms creative protocol support.list_creative_formatswithasset_types: ["text", "image"](noformat_kindfilter exists in the protocol; the buyer identifies the native format from response metadata). Theformat_idused in later steps is a placeholder the implementer substitutes with their actual format_id — standard storyboard pattern.sync_creativeswith all 12 Taboola-fixture slots: title, body_text, main_image (1200×627), CTA, advertiser_name, sponsored_label, landing_page_url, display_url, rating, plus impression/viewability/clickpixel_trackerentries.sync_creativescalls, each asserting a specific error code:title_max_chars→VALIDATION_ERROR | INVALID_REQUESTmain_imagenot inmain_image_sizes→VALIDATION_ERROR | INVALID_REQUESTcta_valuesclosed enum →CREATIVE_VALUE_NOT_ALLOWED(spec-mandated; distinct fromCREATIVE_REJECTEDper enum semantics)pixel_trackerevent=customwithoutcustom_event_name→INVALID_REQUEST | VALIDATION_ERROR(schema constraint perpixel-tracker-asset.jsonallOf)preview_creativewithrequest_type: "single"showing the assembled feed render.Scope decision: New file at
scenarios/native_in_feed.yamlrather than extendingcreative_lifecycle/index.yaml, per expert review: the lifecycle storyboard is a cross-format tour (display/video/native card) and adding 8+ native-specific phases would exceed coherent phase count and create narrative incoherence with the existingnative_trail_proentry. The optional Phase 5 (closed-set rejection atsync_creatives) from the issue is dropped — experts confirmed it gates atcreate_media_buy, notsync_creatives.Non-breaking justification: New file only; no changes to existing storyboards, schemas, or source files. Conformance harness additions are always non-breaking per the patch-eligibility rules.
Pre-PR review:
stateful_preloaded→stateful_push— buyer-push flow matchescreative_reception.yamlprecedent); all error code choices confirmed soundSession: https://claude.ai/code/session_01SHXC5MNy7UQCsnvJoUFeXp
Generated by Claude Code