Root cause
src/lib/testing/storyboard/request-builder.ts:207 — the create_media_buy enricher rebuilds the request from scratch and only spreads start_time / end_time / packages from step.sample_request. It substitutes account with resolveAccount(options) = {brand: {domain: 'test.example'}, sandbox: true} and silently drops:
proposal_id (sourced via $context.proposal_id after adcp#4088)
total_budget
idempotency_key
The YAML's proposal_id: \"\$context.proposal_id\" substitution never reaches the wire because the enricher discards it before send.
Symptom
Proposal-mode adapter gate test masks create_media_buy in EXPECTED_FAILURES (PR #1599). Without the mask, the adapter receives a request without proposal_id, can't look it up, returns an error or wrong-shape response, and fails the schema check.
Fix
The enricher should preserve all sample_request fields and only override what it explicitly needs to (account substitution). Spread step.sample_request first, then layer the runner's substitutions on top.
Acceptance
Refs
Root cause
src/lib/testing/storyboard/request-builder.ts:207— thecreate_media_buyenricher rebuilds the request from scratch and only spreadsstart_time/end_time/packagesfromstep.sample_request. It substitutesaccountwithresolveAccount(options) = {brand: {domain: 'test.example'}, sandbox: true}and silently drops:proposal_id(sourced via$context.proposal_idafter adcp#4088)total_budgetidempotency_keyThe YAML's
proposal_id: \"\$context.proposal_id\"substitution never reaches the wire because the enricher discards it before send.Symptom
Proposal-mode adapter gate test masks
create_media_buyinEXPECTED_FAILURES(PR #1599). Without the mask, the adapter receives a request withoutproposal_id, can't look it up, returns an error or wrong-shape response, and fails the schema check.Fix
The enricher should preserve all
sample_requestfields and only override what it explicitly needs to (account substitution). Spreadstep.sample_requestfirst, then layer the runner's substitutions on top.Acceptance
sample_requestfields reach the wire when the runner enrichescreate_media_buy(and any other tool with similar enrichment logic — auditrequest-builder.tsfor the pattern).EXPECTED_FAILURES.create_media_buyallowlist entry fromtest/examples/hello-seller-adapter-proposal-mode.test.js(fix(test): drop stale get_products_refine allowlist on proposal-mode adapter #1599).sample_request.Refs