A business page reorders its sections for the moment it is read (closed now, mealtime, an urgent trade on a phone), never changing what the page says, measured by a site-split experiment.
A Doozer business page used to be a snapshot: the same order of sections for every visitor at every hour. Live composition lets the page lead with what someone needs right now, using only what we honestly know at that moment. If the place is closed, the hours come first so the visitor can plan. If it is an emergency plumber and the visitor is on a phone while it is open, the ways to call come first. If it is lunchtime at a restaurant whose menu Jon has reviewed, the menu comes first.
It is the first working piece of the "Doozer is the data, the site is what you need to see now" direction. It changes order only. Every visitor gets the same sections with the same words.
includes/live-compose.php, called from includes/business-site.php.
products, photos with the image band, reviews, FAQ, hours with the weather card, contact) renders in today's order into its own output buffer. Execution order never changes, so the photo de-duplication between sections, the muse flourish slots and the feature band's photo all stay exactly as they were.
or two blocks up and leaves the rest where they were, so a composed page still reads like the same site and one move is one measurable change.
byte-identical to the page before this existed (checked on live pages).
The hero, header, answer block, structured data, sticky call bar and footer never move.
the venue's local time and open state, the device class from the user agent, and signals a visitor carries (first-party cookies, a referrer backed by real browser navigation headers, a saved location). Search crawlers carry none of those, so they see exactly what a cookieless phone or desktop sees at that moment. That is dynamic serving, which Google documents as acceptable, and the response declares Vary: User-Agent.
hours banner says closed, from one open-state computation per request that the banner, the contact card and the composer all share. A menu leads only while its exact contents match the hash stamped when Jon approved it on the Enrichment Review page. Reviews lead only for a rating of 4.0 or better from 10 or more ratings.
position (a jumbled zine grid, irregular rhythm, rotated handbill cards) keep the standard order.
"Closed".
The experiment splits sites, not visitors: half the sites (by a hash of the site id) keep the standard order. A crawler therefore never sees different orders for one site from different addresses. The holdout has an end date.
An exposure is counted only when the page's own script reports a trusted interaction while the page is visible, using a signed token and no write at render time. Scrapers without a real browser never enter the denominator. The primary metric is an engaged visit (15 seconds visible plus an interaction). Taps carry the exposure id, so they join exactly. At about three real taps a day across the network, taps alone could not settle anything within a year. Shadow mode runs the same measurement with everyone on the standard order, as an A/A check that the instrument is not lying.
dz compose shows settings and today's exposures.dz compose migrate=1 creates the exposure table.dz compose mode=off|shadow|live switches the whole thing. Off is instant and total.dz compose trace=1 host=<site> explains a decision.dz compose parity=1 host=<site> proves each crawler gets its browser twin's order.dz compose report=1 reports per arm, and prints no lift until the sample supports it.?dzcompose=<order>. The previewis marked noindex. Anyone else's parameter is ignored.
The fast decision model (Jev) can be asked which order it would choose, and its answer is logged beside the rules. During the experiment it is never served: its input carries no business facts and its model can change mid-test. It stays off until a key exists and the operator turns it on.
survive a rendering crawler.