File size: 7,159 Bytes
a36db1b
abef90f
a36db1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
abef90f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a36db1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
abef90f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a36db1b
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
"use client";
import { Brain, Shuffle, CircleGauge, ShieldAlert, ArrowRight, Sparkles, ChartLine } from "lucide-react";
import { formatScore } from "../lib/theme";
import type { EvalSummary } from "../lib/types";

const ARCH = [
  { icon: Brain,               title: "Orchestrator",        desc: "Learns trust, verification, and recovery from behavior alone." },
  { icon: Shuffle,             title: "Shuffled Specialists", desc: "Hidden profiles reshuffle every reset — no identity memorization." },
  { icon: CircleGauge,         title: "Trust Ledger",        desc: "Bayesian updates turn observed behavior into routing signal." },
  { icon: ShieldAlert,         title: "Reward Engine",       desc: "Completion + detection + calibration + efficiency." },
];

const BEFORE_STEPS = [
  "Orchestrator delegates with no evidence.",
  "Adversarial specialist poisons high-stakes output.",
  "Poisoned state cascades across downstream tasks.",
  "Mission fails — nobody knows which slot was risky.",
];
const AFTER_STEPS = [
  "Trust ledger updates after every action.",
  "High-stakes + low-trust triggers verification.",
  "Adversarial attempt blocked before cascade.",
  "Profile swap proves skill, not memorized identity.",
];
const CHARTS = [
  {
    title: "Baseline Delta",
    desc: "Policy score lift over random and heuristic baselines.",
    src: "/assets/charts/baseline_delta_lines.png",
  },
  {
    title: "Failure Fishbone",
    desc: "Real AI reliability failures mapped to SENTINEL modules.",
    src: "/assets/charts/failure_fishbone_map.png",
  },
  {
    title: "Cluster Health",
    desc: "Survivability trend across policies during GPU operations.",
    src: "/assets/charts/cluster_health_policy_lines.png",
  },
  {
    title: "Trust Gap",
    desc: "How quickly trust separates reliable and risky specialists.",
    src: "/assets/charts/trust_gap_over_time.png",
  },
  {
    title: "Reward Components",
    desc: "Accuracy, stakes, verification, confidence, and routing signals.",
    src: "/assets/charts/reward_component_stacked_area.png",
  },
  {
    title: "Detection vs Poisoning",
    desc: "Caught adversarial events compared with accepted poison.",
    src: "/assets/charts/detection_vs_poisoning.png",
  },
];

export default function Landing({
  proof,
  onEnterMission,
  onEnterJudge,
}: {
  proof: {
    random: EvalSummary;
    heuristic: EvalSummary;
    oracle: EvalSummary;
    trained?: EvalSummary;
    task3Heuristic: EvalSummary;
  } | null;
  onEnterMission: () => void;
  onEnterJudge: () => void;
}) {
  return (
    <div className="land">
      {/* hero */}
      <div className="land-hero">
        <h1>
          Agents fail because they{" "}
          <span>trust blindly</span>
        </h1>
        <p>
          SENTINEL trains an orchestrator to decide who to trust, when to verify,
          and how to recover in long multi-agent tasks when specialist agents are
          unreliable or adversarial.
        </p>
        <div className="land-ctas">
          <button className="btn btn-primary btn-lg" onClick={onEnterMission}>
            <Sparkles size={16} /> Try It Live
          </button>
          <button className="btn btn-lg" onClick={onEnterJudge}>
            <ArrowRight size={16} /> Judge Demo
          </button>
        </div>
      </div>

      {/* score strip */}
      <div className="score-strip">
        <div className="panel score-card r">
          <div className="lbl">Random</div>
          <div className="val">{formatScore(proof?.random.avg_score)}</div>
        </div>
        <div className="panel score-card a">
          <div className="lbl">Heuristic</div>
          <div className="val">{formatScore(proof?.heuristic.avg_score)}</div>
        </div>
        <div className="panel score-card g">
          <div className="lbl">Oracle‑lite</div>
          <div className="val">{formatScore(proof?.oracle.avg_score)}</div>
        </div>
        <div className="panel score-card a">
          <div className="lbl">GRPO Replay</div>
          <div className="val">{formatScore(proof?.trained?.avg_score)}</div>
        </div>
        <div className="panel score-card w">
          <div className="lbl">Task 3 Detect</div>
          <div className="val">{formatScore(proof?.task3Heuristic.avg_detection_rate)}</div>
        </div>
      </div>

      {/* before / after */}
      <div className="ba-section">
        <div className="panel-head" style={{ textAlign: "center", marginBottom: 20 }}>
          <div className="panel-eyebrow">Why This Matters</div>
          <div className="panel-title">Before vs After SENTINEL</div>
        </div>
        <div className="ba-grid">
          <div className="panel ba-card before">
            <div className="ba-tag">✗ Without Trust Calibration</div>
            <h3>Blind Delegation</h3>
            <div className="ba-steps">
              {BEFORE_STEPS.map((s, i) => (
                <div className="ba-step" key={i}>
                  <span className="num">{i + 1}</span>
                  <span>{s}</span>
                </div>
              ))}
            </div>
            <div className="ba-score">0.19</div>
          </div>
          <div className="panel ba-card after">
            <div className="ba-tag">✓ With SENTINEL Training</div>
            <h3>Trust‑Aware Routing</h3>
            <div className="ba-steps">
              {AFTER_STEPS.map((s, i) => (
                <div className="ba-step" key={i}>
                  <span className="num">{i + 1}</span>
                  <span>{s}</span>
                </div>
              ))}
            </div>
            <div className="ba-score">0.71</div>
          </div>
        </div>
      </div>

      {/* architecture */}
      <div style={{ marginTop: 8 }}>
        <div className="panel-head" style={{ textAlign: "center", marginBottom: 16 }}>
          <div className="panel-eyebrow">Architecture</div>
          <div className="panel-title">What the System Is Made Of</div>
        </div>
        <div className="arch-grid">
          {ARCH.map((a) => (
            <div className="panel arch-card" key={a.title}>
              <a.icon size={20} />
              <h4>{a.title}</h4>
              <p>{a.desc}</p>
            </div>
          ))}
        </div>
      </div>

      {/* evidence charts */}
      <div className="chart-section">
        <div className="panel-head" style={{ textAlign: "center", marginBottom: 16 }}>
          <div className="panel-eyebrow">Evidence</div>
          <div className="panel-title">Baseline, Trust, Reward, and Failure Maps</div>
        </div>
        <div className="chart-grid">
          {CHARTS.map((chart) => (
            <a className="panel chart-card" href={chart.src} target="_blank" rel="noreferrer" key={chart.src}>
              <div className="chart-meta">
                <ChartLine size={16} />
                <div>
                  <h4>{chart.title}</h4>
                  <p>{chart.desc}</p>
                </div>
              </div>
              <img src={chart.src} alt={chart.title} />
            </a>
          ))}
        </div>
      </div>
    </div>
  );
}