(self)
| 195 | |
| 196 | class ProblemSlide(Scene): |
| 197 | def construct(self): |
| 198 | header = slide_title("THE PROBLEM") |
| 199 | self.play(FadeIn(header, shift=RIGHT * 0.3)) |
| 200 | |
| 201 | main_text = Text( |
| 202 | "AI infrastructure is being deployed at breakneck speed.\nSecurity is an afterthought.", |
| 203 | font="SF Mono", font_size=22, color=TEXT_PRIMARY, line_spacing=1.4 |
| 204 | ) |
| 205 | main_text.shift(UP * 2.5) |
| 206 | self.play(Write(main_text, run_time=2)) |
| 207 | |
| 208 | # Big stat cards |
| 209 | card1 = stat_card("175,000+", "Ollama servers\nexposed globally", SEVERITY_CRITICAL, width=4.2, height=2.2) |
| 210 | card2 = stat_card("2,000+", "Clawdbot gateways\nno authentication", SEVERITY_HIGH, width=4.2, height=2.2) |
| 211 | card3 = stat_card("7,000+", "MCP servers\nopen on the web", ACCENT_AMBER, width=4.2, height=2.2) |
| 212 | |
| 213 | cards = VGroup(card1, card2, card3).arrange(RIGHT, buff=0.4) |
| 214 | cards.shift(DOWN * 0.3) |
| 215 | |
| 216 | self.play(LaggedStart( |
| 217 | *[FadeIn(c, shift=UP * 0.5, scale=0.9) for c in cards], |
| 218 | lag_ratio=0.2 |
| 219 | ), run_time=2) |
| 220 | |
| 221 | # Bottom stats bar |
| 222 | bottom_stats = VGroup( |
| 223 | Text("43% of MCP servers have command injection", font="SF Mono", font_size=14, color=SEVERITY_CRITICAL), |
| 224 | Text(" | ", font="SF Mono", font_size=14, color=BORDER), |
| 225 | Text("$100K/day in stolen compute", font="SF Mono", font_size=14, color=SEVERITY_HIGH), |
| 226 | Text(" | ", font="SF Mono", font_size=14, color=BORDER), |
| 227 | Text("91,403 attack sessions documented", font="SF Mono", font_size=14, color=ACCENT_AMBER), |
| 228 | ).arrange(RIGHT, buff=0.05) |
| 229 | bottom_stats.shift(DOWN * 2.8) |
| 230 | |
| 231 | self.play(FadeIn(bottom_stats, shift=UP * 0.2)) |
| 232 | |
| 233 | # Source citation |
| 234 | source = Text( |
| 235 | "Sources: SentinelOne/Censys Jan 2026, Shodan Jan 2026, AuthZed Dec 2025", |
| 236 | font="SF Mono", font_size=10, color=TEXT_MUTED |
| 237 | ) |
| 238 | source.to_edge(DOWN, buff=0.3) |
| 239 | self.play(FadeIn(source)) |
| 240 | |
| 241 | self.wait(3) |
| 242 | |
| 243 | |
| 244 | # ═══════════════════════════════════════════════════════════════════════════════ |
nothing calls this directly
no test coverage detected