From 35506118ac1b4c5c27dd6d0f7f5e4be21c9e74b9 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 8 May 2026 13:44:52 +0000 Subject: [PATCH 1/2] fix(compliance): extend \$generate:uuid_v4 to all hardcoded idempotency_keys in media-buy storyboards Replaces 15 hardcoded idempotency_key literals across 9 media-buy storyboard scenarios with \$generate:uuid_v4# patterns, following the precedent set in #4218. Prevents cross-run IdempotencyStore collisions when a seller's cached response shape is stale (e.g. after a spec version upgrade). Also renames 3 pre-existing aliases in governance_denied.yaml and invalid_transitions.yaml that used bare names instead of the established media_buy_seller___ convention. Closes #4230. https://claude.ai/code/session_016efYC8QLXVZZSPiisZ83oM --- .changeset/fix-storyboard-uuid-idempotency-keys.md | 7 +++++++ .../scenarios/creative_fate_after_cancellation.yaml | 10 +++++----- .../media-buy/scenarios/governance_approved.yaml | 2 +- .../media-buy/scenarios/governance_conditions.yaml | 2 +- .../media-buy/scenarios/governance_denied.yaml | 4 ++-- .../scenarios/governance_denied_recovery.yaml | 6 +++--- .../media-buy/scenarios/invalid_transitions.yaml | 6 +++--- .../media-buy/scenarios/inventory_list_no_match.yaml | 2 +- .../media-buy/scenarios/inventory_list_targeting.yaml | 2 +- .../scenarios/pending_creatives_to_start.yaml | 2 +- 10 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 .changeset/fix-storyboard-uuid-idempotency-keys.md diff --git a/.changeset/fix-storyboard-uuid-idempotency-keys.md b/.changeset/fix-storyboard-uuid-idempotency-keys.md new file mode 100644 index 0000000000..2cfd290585 --- /dev/null +++ b/.changeset/fix-storyboard-uuid-idempotency-keys.md @@ -0,0 +1,7 @@ +--- +--- + +Replace 15 hardcoded idempotency_key literals across 9 media-buy storyboard scenarios +with `$generate:uuid_v4#` patterns, following the precedent set in #4218. +Also renames 3 pre-existing aliases in governance_denied and invalid_transitions that +did not follow the established `media_buy_seller___` convention. diff --git a/static/compliance/source/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml b/static/compliance/source/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml index 4c9fe67900..b11c249bf2 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml @@ -114,7 +114,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "creative-fate-setup-create-buy-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_fate_after_cancellation_setup_create_buy" start_time: "2026-09-01T00:00:00Z" end_time: "2026-09-30T23:59:59Z" packages: @@ -175,7 +175,7 @@ phases: assignments: - creative_id: "acme_reuse_banner_001" package_id: "$context.package_id" - idempotency_key: "creative-fate-setup-sync-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_fate_after_cancellation_setup_sync_creative_with_assignment" context: correlation_id: "creative_fate--sync_creative_with_assignment" context_outputs: @@ -257,7 +257,7 @@ phases: media_buy_id: "$context.media_buy_id" canceled: true cancellation_reason: "Creative-fate scenario: releasing assignment to verify library persistence." - idempotency_key: "creative-fate-cancel-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_fate_after_cancellation_cancel_buy_update_media_buy_canceled" context: correlation_id: "creative_fate--update_media_buy_canceled" validations: @@ -340,7 +340,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "creative-fate-second-buy-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_fate_after_cancellation_reuse_creative_on_new_buy_create_second_buy" start_time: "2026-10-01T00:00:00Z" end_time: "2026-10-31T23:59:59Z" packages: @@ -406,7 +406,7 @@ phases: assignments: - creative_id: "acme_reuse_banner_001" package_id: "$context.second_package_id" - idempotency_key: "creative-fate-reassign-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_creative_fate_after_cancellation_reuse_creative_on_new_buy_reassign_creative" context: correlation_id: "creative_fate--reassign_creative" validations: diff --git a/static/compliance/source/protocols/media-buy/scenarios/governance_approved.yaml b/static/compliance/source/protocols/media-buy/scenarios/governance_approved.yaml index d6c7396d39..c56401e76b 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/governance_approved.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/governance_approved.yaml @@ -84,7 +84,7 @@ phases: expected: | The governance agent acknowledges the plan with a plan_id. sample_request: - idempotency_key: "comply-gov-approved-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_approved_governance_plan_setup_sync_plans" plans: - plan_id: "comply-gov-approved-plan" brand: diff --git a/static/compliance/source/protocols/media-buy/scenarios/governance_conditions.yaml b/static/compliance/source/protocols/media-buy/scenarios/governance_conditions.yaml index f545f6a786..90d0685afc 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/governance_conditions.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/governance_conditions.yaml @@ -61,7 +61,7 @@ phases: expected: | The governance agent acknowledges the plan with a plan_id. sample_request: - idempotency_key: "comply-gov-conditions-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_conditions_governance_plan_setup_sync_plans" plans: - plan_id: "comply-gov-conditions-plan" brand: diff --git a/static/compliance/source/protocols/media-buy/scenarios/governance_denied.yaml b/static/compliance/source/protocols/media-buy/scenarios/governance_denied.yaml index 7d068839a3..617438f975 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/governance_denied.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/governance_denied.yaml @@ -61,7 +61,7 @@ phases: expected: | The governance agent acknowledges the plan with a plan_id. sample_request: - idempotency_key: "comply-gov-denied-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_denied_governance_plan_setup_sync_plans" plans: - plan_id: "comply-gov-denied-plan" brand: @@ -188,7 +188,7 @@ phases: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" sandbox: true - idempotency_key: "$generate:uuid_v4#governance_denied_create_media_buy" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_denied_buy_denied_create_media_buy_denied" start_time: "2026-04-01T00:00:00Z" end_time: "2026-06-30T23:59:59Z" packages: diff --git a/static/compliance/source/protocols/media-buy/scenarios/governance_denied_recovery.yaml b/static/compliance/source/protocols/media-buy/scenarios/governance_denied_recovery.yaml index 8f03d7bb14..3588a39214 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/governance_denied_recovery.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/governance_denied_recovery.yaml @@ -61,7 +61,7 @@ phases: expected: | The governance agent acknowledges the plan. sample_request: - idempotency_key: "comply-gov-recovery-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_denied_recovery_governance_plan_setup_sync_plans" plans: - plan_id: "comply-gov-recovery-plan" brand: @@ -184,7 +184,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "gov-recovery-initial-denied-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_denied_recovery_buy_denied_create_media_buy_denied" start_time: "2026-04-01T00:00:00Z" end_time: "2026-06-30T23:59:59Z" packages: @@ -229,7 +229,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "gov-recovery-retry-approved-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_governance_denied_recovery_buy_retried_create_media_buy_retry" start_time: "2026-04-01T00:00:00Z" end_time: "2026-06-30T23:59:59Z" packages: diff --git a/static/compliance/source/protocols/media-buy/scenarios/invalid_transitions.yaml b/static/compliance/source/protocols/media-buy/scenarios/invalid_transitions.yaml index 18d18f1e0e..c908df9e75 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/invalid_transitions.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/invalid_transitions.yaml @@ -73,7 +73,7 @@ phases: operator: "pinnacle-agency.example" media_buy_id: "does-not-exist-invalid-transitions-v1" paused: true - idempotency_key: "$generate:uuid_v4#update_unknown_media_buy" + idempotency_key: "$generate:uuid_v4#media_buy_seller_invalid_transitions_unknown_media_buy_update_unknown_media_buy" context: correlation_id: "invalid_transitions--update_unknown_media_buy" validations: @@ -140,7 +140,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "invalid-transitions-setup-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_invalid_transitions_setup_create_buy" start_time: "2026-08-01T00:00:00Z" end_time: "2026-08-31T23:59:59Z" packages: @@ -191,7 +191,7 @@ phases: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" media_buy_id: "$context.media_buy_id" - idempotency_key: "$generate:uuid_v4#update_unknown_package" + idempotency_key: "$generate:uuid_v4#media_buy_seller_invalid_transitions_unknown_package_update_unknown_package" packages: - package_id: "does-not-exist-package-invalid-transitions-v1" paused: true diff --git a/static/compliance/source/protocols/media-buy/scenarios/inventory_list_no_match.yaml b/static/compliance/source/protocols/media-buy/scenarios/inventory_list_no_match.yaml index 8f5f4eb301..da5e751faa 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/inventory_list_no_match.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/inventory_list_no_match.yaml @@ -116,7 +116,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "inventory-list-no-match-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_inventory_list_no_match_no_match_attempt_create_buy_no_match" start_time: "2026-07-01T00:00:00Z" end_time: "2026-09-30T23:59:59Z" packages: diff --git a/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml b/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml index 9502c04168..185f7a8713 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml @@ -114,7 +114,7 @@ phases: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" sandbox: true - idempotency_key: "inventory-list-targeting-create-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_inventory_list_targeting_create_with_both_lists_create_buy_with_lists" start_time: "2026-07-01T00:00:00Z" end_time: "2026-09-30T23:59:59Z" packages: diff --git a/static/compliance/source/protocols/media-buy/scenarios/pending_creatives_to_start.yaml b/static/compliance/source/protocols/media-buy/scenarios/pending_creatives_to_start.yaml index 9bf1a639a0..daed0b1a41 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/pending_creatives_to_start.yaml @@ -103,7 +103,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "pending-creatives-transition-v1" + idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_create_without_creatives_create_buy_no_creatives" start_time: "2026-08-01T00:00:00Z" end_time: "2026-08-31T23:59:59Z" packages: From f230a0ae777f1bf68f6528dbe46d8a24e022f964 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 10 May 2026 17:18:29 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix(compliance):=20fold=20#4344=20=E2=80=94?= =?UTF-8?q?=20extend=20\$generate:uuid=5Fv4=20to=2013=20additional=20hardc?= =?UTF-8?q?oded=20idempotency=5Fkeys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Converts all remaining static idempotency_key literals identified in #4344 that were not covered by the original PR scope: - universal/error-compliance.yaml: 5 keys (negative_budget, nonexistent_product, reversed_dates_error, validate_error_shape, validate_transport_binding) - universal/schema-validation.yaml: schema_validation_temporal_validation_reversed_dates - protocols/governance/index.yaml: media_buy_governance_escalation_register_plan_sync_plans - specialisms/creative-ad-server/index.yaml: report_billing_report_usage (a1b2c3d4-e5f6-7890-abcd-ef1234567890 — verified not a format-probe: step validates response schema and context echo only, no idempotency_key format check) - specialisms/governance-delivery-monitor/index.yaml: plan_registration_sync_plans - specialisms/governance-spend-authority/denied.yaml: plan_registration_sync_plans - specialisms/governance-spend-authority/index.yaml: plan_registration_sync_plans - specialisms/signal-marketplace/scenarios/governance_denied.yaml: activation_denied_activate_signal_denied Note: measurement-terms-probe-aggressive-v1 and measurement-terms-probe-relaxed-v1 are already converted in source (PR #4218); the hardcoded values only exist in immutable dist/ snapshots (3.0.x). error-compliance-signals.yaml keys are not in #4344's scope — left as separate follow-up. build:compliance: 23 universal, 6 protocols, 20 specialisms — all 12 lints green. https://claude.ai/code/session_01KQDykcFGBjozQgvssU95zX --- .../compliance/source/protocols/governance/index.yaml | 2 +- .../source/specialisms/creative-ad-server/index.yaml | 2 +- .../specialisms/governance-delivery-monitor/index.yaml | 2 +- .../specialisms/governance-spend-authority/denied.yaml | 2 +- .../specialisms/governance-spend-authority/index.yaml | 2 +- .../scenarios/governance_denied.yaml | 2 +- .../compliance/source/universal/error-compliance.yaml | 10 +++++----- .../compliance/source/universal/schema-validation.yaml | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/static/compliance/source/protocols/governance/index.yaml b/static/compliance/source/protocols/governance/index.yaml index 539222534c..7bfb33334c 100644 --- a/static/compliance/source/protocols/governance/index.yaml +++ b/static/compliance/source/protocols/governance/index.yaml @@ -246,7 +246,7 @@ phases: - human_review_required: set when the plan mandates escalation sample_request: - idempotency_key: "media-buy-governance-escalation-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#media_buy_governance_escalation_register_plan_sync_plans" plans: - plan_id: "gov_acme_q2_2027" brand: diff --git a/static/compliance/source/specialisms/creative-ad-server/index.yaml b/static/compliance/source/specialisms/creative-ad-server/index.yaml index bd1c2acf93..ab81194b5e 100644 --- a/static/compliance/source/specialisms/creative-ad-server/index.yaml +++ b/static/compliance/source/specialisms/creative-ad-server/index.yaml @@ -367,7 +367,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + idempotency_key: "$generate:uuid_v4#creative_ad_server_report_billing_report_usage" reporting_period: start: "2026-03-01T00:00:00Z" end: "2026-03-31T23:59:59Z" diff --git a/static/compliance/source/specialisms/governance-delivery-monitor/index.yaml b/static/compliance/source/specialisms/governance-delivery-monitor/index.yaml index 45e1a2b993..05840fb9e3 100644 --- a/static/compliance/source/specialisms/governance-delivery-monitor/index.yaml +++ b/static/compliance/source/specialisms/governance-delivery-monitor/index.yaml @@ -164,7 +164,7 @@ phases: - budget.reallocation_threshold: amount above which reallocation requires re-evaluation sample_request: - idempotency_key: "governance-delivery-monitor-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#governance_delivery_monitor_plan_registration_sync_plans" plans: - plan_id: "gov_acme_delivery_monitor" brand: diff --git a/static/compliance/source/specialisms/governance-spend-authority/denied.yaml b/static/compliance/source/specialisms/governance-spend-authority/denied.yaml index 65816831c7..245fd4c17a 100644 --- a/static/compliance/source/specialisms/governance-spend-authority/denied.yaml +++ b/static/compliance/source/specialisms/governance-spend-authority/denied.yaml @@ -110,7 +110,7 @@ phases: - budget.total: $10K cap that any single buy above will exceed sample_request: - idempotency_key: "governance-spend-authority-denied-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#governance_spend_authority_denied_plan_registration_sync_plans" plans: - plan_id: "gov_acme_strict" brand: diff --git a/static/compliance/source/specialisms/governance-spend-authority/index.yaml b/static/compliance/source/specialisms/governance-spend-authority/index.yaml index 437b4bcfba..dcb46b61bb 100644 --- a/static/compliance/source/specialisms/governance-spend-authority/index.yaml +++ b/static/compliance/source/specialisms/governance-spend-authority/index.yaml @@ -159,7 +159,7 @@ phases: - custom_policies: policy conditions registered sample_request: - idempotency_key: "governance-spend-authority-sync-plans-v1" + idempotency_key: "$generate:uuid_v4#governance_spend_authority_plan_registration_sync_plans" plans: - plan_id: "gov_acme_spend_authority_q2_2027" brand: diff --git a/static/compliance/source/specialisms/signal-marketplace/scenarios/governance_denied.yaml b/static/compliance/source/specialisms/signal-marketplace/scenarios/governance_denied.yaml index 39aa1ef4f6..14a541e2db 100644 --- a/static/compliance/source/specialisms/signal-marketplace/scenarios/governance_denied.yaml +++ b/static/compliance/source/specialisms/signal-marketplace/scenarios/governance_denied.yaml @@ -187,7 +187,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "signal-gov-denied-v1" + idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_activation_denied_activate_signal_denied" context: correlation_id: "signal_marketplace--governance_denied--activate" diff --git a/static/compliance/source/universal/error-compliance.yaml b/static/compliance/source/universal/error-compliance.yaml index 50d826220f..6837498729 100644 --- a/static/compliance/source/universal/error-compliance.yaml +++ b/static/compliance/source/universal/error-compliance.yaml @@ -117,7 +117,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "error-test-negative-budget" + idempotency_key: "$generate:uuid_v4#error_compliance_error_responses_negative_budget" start_time: "2026-05-01T00:00:00Z" end_time: "2026-05-31T23:59:59Z" packages: @@ -165,7 +165,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "error-test-nonexistent-product" + idempotency_key: "$generate:uuid_v4#error_compliance_error_responses_nonexistent_product" start_time: "2026-05-01T00:00:00Z" end_time: "2026-05-31T23:59:59Z" packages: @@ -252,7 +252,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "error-test-reversed-dates" + idempotency_key: "$generate:uuid_v4#error_compliance_error_responses_reversed_dates_error" start_time: "2026-12-31T00:00:00Z" end_time: "2026-01-01T00:00:00Z" packages: @@ -308,7 +308,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "error-structure-test" + idempotency_key: "$generate:uuid_v4#error_compliance_error_structure_validate_error_shape" start_time: "2026-12-31T00:00:00Z" end_time: "2026-01-01T00:00:00Z" packages: @@ -452,7 +452,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "error-transport-test" + idempotency_key: "$generate:uuid_v4#error_compliance_error_transport_validate_transport_binding" start_time: "2026-12-31T00:00:00Z" end_time: "2026-01-01T00:00:00Z" packages: diff --git a/static/compliance/source/universal/schema-validation.yaml b/static/compliance/source/universal/schema-validation.yaml index dcdbbed475..e481276b76 100644 --- a/static/compliance/source/universal/schema-validation.yaml +++ b/static/compliance/source/universal/schema-validation.yaml @@ -333,7 +333,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" - idempotency_key: "schema-validation-reversed-dates-v1" + idempotency_key: "$generate:uuid_v4#schema_validation_temporal_validation_reversed_dates" start_time: "2026-12-31T00:00:00Z" end_time: "2026-01-01T00:00:00Z" packages: