diff --git a/docs/index.html b/docs/index.html index 7c10cf9..59c4c8b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -45,8 +45,8 @@ - - + + @@ -65,6 +65,7 @@ + @@ -241,94 +242,87 @@
-
+
-
-
-

Pricing Heuristics Against Non-human Transaction Orchestration Mechanisms

-

Revenue management in the age of AI agents.

- +
+
+

IE University Bachelor's Thesis · 2025

+

PHANTOM

+

Revenue management in the age of AI agents.

-
- IE University
Bachelor's Thesis 2025
- Advisor: Alberto Martín Izquierdo -
- -
- + +
-
+
+
+
+
+
+ 01 +

The vulnerability

+

Repeated agent price queries collapse the Cost of Information that dynamic pricing depends on.

+
+
+ 02 +

The signal

+

Human and agent sessions separate through transition-kernel behavior, not brittle bot flags.

+
+
+ 03 +

The defense

+

Distributionally robust RL preserves pricing power under contaminated demand.

+
+
+
+
-
+
@@ -344,7 +338,7 @@
-

Abstract

+

The thesis, compressed.

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 H and 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 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +