[
  {"title":"Which airports matter for the Cannes demo","note":"The demo needs a target list — which 10 to 50 airports should it cover?","reality":"One Avolta adapter already reaches 168 airports as config, not new code; Dubai adds the world's biggest single store. Breadth is cheap once a retail platform is supported.","recommendation":"Adam names the launch list at the review meeting; we prioritise the platforms that unlock the most of it.","theme":"Product","needs_decision":true},
  {"title":"Liquor first, or everything sold in duty free?","note":"The PoC is spirits-only; Adam's brief says fragrance, beauty, tobacco and confectionery too.","reality":"The category taxonomy already matches Adam's own wireframe and the schema carries every category. Spirits ships first because it is the hardest to match and so proves the pipeline.","recommendation":"Confirm the category rollout order (spirits, then fragrance, then the rest); each new category is more shops, not a rebuild.","theme":"Scope","needs_decision":true},
  {"title":"How fresh must the prices be?","note":"Refresh frequency and airport count are the two dials that drive the running cost.","reality":"Harvesting listing pages keeps cost around US$16-120/month; daily refresh across many airports pushes it up, weekly keeps it low. Collection is manual for the demo.","recommendation":"Pick a cadence (likely weekly to start) at the review meeting; it can differ per source.","theme":"Cost","needs_decision":true},
  {"title":"Where product photos come from","note":"Retailer photography is their copyright; we cannot rehost it.","reality":"Every comparable lawsuit was won on imagery, not prices. Current photos come from openly-licensed Open Food Facts keyed on barcode — about a 12% hit rate, best on big brands.","recommendation":"Treat brand-supplied official shots as the durable answer — a partnership ask for Cannes; ship without a photo where none exists.","theme":"Images","needs_decision":true},
  {"title":"Retailer data partnerships beat scraping","note":"Some shops publish fake or no barcodes, so matching in those shops is weak.","reality":"Barcodes (GTIN) turn cross-shop matching into a reliable database join. Some retailers — especially Latin American Shopify stores — publish internal SKUs or none, so matches there become guesswork.","recommendation":"Use Cannes to secure clean product feeds from operators; a data relationship is the durable version of this business.","theme":"Data quality","needs_decision":true},
  {"title":"Keep WordPress for the writers, or move?","note":"Kristine and Matt need to post content and results independently.","reality":"The competition sites run on WordPress today. It can stay as a headless CMS feeding this app, or the writers move to a new editor — either way, training is part of the change.","recommendation":"A people decision, not a technical one — defer to the review meeting; the bar is Kristine and Matt fully independent.","theme":"Content","needs_decision":true},
  {"title":"Map, alerts, accounts: launch or later?","note":"The interactive map, price alerts and user accounts are all out of the PoC.","reality":"The September audience is trade buyers, not travellers, so the priority is breadth of locations and a demo that survives industry scrutiny — not consumer features.","recommendation":"Confirm these are post-Cannes; add them only once the core comparison proves itself with operators.","theme":"Product","needs_decision":true},
  {"title":"Who owns the scraping vendor account","note":"If a paid fetcher is ever used, whose account holds the key matters.","reality":"An agency-owned key means Adam cannot take the product elsewhere without a migration; a client-owned key means rian debugs billing he cannot see. The code itself is Adam's, movable off this server.","recommendation":"Register any paid fetcher under Adam's own account from the start.","theme":"Cost","needs_decision":true},
  {"title":"A lawyer should review before launch","note":"The PoC is negligible-risk; a commercial launch is a different conversation.","reality":"A few dozen products, logged-out, facts-only, at trivial volume is a safe proof of concept. Many airports refreshed daily as a commercial product warrants a real legal check.","recommendation":"Budget about 30 minutes with a lawyer before launch — not before the demo.","theme":"Legal","needs_decision":true},
  {"title":"The biggest airports mostly publish nothing","note":"Several of the world's busiest duty-free operators block or simply do not publish prices.","reality":"Dubai is reachable and is the industry's best data source, but Doha, Amsterdam, Istanbul, Incheon and Paris CDG publish nothing public or block automated access. Coverage is real but uneven.","recommendation":"Show the gaps honestly in the UI and treat each closed operator as a Cannes business-development opening, not a defect.","theme":"Coverage","needs_decision":false},
  {"title":"We do not evade shops that block us","note":"Some retailers block automated access; the project deliberately does not force past it.","reality":"Defeating a bot wall is the centre of current litigation and can be criminal in the EU/UK. More importantly, Adam's business is relationships with these very operators — evasion would damage the competitions.","recommendation":"Build on the open doors; log every blocked shop as a partnership ask for Cannes instead of forcing entry.","theme":"Legal","needs_decision":false},
  {"title":"A scraped price is a sample, not the price","note":"The same bottle can carry several prices depending on who is buying and where they fly.","reality":"Avolta is rolling out dynamic pricing by customer profile; member prices are invisible to anonymous collection; per-destination and per-terminal rules exist. A scraped figure is one public observation.","recommendation":"The app already shows each price with its collection date and source — keep that framing and never promise 'the price'.","theme":"Data quality","needs_decision":false},
  {"title":"Online prices differ from in-store prices","note":"Some shops discount online by a fixed amount versus the in-store counter price.","reality":"Online discounts are structural, not promotional — one operator shows '10% off online'. Showing an online price to someone standing in the shop would confidently misinform them.","recommendation":"Model online and in-store as separate price types and label which one each figure is.","theme":"Data quality","needs_decision":false},
  {"title":"Harvest listing pages, not each product","note":"This one design choice moves the running cost by about 40 times.","reality":"Pulling 40 products from one listing request, instead of one request per product, is the same data at a fraction of the volume — roughly US$16-120/month versus hundreds. Vendor choice only moves cost about 3x.","recommendation":"Already the design rule: get every field from listing endpoints and treat product-page fetches as the exception.","theme":"Cost","needs_decision":false},
  {"title":"Access is ongoing upkeep, not solved once","note":"Sites that work today can harden tomorrow; collection needs maintenance.","reality":"Bot defences have moved to fingerprint coherence and behavioural scoring, and robots.txt is increasingly enforced mechanically by CDNs. Politely-open sources can close, so coverage needs tending.","recommendation":"Frame maintenance to stakeholders as ongoing, and let partnerships replace the fragile scraped sources over time.","theme":"Data quality","needs_decision":false},
  {"title":"Take facts, never log in","note":"The whole legal posture rests on two simple rules.","reality":"Price, size, ABV, brand and airport are uncopyrightable facts; marketing copy and photos are not. Logging in is what creates an enforceable contract — every safe-harbour case scraped only while logged out.","recommendation":"Store structured facts only, never rehost photos or marketing prose, and always link back to the source retailer.","theme":"Legal","needs_decision":false},
  {"title":"Rate-limit, honour robots, keep a kill switch","note":"Politeness is the real damages defence, and stopping on request is mandatory.","reality":"The one retail scraping case with real exposure was about crashing a site with request volume, not price data. A cease-and-desist turns an unenforceable notice into a binding contract the moment it is ignored.","recommendation":"Keep the per-source kill switch (already built) so any collector stops in seconds, and route retailer contact to rian the same day.","theme":"Legal","needs_decision":false},
  {"title":"No Duty Free Awards medals exist yet","note":"The DFA competition has not run, so it has no winners to badge.","reality":"The awards slot fills automatically when DFA runs. Meanwhile the demo badges real medals from the existing New York, Berlin, Melbourne and Asia competitions via their own winners data.","recommendation":"Ship with the real existing medals now; DFA badges appear on their own once that competition produces winners.","theme":"Content","needs_decision":false},
  {"title":"Third-party medals double as a sales list","note":"Awards printed on retailer pages are captured for free during collection.","reality":"IWSC, SFWSC and similar medals already shown on product listings are recorded as we collect. That yields a record of which award-winning products are actually stocked in duty free.","recommendation":"Offer Adam this as a competition-entry prospect list — a free by-product of the pipeline.","theme":"Content","needs_decision":false},
  {"title":"The code is Adam's and stays portable","note":"Nothing ties the app to rian's server or to any single vendor.","reality":"The fetch layer is a swappable interface — if a supplier raises prices or dies, one config line changes, not the architecture. Auth is app-native, not borrowed from rian's login system.","recommendation":"No action needed — this is a design guarantee; keep vendor choices as line-items, never as lock-in.","theme":"Product","needs_decision":false}
]
