Skip to content

feat(conformance): native_in_feed storyboard coverage in creative protocol#4810

Merged
bokelley merged 1 commit into
mainfrom
claude/issue-4774-native-in-feed-storyboard
May 20, 2026
Merged

feat(conformance): native_in_feed storyboard coverage in creative protocol#4810
bokelley merged 1 commit into
mainfrom
claude/issue-4774-native-in-feed-storyboard

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

Closes #4774

Adds static/compliance/source/protocols/creative/scenarios/native_in_feed.yaml — a new storyboard exercising the native_in_feed canonical 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):

  1. Capability discoveryget_adcp_capabilities confirms creative protocol support.
  2. Discover native formatslist_creative_formats with asset_types: ["text", "image"] (no format_kind filter exists in the protocol; the buyer identifies the native format from response metadata). The format_id used in later steps is a placeholder the implementer substitutes with their actual format_id — standard storyboard pattern.
  3. Sync full native bundlesync_creatives with 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/click pixel_tracker entries.
  4. Validation rejection paths — four isolated sync_creatives calls, each asserting a specific error code:
    • title over title_max_charsVALIDATION_ERROR | INVALID_REQUEST
    • main_image not in main_image_sizesVALIDATION_ERROR | INVALID_REQUEST
    • CTA outside cta_values closed enum → CREATIVE_VALUE_NOT_ALLOWED (spec-mandated; distinct from CREATIVE_REJECTED per enum semantics)
    • pixel_tracker event=custom without custom_event_nameINVALID_REQUEST | VALIDATION_ERROR (schema constraint per pixel-tracker-asset.json allOf)
  5. Previewpreview_creative with request_type: "single" showing the assembled feed render.

Scope decision: New file at scenarios/native_in_feed.yaml rather than extending creative_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 existing native_trail_pro entry. The optional Phase 5 (closed-set rejection at sync_creatives) from the issue is dropped — experts confirmed it gates at create_media_buy, not sync_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:

  • code-reviewer: approved — all scoping, idempotency, error-code, and context-echo rules verified; no blockers; nit on format_id placeholder addressed in narrative
  • ad-tech-protocol-expert: approved after blocker fix applied (stateful_preloadedstateful_push — buyer-push flow matches creative_reception.yaml precedent); all error code choices confirmed sound

Triage-managed PR. This bot does not currently iterate on
review comments or PR conversation threads (only on the source
issue). To unblock:

  • Push fixup commits directly: gh pr checkout <num>
    fix → push.
  • Or re-trigger: comment /triage execute on the source
    issue.

See #3121
for context.

Session: https://claude.ai/code/session_01SHXC5MNy7UQCsnvJoUFeXp


Generated by Claude Code

…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
@bokelley bokelley added the claude-triaged Issue has been triaged by the Claude Code triage routine. Remove to re-triage. label May 19, 2026
@bokelley bokelley marked this pull request as ready for review May 20, 2026 17:18
@bokelley bokelley merged commit eb5ebcc into main May 20, 2026
20 checks passed
@bokelley bokelley deleted the claude/issue-4774-native-in-feed-storyboard branch May 20, 2026 17:18
Copy link
Copy Markdown
Contributor

@aao-release-bot aao-release-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 their schema_ref paths resolve against static/schemas/source/. The creative-agent variant of list-creative-formats-request.json is the correct one, not the media-buy/ legacy path.
  • asset_types: ["text", "image"] is a real filter on creative/list-creative-formats-request.json:48-64 with both values in the enum.
  • request_type: "single" is valid on preview-creative-request.json:55-62, and the creative_manifest payload satisfies the allOf if/then.
  • interaction_model: stateful_push is in storyboard-schema.yaml:316. The flip from stateful_preloaded matches the buyer-push shape used by creative_reception.yaml and provenance_*.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_values violations — the storyboard's claim is verbatim spec.
  • pixel-tracker-asset.json:51-63 carries the exact allOf if event=custom then required: [custom_event_name] constraint the reject-path exercises. viewable_mrc_50 is 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_id in sample_request.context matches the validations[].value asserted against it. The four expect_error: true steps correctly drop the echo-check and use check: error_code only.
  • Idempotency keys: five mutating calls, five unique #<tag> suffixes. No collisions.
  • Creative IDs: happy path reuses native_trail_pro_full_bundle across 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claude-triaged Issue has been triaged by the Claude Code triage routine. Remove to re-triage.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(conformance): native_in_feed storyboard coverage in creative_lifecycle

2 participants