Summary
#5247 (fixed by #5310) established that comply_test_controller seeding calls should be bucketed per-storyboard via a context.correlation_id prefix, since a shared long-running agent otherwise accumulates seeded state across storyboards. That fix works — but only for storyboards that have their own seeding phase. A storyboard whose discovery step is stateful: false and seeds nothing itself has no signal that a new scenario has started, and can silently read whatever a different, earlier storyboard's seeding phase left behind.
Concrete repro
- Reference seller agent (a demo ADCP seller built on
adcp-client-python), pinned @adcp/sdk@9.7.0.
- A full storyboard run executes
available_actions / product_signal_targeting first, each seeding its own fixed-price product via seed_product/seed_pricing_option under its own correlation_id prefix.
media_buy_seller/inline_creatives_without_sync's get_products_canonical_format step (stateful: false, no seeding phase of its own) runs later, filtering is_fixed_price: true.
products[0] in its response is a fixture left over from an earlier storyboard's seeding phase — not the product this scenario itself expects — because nothing reset the shared products catalog before this read.
Root cause
The correlation_id-prefix convention from #5247's Fix 2 is only consulted at seeding call sites in every reference we could find. Non-seeding graded task calls (get_products, etc.) already carry context.correlation_id with the identical {scenario}--{step} convention — confirmed directly in the pinned 3.1.1 storyboard payloads — but the runner never gives implementations an explicit, unconditional boundary signal to act on.
Proposed fix
Have the runner call an explicit reset_state scenario unconditionally before every storyboard — seeding phase or not — the way #5247's own "Fix 1" originally proposed. This removes the isolation gap at the source rather than depending on every implementation independently noticing and correctly bucketing correlation_id on calls beyond seeding.
Summary
#5247 (fixed by #5310) established that
comply_test_controllerseeding calls should be bucketed per-storyboard via acontext.correlation_idprefix, since a shared long-running agent otherwise accumulates seeded state across storyboards. That fix works — but only for storyboards that have their own seeding phase. A storyboard whose discovery step isstateful: falseand seeds nothing itself has no signal that a new scenario has started, and can silently read whatever a different, earlier storyboard's seeding phase left behind.Concrete repro
adcp-client-python), pinned@adcp/sdk@9.7.0.available_actions/product_signal_targetingfirst, each seeding its own fixed-price product viaseed_product/seed_pricing_optionunder its own correlation_id prefix.media_buy_seller/inline_creatives_without_sync'sget_products_canonical_formatstep (stateful: false, no seeding phase of its own) runs later, filteringis_fixed_price: true.products[0]in its response is a fixture left over from an earlier storyboard's seeding phase — not the product this scenario itself expects — because nothing reset the shared products catalog before this read.Root cause
The correlation_id-prefix convention from #5247's Fix 2 is only consulted at seeding call sites in every reference we could find. Non-seeding graded task calls (
get_products, etc.) already carrycontext.correlation_idwith the identical{scenario}--{step}convention — confirmed directly in the pinned 3.1.1 storyboard payloads — but the runner never gives implementations an explicit, unconditional boundary signal to act on.Proposed fix
Have the runner call an explicit
reset_statescenario unconditionally before every storyboard — seeding phase or not — the way #5247's own "Fix 1" originally proposed. This removes the isolation gap at the source rather than depending on every implementation independently noticing and correctly bucketing correlation_id on calls beyond seeding.