Files
PHANTOM/paper/defense/defense.tex
2026-05-12 12:47:41 +02:00

933 lines
42 KiB
TeX

% 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}