At the top of the chat, the shopper asks for a headlamp. By the time the offer is ready, they have found their old one and want to know how to change its batteries. The headlamp offer was a reasonable match when the request left. Pinning it to the newest message turns it into a bad recommendation.
Perplexity described a different placement in its advertising experiment: a brand could sponsor a follow-up question. The distinction matters to an engineer. A follow-up belongs to a particular answer. So does a product card. Its position in a moving transcript is an unreliable way to identify that answer. Read Perplexity’s experiment note.
Make the race happen on demand
Here is a complete JavaScript reproduction. The user changes tasks between starting the lookup and resolving it. Run it in Node.
const slots = new Map();
let current = "headlamp";
const requestedTurn = current;
let finish;
const offer = new Promise(resolve => { finish = resolve; });
const paint = offer.then(card => {
if (requestedTurn === current) slots.set(requestedTurn, card);
});
current = "battery repair";
finish("Sponsored headlamp");
await paint;
if (slots.size !== 0) throw Error("Stale placement");
Change the callback to slots.set(current, card) and the example fails. A fast local network can hide this bug for months. A promise you resolve by hand reproduces it every time.
This example uses a policy that drops offers once the reader moves on. If a publisher wants old answers to retain their offers, it can instead write to the original answer’s slot. Either policy starts with capturing the turn ID before the request leaves.