# Review-page copy archive — 2026-08-25, before the features-and-decisions restructure
<!-- Internal reference. The client page was restructured to rian's pitch (big picture /
     features / coverage / machine / bigger ideas + demo picker); these are the sections
     and feature blurbs it replaced. The still-wordier first-generation narrative is
     summarized across .logs/handoff.md entries for 8/23-8/25. -->

## SECTIONS (lib/review.ts as of tonight)
```
/**
 * The client review page's copy.
 *
 * The client skims and relies on the video, so every section is a handful of
 * short paragraphs: the essential point, nothing else. The commentable items
 * hang off the section that explains them.
 *
 * House style for anything the client reads: no em dashes. Scope discipline:
 * this page describes what the demo shows, and does not narrate internal
 * process or work outside it.
 */
export interface ReviewSection {
  id: string;
  eyebrow: string;
  title: string;
  /** Short paragraphs. Plain sentences, no jargon, no shorthand. */
  body: string[];
  /** Which discussion items belong under it. */
  theme?: string;
  /** Where to go and see it, rather than take the prose's word. */
  link?: { to: string; label: string };
}

export const SECTIONS: ReviewSection[] = [
  {
    id: "built",
    eyebrow: "What happened",
    title: "What you are looking at",
    body: [
      "The core ask works: search a bottle, see what it costs at each airport, decide where to buy. Your own example is live, so open it and check the figures rather than taking mine.",
      "Pick the airports you will be at and the whole site prices for your trip: the catalogue, the savings, every product page.",
    ],
    link: {
      to: "/products/johnnie-walker-blue-label-blended-scotch-whisky-1l-60",
      label: "See the Johnnie Walker Blue comparison",
    },
  },
  {
    id: "data",
    eyebrow: "Reliability",
    title: "Can you trust the numbers?",
    theme: "data",
    body: [
      "Every price was published by the shop itself and carries the date we read it. Nothing is typed in and nothing is estimated.",
      "We spot-checked stored prices against the live retailer pages: eleven of twelve matched to the penny, and the twelfth had gone on sale in the meantime, so sale prices now show alongside the everyday price.",
      "Automated checks run before every update, and a price that looks implausible is held back rather than shown. Prices still move between our reading and your looking, and what a traveller pays can vary by destination and loyalty tier. The site says so on every product page.",
    ],
  },
  {
    id: "coverage",
    eyebrow: "Reach",
    title: "Which shops we can read",
    theme: "coverage",
    body: [
      "Duty free is a handful of large operators. Where catalogues are public we read them. Several of the biggest names publish no prices at all, and some ask not to be read, so they are absent. The coverage page lists both sides plainly.",
      "Widening from here is mostly conversations with operators rather than more code, and Cannes is where those happen.",
    ],
  },
  {
    id: "conduct",
    eyebrow: "How we work",
    title: "How we behave on their websites",
    theme: "conduct",
    body: [
      "Four rules, always: we never sign in; we take facts (prices, sizes, barcodes), never photography or marketing copy; we read slower than each site asks; and when a site says no, we stop.",
      "That is why the project carries so little legal risk, why a few shops are missing, and why this can walk up to any operator at Cannes with a straight face.",
    ],
  },
  {
    id: "running",
    eyebrow: "Upkeep",
    title: "Keeping it alive",
    theme: "running",
    body: [
      "Collection runs by hand today, which is deliberate for a proof of concept. The next step is a schedule, plus an alarm that fires when a shop suddenly returns far less than it did last time.",
      "Running cost is small. The real cost is care: sites redesign, and someone has to notice and adjust.",
    ],
  },
];

export const DECISIONS_INTRO = [
  "A one-line comment on each is plenty. The first two matter most; the rest can wait for a conversation.",
];

export const CLOSING = [
  "The proof of concept set out to answer one question: is this real and worth continuing? It answers with your own data, not a demo dataset. Next comes scheduled collection with that alarm, wider coverage, and the operator conversations, and we scope that together.",
];
```

## BUILT / PLANNED lists (DiscussionPage.tsx as of tonight)
```
const BUILT: { name: string; extent: "solid" | "partial"; body: string; to?: string }[] = [
  { name: "Cross-airport price comparison", extent: "solid", to: "/products",
    body: "Bottles matched by barcode, so the same bottle at each airport is genuinely the same row." },
  { name: "Your airports", extent: "solid", to: "/savings",
    body: "Pick where you are flying and the whole site prices for your trip." },
  { name: "Product pages", extent: "solid", to: "/products",
    body: "Every shop's latest price with the date it was checked, stock, and sale prices." },
  { name: "Search, categories, filters", extent: "solid", to: "/products",
    body: "Your taxonomy from the wireframe; filters for winners, exclusives, comparable-only." },
  { name: "Competition medals", extent: "solid", to: "/awards",
    body: "Your medals on the bottles that won them, matched cautiously: ambiguous means no medal." },
  { name: "Featured savings", extent: "solid", to: "/",
    body: "The home page leads with the biggest genuine gaps; a too-good-to-be-true price is not featured until enough shops corroborate it." },
  { name: "Travel exclusives", extent: "solid", to: "/exclusives",
    body: "Bottles sold only in travel retail, marked by the retailers themselves." },
  { name: "Coverage page", extent: "solid", to: "/airports",
    body: "Which shops we read, when each was last checked, and who said no." },
  { name: "Ready for search engines", extent: "solid",
    body: "Product schema, unique titles, descriptive addresses, a sitemap. Indexing starts the day the password comes off." },
  { name: "Product photos", extent: "partial",
    body: "Openly licensed sources only; brand uploads through your network is a decision below." },
  { name: "Editorial home page", extent: "partial", to: "/",
    body: "The magazine layer from your mockup, slots marked as samples until the writers have a home." },
  { name: "Promotions", extent: "partial",
    body: "Sale price shown against the everyday price; how loud to be about it is a decision below." },
];
const PLANNED: { name: string; body: string; to?: string }[] = [
  { name: "More airports", to: "/airports",
    body: "Another airport on a platform we already read is configuration, not code. The closed operators are partnership conversations." },
  { name: "Scheduled collection", body: "Prices refresh on a schedule, with an alarm when a shop returns far less than last time." },
  { name: "Price tracker", to: "/feature/price-tracker",
    body: "How a bottle's price has moved, per airport, from the dates we store." },
  { name: "Reviews & tasting notes", to: "/feature/reviews",
    body: "Human-written, tied to the exact bottle and its live prices." },
  { name: "Buying guides", to: "/feature/guides", body: "What to buy and what to skip, pulling in live prices." },
  { name: "News", to: "/feature/news", body: "The trade stories, published next to the prices they affect." },
  { name: "Newsletter", to: "/feature/newsletter", body: "The month's best genuine gaps, new exclusives, new medals." },
  { name: "Airport guides", to: "/feature/airport-guides", body: "A page per airport: what's stocked, what's exclusive, where it wins." },
  { name: "Interactive map", to: "/feature/map", body: "Click an airport, see its prices." },
  { name: "Price alerts & accounts", to: "/feature/alerts", body: "Follow a bottle and hear when it drops. The first feature that needs visitor accounts." },
  { name: "Duty Free Awards medals", body: "The badge slot is built; DFA results flow in once the competition runs." },
];
```
