create-slide-deck 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +119 -0
- package/package.json +36 -0
- package/template-full/README.md +99 -0
- package/template-full/package.json +47 -0
- package/template-full/src/reveal/components/auto-layout.ts +229 -0
- package/template-full/src/reveal/components/charts.tsx +213 -0
- package/template-full/src/reveal/core/blocks.ts +172 -0
- package/template-full/src/reveal/core/deck-init.ts +60 -0
- package/template-full/src/reveal/core/design.ts +46 -0
- package/template-full/src/reveal/core/layout.ts +187 -0
- package/template-full/src/reveal/core/mount-registry.ts +41 -0
- package/template-full/src/reveal/core/presets.ts +189 -0
- package/template-full/src/reveal/core/runtime.ts +141 -0
- package/template-full/src/reveal/core/types.ts +114 -0
- package/template-full/src/reveal/data/algorithms.ts +78 -0
- package/template-full/src/reveal/data/benchmark.ts +79 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-arc-progress.tsx +153 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-before-after.tsx +164 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-bigtext.tsx +70 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-card-flip.tsx +118 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-chat-bubbles.tsx +257 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-code.tsx +136 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-concept-map.tsx +336 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-counter.tsx +194 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-cover.tsx +188 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-dark-dashboard.tsx +166 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-eval-matrix.tsx +191 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-force-graph.tsx +169 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-fullbleed-bars.tsx +109 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-fullbleed-flow.tsx +177 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-heatmap.tsx +135 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-icon-wall.tsx +143 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-math.tsx +103 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-number-morph.tsx +126 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-path.tsx +185 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-radar.tsx +124 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-rough.tsx +169 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-sankey.tsx +144 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-screenshot-annotate.tsx +181 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-stacked-cards.tsx +159 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-tabs.tsx +206 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-timeline.tsx +162 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-treemap.tsx +161 -0
- package/template-full/src/reveal/decks/demo-showcase/components/demo-zoom-focus.tsx +223 -0
- package/template-full/src/reveal/decks/demo-showcase/components/registry.ts +63 -0
- package/template-full/src/reveal/decks/demo-showcase/demo.css +237 -0
- package/template-full/src/reveal/decks/demo-showcase/index.html +24 -0
- package/template-full/src/reveal/decks/demo-showcase/main.ts +7 -0
- package/template-full/src/reveal/decks/demo-showcase/slides.ts +271 -0
- package/template-full/src/reveal/decks/fse26-rca/components/aws-cascade.tsx +295 -0
- package/template-full/src/reveal/decks/fse26-rca/components/bench-compare.tsx +64 -0
- package/template-full/src/reveal/decks/fse26-rca/components/bench-deficiency.tsx +104 -0
- package/template-full/src/reveal/decks/fse26-rca/components/bench-loop.tsx +402 -0
- package/template-full/src/reveal/decks/fse26-rca/components/bench-needs.tsx +78 -0
- package/template-full/src/reveal/decks/fse26-rca/components/closing-takeaway.tsx +165 -0
- package/template-full/src/reveal/decks/fse26-rca/components/cloud-incidents.tsx +88 -0
- package/template-full/src/reveal/decks/fse26-rca/components/failure-modes.tsx +59 -0
- package/template-full/src/reveal/decks/fse26-rca/components/fault-heatmap.tsx +85 -0
- package/template-full/src/reveal/decks/fse26-rca/components/hierarchy-tree.tsx +93 -0
- package/template-full/src/reveal/decks/fse26-rca/components/incident-hard.tsx +72 -0
- package/template-full/src/reveal/decks/fse26-rca/components/rca-pipeline.tsx +193 -0
- package/template-full/src/reveal/decks/fse26-rca/components/registry.ts +37 -0
- package/template-full/src/reveal/decks/fse26-rca/components/simple-rca.tsx +216 -0
- package/template-full/src/reveal/decks/fse26-rca/components/sota-collapse.tsx +63 -0
- package/template-full/src/reveal/decks/fse26-rca/components/srca-results.tsx +115 -0
- package/template-full/src/reveal/decks/fse26-rca/images/aws-outage-2025-deployflow.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/aws-post-event-summary.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/bbc-crowdstrike.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/cnn-meta-outage-2021.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/cover.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/nyt-facebook-2021.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/qr-repo.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/verge-crowdstrike-2024.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/images/wiki-meta-outage-2021.png +0 -0
- package/template-full/src/reveal/decks/fse26-rca/index.html +30 -0
- package/template-full/src/reveal/decks/fse26-rca/main.ts +8 -0
- package/template-full/src/reveal/decks/fse26-rca/slides.ts +175 -0
- package/template-full/src/reveal/env.d.ts +38 -0
- package/template-full/src/reveal/theme.css +762 -0
- package/template-full/src/reveal/tools/dev.mjs +120 -0
- package/template-full/src/reveal/tools/export-pdf.mjs +86 -0
- package/template-full/src/reveal/tools/preview.mjs +132 -0
- package/template-full/tsconfig.json +19 -0
- package/template-full/vite.config.ts +95 -0
- package/template-minimal/package.json +42 -0
- package/template-minimal/src/reveal/components/auto-layout.ts +229 -0
- package/template-minimal/src/reveal/components/charts.tsx +213 -0
- package/template-minimal/src/reveal/core/blocks.ts +172 -0
- package/template-minimal/src/reveal/core/deck-init.ts +60 -0
- package/template-minimal/src/reveal/core/design.ts +46 -0
- package/template-minimal/src/reveal/core/layout.ts +187 -0
- package/template-minimal/src/reveal/core/mount-registry.ts +41 -0
- package/template-minimal/src/reveal/core/presets.ts +189 -0
- package/template-minimal/src/reveal/core/runtime.ts +141 -0
- package/template-minimal/src/reveal/core/types.ts +114 -0
- package/template-minimal/src/reveal/data/.gitkeep +0 -0
- package/template-minimal/src/reveal/decks/my-deck/components/example-component.tsx +28 -0
- package/template-minimal/src/reveal/decks/my-deck/components/registry.ts +9 -0
- package/template-minimal/src/reveal/decks/my-deck/index.html +14 -0
- package/template-minimal/src/reveal/decks/my-deck/main.ts +5 -0
- package/template-minimal/src/reveal/decks/my-deck/slides.ts +34 -0
- package/template-minimal/src/reveal/env.d.ts +38 -0
- package/template-minimal/src/reveal/theme.css +762 -0
- package/template-minimal/tsconfig.json +19 -0
- package/template-minimal/vite.config.ts +95 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>FSE26 RCA Paper Talk</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<svg class="global-svg-defs" width="0" height="0" aria-hidden="true" focusable="false">
|
|
10
|
+
<defs>
|
|
11
|
+
<marker id="arrow-gray" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="8.5" markerHeight="8.5" orient="auto-start-reverse">
|
|
12
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#BFBFBF"></path>
|
|
13
|
+
</marker>
|
|
14
|
+
<marker id="arrow-red" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="8.5" markerHeight="8.5" orient="auto-start-reverse">
|
|
15
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#C00000"></path>
|
|
16
|
+
</marker>
|
|
17
|
+
<marker id="arrow-green" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="8.5" markerHeight="8.5" orient="auto-start-reverse">
|
|
18
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#76B82A"></path>
|
|
19
|
+
</marker>
|
|
20
|
+
<marker id="arrow-blue" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="8.5" markerHeight="8.5" orient="auto-start-reverse">
|
|
21
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#00A6D6"></path>
|
|
22
|
+
</marker>
|
|
23
|
+
</defs>
|
|
24
|
+
</svg>
|
|
25
|
+
<div class="reveal">
|
|
26
|
+
<div class="slides"></div>
|
|
27
|
+
</div>
|
|
28
|
+
<script type="module" src="./main.ts"></script>
|
|
29
|
+
</body>
|
|
30
|
+
</html>
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { blockSlide, reactSlide } from "../../core/layout.ts";
|
|
2
|
+
import type { ComponentName } from "./components/registry.ts";
|
|
3
|
+
import type { Slide } from "../../core/types.ts";
|
|
4
|
+
|
|
5
|
+
function slide01(): Slide {
|
|
6
|
+
return blockSlide({
|
|
7
|
+
html: `
|
|
8
|
+
<img class="cover-photo" src="images/cover.png" alt="CUHK-Shenzhen">
|
|
9
|
+
<div class="cover-title">Rethinking the Evaluation of Microservice RCA<br>with a Fault Propagation-Aware Benchmark</div>
|
|
10
|
+
<div class="authors"><strong>Aoyang Fang</strong>, Songhan Zhang, Yifan Yang, Haotong Wu, Junjielong Xu<br>Xuyang Wang, Rui Wang, Manyi Wang, Qisheng Lu, Pinjia He</div>
|
|
11
|
+
<div class="affiliation">The Chinese University of Hong Kong, Shenzhen</div>
|
|
12
|
+
<div class="affiliation-sub">School of Data Science | School of Artificial Intelligence</div>
|
|
13
|
+
`,
|
|
14
|
+
notes: "Static cover with title, authors, first author highlight, and institution.",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function slideWhyRcaMatters(): Slide {
|
|
19
|
+
return reactSlide<ComponentName>({
|
|
20
|
+
title: "Cloud incidents cost billions",
|
|
21
|
+
component: "CloudIncidents",
|
|
22
|
+
steps: 1,
|
|
23
|
+
notes: "Three real-world outage headlines with captions; a frosted banner summarises the RCA connection.",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function slide03(): Slide {
|
|
28
|
+
return reactSlide<ComponentName>({
|
|
29
|
+
title: "AWS 2025: A DNS race cascaded through 6 layers",
|
|
30
|
+
component: "AwsCascade",
|
|
31
|
+
steps: 7,
|
|
32
|
+
x: 20, y: 62, w: 1240, h: 650,
|
|
33
|
+
notes: "Progressive cascade: each click reveals the next layer of the AWS incident propagation.",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function slide02(): Slide {
|
|
38
|
+
return reactSlide<ComponentName>({
|
|
39
|
+
title: "How RCA works in papers",
|
|
40
|
+
component: "RcaPipeline",
|
|
41
|
+
steps: 6,
|
|
42
|
+
x: 20, y: 62, w: 1240, h: 650,
|
|
43
|
+
notes: "Progressive reveal: failure → metrics → logs → traces → RCA model → Top-K ranking.",
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function slide04(): Slide {
|
|
48
|
+
return reactSlide<ComponentName>({
|
|
49
|
+
title: "What makes real incidents hard?",
|
|
50
|
+
component: "IncidentHard",
|
|
51
|
+
steps: 4,
|
|
52
|
+
notes: "Real incidents have two key properties: fault propagation (cascade across layers) and diagnostic difficulty (root cause is not the loudest signal). Do existing benchmarks capture this? To test, we designed SimpleRCA — a deliberately simple probe.",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function slide05(): Slide {
|
|
57
|
+
return reactSlide<ComponentName>({
|
|
58
|
+
title: "SimpleRCA: a deliberately simple probe",
|
|
59
|
+
component: "SimpleRca",
|
|
60
|
+
steps: 5,
|
|
61
|
+
x: 20, y: 62, w: 1240, h: 650,
|
|
62
|
+
notes: "SimpleRCA walks each telemetry type with a simple rule: threshold for metrics, latency for traces, keyword match for logs. Alerts are counted per service, then ranked. If this trivial approach matches SOTA, the benchmark is shortcut-friendly.",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function slide06(): Slide {
|
|
67
|
+
return reactSlide<ComponentName>({
|
|
68
|
+
title: "The shortcut performs too well",
|
|
69
|
+
component: "SrcaResults",
|
|
70
|
+
steps: 3,
|
|
71
|
+
x: 50, y: 80, w: 1180, h: 620,
|
|
72
|
+
notes: "Step 1: highlight 7 datasets where SimpleRCA wins. Step 2: highlight 4 where it loses — gap ≤ 0.18, Eadro has data leakage. Step 3: 7/11 summary + punchline.",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function slide07(): Slide {
|
|
77
|
+
return reactSlide<ComponentName>({
|
|
78
|
+
title: "Why does the shortcut work?",
|
|
79
|
+
component: "BenchDeficiency",
|
|
80
|
+
steps: 4,
|
|
81
|
+
x: 30, y: 70, w: 1220, h: 640,
|
|
82
|
+
notes: "We studied 737 cases across 11 benchmarks. Type I (68%): only injected service is loud — trivially easy. Type II (18%): no signal anywhere — impossible. Type III (14%): downstream louder — needs real reasoning. 86% are shortcut-friendly. 99% lack complete observability.",
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function slide09(): Slide {
|
|
87
|
+
return reactSlide<ComponentName>({
|
|
88
|
+
title: "What does a realistic benchmark need?",
|
|
89
|
+
component: "BenchNeeds",
|
|
90
|
+
steps: 3,
|
|
91
|
+
notes: "A better benchmark preserves three things: known fault source, propagation path, and validated user impact.",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function slide10(): Slide {
|
|
96
|
+
return reactSlide<ComponentName>({
|
|
97
|
+
title: "The benchmark generator is a closed loop",
|
|
98
|
+
component: "BenchLoop",
|
|
99
|
+
steps: 10,
|
|
100
|
+
notes: "10 steps: TrainTicket, then Dynamic Load builds tree click-by-click, then Fault controller, Telemetry, SLI validator.",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function slide13(): Slide {
|
|
105
|
+
return reactSlide<ComponentName>({
|
|
106
|
+
title: "Ground truth is hierarchical",
|
|
107
|
+
component: "HierarchyTree",
|
|
108
|
+
steps: 5,
|
|
109
|
+
x: 20, y: 80, w: 1240, h: 620,
|
|
110
|
+
notes: "Hierarchical ground truth: Service (ts-order-service) → Pod → Container → Metric/Span/Function. Main results use service-level for fair cross-method comparison.",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function slide15(): Slide {
|
|
115
|
+
return reactSlide<ComponentName>({
|
|
116
|
+
title: "Our benchmark vs. existing datasets",
|
|
117
|
+
component: "BenchCompare",
|
|
118
|
+
steps: 5,
|
|
119
|
+
notes: "Side-by-side comparison across 8 dimensions: cases, services, coverage, depth, QPS, logs, traces, fault types. Ours dominates on most dimensions.",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function slide16(): Slide {
|
|
124
|
+
return reactSlide<ComponentName>({
|
|
125
|
+
title: "SOTA accuracy collapses on the new benchmark",
|
|
126
|
+
component: "SotaCollapse",
|
|
127
|
+
steps: 4,
|
|
128
|
+
notes: "12 algorithms on our benchmark: best Top@1 = 0.37 (MicroRCA), SimpleRCA = 0.28. CausalRCA takes 927s. The shortcut no longer dominates.",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function slide17(): Slide {
|
|
133
|
+
return reactSlide<ComponentName>({
|
|
134
|
+
title: "Model behavior changes across realistic fault types",
|
|
135
|
+
component: "FaultHeatmap",
|
|
136
|
+
steps: 7,
|
|
137
|
+
notes: "All 25 fault types × 12 algorithms. Step 0 Lifecycle, Step 1 Resource, Step 2 HTTP, Step 3 JVM, Step 4 Network, Step 5 Blind spots, Step 6 summary.",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function slide18(): Slide {
|
|
142
|
+
return reactSlide<ComponentName>({
|
|
143
|
+
title: "The failures cluster into three bottlenecks",
|
|
144
|
+
component: "FailureModes",
|
|
145
|
+
steps: 4,
|
|
146
|
+
notes: "262 hardest cases. Step 0 Scalability (39.8%): CausalRCA 927s, Nezha 94.6s per case. Step 1 Observability blind spots (signal-loss 5.8%, infrastructure 4.2%, semantic-gap 2.9%). Step 2 Modeling (47.4%): wrong propagation assumptions. Step 3: three orthogonal bottlenecks.",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function slideClosing(): Slide {
|
|
151
|
+
return reactSlide<ComponentName>({
|
|
152
|
+
title: "Takeaways",
|
|
153
|
+
component: "ClosingTakeaway",
|
|
154
|
+
steps: 4,
|
|
155
|
+
notes: "Three takeaways: (1) Benchmark quality determines research direction — same algorithms rank differently. (2) Three orthogonal bottlenecks: modeling 47%, scalability 40%, observability 13%. (3) Open benchmark with 1,430 cases, 25 fault types, 12 algorithms. Final message: do not optimize for an easy benchmark.",
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export async function buildFse26NativeSlides(): Promise<Slide[]> {
|
|
160
|
+
const builders = [
|
|
161
|
+
slide01, slideWhyRcaMatters, slide03, slide02, slide04, slide05,
|
|
162
|
+
slide06, slide07, slide09, slide10,
|
|
163
|
+
slide13, slide15,
|
|
164
|
+
slide16, slide17, slide18, slideClosing,
|
|
165
|
+
];
|
|
166
|
+
const slides = builders.map((builder) => builder());
|
|
167
|
+
slides.forEach((slide, i) => {
|
|
168
|
+
const pageDiv = `<div class="page-no">${String(i + 1).padStart(2, "0")}</div>`;
|
|
169
|
+
if (!slide.html.includes('class="page-no"')) {
|
|
170
|
+
slide.html += "\n" + pageDiv;
|
|
171
|
+
}
|
|
172
|
+
slide.html += '\n<div class="inst-mark">CUHK-Shenzhen</div>';
|
|
173
|
+
});
|
|
174
|
+
return slides;
|
|
175
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
|
2
|
+
|
|
3
|
+
declare module "reveal.js" {
|
|
4
|
+
export default class Reveal {
|
|
5
|
+
constructor(config: Record<string, any>);
|
|
6
|
+
initialize(): Promise<void>;
|
|
7
|
+
on(event: string, callback: (e: any) => void): void;
|
|
8
|
+
off(event: string, callback: (e: any) => void): void;
|
|
9
|
+
getCurrentSlide(): HTMLElement | null;
|
|
10
|
+
getState(): { indexh: number; indexf: number };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare module "reveal.js/plugin/notes" {
|
|
15
|
+
const RevealNotes: any;
|
|
16
|
+
export default RevealNotes;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
declare module "*.css" {}
|
|
20
|
+
|
|
21
|
+
declare module "roughjs" {
|
|
22
|
+
export function svg(el: SVGSVGElement): any;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare module "roughjs/bundled/rough.esm.js" {
|
|
26
|
+
const rough: {
|
|
27
|
+
svg(el: SVGSVGElement): any;
|
|
28
|
+
};
|
|
29
|
+
export default rough;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
declare module "prismjs" {
|
|
33
|
+
const Prism: {
|
|
34
|
+
highlight(code: string, grammar: any, language: string): string;
|
|
35
|
+
languages: Record<string, any>;
|
|
36
|
+
};
|
|
37
|
+
export default Prism;
|
|
38
|
+
}
|