From f84c73523ab0a81280bf9609a6060906fa95659b Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Mon, 4 May 2026 11:26:39 -0400 Subject: [PATCH] fix(compliance): chain proposal_id through proposal_finalize storyboard (#4086) Capture proposals[0].proposal_id on brief_with_proposals via context_outputs, and consume it as $context.proposal_id in refine_proposal, finalize_proposal, and accept_proposal. Without the chain the runner sent the literal placeholder "balanced_reach_q2" from sample_request, which 404s against sellers minting runtime proposal IDs (uuids, db rowids). Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/proposal-finalize-context-chain.md | 6 ++++++ .../media-buy/scenarios/proposal_finalize.yaml | 10 +++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 .changeset/proposal-finalize-context-chain.md diff --git a/.changeset/proposal-finalize-context-chain.md b/.changeset/proposal-finalize-context-chain.md new file mode 100644 index 0000000000..4995e250f8 --- /dev/null +++ b/.changeset/proposal-finalize-context-chain.md @@ -0,0 +1,6 @@ +--- +--- + +**conformance**: chain `proposal_id` through `media_buy_seller/proposal_finalize` storyboard. + +The `brief_with_proposals` step now captures `proposals[0].proposal_id` via `context_outputs`, and the downstream `refine_proposal` / `finalize_proposal` / `accept_proposal` steps reference it as `$context.proposal_id` instead of the hardcoded placeholder `balanced_reach_q2`. Sellers that mint runtime `proposal_id` values (uuids, db rowids) can now pass the full lifecycle — previously the literal placeholder reached the wire and 404'd against any stateful upstream. Closes #4086. diff --git a/static/compliance/source/protocols/media-buy/scenarios/proposal_finalize.yaml b/static/compliance/source/protocols/media-buy/scenarios/proposal_finalize.yaml index cd30feb805..68fac08bb7 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/proposal_finalize.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/proposal_finalize.yaml @@ -98,6 +98,10 @@ phases: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" + context_outputs: + - path: "proposals[0].proposal_id" + key: "proposal_id" + validations: - check: response_schema description: "Response matches get-products-response.json schema" @@ -137,7 +141,7 @@ phases: buying_mode: "refine" refine: - scope: "proposal" - proposal_id: "balanced_reach_q2" + proposal_id: "$context.proposal_id" ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video." - scope: "request" ask: "All products must support frequency capping at 3 per day." @@ -184,7 +188,7 @@ phases: buying_mode: "refine" refine: - scope: "proposal" - proposal_id: "balanced_reach_q2" + proposal_id: "$context.proposal_id" action: "finalize" account: brand: @@ -230,7 +234,7 @@ phases: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" sandbox: true - proposal_id: "balanced_reach_q2" + proposal_id: "$context.proposal_id" total_budget: amount: 50000 currency: "USD"