Dynamic pricing extracts margin by exploiting the gap between what a platform knows and what a buyer knows. A user who browses a hotel across several sessions signals intent; the platform raises the price accordingly. That information asymmetry — the Cost of Information — is the economic engine behind session-based pricing in travel, hospitality, and e-commerce.
@@ -408,34 +402,25 @@
-
+
-
-
How it works
-
- The methodology runs in three stages: observe, distinguish, defend.
-
-
-
Stage 1 — Observe
-
- Both human participants and LLM agents are assigned goal-driven tasks on a live instrumented storefront (hotel or airline mode). Every interaction is logged as a timestamped event tuple (action, item, timestamp). Actions are partitioned into four semantic categories — cart, dwell, navigation, filter — with decreasing signal weights (4.0, 2.0, 1.0, 0.5) calibrated by the KL divergence between human and agent transition rows. Price quotes are streamed to a separate Kafka topic, enabling joint analysis of behavior and pricing exposure. The platform runs a surge-discount heuristic during collection to expose participants to state-dependent prices.
-
-
-
Stage 2 — Distinguish
-
- From the labeled session trajectories, we estimate class-specific Markov transition kernels T̂H and T̂A by maximum likelihood. For any new partial trajectory τ', we compute KL divergence to each prototype:
-
-
- ΔH = DKL (T̂' ∥ T̄H ), ΔA = DKL (T̂' ∥ T̄A )
-
-
- The gap score g (τ') = ΔH − ΔA maps to a weak agent probability via a temperature-controlled logistic function: f (τ') = σ((ΔH − ΔA ) / T). This is a continuous signal, not a binary bot flag. The Mann–Whitney test on gap scores between the 13-human and 16-agent cohorts yields U = 2.0, p = 0.0006 — the behavioral distributions are well separated.
-
-
-
Stage 3 — Defend
-
- A contamination generator G(α) mixes real human trajectories with synthetic agent trajectories drawn from T̂A to produce training distributions at any contamination level α ∈ [0, 1]. The pricing policy is trained as a Stackelberg leader against a Wasserstein ambiguity set around the generator's empirical distribution, minimizing worst-case regret over plausible demand shifts. The per-step reward penalizes COI leakage — weighted by f (τ') — while a UX index bounds harm to legitimate users. Sweeps ran across 384 TPU chips (v4, v5e, v6e Trillium) covering six contamination levels and multiple algorithm variants (PPO, A2C, DQN, Q-table).
-
+
We study behavior, convert it into a control signal, and train a pricing policy that survives contamination.
+
+
+ 01
+ Observe
+ Human participants and LLM agents complete goal-driven hotel and airline tasks. The storefront records behavior events and price quotes as timestamped trajectories.
+
+
+ 02
+ Distinguish
+ Session paths become transition kernels. KL distance to human and agent prototypes yields a continuous agent-probability signal.
+
+
+ 03
+ Defend
+ A contamination generator mixes human and synthetic agent trajectories. A distributionally robust RL policy optimizes price under worst-case demand shifts.
+
@@ -524,7 +509,7 @@
-
Full Thesis
+
Full thesis.
diff --git a/docs/static/css/defense-theme.css b/docs/static/css/defense-theme.css
new file mode 100644
index 0000000..6bc4eca
--- /dev/null
+++ b/docs/static/css/defense-theme.css
@@ -0,0 +1,740 @@
+:root {
+ --phantom-bg: #eef3f7;
+ --phantom-paper: rgba(255, 255, 255, 0.78);
+ --phantom-paper-solid: #ffffff;
+ --phantom-ink: #1f2a38;
+ --phantom-muted: #59636e;
+ --phantom-faint: #dce5eb;
+ --phantom-line: rgba(31, 42, 56, 0.13);
+ --phantom-teal: #28aaa5;
+ --phantom-teal-dark: #16837f;
+ --phantom-blue: #527dad;
+ --phantom-blue-soft: rgba(82, 125, 173, 0.18);
+ --phantom-shadow: 0 28px 80px rgba(31, 42, 56, 0.12);
+ --phantom-soft-shadow: 0 14px 45px rgba(31, 42, 56, 0.08);
+}
+
+html {
+ scroll-behavior: smooth;
+ background: var(--phantom-bg);
+}
+
+body {
+ color: var(--phantom-ink);
+ background:
+ radial-gradient(70rem 22rem at 72% 8%, rgba(31, 42, 56, 0.15), transparent 58%),
+ radial-gradient(54rem 24rem at 20% 62%, rgba(31, 42, 56, 0.12), transparent 62%),
+ linear-gradient(180deg, #f7fafc 0%, var(--phantom-bg) 48%, #f8fafb 100%);
+ font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
+ letter-spacing: -0.02em;
+}
+
+body::before {
+ content: "";
+ position: fixed;
+ inset: -20vh -10vw auto -10vw;
+ height: 72vh;
+ pointer-events: none;
+ z-index: -1;
+ opacity: 0.88;
+ filter: blur(30px);
+ background:
+ radial-gradient(45rem 16rem at 9% 34%, rgba(18, 23, 31, 0.11), transparent 62%),
+ radial-gradient(35rem 11rem at 65% 24%, rgba(18, 23, 31, 0.13), transparent 65%),
+ radial-gradient(42rem 17rem at 45% 88%, rgba(82, 125, 173, 0.13), transparent 68%);
+}
+
+strong, b {
+ font-weight: 700;
+ color: inherit;
+}
+
+a {
+ color: var(--phantom-blue);
+ text-decoration-thickness: 0.08em;
+ text-underline-offset: 0.18em;
+}
+
+main {
+ overflow: hidden;
+}
+
+.container.is-max-desktop {
+ max-width: 1180px !important;
+}
+
+.section,
+.hero-body {
+ position: relative;
+}
+
+.section {
+ padding: 5rem 1.5rem;
+}
+
+.title,
+.subtitle,
+h1,
+h2,
+h3,
+h4,
+button,
+.button {
+ /* important needed to beat index.css serif heading rule */
+ font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace !important;
+ letter-spacing: -0.04em;
+}
+
+/* Defense cover */
+.defense-cover {
+ min-height: 92vh;
+ padding: 2rem 0 3.5rem;
+ background:
+ linear-gradient(180deg, rgba(255, 255, 255, 0.68), rgba(238, 243, 247, 0.92));
+}
+
+.defense-cover::after {
+ content: "";
+ position: absolute;
+ right: -10vw;
+ bottom: -13rem;
+ width: 64vw;
+ height: 26rem;
+ background: rgba(31, 42, 56, 0.12);
+ filter: blur(38px);
+ border-radius: 65% 35% 47% 53%;
+ transform: rotate(-8deg);
+ pointer-events: none;
+}
+
+.defense-cover .hero-body {
+ padding: 5.5rem 1.5rem 4rem;
+}
+
+.defense-hero-grid {
+ display: grid;
+ grid-template-columns: minmax(0, 1.08fr) minmax(280px, 0.72fr);
+ gap: clamp(2rem, 6vw, 7rem);
+ align-items: center;
+}
+
+.defense-kicker,
+.defense-meta-row,
+.defense-chip-row,
+.defense-mini-label,
+.tpu-credit {
+ color: rgba(31, 42, 56, 0.66);
+ font-size: 0.88rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+.defense-kicker {
+ margin-bottom: 1.2rem;
+}
+
+.publication-title.defense-title {
+ margin: 0;
+ color: var(--phantom-ink);
+ font-size: clamp(4.25rem, 12vw, 10rem);
+ line-height: 0.82;
+ font-weight: 800;
+ letter-spacing: -0.09em;
+ text-transform: uppercase;
+}
+
+.defense-subtitle {
+ max-width: 950px;
+ margin: clamp(1.5rem, 3vw, 2.3rem) 0 0;
+ color: var(--phantom-ink);
+ font-size: clamp(1.55rem, 3.2vw, 3.35rem);
+ line-height: 1.35;
+ font-weight: 400;
+ letter-spacing: 0.05em;
+}
+
+.mark,
+mark,
+.defense-highlight {
+ background: linear-gradient(0deg, var(--phantom-blue) 0%, var(--phantom-blue) 100%);
+ color: #ffffff;
+ padding: 0 0.1em;
+ line-height: inherit;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone;
+}
+
+.defense-chip-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.7rem 0.9rem;
+ margin-top: 2.15rem;
+ text-transform: none;
+ letter-spacing: -0.02em;
+ font-size: clamp(0.92rem, 1.4vw, 1.2rem);
+}
+
+.defense-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.65rem;
+ color: rgba(31, 42, 56, 0.70);
+}
+
+.defense-chip::before {
+ content: "";
+ width: 0.42rem;
+ height: 0.42rem;
+ border-radius: 999px;
+ background: var(--phantom-blue);
+ box-shadow: 0 0 0 0.35rem var(--phantom-blue-soft);
+}
+
+.defense-meta-card {
+ margin-top: 2.4rem;
+ display: inline-flex;
+ flex-wrap: wrap;
+ gap: 0.6rem 1rem;
+ align-items: center;
+ padding: 0.85rem 1rem;
+ border: 1px solid var(--phantom-line);
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.58);
+ backdrop-filter: blur(18px);
+ box-shadow: var(--phantom-soft-shadow);
+ color: rgba(31, 42, 56, 0.74);
+ font-size: 0.95rem;
+}
+
+.defense-meta-card .dot {
+ width: 0.26rem;
+ height: 0.26rem;
+ border-radius: 50%;
+ background: var(--phantom-teal);
+}
+
+.defense-links {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ margin-top: 1.8rem;
+}
+
+.defense-links .button,
+.publication-links .button {
+ border: 1px solid rgba(31, 42, 56, 0.18) !important;
+ background: rgba(31, 42, 56, 0.92) !important;
+ color: #ffffff !important;
+ box-shadow: 0 12px 30px rgba(31, 42, 56, 0.16);
+ transition: transform 180ms ease, box-shadow 180ms ease, background 180ms ease;
+}
+
+.defense-links .button:hover,
+.publication-links .button:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 16px 40px rgba(31, 42, 56, 0.20);
+ background: var(--phantom-ink) !important;
+}
+
+.defense-links .button.is-light-outline {
+ background: rgba(255, 255, 255, 0.72) !important;
+ color: var(--phantom-ink) !important;
+}
+
+.tpu-credit {
+ margin-top: 1.35rem;
+ text-transform: none;
+ letter-spacing: 0.02em;
+}
+
+.tpu-credit .accent {
+ color: var(--phantom-blue);
+ font-weight: 700;
+}
+
+.defense-visual {
+ justify-self: end;
+ width: min(100%, 430px);
+}
+
+.defense-orbit-card {
+ position: relative;
+ min-height: 435px;
+ border: 1px solid var(--phantom-line);
+ border-radius: 2rem;
+ background: linear-gradient(145deg, rgba(255, 255, 255, 0.84), rgba(238, 243, 247, 0.68));
+ box-shadow: var(--phantom-shadow);
+ overflow: hidden;
+}
+
+.defense-orbit-card::before {
+ content: "";
+ position: absolute;
+ inset: 2rem;
+ border: 1px dashed rgba(31, 42, 56, 0.22);
+ border-radius: 44% 56% 58% 42%;
+ transform: rotate(-14deg);
+}
+
+.defense-orbit-card::after {
+ content: "";
+ position: absolute;
+ right: -4rem;
+ bottom: -5rem;
+ width: 18rem;
+ height: 12rem;
+ background: rgba(40, 170, 165, 0.14);
+ border-radius: 50%;
+ filter: blur(18px);
+}
+
+.defense-art-stack {
+ position: relative;
+ display: grid;
+ min-height: 435px;
+ place-items: center;
+ z-index: 1;
+}
+
+.defense-art-stack .agent-art {
+ width: min(70%, 250px);
+ transform: translateY(-12px);
+ filter: drop-shadow(0 28px 28px rgba(31, 42, 56, 0.12));
+}
+
+.defense-art-stack .mini-token {
+ position: absolute;
+ width: 4.8rem;
+ height: 4.8rem;
+ display: grid;
+ place-items: center;
+ border-radius: 1.3rem;
+ border: 1px solid rgba(82, 125, 173, 0.28);
+ background: rgba(255, 255, 255, 0.72);
+ color: var(--phantom-blue);
+ box-shadow: var(--phantom-soft-shadow);
+ font-size: 1.35rem;
+}
+
+.defense-art-stack .mini-token:nth-child(2) { top: 3.1rem; right: 3.2rem; }
+.defense-art-stack .mini-token:nth-child(3) { left: 2.8rem; bottom: 6.1rem; color: var(--phantom-teal-dark); }
+.defense-art-stack .mini-token:nth-child(4) { right: 5.6rem; bottom: 3.2rem; color: var(--phantom-ink); }
+
+/* Defense overview strip */
+.defense-overview-strip {
+ margin-top: -3.8rem;
+ padding: 0 1.5rem 4.6rem;
+ position: relative;
+ z-index: 2;
+}
+
+.defense-overview-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1rem;
+}
+
+.defense-overview-card,
+.actor-card,
+.defense-step,
+.hf-callout,
+.coi-equation,
+pre,
+.publication-banner {
+ border: 1px solid var(--phantom-line);
+ background: var(--phantom-paper);
+ box-shadow: var(--phantom-soft-shadow);
+ backdrop-filter: blur(18px);
+}
+
+.defense-overview-card {
+ min-height: 9rem;
+ padding: 1.3rem;
+ border-radius: 1.4rem;
+}
+
+.defense-overview-card .num {
+ color: var(--phantom-blue);
+ font-weight: 700;
+ font-size: 0.85rem;
+}
+
+.defense-overview-card h3 {
+ margin: 1rem 0 0.45rem;
+ color: var(--phantom-ink);
+ font-size: clamp(1.15rem, 2vw, 1.65rem);
+ line-height: 1.05;
+}
+
+.defense-overview-card p {
+ color: var(--phantom-muted);
+ font-size: 0.95rem;
+ line-height: 1.45;
+}
+
+/* Main sections */
+.hero.teaser,
+.hero.is-small,
+.hero.is-small.is-light,
+.hero.is-light,
+.section.hero.is-light,
+.defense-block {
+ background: transparent !important;
+}
+
+.publication-banner {
+ padding: 1rem;
+ border-radius: 1.5rem;
+ overflow: hidden;
+}
+
+.publication-banner img,
+.actor-art img {
+ filter: drop-shadow(0 18px 22px rgba(31, 42, 56, 0.10));
+}
+
+.defense-heading,
+.title.is-3,
+.content h2.title {
+ color: var(--phantom-ink) !important;
+ font-size: clamp(2rem, 4.5vw, 4.8rem) !important;
+ /* enough leading that .mark backgrounds on wrapped lines don't overlap adjacent text */
+ line-height: 1.2 !important;
+ font-weight: 700 !important;
+ letter-spacing: -0.06em !important;
+ text-align: left !important;
+ margin-bottom: 2rem !important;
+}
+
+.title.is-4,
+.content h3.title {
+ color: var(--phantom-ink) !important;
+ font-size: clamp(1.35rem, 2.2vw, 2rem) !important;
+ font-weight: 700 !important;
+ letter-spacing: -0.05em !important;
+ margin-top: 2rem !important;
+}
+
+.content {
+ color: var(--phantom-muted);
+ font-size: 1.02rem;
+ line-height: 1.68;
+}
+
+.content.has-text-justified,
+.content.has-text-justified p {
+ text-align: left !important;
+}
+
+.content p + p {
+ margin-top: 1.05rem;
+}
+
+.defense-block,
+.section.hero.is-light {
+ position: relative;
+}
+
+.defense-block::before,
+.section.hero.is-light::before {
+ content: "";
+ position: absolute;
+ inset: 1rem 0 auto 0;
+ height: 1px;
+ background: linear-gradient(90deg, transparent, rgba(31, 42, 56, 0.13), transparent);
+}
+
+.defense-block .defense-heading {
+ margin-bottom: 3.5rem !important;
+}
+
+.actor-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1.1rem;
+ position: relative;
+ z-index: 1;
+}
+
+.actor-card {
+ display: flex;
+ flex-direction: column;
+ min-height: 25rem;
+ padding: 1.4rem;
+ border-radius: 1.5rem;
+}
+
+.actor-card h3 {
+ margin-top: 1.1rem;
+ color: var(--phantom-ink);
+ font-size: clamp(1.6rem, 3vw, 2.55rem);
+ line-height: 1;
+ font-weight: 700;
+}
+
+.actor-card p {
+ margin-top: 1rem;
+ color: var(--phantom-muted);
+ font-size: 1rem;
+ line-height: 1.45;
+}
+
+.actor-art {
+ min-height: 12rem;
+ display: grid;
+ place-items: center;
+}
+
+.actor-art img {
+ max-height: 10.5rem;
+ width: auto;
+}
+
+.actor-icon {
+ display: grid;
+ width: 8.75rem;
+ height: 8.75rem;
+ place-items: center;
+ border: 2px solid rgba(82, 125, 173, 0.55);
+ border-radius: 1.7rem;
+ background: linear-gradient(145deg, rgba(40, 170, 165, 0.20), rgba(255, 255, 255, 0.94));
+ color: var(--phantom-teal-dark);
+ font-size: 3.6rem;
+ transform: rotate(-6deg);
+}
+
+.underline {
+ text-decoration: underline;
+ text-decoration-thickness: 0.09em;
+ text-underline-offset: 0.13em;
+}
+
+.coi-equation {
+ border-radius: 1.7rem;
+ padding: clamp(1.6rem, 4vw, 3rem);
+}
+
+.coi-equation .formula {
+ color: #111111;
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: clamp(3rem, 9vw, 7.6rem);
+ line-height: 1;
+ letter-spacing: -0.07em;
+}
+
+.coi-equation .caption {
+ max-width: 780px;
+ margin-top: 1.3rem;
+ color: var(--phantom-muted);
+ font-size: 1.05rem;
+}
+
+.defense-method-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1rem;
+ margin-top: 2rem;
+}
+
+.defense-step {
+ border-radius: 1.4rem;
+ padding: 1.35rem;
+}
+
+.defense-step .step-num {
+ display: inline-grid;
+ place-items: center;
+ width: 2.6rem;
+ height: 2.6rem;
+ margin-bottom: 1rem;
+ border: 1px solid rgba(40, 170, 165, 0.38);
+ border-radius: 50%;
+ color: var(--phantom-teal-dark);
+ background: rgba(40, 170, 165, 0.10);
+ font-weight: 700;
+}
+
+.defense-step h3 {
+ margin: 0 0 0.55rem !important;
+ font-size: 1.45rem !important;
+}
+
+.defense-step p {
+ color: var(--phantom-muted);
+ font-size: 0.95rem;
+ line-height: 1.5;
+}
+
+.takeaways {
+ list-style: none;
+ margin: 2rem 0 0 !important;
+ padding: 0;
+ display: grid;
+ gap: 0.9rem;
+}
+
+.takeaways li {
+ display: grid;
+ grid-template-columns: 5rem minmax(0, 1fr);
+ gap: 1rem;
+ align-items: start;
+ padding: 1.2rem 1.3rem;
+ border: 1px solid var(--phantom-line);
+ border-radius: 1.2rem;
+ background: rgba(255, 255, 255, 0.68);
+}
+
+.takeaways .num {
+ color: var(--phantom-blue);
+ font-size: 1.4rem;
+ font-weight: 700;
+}
+
+.takeaways .stat {
+ display: block;
+ margin-top: 0.45rem;
+ color: var(--phantom-muted);
+ font-size: 0.9rem;
+}
+
+.deploy-line {
+ margin: 2rem 0 0;
+ color: var(--phantom-ink);
+ font-size: clamp(1.45rem, 3vw, 2.5rem);
+ line-height: 1.25;
+ font-weight: 700;
+}
+
+.deploy-line strong {
+ background: var(--phantom-blue);
+ color: #ffffff;
+ padding: 0 0.1em;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone;
+}
+
+.hf-callout {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ gap: 1rem;
+ margin-top: 1.6rem;
+ padding: 1.2rem;
+ border-radius: 1.3rem;
+}
+
+.hf-emoji {
+ width: 3.6rem;
+ height: 3.6rem;
+ display: grid;
+ place-items: center;
+ border-radius: 1rem;
+ background: rgba(255, 215, 0, 0.20);
+ font-size: 1.9rem;
+}
+
+.hf-callout h4 {
+ margin: 0 0 0.3rem;
+ color: var(--phantom-ink);
+ font-size: 1.12rem;
+}
+
+.hf-callout p {
+ margin: 0 0 0.35rem;
+ color: var(--phantom-muted);
+}
+
+pre#bibtex-code,
+pre {
+ border-radius: 1.2rem;
+ color: var(--phantom-ink);
+}
+
+.footer {
+ background: rgba(255, 255, 255, 0.54);
+ border-top: 1px solid var(--phantom-line);
+ color: var(--phantom-muted);
+}
+
+.more-works-container,
+.scroll-to-top {
+ font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
+}
+
+.more-works-btn,
+.scroll-to-top {
+ background: rgba(255, 255, 255, 0.78) !important;
+ color: var(--phantom-ink) !important;
+ border: 1px solid var(--phantom-line) !important;
+ box-shadow: var(--phantom-soft-shadow) !important;
+ backdrop-filter: blur(16px);
+}
+
+.more-works-dropdown {
+ border: 1px solid var(--phantom-line) !important;
+ border-radius: 1.2rem !important;
+ box-shadow: var(--phantom-shadow) !important;
+}
+
+@media (max-width: 900px) {
+ .defense-hero-grid,
+ .defense-overview-grid,
+ .actor-grid,
+ .defense-method-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .defense-cover .hero-body {
+ padding-top: 4rem;
+ }
+
+ .defense-visual {
+ justify-self: stretch;
+ }
+
+ .defense-orbit-card,
+ .defense-art-stack {
+ min-height: 330px;
+ }
+
+ .defense-art-stack .agent-art {
+ width: min(56%, 205px);
+ }
+
+ .defense-meta-card {
+ border-radius: 1.2rem;
+ }
+
+ .publication-title.defense-title {
+ font-size: clamp(4rem, 18vw, 6.2rem);
+ }
+}
+
+@media (max-width: 560px) {
+ .section {
+ padding: 3.6rem 1.1rem;
+ }
+
+ .defense-cover .hero-body {
+ padding-left: 1.1rem;
+ padding-right: 1.1rem;
+ }
+
+ .defense-subtitle {
+ letter-spacing: 0.02em;
+ }
+
+ .takeaways li,
+ .hf-callout {
+ grid-template-columns: 1fr;
+ }
+
+ .defense-chip-row,
+ .defense-links {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .defense-links .button {
+ justify-content: center;
+ }
+}
diff --git a/docs/static/css/index.css b/docs/static/css/index.css
index 947351a..9718b15 100644
--- a/docs/static/css/index.css
+++ b/docs/static/css/index.css
@@ -686,281 +686,6 @@ a:focus-visible,
}
}
-/* ------- Defense-styled sections (style ported from defense slides) ------- */
-
-.defense-tagline {
- font-family: var(--mono-stack);
- font-size: clamp(1.05rem, 2vw, 1.45rem);
- font-weight: 500;
- color: var(--defense-ink-soft);
- letter-spacing: 0.02em;
- margin-top: -0.5rem;
- margin-bottom: 1.5rem;
- text-align: center;
- line-height: 1.45;
-}
-
-.defense-tagline .mark {
- background: var(--defense-teal-bg);
- padding: 0.05em 0.35em;
- border-radius: 4px;
- color: var(--defense-ink);
-}
-
-.tpu-credit {
- font-family: var(--mono-stack);
- font-size: 0.85rem;
- color: var(--paper-ink-soft);
- letter-spacing: 0.03em;
- text-align: center;
- margin-top: 1.25rem;
-}
-
-.tpu-credit .accent {
- color: #4285f4;
- font-weight: 700;
-}
-
-.section.defense-block {
- background: var(--defense-bg);
- border-top: 1px solid var(--paper-border);
- border-bottom: 1px solid var(--paper-border);
-}
-
-.defense-heading {
- font-family: var(--mono-stack) !important;
- font-size: clamp(1.35rem, 2.6vw, 2rem) !important;
- font-weight: 700;
- color: var(--defense-ink) !important;
- line-height: 1.4;
- letter-spacing: -0.005em;
- max-width: 56ch;
- margin: 0 auto 2.25rem !important;
- text-align: center;
-}
-
-.defense-heading .mark {
- background: var(--defense-teal-bg);
- padding: 0.05em 0.35em;
- border-radius: 4px;
-}
-
-.defense-heading .underline {
- text-decoration: underline;
- text-decoration-color: var(--defense-teal);
- text-decoration-thickness: 2px;
- text-underline-offset: 4px;
-}
-
-.actor-grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 1.4rem;
- align-items: start;
- margin: 2rem 0 1rem;
-}
-
-.actor-card {
- background: var(--defense-surface);
- border: 1px solid var(--paper-border);
- border-radius: var(--radius-lg);
- padding: 1.4rem 1.2rem 1.6rem;
- text-align: center;
-}
-
-.actor-card .actor-art {
- height: 160px;
- display: grid;
- place-items: center;
- margin-bottom: 1rem;
- overflow: hidden;
-}
-
-.actor-card .actor-art img,
-.actor-card .actor-art svg {
- height: 160px !important;
- width: 160px !important;
- max-height: 160px;
- max-width: 160px;
- display: block;
- border: 0;
- border-radius: 0;
- box-shadow: none;
- object-fit: contain;
-}
-
-.actor-card .actor-icon {
- height: 160px;
- width: 160px;
- display: grid;
- place-items: center;
- color: var(--defense-teal);
- font-size: 5rem;
- line-height: 1;
-}
-
-.actor-card h3 {
- font-family: var(--mono-stack) !important;
- font-size: 1.4rem !important;
- font-weight: 700;
- color: var(--defense-ink) !important;
- margin: 0 0 0.55rem !important;
- letter-spacing: -0.01em;
-}
-
-.actor-card p {
- font-family: var(--mono-stack);
- font-size: 0.95rem;
- line-height: 1.55;
- color: var(--defense-ink-soft);
- margin: 0;
-}
-
-.actor-card p strong {
- color: var(--defense-ink);
- font-weight: 700;
-}
-
-.coi-equation {
- display: grid;
- grid-template-columns: 1fr;
- gap: 0.6rem;
- text-align: center;
- background: var(--defense-surface);
- border: 1px solid var(--paper-border);
- border-radius: var(--radius-lg);
- padding: 2.25rem 1.5rem;
- margin: 1.8rem auto 0;
-}
-
-.coi-equation .formula {
- font-family: "CMU Serif", Georgia, serif;
- font-size: clamp(1.8rem, 4vw, 2.6rem);
- color: var(--defense-ink);
-}
-
-.coi-equation .formula em {
- font-style: italic;
-}
-
-.coi-equation .caption {
- font-family: var(--mono-stack);
- font-size: 0.92rem;
- color: var(--defense-ink-soft);
- max-width: 46ch;
- margin: 0 auto;
- line-height: 1.55;
-}
-
-.takeaways {
- list-style: none;
- margin: 0 auto;
- padding: 0;
- max-width: 720px;
- display: grid;
- gap: 0.85rem;
-}
-
-.takeaways li {
- display: grid;
- grid-template-columns: 2.6rem 1fr;
- align-items: start;
- gap: 1rem;
- padding: 1rem 1.2rem;
- background: var(--defense-surface);
- border: 1px solid var(--paper-border);
- border-left: 3px solid var(--defense-teal);
- border-radius: var(--radius);
- font-family: var(--mono-stack);
- font-size: 1rem;
- color: var(--defense-ink);
- line-height: 1.5;
-}
-
-.takeaways li .num {
- font-weight: 700;
- color: var(--defense-teal);
- font-size: 1.05rem;
-}
-
-.takeaways li .stat {
- display: block;
- font-size: 0.82rem;
- color: var(--defense-ink-soft);
- margin-top: 0.25rem;
-}
-
-.deploy-line {
- font-family: var(--mono-stack);
- font-size: clamp(1.05rem, 2vw, 1.3rem);
- text-align: center;
- margin: 2rem auto 0;
- max-width: 48ch;
- color: var(--defense-ink);
- line-height: 1.55;
-}
-
-.deploy-line strong {
- background: var(--defense-teal-bg);
- padding: 0.05em 0.35em;
- border-radius: 4px;
-}
-
-.hf-callout {
- display: grid;
- grid-template-columns: auto 1fr;
- gap: 1rem;
- align-items: center;
- background: #fff8e7;
- border: 1px solid #f3dba0;
- border-radius: var(--radius-lg);
- padding: 1.1rem 1.3rem;
- margin: 1.6rem auto 0;
- max-width: 720px;
- font-family: var(--mono-stack);
-}
-
-.hf-callout .hf-emoji {
- font-size: 2rem;
- line-height: 1;
-}
-
-.hf-callout h4 {
- margin: 0 0 0.3rem 0 !important;
- font-family: var(--mono-stack) !important;
- font-size: 1.05rem !important;
- color: var(--defense-ink) !important;
-}
-
-.hf-callout p {
- margin: 0;
- font-size: 0.92rem;
- color: var(--defense-ink-soft);
- line-height: 1.5;
-}
-
-.hf-callout a {
- color: var(--defense-blue);
- border-bottom-color: var(--defense-teal-soft);
- font-size: 0.85rem;
-}
-
-@media screen and (max-width: 768px) {
- .actor-grid {
- grid-template-columns: 1fr;
- }
-
- .takeaways li {
- grid-template-columns: 2rem 1fr;
- gap: 0.7rem;
- }
-
- .hf-callout {
- grid-template-columns: 1fr;
- text-align: center;
- }
-}
-
@media print {
.more-works-container,
.scroll-to-top,
diff --git a/docs/static/images/agent.svg b/docs/static/images/agent.svg
new file mode 100644
index 0000000..b634a4b
--- /dev/null
+++ b/docs/static/images/agent.svg
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/static/images/apple-touch-icon.png b/docs/static/images/apple-touch-icon.png
new file mode 100644
index 0000000..43dc6b0
Binary files /dev/null and b/docs/static/images/apple-touch-icon.png differ
diff --git a/docs/static/images/favicon.ico b/docs/static/images/favicon.ico
index 101a827..58c0afd 100644
Binary files a/docs/static/images/favicon.ico and b/docs/static/images/favicon.ico differ
diff --git a/docs/static/images/human.svg b/docs/static/images/human.svg
new file mode 100644
index 0000000..d0335d2
--- /dev/null
+++ b/docs/static/images/human.svg
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+