% Final thesis defense (PHANTOM)
% Build: cd paper/defense && pdflatex defense.tex && pdflatex defense.tex
%
% =========================================================================
% NOTATION GUIDE (every variable used in this deck is defined once here)
% =========================================================================
%
% PRICING & POLICY
%   p_t              price action at time t                [EUR per booking]
%   p_floor          minimum viable price (marginal cost)  [EUR per booking]
%   E[P]             expected price under policy pi        [EUR per booking]
%   pi(x_t)          policy mapping context to price
%   x_t              context vector (product, time, behavior signals)
%   R(p, q)          revenue per session, equals p * q     [EUR per session]
%
% COST OF INFORMATION
%   COI(pi) = E[P] - p_floor                               [EUR per transaction]
%   This is the average premium the platform extracts above marginal cost,
%   i.e. the financial value of "knowing the customer's interest".
%
% BEHAVIOR & SESSIONS
%   tau              full session trajectory of (action, item, time) tuples
%   tau'             partial trajectory observed at scoring time
%   T_hat(s'|s)      empirical session transition kernel (a square table:
%                    rows are current actions, columns are next actions,
%                    each row sums to one)
%   T_H_bar          human prototype kernel (reference for human cohort)
%   T_A_bar          agent prototype kernel (reference for agent cohort)
%
% DETECTION SIGNAL
%   Delta_H = KL(T_hat' || T_H_bar)   distance to human prototype
%   Delta_A = KL(T_hat' || T_A_bar)   distance to agent prototype
%   g(tau') = Delta_H - Delta_A       signed gap, zero is the boundary
%   f(tau') = sigmoid(g/T) in [0,1]   agent-likelihood score
%   T                temperature for the sigmoid (unitless)
%   threshold        decision boundary at f = 0.5 (g = 0)
%
% DEMAND & CONTAMINATION
%   d(p|theta)       individual demand response, theta is type
%   alpha            contamination ratio, fraction of agent-mediated traffic
%   Q(p|alpha)       aggregate demand under contamination alpha
%
% ROBUST CONTROL
%   P_hat_N          empirical demand distribution from N samples
%   U_eps(P_hat_N)   Wasserstein ambiguity ball of radius eps
%   lambda           weight on COI-leakage penalty in the reward
%   eta_ux           weight on UX penalty in the reward
%   c_info           per-query info cost surrogate           [EUR per query]
%   UX(tau, p)       user-experience penalty in [0,1]
%
% =========================================================================

\documentclass[aspectratio=169,11pt]{beamer}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{microtype}
\usepackage{amsmath,amssymb}
\usepackage{graphicx}
\usepackage{xspace}
\usepackage{booktabs}
\usepackage{appendixnumberbeamer}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,calc,positioning,fit,shapes.geometric,shapes.misc,decorations.pathreplacing}

\graphicspath{{../src/chapters/figures/results/generated/final/plots/}{../src/chapters/}}

\usetheme[
  progressbar=frametitle,
]{moloch}
\molochset{sectionpage=none,subsectionpage=none}
\usefonttheme{professionalfonts}
\setbeamertemplate{frame numbering}[fraction]

% Dark palette: deep ink canvas, cream paper text, orange + teal accents
\definecolor{PhantomPaper}{HTML}{F6F1E9}
\definecolor{PhantomInk}{HTML}{0F1B2D}
\definecolor{PhantomSlate}{HTML}{B5C2D2}
\definecolor{PhantomCyan}{HTML}{E08A4C}
\definecolor{PhantomIndigo}{HTML}{4FB8B2}
\definecolor{PhantomPeach}{HTML}{EEC39C}
\definecolor{PhantomMute}{HTML}{4A5566}

\setbeamercolor{normal text}{fg=PhantomPaper,bg=PhantomInk}
\setbeamercolor{background canvas}{bg=PhantomInk}
\setbeamercolor{alerted text}{fg=PhantomCyan}
\setbeamercolor{example text}{fg=PhantomIndigo}
\setbeamercolor{palette primary}{fg=PhantomPaper,bg=PhantomInk}
\setbeamercolor{frametitle}{fg=PhantomPaper,bg=PhantomInk}
\setbeamercolor{progress bar}{fg=PhantomCyan,bg=PhantomMute!50}
\setbeamercolor{title separator}{fg=PhantomCyan,bg=PhantomMute!50}
\setbeamercolor{structure}{fg=PhantomCyan}
\setbeamercolor{block title}{fg=PhantomPaper,bg=PhantomMute!70!PhantomInk}
\setbeamercolor{block body}{fg=PhantomPaper,bg=PhantomMute!35!PhantomInk}
\setbeamercolor{alertblock title}{fg=PhantomInk,bg=PhantomCyan}
\setbeamercolor{alertblock body}{fg=PhantomPaper,bg=PhantomCyan!25!PhantomInk}
\setbeamercolor{exampleblock title}{fg=PhantomInk,bg=PhantomIndigo}
\setbeamercolor{exampleblock body}{fg=PhantomPaper,bg=PhantomIndigo!25!PhantomInk}

\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{itemize item}{\small\raise0.3ex\hbox{$\bullet$}}
\setbeamertemplate{itemize subitem}{\tiny\raise0.2ex\hbox{$\circ$}}

\hypersetup{colorlinks=true,urlcolor=PhantomCyan,linkcolor=PhantomInk}

\title{PHANTOM}
\subtitle{Pricing Heuristics Against Non-human Transaction Orchestration Mechanisms}
\author{Daniel R\"osel}
\institute{IE University, Madrid \\ Supervisor: Alberto Mart\'in Izquierdo}
\date{\today}

% Variable explanation block: \vardef{symbol}{description}
\newcommand{\vardef}[2]{%
  \par\noindent\makebox[1.55cm][l]{\textbf{\color{PhantomCyan}#1}}%
  \parbox[t]{\dimexpr\linewidth-1.65cm}{\small #2}\par\smallskip%
}

\newcommand{\metriccard}[2]{%
  \begin{tikzpicture}
    \node[
      draw=PhantomInk,
      rounded corners=3pt,
      fill=PhantomCyan!10,
      minimum width=3.05cm,
      minimum height=1.25cm,
      align=center
    ] {\Large\bfseries #1\\[-0.2em]{\scriptsize #2}};
  \end{tikzpicture}%
}

% Compact inline icons (text-based, no nested tikzpictures).
% Dynamic color: uses current text color so icons stay visible inside
% blocks (dark text) and on the dark canvas (light text).
\newcommand{\humanicon}{\textbf{\textsf{H}}\xspace}
\newcommand{\roboticon}{\textcolor{PhantomCyan}{\textbf{\textsf{A}}}\xspace}
\newcommand{\platformicon}{\textcolor{PhantomIndigo}{\textbf{\textsf{P}}}\xspace}

% Big diagram icons (drawn directly inside an outer tikzpicture, no nesting)
\newcommand{\bighumanicon}[1]{%
  \fill[PhantomInk] (#1) ++(0,0.45) circle (0.18);
  \draw[PhantomInk,line width=0.6pt,fill=PhantomSlate!30] (#1) ellipse (0.32 and 0.22);
}
\newcommand{\bigroboticon}[1]{%
  \draw[PhantomInk,line width=0.6pt,rounded corners=2pt,fill=PhantomCyan!30] ($(#1)+(-0.42,-0.30)$) rectangle ($(#1)+(0.42,0.34)$);
  \fill[PhantomPaper] ($(#1)+(-0.18,0.05)$) circle (0.09);
  \fill[PhantomPaper] ($(#1)+(0.18,0.05)$) circle (0.09);
  \fill[PhantomInk] ($(#1)+(-0.18,0.05)$) circle (0.035);
  \fill[PhantomInk] ($(#1)+(0.18,0.05)$) circle (0.035);
  \draw[PhantomInk,line width=0.6pt] ($(#1)+(0,0.34)$) -- ($(#1)+(0,0.50)$);
  \fill[PhantomCyan] ($(#1)+(0,0.55)$) circle (0.05);
}
\newcommand{\bigplatformicon}[1]{%
  \draw[PhantomInk,line width=0.6pt,rounded corners=2pt,fill=PhantomIndigo!25] ($(#1)+(-0.32,-0.32)$) rectangle ($(#1)+(0.32,0.32)$);
  \node[font=\small\bfseries,text=PhantomInk] at (#1) {P};
}

\tikzset{every node/.append style={text=PhantomInk}}

\begin{document}

% =========================================================================
% TITLE
% =========================================================================
\begin{frame}[plain]
  \vfill
  \centering
  {\color{PhantomPaper}\Huge\bfseries PHANTOM\par}
  \vspace{0.6em}
  {\color{PhantomCyan}\rule{0.45\paperwidth}{0.06cm}\par}
  \vspace{0.8em}
  {\large\color{PhantomPaper}Pricing heuristics against non-human transaction orchestration\par}
  \vfill
  {\color{PhantomPaper}\normalsize Daniel R\"osel\par}
  {\color{PhantomSlate}\small IE University \textbullet\ Supervisor: Alberto Mart\'in Izquierdo\par}
  \vspace{1.2em}
  {\footnotesize\color{PhantomCyan}\href{https://velocitatem.github.io/PHANTOM/}{\texttt{velocitatem.github.io/PHANTOM}}}
  \vfill
\end{frame}

% =========================================================================
% ROADMAP (no minutes)
% =========================================================================
\begin{frame}{Roadmap: one argument in six stages}
  \centering
  \begin{tikzpicture}[
    font=\scriptsize\sffamily,
    stage/.style={draw=PhantomInk,rounded corners=3pt,fill=PhantomCyan!10,minimum width=2.05cm,minimum height=0.95cm,align=center},
    flow/.style={-{Stealth[length=2.0mm,width=1.8mm]},line width=1pt,PhantomSlate}
  ]
    \node[stage] (intro) {Two POVs};
    \node[stage,right=0.30cm of intro] (platform) {Platform};
    \node[stage,right=0.30cm of platform] (signal) {Signal};
    \node[stage,right=0.30cm of signal] (drrl) {DR-RL};
    \node[stage,right=0.30cm of drrl] (results) {Results};
    \node[stage,right=0.30cm of results] (close) {Close};
    \draw[flow,shorten <=2pt,shorten >=2pt] (intro.east) -- (platform.west);
    \draw[flow,shorten <=2pt,shorten >=2pt] (platform.east) -- (signal.west);
    \draw[flow,shorten <=2pt,shorten >=2pt] (signal.east) -- (drrl.west);
    \draw[flow,shorten <=2pt,shorten >=2pt] (drrl.east) -- (results.west);
    \draw[flow,shorten <=2pt,shorten >=2pt] (results.east) -- (close.west);
  \end{tikzpicture}

  \vspace{0.9em}
  \begin{block}{Main research question}
    How can dynamic pricing preserve margin integrity when transactions are
    increasingly mediated by non-human agents?
  \end{block}
  \vspace{0.35em}
  {\footnotesize Dynamic pricing has often been treated as a secondary
  optimization layer; agent-mediated shopping turns it into a primary
  margin-risk surface.}
\end{frame}

% =========================================================================
% TWO POVs - INTRO
% =========================================================================
\begin{frame}{This work cycles through two points of view}
  \centering
  \begin{tikzpicture}[
    font=\small\sffamily,
    box/.style={draw=PhantomInk,rounded corners=6pt,minimum width=5.2cm,minimum height=3.4cm,align=center}
  ]
    \node[box,fill=PhantomCyan!12] (consumer) at (-3.4,0) {};
    \node[box,fill=PhantomIndigo!12] (platform) at (3.4,0) {};
    \bighumanicon{-3.4,0.95}
    \bigplatformicon{3.4,0.95}
    \node[font=\small,align=center,text=PhantomInk] at (-3.4,-0.45)
      {\textbf{Consumer POV}\\[0.4em]
       \footnotesize\textit{``how much does this item cost?''}\\[0.2em]
       \footnotesize the question being asked};
    \node[font=\small,align=center,text=PhantomInk] at (3.4,-0.45)
      {\textbf{Platform POV}\\[0.4em]
       \footnotesize\textit{``what does this session reveal?''}\\[0.2em]
       \footnotesize the demand being inferred};
    \draw[<->,thick,PhantomSlate] (consumer.east) -- node[above,font=\scriptsize,text=PhantomPaper]{price quote} node[below,font=\scriptsize,text=PhantomPaper]{behavior trail} (platform.west);
  \end{tikzpicture}

  \vspace{0.6em}
  \begin{block}{Why two views}
    The same transaction looks very different from each side. We will switch
    between them to show where agent-mediation breaks the loop.
  \end{block}
\end{frame}

% =========================================================================
% POV 1 - DIRECT
% =========================================================================
\begin{frame}{POV 1: the consumer asks the platform directly}
  \centering
  \begin{tikzpicture}[
    font=\small\sffamily,
    actor/.style={draw=PhantomInk,rounded corners=5pt,minimum width=2.6cm,minimum height=1.4cm,align=center,fill=PhantomPaper},
    msg/.style={draw=PhantomInk!40,rounded corners=2pt,fill=PhantomCyan!8,inner sep=4pt,font=\scriptsize}
  ]
    \node[actor,fill=PhantomCyan!14] (h) at (-4.5,0) {\\[0.6em]consumer};
    \node[actor,fill=PhantomIndigo!14] (p) at (4.5,0) {\\[0.6em]platform};
    \bighumanicon{-4.5,0.25}
    \bigplatformicon{4.5,0.25}

    \draw[-{Stealth[length=2.5mm]},thick,PhantomPaper] ([yshift=0.45cm]h.east) -- ([yshift=0.45cm]p.west)
      node[midway,above,msg]{``how much does item $i$ cost?''};
    \draw[-{Stealth[length=2.5mm]},thick,PhantomPaper] ([yshift=-0.45cm]p.west) -- ([yshift=-0.45cm]h.east)
      node[midway,below,msg]{``it costs $p_t$''};
  \end{tikzpicture}

  \vspace{0.7em}
  \begin{columns}[T,onlytextwidth]
    \column{0.5\textwidth}
    \footnotesize
    \textbf{What you see:} a website opens, you read a price, you decide.\\[0.3em]
    \textbf{What the platform sees:} clicks, hovers, dwell time --- a clean
    behavioral fingerprint of one human session.
    \column{0.45\textwidth}
    \begin{block}{Variables}
      \vardef{$i$}{the item being shopped (e.g. a hotel night)}
      \vardef{$p_t$}{posted price at time $t$, in EUR per booking}
    \end{block}
  \end{columns}
\end{frame}

% =========================================================================
% POV 2 - VIA AGENT
% =========================================================================
\begin{frame}{POV 2: the consumer asks an AI agent}
  \centering
  \begin{tikzpicture}[
    font=\small\sffamily,
    actor/.style={draw=PhantomInk,rounded corners=5pt,minimum width=2.3cm,minimum height=1.3cm,align=center,fill=PhantomPaper},
    msg/.style={font=\tiny,text=PhantomSlate}
  ]
    \node[actor,fill=PhantomCyan!14] (h) at (-5.6,0) {};
    \node[actor,fill=PhantomCyan!14] (a) at (0,0) {};
    \node[actor,fill=PhantomIndigo!14] (p) at (5.6,0) {};
    \bighumanicon{-5.6,0}
    \bigroboticon{0,0}
    \bigplatformicon{5.6,0}

    \draw[-{Stealth[length=2.5mm]},thick,PhantomPaper] ([yshift=0.35cm]h.east) -- ([yshift=0.35cm]a.west)
      node[midway,above,msg]{``find prices for $i$''};
    \draw[-{Stealth[length=2.5mm]},thick,PhantomPaper] ([yshift=0.35cm]a.east) -- ([yshift=0.35cm]p.west)
      node[midway,above,msg]{repeated queries};
    \draw[-{Stealth[length=2.5mm]},thick,PhantomCyan] ([yshift=-0.35cm]p.west) -- ([yshift=-0.35cm]a.east)
      node[midway,below,msg,text=PhantomCyan]{many quotes};
    \draw[-{Stealth[length=2.5mm]},thick,PhantomCyan] ([yshift=-0.35cm]a.west) -- ([yshift=-0.35cm]h.east)
      node[midway,below,msg,text=PhantomCyan]{best price found};
  \end{tikzpicture}

  \vspace{0.5em}
  \begin{columns}[T,onlytextwidth]
    \column{0.55\textwidth}
    \footnotesize
    \textbf{Same intent, different visible behavior.} The platform sees a
    machine-paced session that looks nothing like the human who actually
    wants to buy.
    \column{0.40\textwidth}
    \begin{alertblock}{Information asymmetry flips}
      The agent samples many quotes before committing; the platform only
      sees the recon, not the buyer.
    \end{alertblock}
  \end{columns}
\end{frame}

% =========================================================================
% DEMAND FLOW - WHAT THE PLATFORM ACTUALLY OBSERVES
% =========================================================================
\begin{frame}{Two flows, one demand signal --- and only one is reliable}
  \centering
  \begin{tikzpicture}[font=\scriptsize\sffamily,
    flow/.style={-{Stealth[length=2.2mm]},thick,PhantomSlate},
    panel/.style={draw=PhantomInk,rounded corners=4pt,minimum width=5.5cm,minimum height=3.0cm,align=center,fill=PhantomPaper}]

    \node[panel,fill=PhantomCyan!8] (left) at (-3.4,0) {};
    \node[anchor=north,font=\footnotesize\bfseries] at (left.north) {\vphantom{p}direct human session};
    \coordinate (h1) at (-5.0,0.0);
    \bighumanicon{h1}
    \node[draw=PhantomInk,rounded corners=2pt,minimum width=1.4cm,minimum height=0.55cm,fill=PhantomPaper,font=\tiny] (pt1) at (-2.0,0.6) {one buyer};
    \node[draw=PhantomInk,rounded corners=2pt,minimum width=1.4cm,minimum height=0.55cm,fill=PhantomCyan!20,font=\tiny] (q1) at (-2.0,-0.6) {true demand};
    \draw[flow] ($(h1)+(0.3,0)$) -- (pt1.west);
    \draw[flow] ($(h1)+(0.3,0)$) -- (q1.west);

    \node[panel,fill=PhantomIndigo!8] (right) at (3.4,0) {};
    \node[anchor=north,font=\footnotesize\bfseries] at (right.north) {\vphantom{p}agent-mediated session};
    \coordinate (h2) at (1.4,0.0);
    \coordinate (a2) at (3.4,0.0);
    \bighumanicon{h2}
    \bigroboticon{a2}
    \node[draw=PhantomInk,rounded corners=2pt,minimum width=1.4cm,minimum height=0.55cm,fill=PhantomPaper,font=\tiny] (pt2) at (5.4,0.6) {many quotes};
    \node[draw=PhantomInk,rounded corners=2pt,minimum width=1.4cm,minimum height=0.55cm,fill=PhantomMute!30,font=\tiny] (q2) at (5.4,-0.6) {buyer hidden};
    \draw[flow] ($(h2)+(0.3,0)$) -- ($(a2)+(-0.42,0)$);
    \draw[flow] ($(a2)+(0.42,0)$) -- (pt2.west);
    \draw[flow] ($(a2)+(0.42,0)$) -- (q2.west);
  \end{tikzpicture}

  \vspace{0.5em}
  {\footnotesize\textbf{Takeaway.} On the right, the platform sees recon, not
  intent. Pricing trained on the visible signal will misread real demand.}
\end{frame}

% =========================================================================
% POLICY DEFINITION (variables explained)
% =========================================================================
\begin{frame}{Policy first: one rule maps context into a price}
  \begin{columns}[T,onlytextwidth]
    \column{0.50\textwidth}
    \begin{block}{Definition}
      \[
        p_t = \pi(x_t)
      \]
    \end{block}
    \vardef{$p_t$}{price quoted at time $t$ \;[EUR per booking]}
    \vardef{$\pi$}{the pricing policy --- a function the platform learns}
    \vardef{$x_t$}{context: product, time-of-day, and behavior summary of the session}

    \column{0.45\textwidth}
    \centering
    \begin{tikzpicture}[
      font=\scriptsize\sffamily,
      box/.style={draw=PhantomInk,rounded corners=4pt,minimum width=3.35cm,minimum height=0.85cm,align=center},
      flow/.style={-{Stealth[length=2.0mm]},thick,PhantomSlate}
    ]
      \node[box,fill=PhantomPaper] (ctx) at (0,1.35) {context $x_t$};
      \node[box,fill=PhantomIndigo!12] (pol) at (0,0.15) {policy $\pi$};
      \node[box,fill=PhantomCyan!15] (act) at (0,-1.05) {price $p_t$};
      \draw[flow] (ctx) -- (pol);
      \draw[flow] (pol) -- (act);
      \node[font=\tiny\itshape,text=PhantomSlate] at (0,-1.75) {bandits first; later extended to DR-RL};
    \end{tikzpicture}
  \end{columns}
\end{frame}

% =========================================================================
% COI METRIC (matches reference image style)
% =========================================================================
\begin{frame}{Cost of Information (COI) --- what the platform earns from \alert{knowing you}}
  \begin{columns}[T,onlytextwidth]
    \column{0.50\textwidth}
    \begin{block}{Definition}
      \vspace{0.2em}
      \centering
      \[
        \mathrm{COI}(\pi) = \mathbb{E}[P] - p_{\mathrm{floor}}
      \]
    \end{block}
    \vardef{$\mathbb{E}[P]$}{expected price the policy actually charges \;[EUR per booking]}
    \vardef{$p_{\mathrm{floor}}$}{minimum viable price (marginal cost / break-even floor)}
    \vardef{COI}{average premium the platform extracts above marginal cost \;[EUR per transaction]}

    \column{0.48\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily,x=0.95cm,y=0.85cm]
      \draw[->,thick,PhantomPaper] (-0.2,0) -- (5.6,0) node[right,text=PhantomPaper]{price $p$};
      \draw[->,thick,PhantomPaper] (0,-0.1) -- (0,3.0) node[above,text=PhantomPaper]{density};
      \draw[very thick,PhantomPaper,domain=0.2:5.2,smooth,samples=80]
        plot (\x, {2.5*exp(-((\x-2.6)^2)/1.0)});
      \draw[dashed,PhantomSlate] (1.2,0) -- (1.2,2.0) node[above,font=\tiny,text=PhantomPaper]{$p_{\mathrm{floor}}$};
      \draw[dashed,PhantomCyan,thick] (2.6,0) -- (2.6,2.5) node[above,font=\tiny,text=PhantomCyan]{$\mathbb{E}[P]$};
      \draw[decorate,decoration={brace,amplitude=4pt},PhantomCyan,thick] (1.2,2.7) -- (2.6,2.7) node[midway,above,font=\scriptsize,text=PhantomCyan]{COI};
    \end{tikzpicture}
  \end{columns}

  \vspace{0.3em}
  {\footnotesize\textit{The ``cost'' is from the consumer's POV: it is what they pay because the platform can read their interest. Revenue at risk equals COI $\times$ volume.}}
\end{frame}

% =========================================================================
% WHY AGENTS ERODE COI - SIMPLIFIED ORDER STATISTIC
% =========================================================================
\begin{frame}{Why agents erode COI: the realizable price drops to the minimum}
  \begin{columns}[T,onlytextwidth]
    \column{0.46\textwidth}
    \footnotesize
    A single buyer pays the price they were quoted.\\[0.4em]
    An agent samples $N$ independent quotes and the buyer pays
    \(\;p^{(1)} = \min(p_1,\dots,p_N)\).\\[0.4em]
    \textbf{Result:} as $N \to \infty$, $\mathrm{COI} \to 0$. More recon
    pushes realizable prices toward the floor.

    \vspace{0.5em}
    \begin{alertblock}{One-line claim}
      Untreated agentic recon behaves like an information leak that
      compresses sustainable margins.
    \end{alertblock}

    \column{0.50\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily,x=0.65cm,y=0.85cm]
      \draw[->,thick,PhantomPaper] (0,0) -- (6.5,0) node[right,text=PhantomPaper]{queries $N$};
      \draw[->,thick,PhantomPaper] (0,0) -- (0,2.6) node[above,text=PhantomPaper]{COI [EUR]};
      \draw[very thick,PhantomCyan,domain=0.2:6.0,smooth,samples=60]
        plot (\x, {2.2*exp(-0.55*\x)+0.12});
      \draw[dashed,PhantomSlate] (0,0.12) -- (6.0,0.12);
      \node[anchor=west,font=\tiny,text=PhantomSlate] at (3.4,0.32) {price-floor proximity};
      \node[anchor=west,font=\tiny,text=PhantomPaper] at (0.4,2.2) {single human};
      \node[anchor=west,font=\tiny,text=PhantomCyan] at (3.4,1.0) {agent-amplified};
    \end{tikzpicture}
  \end{columns}
\end{frame}

% =========================================================================
% RESEARCH QUESTIONS - SQ1 SQ2 SQ3
% =========================================================================
\begin{frame}{The thesis answers one chain: \alert{mechanism \(\to\) signal \(\to\) control}}
  \begin{columns}[T,onlytextwidth]
    \column{0.32\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily]
      \draw[rounded corners=4pt,draw=PhantomInk,fill=PhantomPaper] (-1.55,-1.1) rectangle (1.55,1.2);
      \fill[PhantomCyan] (-0.75,0.35) circle (0.14);
      \fill[PhantomCyan] (-0.45,0.70) circle (0.14);
      \fill[PhantomCyan] (-0.15,0.45) circle (0.14);
      \fill[PhantomIndigo] (0.35,-0.20) circle (0.14);
      \fill[PhantomIndigo] (0.65,-0.45) circle (0.14);
      \fill[PhantomIndigo] (0.95,-0.15) circle (0.14);
      \draw[dashed,PhantomInk!60] (0.12,-0.92) -- (0.12,1.0);
      \node[text=PhantomMute,font=\tiny] at (0,-0.97) {behavior separability};
    \end{tikzpicture}
    {\footnotesize\textbf{SQ1}}\\[-0.15em]
    {\scriptsize Can we distinguish \humanicon and \roboticon sessions from interactions alone?}

    \column{0.32\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily]
      \draw[rounded corners=4pt,draw=PhantomInk,fill=PhantomPaper] (-1.55,-1.1) rectangle (1.55,1.2);
      \draw[->,thick,PhantomMute] (-1.15,-0.75) -- (1.2,-0.75) node[right,font=\tiny,text=PhantomMute,xshift=-3pt,yshift=4pt]{$\alpha$};
      \draw[->,thick,PhantomMute] (-1.15,-0.75) -- (-1.15,0.85) node[above,font=\tiny,text=PhantomMute,yshift=-4pt,xshift=8pt]{COI};
      \draw[very thick,PhantomCyan,domain=-1.0:1.05,smooth,samples=40] plot (\x, {0.65*exp(-1.2*(\x+1.0))-0.05});
      \draw[dashed,PhantomMute] (-1.15,-0.55) -- (1.05,-0.55);
      \node[text=PhantomMute,font=\tiny,xshift=2pt] at (-0.4,-0.45) {floor};
      \node[text=PhantomMute,font=\tiny] at (0,-0.97) {COI erodes as $\alpha\uparrow$};
    \end{tikzpicture}
    {\footnotesize\textbf{SQ2}}\\[-0.15em]
    {\scriptsize How strong is price and revenue erosion under agentic contamination?}

    \column{0.32\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily]
      \draw[rounded corners=4pt,draw=PhantomInk,fill=PhantomPaper] (-1.55,-1.1) rectangle (1.55,1.2);
      \draw[->,thick,PhantomMute] (-1.15,-0.75) -- (1.2,-0.75) node[right,font=\tiny,text=PhantomMute,xshift=-3pt,yshift=4pt]{UX};
      \draw[->,thick,PhantomMute] (-1.15,-0.75) -- (-1.15,0.85) node[above,font=\tiny,text=PhantomMute,yshift=-4pt,xshift=10pt]{margin};
      \fill[PhantomSlate] (-0.55,-0.40) circle (2.6pt);
      \node[text=PhantomMute,font=\tiny] at (-0.55,-0.13) {baseline};
      \fill[PhantomCyan] (0.55,0.45) circle (2.8pt);
      \node[text=PhantomCyan,font=\tiny] at (0.55,0.72) {robust};
      \draw[->,thick,PhantomCyan,dashed] (-0.40,-0.30) -- (0.40,0.35);
      \node[text=PhantomMute,font=\tiny] at (0,-0.97) {robust dominates baseline};
    \end{tikzpicture}
    {\footnotesize\textbf{SQ3}}\\[-0.15em]
    {\scriptsize Can policy design recover margin while keeping UX stable?}
  \end{columns}
\end{frame}

\section{Platform Development}

% =========================================================================
% PLATFORM (Stage 1)
% =========================================================================
\begin{frame}{Stage 1: a dual-loop platform pairs every quote with its behavior}
  \centering
  \begin{tikzpicture}[
    font=\scriptsize\sffamily,
    box/.style={draw=PhantomInk,rounded corners=3pt,minimum width=2.5cm,minimum height=0.9cm,align=center,fill=PhantomPaper},
    arr/.style={-{Stealth[length=2.2mm]},thick,PhantomSlate}
  ]
    \node[box,fill=PhantomCyan!14] (actors) at (0,1.45) {users \humanicon\\agents \roboticon};
    \node[box] (web) at (2.9,1.45) {web\\storefront};
    \node[box] (provider) at (5.8,1.45) {pricing\\service};
    \node[box] (redis) at (8.7,1.45) {serve\\cache};
    \node[box,fill=PhantomIndigo!12,minimum width=3.1cm] (kafka) at (4.35,-0.15) {event stream\\behavior + quote logs};
    \node[box,fill=PhantomCyan!10,minimum width=2.8cm] (airflow) at (8.0,-0.15) {offline trainer\\batch updates};

    \draw[arr] (actors) -- (web);
    \draw[arr] (web) -- (provider);
    \draw[arr] (provider) -- (redis);
    \draw[arr] (web.south) -- (kafka.north west);
    \draw[arr] (provider.south) -- (kafka.north east);
    \draw[arr] (kafka) -- (airflow);
    \draw[arr] (airflow.north) -| (redis.south);
    \draw[arr] (redis.west) to[bend left=35] (provider.east);

    \node[font=\tiny\itshape,text=PhantomSlate] at (2.2,-1.0) {Kappa: streaming telemetry};
    \node[font=\tiny\itshape,text=PhantomSlate] at (8.1,-1.0) {Lambda: offline learning + refresh};
  \end{tikzpicture}

  \vspace{0.4em}
  \begin{itemize}
    \item Every quote has a matching behavioral context in the log stream.
    \item The same architecture supports reproducible stress tests before any live deployment.
  \end{itemize}
\end{frame}

% =========================================================================
% DATASET CARD
% =========================================================================
\begin{frame}{Dataset card: compact, labeled, experiment-ready}
  \begin{columns}[T,onlytextwidth]
    \column{0.60\textwidth}
    \centering
    \begin{tikzpicture}[
      font=\scriptsize\sffamily,
      chip/.style={draw=PhantomInk!40,rounded corners=2pt,inner sep=2.7pt,fill=PhantomPaper}
    ]
      \node[draw=PhantomInk,rounded corners=5pt,fill=PhantomPaper,minimum width=6.85cm,minimum height=4.45cm] at (0,0) {};
      \node[anchor=west,font=\footnotesize\bfseries,text=PhantomInk] at (-3.2,1.72) {WhoClickedIt dataset card};
      \node[anchor=west,draw=PhantomInk!35,rounded corners=2pt,fill=PhantomCyan!10,inner xsep=4pt,inner ysep=3pt,text width=6.15cm,align=left,font=\tiny\ttfamily,text=PhantomInk] at (-3.2,1.22)
        {huggingface.co/datasets/velocitatem/whoclickedit};
      \node[anchor=west,chip,fill=PhantomIndigo!12] (humanrows) at (-3.2,0.52) {\textbf{human rows} 798};
      \node[anchor=west,chip,fill=PhantomIndigo!12] at ([xshift=0.16cm]humanrows.east) {\textbf{agent rows} 3076};
      \node[anchor=west,text width=6.0cm,align=left,font=\scriptsize,text=PhantomInk] at (-3.2,-0.33)
        {Flat schema and explicit actor labels simplify session-aware train/test splits.};
      \node[anchor=west,font=\tiny\itshape,text=PhantomSlate] at (-3.2,-1.01)
        {Kafka provenance is retained for reproducibility.};
    \end{tikzpicture}

    \column{0.38\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily,
      stat/.style={draw=PhantomInk,rounded corners=5pt,minimum width=4.95cm,minimum height=1.33cm,align=center}]
      \node[stat,fill=PhantomCyan!12] at (0,1.95)
        {\Large\bfseries 29 interviews\\[-0.1em]\footnotesize labeled trajectories};
      \node[stat,fill=PhantomCyan!18] at (0,0.25)
        {\Large\bfseries 45\% / 55\%\\[-0.1em]\footnotesize human / agent split};
      \node[stat,fill=PhantomIndigo!12] at (0,-1.45)
        {\Large\bfseries 2 streams\\[-0.1em]\footnotesize interaction + price logs};
    \end{tikzpicture}
  \end{columns}
\end{frame}

% =========================================================================
% EXPERIMENTAL DESIGN
% =========================================================================
\begin{frame}{Experimental design controls goals, not instructions}
  \begin{columns}[T,onlytextwidth]
    \column{0.58\textwidth}
    \centering
    \begin{tikzpicture}[
      font=\scriptsize\sffamily,
      box/.style={draw=PhantomInk,rounded corners=3pt,minimum width=3.65cm,minimum height=0.95cm,align=center,fill=PhantomPaper},
      arr/.style={-{Stealth[length=2.2mm]},thick,PhantomSlate}
    ]
      \node[box,fill=PhantomCyan!14] (tasks) at (0,1.8) {JTBD task pool\\hotel + airline modes};
      \node[box] (assign) at (0,0.55) {random assignment\\mode + task + actor id};
      \node[box,fill=PhantomIndigo!12] (run) at (0,-0.7) {execution\\human or browser-use agent};
      \node[box] (logs) at (0,-1.95) {session logs\\events + quotes};
      \draw[arr] (tasks) -- (assign);
      \draw[arr] (assign) -- (run);
      \draw[arr] (run) -- (logs);
    \end{tikzpicture}

    \column{0.40\textwidth}
    \begin{itemize}\setlength{\itemsep}{0.55em}
      \item Agents run with \textbf{browser-use} and a model-swappable LLM router (default \texttt{gpt-5-mini}).
      \item Tasks are defined by outcomes, not scripted clicks, to preserve behavioral variety.
      \item Current release is stronger on hotel flows than airline flows.
    \end{itemize}
  \end{columns}
\end{frame}

\section{Distinguishability Construction}

% =========================================================================
% KERNEL EXPLAINER (NEW dedicated slide)
% =========================================================================
\begin{frame}{Stage 2: what is a \alert{kernel}?}
  \begin{block}{Plain definition}
    A \textbf{kernel} is a small square table $T$ where $T[a,b]$ is the
    probability that action $b$ follows action $a$ inside one session. Every
    row sums to one.
  \end{block}

  \vspace{0.3em}
  \begin{columns}[T,onlytextwidth]
    \column{0.45\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily]
      \node[draw=PhantomInk,rounded corners=3pt,fill=PhantomCyan!12,minimum width=2.6cm,minimum height=0.7cm] (a) at (-1.6,0.7) {view item};
      \node[draw=PhantomInk,rounded corners=3pt,fill=PhantomPaper,minimum width=2.6cm,minimum height=0.7cm] (b) at (1.6,0.7) {hover};
      \node[draw=PhantomInk,rounded corners=3pt,fill=PhantomIndigo!12,minimum width=2.6cm,minimum height=0.7cm] (c) at (0,-0.9) {add to cart};
      \draw[-{Stealth[length=2mm]},thick,PhantomSlate] (a) -- node[above,font=\tiny]{0.64} (b);
      \draw[-{Stealth[length=2mm]},thick,PhantomSlate] (b) -- node[right,font=\tiny]{0.31} (c);
      \draw[-{Stealth[length=2mm]},thick,PhantomSlate] (a) -- node[left,font=\tiny]{0.36} (c);
    \end{tikzpicture}\\[0.3em]
    {\tiny example session graph}

    \column{0.50\textwidth}
    \centering
    \begin{tabular}{@{}l|ccc@{}}
      \toprule
      from \textbackslash{} to & view & hover & cart \\
      \midrule
      view  & 0.00 & 0.64 & 0.36 \\
      hover & 0.69 & 0.00 & 0.31 \\
      cart  & 0.00 & 0.00 & 1.00 \\
      \bottomrule
    \end{tabular}\\[0.4em]
    {\footnotesize\textit{This is the kernel $T$. Each row is a probability distribution.}}
  \end{columns}

  \vspace{0.3em}
  \vardef{$T[a,b]$}{probability that the next action is $b$ given the current action is $a$}
\end{frame}

% =========================================================================
% HUMAN VS AGENT KERNELS - VISUAL COMPARISON
% =========================================================================
\begin{frame}{Humans and agents click in \alert{different patterns}}
  \begin{columns}[T,onlytextwidth]
    \column{0.48\textwidth}
    \centering
    \textbf{Human kernel $\bar T_H$}\par
    {\scriptsize view $\to$ hover $\to$ cart, with detours}\par\vspace{0.2em}
    \includegraphics[width=\linewidth,height=0.40\textheight,keepaspectratio]{mdp_human.pdf}
    \column{0.48\textwidth}
    \centering
    \textbf{Agent kernel $\bar T_A$}\par
    {\scriptsize view $\to$ view $\to$ view, almost no cart}\par\vspace{0.2em}
    \includegraphics[width=\linewidth,height=0.40\textheight,keepaspectratio]{mdp_agent.pdf}
  \end{columns}

  \vspace{0.4em}
  \begin{columns}[T,onlytextwidth]
    \column{0.32\textwidth}\centering\metriccard{$-3.35$}{mean gap (human)}
    \column{0.32\textwidth}\centering\metriccard{$+1.65$}{mean gap (agent)}
    \column{0.32\textwidth}\centering\metriccard{$p<0.001$}{Mann-Whitney rank}
  \end{columns}
  \vspace{0.2em}
  {\footnotesize\textit{Two cohorts, two clearly separable click structures --- this is the foundation of the detection signal.}}
\end{frame}

% =========================================================================
% SIGMOID SCORE - SIMPLIFIED
% =========================================================================
\begin{frame}{From two divergences to one \alert{sigmoid score}}
  \begin{columns}[T,onlytextwidth]
    \column{0.46\textwidth}
    \begin{block}{Step 1 --- distance to each prototype}
      \(\Delta_H = \mathrm{KL}(\hat T' \,\|\, \bar T_H)\)\\[0.2em]
      \(\Delta_A = \mathrm{KL}(\hat T' \,\|\, \bar T_A)\)
    \end{block}
    \begin{block}{Step 2 --- signed gap}
      \(g(\tau') = \Delta_H - \Delta_A\)
    \end{block}
    \begin{alertblock}{Step 3 --- \textbf{sigmoid} squash}
      \(f(\tau') = \sigma\!\left(\dfrac{g(\tau')}{T}\right) \in [0,1]\)
    \end{alertblock}
    \vardef{$\sigma$}{the standard logistic sigmoid}
    \vardef{$T$}{temperature, controls how sharply the score moves away from $0.5$}
    \vardef{threshold}{$f = 0.5$ corresponds to $g = 0$ (neither side)}

    \column{0.50\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily,x=0.7cm,y=2.0cm]
      \draw[->,thick,PhantomPaper] (-4.2,0) -- (4.4,0) node[right,text=PhantomPaper]{$g(\tau')$};
      \draw[->,thick,PhantomPaper] (0,-0.05) -- (0,1.15) node[above,text=PhantomPaper]{$f(\tau')$};
      \draw[dashed,PhantomMute] (-4.0,1.0) -- (4.0,1.0);
      \draw[dashed,PhantomCyan,thick] (-4.0,0.5) -- (4.0,0.5) node[right,font=\tiny,text=PhantomCyan]{threshold $0.5$};
      \draw[very thick,PhantomCyan,domain=-4.0:4.0,smooth,samples=120]
        plot (\x, {1/(1+exp(-1.4*\x))});
      \node[anchor=north,font=\tiny,text=PhantomPaper] at (-3.0,-0.04) {human-like \humanicon};
      \node[anchor=north,font=\tiny,text=PhantomPaper] at (3.0,-0.04) {agent-like \roboticon};
      \fill[PhantomCyan] (0,0.5) circle (1.6pt);
      \node[anchor=west,font=\tiny,text=PhantomPaper] at (0.1,0.55) {$g=0$};
    \end{tikzpicture}\\[0.2em]
    {\tiny\color{PhantomSlate} logistic curve --- saturates at $0$ and $1$, threshold at $0.5$}
  \end{columns}
\end{frame}

\section{Distributionally Robust RL}

% =========================================================================
% DR-RL CORE IDEA - SIMPLIFIED
% =========================================================================
\begin{frame}{Stage 3: DR-RL trains against \alert{many plausible worlds}}
  \begin{columns}[T,onlytextwidth]
    \column{0.50\textwidth}
    \footnotesize
    Standard RL trains against one demand model and overfits to it.
    \textbf{DR-RL} optimises the worst case across a small ball of
    plausible demand laws, so the policy still works when contamination
    shifts.

    \vspace{0.6em}
    \begin{block}{Robust objective}
      \(\displaystyle \pi^\star = \arg\max_\pi \min_{Q \in U_\epsilon} \mathbb{E}_Q[\,r\,]\)
    \end{block}
    \vardef{$Q$}{a candidate demand distribution inside the ball}
    \vardef{$U_\epsilon$}{Wasserstein ball of radius $\epsilon$ around the empirical $\hat P_N$}
    \vardef{$r$}{per-step reward (defined next slide)}

    \column{0.46\textwidth}
    \centering
    \begin{tikzpicture}[font=\scriptsize\sffamily]
      \draw[thick,PhantomPaper,fill=PhantomCyan!25!PhantomInk] (0,0) circle (2.0);
      \draw[dashed,PhantomCyan,thick] (0,0) circle (1.4);
      \fill[PhantomPaper] (0,0) circle (2.5pt) node[below,font=\tiny,text=PhantomPaper]{$\hat P_N$};
      \fill[PhantomCyan] (0.9,0.5) circle (2pt);
      \fill[PhantomCyan] (-0.7,0.7) circle (2pt);
      \fill[PhantomCyan] (-1.0,-0.4) circle (2pt);
      \fill[PhantomCyan] (0.6,-0.9) circle (2pt);
      \node[font=\tiny,text=PhantomCyan] at (0,1.7) {plausible $Q$};
      \node[font=\tiny,text=PhantomPaper] at (0,-2.3) {ambiguity ball $U_\epsilon$};
    \end{tikzpicture}
  \end{columns}

  \vspace{0.3em}
  {\footnotesize\textit{Implementation note: in code we solve a local robust loop on the contamination parameter $\alpha$, not the full continuous Wasserstein adversary.}}
\end{frame}

% =========================================================================
% REWARD - THREE TERMS, EACH EXPLAINED
% =========================================================================
\begin{frame}{Reward: revenue, minus leakage, minus UX cost}
  \[
    r_t \;=\; \underbrace{R(p_t,\hat Q_t)}_{\text{revenue}}
          \;-\; \underbrace{\lambda \, f(\tau'_t)\, c_{\text{info}}}_{\text{leakage penalty}}
          \;-\; \underbrace{\eta_{\text{ux}}\, \mathrm{UX}(\tau'_t,p_t)}_{\text{UX penalty}}
  \]

  \vspace{0.6em}
  \begin{columns}[T,onlytextwidth]
    \column{0.32\textwidth}
    \begin{block}{Revenue}
      \(R(p_t,\hat Q_t) = p_t \cdot \hat Q_t\)\\[0.2em]
      {\footnotesize units: EUR per session}
    \end{block}
    \column{0.32\textwidth}
    \begin{alertblock}{Leakage}
      scales with $f(\tau'_t)$ \roboticon\\
      $\lambda$: weight\\
      $c_{\text{info}}$: per-query cost
    \end{alertblock}
    \column{0.32\textwidth}
    \begin{exampleblock}{UX}
      $\mathrm{UX}\in[0,1]$\\
      $\eta_{\text{ux}}$: weight\\
      penalises unstable pricing
    \end{exampleblock}
  \end{columns}

  \vspace{0.4em}
  {\footnotesize \textbf{Reading the formula:}
  if a session looks agent-like ($f \uparrow$), the leakage penalty grows
  and the policy backs off; for clean human sessions only the revenue and
  UX terms are active.}
\end{frame}

% =========================================================================
% COMPUTE
% =========================================================================
\begin{frame}{Wide sweeps are feasible only with \alert{aggressive optimization}}
  \begin{columns}[T,onlytextwidth]
    \column{0.47\textwidth}
    \centering
    {\Large\(4\times4\times3\times2\times2=\mathbf{192}\) configs}\\[0.25em]
    {\scriptsize algorithms $\times$ contamination $\times$ robustness $\times$ COI penalty $\times$ action grid}

    \vspace{0.5em}
    \metriccard{160 PFLOPS}{peak aggregate TPU budget}\\[0.45em]
    \metriccard{$\sim$180 days}{net compute logged}

    \column{0.51\textwidth}
    \begin{block}{Hot-path rewrite impact}
      \centering
      \begin{tabular}{@{}lcc@{}}
        \toprule
        Mode & Before & After \\
        \midrule
        Baseline step/s & 26.0 & 220.0 \\
        Robust step/s & 7.2 & 136.0 \\
        \bottomrule
      \end{tabular}
    \end{block}
    \vspace{0.1em}
    {\footnotesize
    \begin{itemize}
      \item pandas lookups replaced with array/JAX-style loops.
      \item $8.5\times$ and $19\times$ throughput gains made wide sweeps practical.
    \end{itemize}}
  \end{columns}
\end{frame}

\section{Results}

% =========================================================================
% RESULTS - BIGGER FONTS, EXPLICIT CONCLUSION
% =========================================================================
\begin{frame}{Defended policies recover COI as contamination rises}
  \begin{columns}[T,onlytextwidth]
    \column{0.62\textwidth}
    \centering
    \includegraphics[width=\linewidth,height=0.66\textheight,keepaspectratio]{final_focus_coi_by_alpha.pdf}\\[0.2em]
    {\footnotesize x: contamination $\alpha$ (fraction of agent traffic) \;|\; y: COI [EUR per transaction]}

    \column{0.34\textwidth}
    \metriccard{$-90{,}140$}{baseline COI slope (EUR per unit $\alpha$)}\\[0.35em]
    \metriccard{$\sim 3\%$}{short-run revenue cost of defense}\\[0.35em]
    \metriccard{regime-dependent}{COI gains strongest at higher $\alpha$}

    \vspace{0.5em}
    \begin{alertblock}{Conclusion}
      \footnotesize Without defense, COI collapses with $\alpha$.
      Robust policies hold a measurable margin floor at the cost of
      a small, bounded revenue trade.
    \end{alertblock}
  \end{columns}
\end{frame}

\section{Conclusions}

% =========================================================================
% CONCLUSION
% =========================================================================
\begin{frame}{Yes, with boundaries: margin integrity \alert{is defensible} under agentic orchestration}
  \begin{columns}[T,onlytextwidth]
    \column{0.32\textwidth}
    \begin{block}{SQ1\;\;distinguishability}
      \centering
      kernels are separable\\$p<0.001$
    \end{block}
    \column{0.32\textwidth}
    \begin{block}{SQ2\;\;theoretical impact}
      \centering
      COI erosion mechanism\\proved in baseline limit
    \end{block}
    \column{0.32\textwidth}
    \begin{block}{SQ3\;\;mitigation}
      \centering
      robust control shifts\\COI / revenue / UX trade-off
    \end{block}
  \end{columns}

  \vspace{0.5em}
  \begin{alertblock}{Boundary conditions}
    Evidence is from a controlled platform and a small labeled cohort.
    This is mechanism validation, not full production external validity.
  \end{alertblock}
\end{frame}

% =========================================================================
% IMPLICATIONS
% =========================================================================
\begin{frame}{What this implies for real pricing systems}
  \begin{itemize}\setlength{\itemsep}{0.7em}
    \item \textbf{Financially:} untreated reconnaissance behaves like an information leak and can compress sustainable margins.
    \item \textbf{Operationally:} behavior-only session scoring can be wired into pricing without device fingerprinting.
    \item \textbf{Market exposure:} channels where dynamic pricing is a secondary layer (aggregators, comparison funnels, promo traffic) are disrupted first.
    \item \textbf{Strategically:} robust pricing should be calibrated by regime; there is no single penalty that wins everywhere.
    \item \textbf{Before deployment:} larger human baselines, governance review, and legal safeguards are mandatory.
  \end{itemize}
\end{frame}

% =========================================================================
% THANK YOU
% =========================================================================
\begin{frame}[plain]
  \centering
  \vfill
  {\LARGE\bfseries Thank you}
  \vspace{0.8em}

  {\large Questions and discussion}

  \vfill
  {\footnotesize\color{PhantomSlate}Appendix follows: COI theorem derivation, reward composition, and sample-size notes.}
  \vfill
\end{frame}

\appendix
\input{defense_appendix}

\end{document}
