/* Banyan Pharmacy — Pilots (consumer-product A/B; the "next" capability) */ function PilotChart({ series }) { const W = 640, H = 260, padL = 44, padR = 20, padT = 18, padB = 38; const ymax = 15, ymin = 0; const xs = (i) => padL + (i / (series.length - 1)) * (W - padL - padR); const ys = (v) => padT + (1 - (v - ymin) / (ymax - ymin)) * (H - padT - padB); const line = (key) => series.map((d, i) => `${i === 0 ? "M" : "L"} ${xs(i)} ${ys(d[key])}`).join(" "); const yticks = [0, 5, 10, 15]; return ( {yticks.map((t) => ( {t}% ))} {series.map((d, i) => ( {d.week} ))} {/* control */} {series.map((d, i) => )} {/* test */} {series.map((d, i) => )} {/* end labels */} {series[series.length - 1].test}% {series[series.length - 1].control}% ); } function PilotsPage() { const app = useApp(); const p = D.pilot; const focus = app.loopFocus && app.loopFocus.kind === "pilot"; return ( Pilots Consumer-product experiments — as Terrace reads sell-through. The “next” capability, beyond availability. {p.product}Roll out {p.metric} · {p.weeks} weeks · {p.id} +{p.lift}% attach-rate lift {p.summary} {p.testStores.length} test stores {p.controlCount} control stores reads sell-through, not stock TestControl} /> {p.testStores.map((id) => { const st = D.storeById[id]; return ( app.nav({ name: "store", id })}> {st.locality}{st.region} ); })} Decision · {p.decision} A consistent +{p.lift}% attach-rate over {p.weeks} weeks against control. Retention is the next conversation — once loyalty data is in. ); } window.Pages = window.Pages || {}; window.Pages.Pilots = PilotsPage;
{p.summary}