research-copilot 0.2.17 → 0.2.21

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.
Files changed (83) hide show
  1. package/README.md +7 -1
  2. package/app/out/main/index.mjs +2842 -188
  3. package/app/out/preload/index.js +2 -0
  4. package/app/out/renderer/assets/{MilkdownMarkdownEditor-tTNRIB2K.css → MilkdownMarkdownEditor-BW0Pt28W.css} +103 -15
  5. package/app/out/renderer/assets/{MilkdownMarkdownEditor-CuTa5j4S.js → MilkdownMarkdownEditor-OhCrq3X0.js} +99 -52
  6. package/app/out/renderer/assets/{arc-BAWS3N-F.js → arc-DLr0RP8F.js} +1 -1
  7. package/app/out/renderer/assets/{blockDiagram-c4efeb88-BHadwPqY.js → blockDiagram-c4efeb88-XhKChw2n.js} +8 -8
  8. package/app/out/renderer/assets/{c4Diagram-c83219d4-B3kOxRad.js → c4Diagram-c83219d4-DDoJmoIQ.js} +3 -3
  9. package/app/out/renderer/assets/{channel-Bll9CBqI.js → channel-CJCgJSqV.js} +1 -1
  10. package/app/out/renderer/assets/{classDiagram-beda092f-Dv7owGyx.js → classDiagram-beda092f-CAmimZpz.js} +6 -6
  11. package/app/out/renderer/assets/{classDiagram-v2-2358418a-cWrqk5tQ.js → classDiagram-v2-2358418a-Bma4E_Eg.js} +10 -10
  12. package/app/out/renderer/assets/{clone-D-DQ4nnY.js → clone-C338dmoI.js} +1 -1
  13. package/app/out/renderer/assets/{createText-1719965b-ciE8YuqI.js → createText-1719965b-_up4NJqB.js} +2 -2
  14. package/app/out/renderer/assets/{edges-96097737-DycnAYk_.js → edges-96097737-Bpp6hVLn.js} +3 -3
  15. package/app/out/renderer/assets/{erDiagram-0228fc6a-Sv78YNMY.js → erDiagram-0228fc6a-bjTh_7ap.js} +5 -5
  16. package/app/out/renderer/assets/{flowDb-c6c81e3f-BiOarg9b.js → flowDb-c6c81e3f-BjVV4DVk.js} +1 -1
  17. package/app/out/renderer/assets/{flowDiagram-50d868cf-19J80nxU.js → flowDiagram-50d868cf-gmeaaZ6z.js} +12 -12
  18. package/app/out/renderer/assets/{flowDiagram-v2-4f6560a1-c-kGsubV.js → flowDiagram-v2-4f6560a1-nem5zs2M.js} +12 -12
  19. package/app/out/renderer/assets/{flowchart-elk-definition-6af322e1-DRrYbiSC.js → flowchart-elk-definition-6af322e1-DPaGAYRw.js} +6 -6
  20. package/app/out/renderer/assets/{ganttDiagram-a2739b55-BadmpvMy.js → ganttDiagram-a2739b55-CnAti19E.js} +3 -3
  21. package/app/out/renderer/assets/{gitGraphDiagram-82fe8481-BdVoj60Q.js → gitGraphDiagram-82fe8481-DQWHD3SJ.js} +2 -2
  22. package/app/out/renderer/assets/{graph-jZhookGR.js → graph-DKiKgH8m.js} +1 -1
  23. package/app/out/renderer/assets/{index-B8fh500_.js → index-4s-c5d65.js} +3 -3
  24. package/app/out/renderer/assets/{index-5325376f-CbxmatXv.js → index-5325376f-G-0aO-2i.js} +6 -6
  25. package/app/out/renderer/assets/{index-CAlpJ3-o.js → index-9q_P5ULR.js} +4 -4
  26. package/app/out/renderer/assets/{index-cavFRVgM.js → index-B1A3JxQj.js} +3 -3
  27. package/app/out/renderer/assets/{index-B9kkJj3J.js → index-BBUrmGmY.js} +6 -6
  28. package/app/out/renderer/assets/{index-CMGDsC_t.js → index-BQho5LH-.js} +6 -6
  29. package/app/out/renderer/assets/{index-CirXkIv2.js → index-BUVlmsgO.js} +3 -3
  30. package/app/out/renderer/assets/{index-BWCwSkxb.js → index-BzEthrJ4.js} +3 -3
  31. package/app/out/renderer/assets/{index-B2UUF9y9.js → index-C1YzkB4z.js} +1289 -419
  32. package/app/out/renderer/assets/{index-D-ZMmLhv.js → index-CGo665vD.js} +3 -3
  33. package/app/out/renderer/assets/{index-DQwFQR1s.js → index-CPZaxR35.js} +3 -3
  34. package/app/out/renderer/assets/{index-DOUTte7i.js → index-CSyD1mbL.js} +3 -3
  35. package/app/out/renderer/assets/{index-BUcSHPha.js → index-Cf7vlFSn.js} +3 -3
  36. package/app/out/renderer/assets/{index-CZX0435B.js → index-CluH1o2q.js} +6 -6
  37. package/app/out/renderer/assets/{index-lAZsmnj1.css → index-CogwQwDN.css} +185 -32
  38. package/app/out/renderer/assets/{index-DEO9Jh2Y.js → index-Cw1n3klA.js} +5 -5
  39. package/app/out/renderer/assets/{index-BBUnWjLe.js → index-DFzvntIw.js} +3 -3
  40. package/app/out/renderer/assets/{index-g91Iwgxa.js → index-DHzyAhWM.js} +4 -4
  41. package/app/out/renderer/assets/{index-47oNNEnx.js → index-DhliHfCM.js} +6 -6
  42. package/app/out/renderer/assets/{index-DF_C6DjR.js → index-DkVFbCxC.js} +3 -3
  43. package/app/out/renderer/assets/{index-HCRA2-Q6.js → index-DpZJP5MT.js} +6 -6
  44. package/app/out/renderer/assets/{index-BXpNbFhG.js → index-Gfd_DiMG.js} +3 -3
  45. package/app/out/renderer/assets/{index-B110aKST.js → index-jOvNAYyP.js} +3 -3
  46. package/app/out/renderer/assets/{index-BTE0dEKO.js → index-rrJkk8KV.js} +6 -6
  47. package/app/out/renderer/assets/{index-DO5LsHlM.js → index-vfSerSmF.js} +1 -1
  48. package/app/out/renderer/assets/{infoDiagram-8eee0895-DpVt3Scv.js → infoDiagram-8eee0895-BCnBkXXS.js} +2 -2
  49. package/app/out/renderer/assets/{journeyDiagram-c64418c1-RYKX5mcV.js → journeyDiagram-c64418c1-Bq2wSX3k.js} +4 -4
  50. package/app/out/renderer/assets/{layout-BsbNXXgR.js → layout-BvkumzoT.js} +2 -2
  51. package/app/out/renderer/assets/{line-OzQTpJsh.js → line-eU4el-G4.js} +1 -1
  52. package/app/out/renderer/assets/{linear-DO5pdnqi.js → linear-DlBjMBEa.js} +1 -1
  53. package/app/out/renderer/assets/{mindmap-definition-8da855dc-D3zWs3h1.js → mindmap-definition-8da855dc-CzLBu7ao.js} +3 -3
  54. package/app/out/renderer/assets/{pieDiagram-a8764435-DDoNhSgQ.js → pieDiagram-a8764435--olrXFr_.js} +3 -3
  55. package/app/out/renderer/assets/{quadrantDiagram-1e28029f-ZO85SsRM.js → quadrantDiagram-1e28029f-BnpnBBgc.js} +3 -3
  56. package/app/out/renderer/assets/{requirementDiagram-08caed73-C-vKE6g8.js → requirementDiagram-08caed73-6O9WS7hn.js} +5 -5
  57. package/app/out/renderer/assets/{sankeyDiagram-a04cb91d-Cbqb2K-X.js → sankeyDiagram-a04cb91d-D-iJnK91.js} +2 -2
  58. package/app/out/renderer/assets/{sequenceDiagram-c5b8d532-BK4uvpEA.js → sequenceDiagram-c5b8d532-DBlK15cV.js} +3 -3
  59. package/app/out/renderer/assets/{stateDiagram-1ecb1508-DXa_YqNi.js → stateDiagram-1ecb1508-DKXKPYuk.js} +6 -6
  60. package/app/out/renderer/assets/{stateDiagram-v2-c2b004d7-Dm203Z8l.js → stateDiagram-v2-c2b004d7-DY288Eo5.js} +10 -10
  61. package/app/out/renderer/assets/{styles-b4e223ce-BV4b1eAh.js → styles-b4e223ce-CRJ_xgJ-.js} +1 -1
  62. package/app/out/renderer/assets/{styles-ca3715f6-CKhYSe7r.js → styles-ca3715f6-Bp_k5KLD.js} +1 -1
  63. package/app/out/renderer/assets/{styles-d45a18b0-DTCMfE-4.js → styles-d45a18b0-DLA8Gg6D.js} +4 -4
  64. package/app/out/renderer/assets/{svgDrawCommon-b86b1483-DK4i-dfJ.js → svgDrawCommon-b86b1483-Dm5CK2gQ.js} +1 -1
  65. package/app/out/renderer/assets/{timeline-definition-faaaa080-CE2LmuDH.js → timeline-definition-faaaa080-D-m9BHUg.js} +3 -3
  66. package/app/out/renderer/assets/{xychartDiagram-f5964ef8-Bd8KT9X9.js → xychartDiagram-f5964ef8-Drn4Rqev.js} +5 -5
  67. package/app/out/renderer/index.html +2 -2
  68. package/lib/skills/builtin/academic-marp-slides/SKILL.md +933 -0
  69. package/lib/skills/builtin/research-grants/SKILL.md +15 -11
  70. package/lib/skills/builtin/scholar-evaluation/SKILL.md +12 -11
  71. package/lib/skills/builtin/scientific-schematics/SKILL.md +463 -560
  72. package/lib/skills/builtin/teaching-marp-slides/SKILL.md +1218 -0
  73. package/package.json +1 -1
  74. package/scripts/audit-diagram-prompts.mjs +67 -0
  75. package/scripts/test-skill-routing.mjs +238 -0
  76. package/lib/skills/builtin/marp-slides/SKILL.md +0 -642
  77. package/lib/skills/builtin/scientific-schematics/references/QUICK_REFERENCE.md +0 -182
  78. package/lib/skills/builtin/scientific-schematics/references/README.md +0 -292
  79. package/lib/skills/builtin/scientific-schematics/scripts/__pycache__/generate_schematic.cpython-312.pyc +0 -0
  80. package/lib/skills/builtin/scientific-schematics/scripts/__pycache__/generate_schematic_ai.cpython-312.pyc +0 -0
  81. package/lib/skills/builtin/scientific-schematics/scripts/example_usage.sh +0 -85
  82. package/lib/skills/builtin/scientific-schematics/scripts/generate_schematic.py +0 -141
  83. package/lib/skills/builtin/scientific-schematics/scripts/generate_schematic_ai.py +0 -910
@@ -0,0 +1,933 @@
1
+ ---
2
+ name: academic-marp-slides
3
+ description: "Create or revise high-quality academic presentation slides in Markdown using Marp, following a disciplined multi-phase workflow. Use when the user needs conference talk slides, lab meeting decks, thesis defense presentations, research seminars, invited talks, OR wants to revise an existing Marp slide file. Enforces Assertion-Evidence structure and Mayer's multimedia learning principles. For teaching/lecture slides use `teaching-marp-slides`; for written documents use `paper-writing` or `scientific-writing`; for individual figures use `scientific-visualization`."
4
+ category: Presentation
5
+ tags: [Marp, Slides, Presentation, Conference Talk, Lab Meeting, Thesis Defense, Seminar, Research Talk, Assertion-Evidence, 做PPT, 学术幻灯片, 演示文稿, 学术报告]
6
+ triggers: [make slides, create presentation, conference talk, lab meeting slides, thesis defense, research presentation, seminar slides, marp, slide deck, revise slides, edit slides, improve slides, 做幻灯片, 做报告, 学术演讲, 修改幻灯片, PPT]
7
+ depends: [scientific-visualization, scientific-schematics]
8
+ license: MIT
9
+ metadata:
10
+ skill-author: Dong Dai
11
+ based-on: robonuggets/marp-slides, Alley Assertion-Evidence, Mayer multimedia learning principles
12
+ ---
13
+
14
+ # Academic Research Presentation Slides with Marp
15
+
16
+ ## Core Principle
17
+
18
+ **Slides are not documents.** They are visual aids for a spoken narrative. A good slide deck cannot be produced in one pass — it requires iteration through distinct phases, each with a different goal. This skill enforces a **phased workflow** that separates thinking (what to say) from structuring (what order) from visual design (how it looks). Skipping phases produces the flat, overstuffed, logically-loose decks that plague academic talks.
19
+
20
+ The two theoretical anchors:
21
+
22
+ 1. **Assertion-Evidence structure** (Michael Alley): Every slide title is a **complete sentence** stating a claim. The slide body is **visual evidence** for that claim. No bullet-point lists of topics.
23
+ 2. **Mayer's multimedia learning principles**: Images + spoken explanation beats on-screen text read aloud. Reduce redundancy, maximize signaling, keep related elements spatially close.
24
+
25
+ **Violating either of these is the most common reason academic slides fail.**
26
+
27
+ > **Note on Dry Run**: The user explicitly handles delivery rehearsal and validation themselves after receiving the draft. This skill therefore stops at a polished draft and does not prescribe dry-run steps. The user will test the deck and come back with revisions (Revise Mode).
28
+
29
+ ---
30
+
31
+ ## When to Use This Skill
32
+
33
+ - Conference talks, invited talks, workshop presentations
34
+ - Lab meetings, group meetings, research seminars
35
+ - Thesis defenses, qualifying exams
36
+ - Converting a paper/preprint into a talk
37
+ - **Revising** an existing Marp research slide deck
38
+
39
+ ### When NOT to Use
40
+
41
+ | Need | Use Instead |
42
+ |------|-------------|
43
+ | Teaching / lecture / classroom slides | `teaching-marp-slides` |
44
+ | Written paper, report, grant | `paper-writing`, `scientific-writing`, or `research-grants` |
45
+ | One standalone figure | `scientific-visualization`, `matplotlib`, or `seaborn` |
46
+ | Diagram / schematic only | `scientific-schematics` |
47
+ | Poster (static large-format) | Ask user before proceeding — Marp can do it but dedicated poster tools are better |
48
+ | PPTX that user will keep editing in PowerPoint | Marp PPTX export loses styling; warn the user first |
49
+
50
+ ---
51
+
52
+ ## Phase 0: Mode Detection (Do This First, Every Time)
53
+
54
+ Before anything else, determine which mode applies:
55
+
56
+ ### Signals for **Revise Mode**
57
+ - User attached or referenced an existing `.md` Marp file
58
+ - User says "change/fix/improve/update [existing slides]"
59
+ - User says "the deck I made…" / "slide 5 should…" / "this section is…"
60
+ - User pastes Marp Markdown and asks for edits
61
+
62
+ ### Signals for **Create Mode**
63
+ - User describes a paper, research, or topic but has no existing deck
64
+ - User says "make slides for my talk on…" / "help me prepare a presentation"
65
+ - No Marp source file has been provided or created earlier in the conversation
66
+
67
+ If ambiguous, **ask**:
68
+ > "Are we starting a new deck from scratch, or revising an existing one? If existing, please share the .md source."
69
+
70
+ Then route to the appropriate mode below.
71
+
72
+ ---
73
+
74
+ ## Context Gate (Required Before Create Mode)
75
+
76
+ **Good slides do not start from scratch — they are rooted in existing context.** Before entering Phase 1, run the context sweep below and summarize what you found (and what you could not find) to the user. A one-paragraph summary up front saves a Phase 3 rewrite later.
77
+
78
+ The sweep has three tiers. **Do all of tier 1 always; do tier 2 whenever it is cheap and plausibly relevant; only do tier 3 if tier 1+2 left real gaps.** Report at each tier — do not silently skip.
79
+
80
+ ### Tier 1 — Local context (always do, zero cost)
81
+
82
+ Four distinct local stores. Check each one — they don't overlap:
83
+
84
+ 1. **Structured memory** — `.research-pilot/memory/` holds long-lived user facts (co-author names, venue preferences, recurring style choices, prior talk themes). Read `MEMORY.md` (the index) and open any memory files whose description looks relevant. These are persistent across sessions and override inferred defaults.
85
+ 2. **Papers wiki (RFC-005)** — the user's curated literature knowledge base. Use it as follows:
86
+ - `wiki_coverage` first if you don't know what's in it — returns the list of indexed topics/facets.
87
+ - `wiki_search` with the user's topic / method / key terms.
88
+ - `wiki_get` to pull a specific entry; `wiki_neighbors` to walk from a known entry to adjacent work; `wiki_source` to trace a claim back to the underlying paper.
89
+ - If the wiki tools return "Wiki not available", the workspace has no wiki — skip this substep and move on.
90
+ 3. **Artifacts (local literature + notes)** — call `artifact-search` scoped to `papers` and `notes` with the user's topic/method keywords. Hits here are the user's own saved papers, reading notes, and prior session outputs. Read the most relevant before asking the user anything.
91
+ 4. **Workspace files and session history** — scan:
92
+ - `.research-pilot/memory-v2/session-summaries/` for summaries of prior work on this topic
93
+ - `.research-pilot/memory-v2/focus/` for the user's current focus entries
94
+ - `.research-pilot/artifacts/tool-output/slides/` for any prior decks in this workspace (style reference)
95
+ - Any paper drafts, reading PDFs, or data files the user dropped into the workspace root — use `grep`/`find` for likely filenames.
96
+
97
+ If any of these sources names a PDF/DOCX by path that is not yet an artifact, run `convert-document` on it first so its content becomes usable text.
98
+
99
+ ### Tier 2 — User confirmation + light expansion (do when gaps remain)
100
+
101
+ **Ask the user once, in a batched message**, whether any of these additional inputs exist:
102
+ - **Paper, preprint, or manuscript draft** for the research being presented (if not already found)
103
+ - **Prior talk slides** from the same group (style, figure choices)
104
+ - **Conference/venue style guide** (some conferences have templates)
105
+ - **Target venue examples** (published keynotes from the same venue)
106
+
107
+ **Plus, do a quick literature scan** if the slides will have a related-work section and tier 1 returned little:
108
+ - Call the `literature-search` tool with the user's topic + method keywords, limited to ~5–10 hits. This is a *context-building* pass, not an exhaustive survey — pull titles, venues, and abstracts to understand where the work sits.
109
+ - If `wiki_coverage` in tier 1 showed the wiki is well-populated on this topic, skip this step — the wiki already covers it.
110
+
111
+ ### Tier 3 — Online fallback (do only if needed for a specific gap)
112
+
113
+ Use these only when a tier 1+2 gap is *load-bearing* for the deck (e.g., the user named a venue you've never heard of, or a result claim needs a citation nobody has):
114
+ - `web_search` for venue style guides, conference CFPs, keynote examples, or recent news tied to the claim.
115
+ - `web_fetch` on a specific URL the user mentioned or the search returned.
116
+
117
+ Do not use tier 3 for general background — that belongs in `literature-search` or the wiki.
118
+
119
+ ### After the sweep — report and decide
120
+
121
+ Write one short paragraph to the user:
122
+ - **What I found:** [memory hits / wiki hits / artifact hits / workspace files / literature-search hits / web snippets]
123
+ - **What I still need:** [specific gaps that would change the deck — e.g., "no prior slides from your group, so I'll guess at visual style unless you share one"]
124
+ - **Proposed action:** either (a) proceed to Phase 1 now, or (b) pause while the user supplies one or two missing pieces
125
+
126
+ If the sweep turns up nothing substantive and the user has nothing more to share, proceed — but flag it explicitly:
127
+ > "No source material found locally or via a quick literature scan — I'll generate from scratch. Output will be generic and may need heavier revision. Consider sharing a paper draft, notes artifact, or a reference talk if possible."
128
+
129
+ This flag tells the user what quality to expect and invites them to supply material before committing.
130
+
131
+ ## Working Posture (Applies to All Phases)
132
+
133
+ Work like a junior presenter briefing a senior advisor — not like a machine executing a template.
134
+
135
+ - **Surface assumptions before acting.** If you're inferring something the user didn't say (e.g., "I assume this is for specialists in your exact subfield"), state it.
136
+ - **Name decisions and their rationale.** When choosing a narrative structure or an evidence type, say why you picked it and what else you considered.
137
+ - **Flag unknowns.** If a slide needs a figure you don't have, mark it with a clear placeholder and a question to the user.
138
+ - **Less is more.** Do not add filler content. Every slide, bullet, and figure must earn its place. If a slide feels empty, that's a composition problem to solve by re-layout — not by inventing content.
139
+
140
+ These apply at every STOP AND CONFIRM gate.
141
+
142
+ ---
143
+
144
+ # CREATE MODE
145
+
146
+ Four phases. Each has a stop-and-confirm gate with the user. **Do not skip gates. Do not proceed to the next phase without explicit user approval — even if the answer seems obvious.**
147
+
148
+ ```
149
+ Phase 1: Storyline ──► Outline on paper, no PPT (25% of total time)
150
+ Phase 2: Skeleton ──► Empty slide sequence (15%)
151
+ Phase 3: Content ──► Fill in figures + text (40%)
152
+ Phase 4: Polish ──► Visual refinement (20%)
153
+ ```
154
+
155
+ ## Phase 1: Storyline
156
+
157
+ **Goal**: Decide what story to tell before touching any slide software.
158
+
159
+ **Tools allowed**: Prose outlines and assertion lists. **Do not create a `.md` file yet.**
160
+
161
+ ### Step 1.1 — Consolidated intake (ask everything up front, in one batch)
162
+
163
+ Rather than asking questions one at a time and ping-ponging, ask for everything needed in a single structured request. If the user has already answered some of these in earlier messages or if the Context Gate surfaced them from artifacts, fill those in and only ask the remainder.
164
+
165
+ **Required before moving on:**
166
+
167
+ 1. **Audience** — peers in subfield / adjacent field / broad scientific / funders / mixed
168
+ 2. **Talk length** — lightning 5 min / short 10–12 min / standard 15–25 min / invited 45–60 min / defense 45–60 min
169
+ 3. **Venue** — conference hall / seminar room / lab meeting / online — affects theme choice
170
+ 4. **The one-sentence thesis** — the single most important thing the audience should remember one week later. If the user can't articulate this, help them extract it from their paper/notes, but do not proceed until it exists.
171
+ 5. **2–3 supporting claims** that back up the thesis
172
+ 6. **Context material available** — paper draft, prior slides, reference talks (tie to Context Gate above)
173
+ 7. **Hard constraints** — mandatory slides (affiliation logos, funding acknowledgments), required sections (disclosures, conflicts)
174
+
175
+ Batch these as one message. Do not begin drafting assertions until the user has answered the required items (1, 2, 4, 5) at minimum.
176
+
177
+ ### Step 1.2 — Draft the assertion list
178
+
179
+ Write out **every slide's title as a complete declarative sentence**. Example:
180
+
181
+ Bad (topic labels):
182
+ - Introduction
183
+ - Methods
184
+ - Results
185
+ - Discussion
186
+
187
+ Good (assertions):
188
+ - Predicting crystal structures beyond 30 atoms is infeasible with traditional CSP methods
189
+ - Existing AI generative models for crystals lack symmetry and local-environment constraints
190
+ - LEGO-xtal combines subgroup augmentation with SO(3)-descriptor pre-relaxation
191
+ - From 25 known sp² carbon structures, we generated 1,741 new low-energy allotropes
192
+ - We discovered four previously unknown negative-curvature graphite structures
193
+
194
+ Each assertion will become exactly one slide in Phase 2. The audience should follow the logical thread by reading titles alone.
195
+
196
+ ### Step 1.3 — Propose 2–3 narrative structure options (let the user pick)
197
+
198
+ Do not pick a single narrative unilaterally. Identify the 2–3 structures that plausibly fit the research, describe the trade-off, and let the user choose. This prevents committing to the wrong arc before the user has had a chance to weigh in.
199
+
200
+ Candidate structures:
201
+
202
+ | Structure | Best when… | Risk |
203
+ |-----------|-----------|------|
204
+ | **Problem-Method-Result** | Standard research with clear problem, clean methodology, quantitative result | Feels generic; no tension |
205
+ | **Reversal** | Finding contradicts common belief or prior work | Requires a genuinely surprising result |
206
+ | **Journey** | Exploratory work, serendipitous discovery, methodology paper | Can meander without strong editing |
207
+ | **Comparison** | Benchmarks, head-to-head systems studies, framework papers | Audience may lose interest in the losers |
208
+
209
+ Present the 2–3 most plausible candidates to the user with a one-line trade-off for each, then wait for their pick.
210
+
211
+ ### Step 1.4 — ★ STOP AND CONFIRM ★
212
+
213
+ Present to the user before writing any Markdown. Structure the handoff like a junior-to-advisor briefing:
214
+
215
+ **Proposal:**
216
+ 1. The one-sentence thesis
217
+ 2. The ordered list of assertion-style slide titles
218
+ 3. The chosen narrative structure (one of the candidates the user picked)
219
+ 4. Target slide count and time budget
220
+
221
+ **Assumptions I made (tell me if any are wrong):**
222
+ - [List any inferences — audience expertise level, what to omit, what to emphasize]
223
+
224
+ **Open questions:**
225
+ - [List anything still undecided — e.g., "unclear whether the negative result should be its own section or a subsection"]
226
+
227
+ **Do not proceed to Phase 2 without explicit approval.** Fixing a broken storyline here costs minutes; fixing it in Phase 3 costs hours.
228
+
229
+ **Persist the approved storyline.** After approval, call `artifact-create` with `type='note'` and a title like `Slides storyline — <talk title>`, storing the thesis, assertion list, and narrative choice. This gives the user a resumable checkpoint and makes the plan searchable in future sessions.
230
+
231
+ ### Phase 1 Checklist
232
+
233
+ - [ ] Context Gate completed (workspace searched; source material confirmed or absence flagged)
234
+ - [ ] Consolidated intake completed (audience, length, venue, thesis, supporting claims, context material, constraints)
235
+ - [ ] One-sentence thesis is specific (not "we studied X")
236
+ - [ ] Every planned slide has an assertion-style title
237
+ - [ ] 2–3 narrative candidates were presented; user picked one
238
+ - [ ] STOP gate briefing surfaced assumptions and open questions
239
+ - [ ] User has approved the storyline
240
+ - [ ] Approved storyline persisted as a note artifact
241
+
242
+ ---
243
+
244
+ ## Phase 2: Skeleton
245
+
246
+ **Goal**: Translate the approved storyline into a Marp file where every slide exists but contains no visual content yet.
247
+
248
+ **Tools allowed**: Create the `.md` file with minimum front matter. Use the default theme. **No images, no CSS tuning, no colors.**
249
+
250
+ ### Step 2.1 — Decide output location
251
+
252
+ Write the Marp source to `<workspace>/.research-pilot/artifacts/tool-output/slides/<slug>.md` (create the `slides/` subfolder if it does not exist). Using the project artifact tree means the deck lives alongside other session outputs and can be discovered later with `artifact-search`.
253
+
254
+ If the user has specified a different path, honor it — but mention this convention so they know where future decks will land by default.
255
+
256
+ ### Step 2.2 — Minimum front matter
257
+
258
+ ```markdown
259
+ ---
260
+ marp: true
261
+ theme: default
262
+ paginate: true
263
+ math: mathjax
264
+ ---
265
+ ```
266
+
267
+ ### Step 2.3 — One slide per assertion
268
+
269
+ For each approved assertion from Phase 1:
270
+
271
+ ```markdown
272
+ ---
273
+
274
+ # [Full assertion sentence from Phase 1]
275
+
276
+ > PLACEHOLDER: [one sentence describing what evidence goes here]
277
+
278
+ <!-- Speaker notes: key points to say aloud -->
279
+ ```
280
+
281
+ ### Step 2.4 — Add structural slides
282
+
283
+ - **Title slide** (1) — use `<!-- _class: lead -->` and `<!-- _paginate: false -->`
284
+ - **Outline slide** (1) — only if talk >20 min
285
+ - **Section dividers** (1 per major section) — `<!-- _class: lead -->`
286
+ - **Thank you / questions slide** (1)
287
+ - **Backup slides** (2–5) clearly marked for anticipated Q&A
288
+
289
+ ### Step 2.5 — Check timing arithmetic
290
+
291
+ Standard pacing: **~1 minute per content slide**.
292
+
293
+ | Talk length | Content slides | Total incl. dividers |
294
+ |-------------|----------------|----------------------|
295
+ | 5 min | 5–7 | 6–8 |
296
+ | 10–12 min | 8–12 | 10–14 |
297
+ | 15–20 min | 13–18 | 16–22 |
298
+ | 25 min | 18–22 | 22–27 |
299
+ | 45–60 min (defense) | 30–45 | 40–55 |
300
+
301
+ If skeleton is 30% over or under target, fix it now.
302
+
303
+ ### Step 2.6 — ★ STOP AND CONFIRM ★
304
+
305
+ Show the user the skeleton (titles + placeholders only). Ask:
306
+
307
+ - Does the logical flow from title to title still work when read in order?
308
+ - Is any slide doing too much or too little?
309
+ - Are there missing transitions?
310
+
311
+ Wait for approval before Phase 3.
312
+
313
+ ### Phase 2 Checklist
314
+
315
+ - [ ] Skeleton file written under `.research-pilot/artifacts/tool-output/slides/` (or user-specified path)
316
+ - [ ] Every assertion has a slide
317
+ - [ ] Every slide has a placeholder describing what visual evidence goes there
318
+ - [ ] Slide count matches target time budget
319
+ - [ ] Section dividers, title, thank-you slides in place
320
+ - [ ] User has approved the skeleton
321
+
322
+ ---
323
+
324
+ ## Phase 3: Content
325
+
326
+ **Goal**: Replace every placeholder with actual visual evidence (figures, tables, equations) and concise supporting text.
327
+
328
+ **Tools allowed**: Embed figures, write text, build simple tables. **No theme/color polishing yet.**
329
+
330
+ ### Step 3.1 — For each slide, decide evidence type
331
+
332
+ | Assertion claims… | Best evidence form |
333
+ |-------------------|-------------------|
334
+ | Quantitative comparison | Bar/line chart or table with bold winners |
335
+ | Structural/spatial concept | Schematic diagram or annotated figure |
336
+ | Procedural idea | Flowchart or numbered steps |
337
+ | Theoretical result | Equation with labeled terms |
338
+ | Qualitative contrast | Two-column before/after layout |
339
+ | Discovery / example | Representative image + caption |
340
+
341
+ ### Step 3.2 — Source figures by priority (use project skills/tools)
342
+
343
+ 1. **Existing publication figures** from the paper draft or prior slides — but simplify: remove panels, enlarge fonts, trim legends. Publication figures are too dense for slides.
344
+ 2. **Fresh publication-quality figures** — delegate to project skills:
345
+ - For journal-style multi-panel plots → `load_skill('scientific-visualization')`
346
+ - For low-level custom plots → `load_skill('matplotlib')` or `load_skill('seaborn')`
347
+ - Export to `<workspace>/.research-pilot/artifacts/tool-output/slides/figures/` and embed with a relative path.
348
+ 3. **Fresh data-driven numbers or charts** — if a claim needs a computation or re-plot the user doesn't have yet, call the `data-analyze` tool first; persist its output, then embed it.
349
+ 4. **Schematics and concept diagrams** — call the `generate_diagram` tool (load `scientific-schematics` first for type-specific prompt guidance). Output format: PNG for final embed (recommended for slides — fixed, predictable visual), or `format: "svg"` when the author wants to hand-tweak labels / colors afterwards (writes a `.png` anchor sibling for diffing). Best quality requires `OPENAI_API_KEY`; without the key, SVG falls back to a chat-model-only path with reduced quality, or hand-write inline SVG using the Component Library below.
350
+ 5. **Related-work / citation slides** — use the `literature-search` tool to gather references with proper metadata; pull BibTeX/DOIs into speaker notes or a References backup slide.
351
+ 6. **Inline SVG / HTML components** — for metric cards, simple bar charts, timelines (see Component Library below).
352
+
353
+ ### Step 3.3 — Follow one-idea-per-slide limits
354
+
355
+ Marp **silently clips** overflowing content. These are survival rules:
356
+
357
+ - Max 6 bullet points (prefer 3–4)
358
+ - Max 1 primary figure + ≤3 lines of supporting text
359
+ - Max 1 table with ≤5 rows and ≤5 columns
360
+ - Max 1 code block of ≤12 lines
361
+ - Body text never below 0.7em
362
+
363
+ If a slide violates these, **split it**. Never shrink text to fit.
364
+
365
+ ### Step 3.4 — Less is more (reject filler content)
366
+
367
+ Every slide, bullet, figure, and icon must earn its place. Actively reject these filler patterns:
368
+
369
+ - **Stat slop** — numbers or metrics included because "slides need data," not because they support the assertion
370
+ - **Decorative icons** — small icons next to every bullet point that add no semantic meaning
371
+ - **Padding bullets** — expanding 3 real points into 5 to "fill the slide"
372
+ - **Restated titles** — a bullet that just rewrites the title in worse prose
373
+ - **Generic agenda slides** — "Outline: Intro → Method → Results → Conclusion" on a 15-min talk wastes 90 seconds
374
+
375
+ If a slide feels empty, fix it by **re-composing the layout** (larger figure, better whitespace, two-column split), never by inventing content. One thousand no's for every yes.
376
+
377
+ ### Step 3.5 — Apply Mayer non-redundancy
378
+
379
+ Whatever you will say aloud must **NOT** also appear as on-screen text. On-screen text should only be:
380
+
381
+ - Key numerical values and labels
382
+ - Proper nouns and technical terms the audience might miss aurally
383
+ - The single-sentence takeaway reinforcing the title
384
+
385
+ Write spoken narration in speaker notes (HTML comments), not on the slide surface.
386
+
387
+ ### Step 3.6 — Write the takeaway line
388
+
389
+ Every content slide needs a visible one-line takeaway that reinforces the title-assertion:
390
+
391
+ ```markdown
392
+ # LEGO-xtal generates 1,741 new sp² allotropes from 25 starting structures
393
+
394
+ ![w:700](./figures/energy_distribution.png)
395
+
396
+ **A ~70× expansion of the known low-energy sp² carbon space** using only symmetry augmentation and descriptor-guided pre-relaxation.
397
+ ```
398
+
399
+ ### Step 3.7 — ★ STOP AND CONFIRM ★
400
+
401
+ Render the deck locally and show the user. Like Phase 1, include assumptions and open questions alongside the draft:
402
+
403
+ **Deliverable:**
404
+ - Rendered Marp deck with figures and text filled in (HTML preview at minimum)
405
+
406
+ **Assumptions I made:**
407
+ - [e.g., "I picked the left panel of Figure 3 because it shows the main result most cleanly; flag if you'd prefer the combined panel."]
408
+
409
+ **Open questions:**
410
+ - [e.g., "Slide 7 needs a schematic I don't have — should I draw a placeholder or wait for you to provide one?"]
411
+
412
+ Ask the user to:
413
+
414
+ - Flip through and confirm each slide delivers on its title-assertion
415
+ - Flag any slide that feels too dense, too empty, or illogical
416
+ - Note any figure that needs to be replaced or redrawn
417
+
418
+ Wait for approval before Phase 4.
419
+
420
+ ### Phase 3 Checklist
421
+
422
+ - [ ] Every slide has primary visual evidence
423
+ - [ ] No slide violates the one-idea limits
424
+ - [ ] No slide has more than ~30 English words (or ~50 CJK characters) of on-screen prose
425
+ - [ ] Every slide has a takeaway line
426
+ - [ ] Speaker notes exist for at least every results slide
427
+ - [ ] All embedded figures resolve (no broken links)
428
+ - [ ] User has reviewed the filled-in deck
429
+
430
+ ---
431
+
432
+ ## Phase 4: Polish
433
+
434
+ **Goal**: Apply consistent visual styling. **No content changes at this stage.** If content still needs changes, return to Phase 3.
435
+
436
+ ### Step 4.1 — Choose and apply a theme
437
+
438
+ | Venue | Theme |
439
+ |-------|-------|
440
+ | Conference auditorium, invited talk | **Dark theme** |
441
+ | Lab meeting, classroom, well-lit room | **Light theme** |
442
+ | Print handouts needed | **Light theme** |
443
+ | Premium / keynote feel | **Dark theme** with single strong accent |
444
+
445
+ Paste the full CSS block from the Theme System section. **Do not invent a new theme unless specifically requested** — the provided themes are tuned for legibility.
446
+
447
+ ### Step 4.2 — Enforce consistency
448
+
449
+ - **Font consistency** — one heading font, one body font, one monospace
450
+ - **Color consistency** — main + one accent. Semantic colors used the same way throughout.
451
+ - **Figure styling** — axis font size, line weight, legend placement consistent across charts
452
+ - **Spatial consistency** — titles, footers, pagination in same position everywhere
453
+
454
+ ### Step 4.3 — Readability checks
455
+
456
+ - **Far-row test**: Zoom to 25%, squint. Anything unreadable is too small.
457
+ - **Print test**: Export PDF, view greyscale. Color-only distinctions should still work (add shape/bold).
458
+ - **Colorblind test**: Avoid red-green as sole distinguisher.
459
+ - **Projector test**: Body text at least `#666` on light or `#94a3b8` on dark.
460
+
461
+ ### Step 4.4 — Add speaker notes and metadata
462
+
463
+ ```markdown
464
+ <!-- Speaker note: Emphasize the 70× expansion. Pause after the number. Backup slide 3 has phonon validation if asked. -->
465
+ ```
466
+
467
+ ### Step 4.5 — Export
468
+
469
+ ```bash
470
+ # HTML (best fidelity, use on presentation laptop)
471
+ npx @marp-team/marp-cli slides.md --html --allow-local-files
472
+
473
+ # PDF (backup + sharing) — ALWAYS export this too
474
+ npx @marp-team/marp-cli slides.md --pdf --allow-local-files
475
+
476
+ # PPTX (only if user will edit further in PowerPoint)
477
+ npx @marp-team/marp-cli slides.md --pptx --allow-local-files
478
+ ```
479
+
480
+ **Always export HTML + PDF.** Projector failures are common; PDF is the universal fallback.
481
+
482
+ ### Step 4.6 — Persist the final deliverable
483
+
484
+ Call `artifact-create` with `type='tool-output'`, title `Slides — <talk title>`, and the final Markdown content. Record the exported HTML/PDF paths in the artifact body so the user can find them later via `artifact-search`.
485
+
486
+ ### Phase 4 Checklist
487
+
488
+ - [ ] Theme CSS applied consistently
489
+ - [ ] Fonts, colors, spacing consistent across all slides
490
+ - [ ] Far-row and print tests pass
491
+ - [ ] Speaker notes present for key slides
492
+ - [ ] HTML + PDF both exported
493
+ - [ ] Final deck persisted as a tool-output artifact
494
+ - [ ] User has the final deliverables
495
+
496
+ ---
497
+
498
+ # REVISE MODE
499
+
500
+ **Goal**: Improve an existing deck without disturbing the user's intentional choices.
501
+
502
+ **Guiding principle — Respect the user's work.** The user has already made hundreds of decisions. Change only what's requested or clearly broken. Do not rewrite to match Claude's style preferences.
503
+
504
+ ## Change-Size Classification
505
+
506
+ Classify the request before editing:
507
+
508
+ | Level | Meaning | Examples |
509
+ |-------|---------|----------|
510
+ | **L1 — Surface** | Typos, colors, rewordings, image resizing | "fix typos", "make accent green", "this figure too small" |
511
+ | **L2 — Local** | Rework one slide, swap a figure, tighten bullets | "rewrite slide 7", "replace figure on slide 12" |
512
+ | **L3 — Structural** | Reorder sections, add/remove slides, change narrative | "cut 5 min from the talk", "motivation should come after results" |
513
+ | **Vague** | "feels off", "middle is boring", "too dense" | Diagnose first, propose a plan |
514
+
515
+ Report which level you think applies before editing if it's anything beyond L1.
516
+
517
+ ## Quick Diagnosis Checklist
518
+
519
+ When the user reports a problem but doesn't pinpoint it, run through this in order. Report findings before making edits.
520
+
521
+ **Structural level**
522
+ - [ ] Reading titles alone tells a coherent story?
523
+ - [ ] Slide count matches stated talk length (±20%)?
524
+ - [ ] Each section has a divider?
525
+ - [ ] Results slides outnumber background slides?
526
+
527
+ **Per-slide level (scan each content slide)**
528
+ - [ ] Title is an assertion (complete sentence with a claim)?
529
+ - [ ] Main visual evidence present and supports the title?
530
+ - [ ] Body text ≤30 English words (or ~50 CJK chars)?
531
+ - [ ] Takeaway line present?
532
+ - [ ] Not violating one-idea-per-slide limits (≤6 bullets, ≤1 primary figure)?
533
+
534
+ **Visual level**
535
+ - [ ] Fonts consistent throughout?
536
+ - [ ] One accent color used consistently?
537
+ - [ ] No content clipped at slide edges?
538
+ - [ ] Figures legible (axis labels readable)?
539
+
540
+ Flag any failing items. Let the user pick which to fix.
541
+
542
+ ## Revise Mode Workflow
543
+
544
+ 1. **Load and read** the existing `.md` file completely.
545
+ 2. **Classify the request** (L1 / L2 / L3 / vague).
546
+ 3. **If L3 or vague**: run diagnosis, propose a plan, wait for user confirmation.
547
+ 4. **If L1 or L2 with specific targets**: execute directly.
548
+ 5. **Use targeted edits** — not full-file rewrites. Full rewrites are a red flag that you are over-reaching.
549
+ 6. **Report changes** as a compact, 1-indexed diff summary (e.g., "Slide 5: replaced figure; Slide 8: split into 8a + 8b").
550
+ 7. **Do not polish unrelated slides** unless the user asked for a consistency pass.
551
+
552
+ ## Common Revise Requests and How to Handle
553
+
554
+ | Request | Classification | Action |
555
+ |---------|---------------|--------|
556
+ | "Fix typos" | L1 | Scan all, fix, report count |
557
+ | "Change the accent color to green" | L1 | Update theme CSS only |
558
+ | "This figure is too small" | L2 | Adjust `w:` value, offer to simplify figure |
559
+ | "Rewrite slide 7's bullets" | L2 | Rewrite only slide 7, preserve style |
560
+ | "The middle feels too dense" | L2 vague | Diagnose first: flag overloaded slides, propose splits |
561
+ | "Add a slide about X" | L3 | Ask where it goes, what evidence it needs, confirm title |
562
+ | "Cut 5 minutes from the talk" | L3 | Identify cuttable slides, confirm before removing |
563
+ | "Reorganize so method comes before motivation" | L3 | Confirm the user really wants this (non-standard arc), then reorder |
564
+
565
+ ---
566
+
567
+ # Reference Material (Shared by Both Modes)
568
+
569
+ ## Marp Syntax Essentials
570
+
571
+ ### Front matter
572
+
573
+ ```markdown
574
+ ---
575
+ marp: true
576
+ theme: default
577
+ paginate: true
578
+ math: mathjax
579
+ size: 16:9
580
+ style: |
581
+ /* CSS block — paste from Theme System below */
582
+ ---
583
+ ```
584
+
585
+ ### Per-slide directives
586
+
587
+ ```markdown
588
+ <!-- _class: lead --> # centered, title-like layout (this slide only)
589
+ <!-- _paginate: false --> # hide page number (this slide only)
590
+ <!-- _backgroundColor: #000 --> # override background (this slide only)
591
+ <!-- backgroundColor: #1a1a2e --> # set for this slide AND subsequent
592
+ <!-- header: "Section 2" --> # persistent header
593
+ <!-- footer: "Conf 2026" --> # persistent footer
594
+ ```
595
+
596
+ ### Images
597
+
598
+ ```markdown
599
+ ![w:400](figure.png) # fixed width
600
+ ![h:300](figure.png) # fixed height
601
+ ![bg](image.jpg) # full background
602
+ ![bg right:40%](image.jpg) # split layout, image right 40%
603
+ ![bg left:35%](image.jpg) # split layout, image left 35%
604
+ ![bg contain](image.jpg) # fit without cropping
605
+ ![bg brightness:0.3](image.jpg) # darkened
606
+ ```
607
+
608
+ ### Math
609
+
610
+ ```markdown
611
+ Inline: $E = mc^2$
612
+
613
+ Block:
614
+ $$
615
+ \mathcal{L} = \sum_i \ell(f(x_i), y_i) + \lambda \|w\|^2
616
+ $$
617
+ ```
618
+
619
+ **Critical pitfall — math inside HTML containers**: Marp's MathJax/KaTeX plugin is a markdown-it tokenizer plugin. It can only render math that markdown-it actually tokenizes. Per CommonMark, content inside a **single-line** HTML block tag is treated as literal text and never re-parsed as Markdown, so the `$...$` never reaches the math plugin and prints as raw dollar signs in the PDF.
620
+
621
+ This fails silently — there is no warning, just literal `$` characters in the output. When you use layout components from the Inline Component Library (`<div class="cols">`, `<div class="card">`, two- / three-column grids, metric cards), you MUST use one of these patterns:
622
+
623
+ ```html
624
+ <!-- ❌ BROKEN: math on same line as the <div> tag — will NOT render -->
625
+ <div class="card"><strong>$\max_\ell(\tau - t_\ell) \le S_{\max}$</strong></div>
626
+
627
+ <!-- ✅ FIX A: blank lines inside <div> force markdown-it to re-parse -->
628
+ <div class="card">
629
+
630
+ **$\max_\ell(\tau - t_\ell) \le S_{\max}$**
631
+
632
+ </div>
633
+
634
+ <!-- ✅ FIX B: put block math outside the container; keep only non-math content in the grid -->
635
+ <div class="card">
636
+ <div class="label">Invariant</div>
637
+ </div>
638
+
639
+ $$\max_\ell(\tau - t_\ell) \le S_{\max}$$
640
+ ```
641
+
642
+ Rule: **whenever a slide has both a `<div>`-based layout and LaTeX math, write the math on its own line with a blank line separating it from the surrounding HTML tags.** Or write the whole slide in pure Markdown without grid containers — inline `$...$` and block `$$...$$` always render correctly in plain Markdown context.
643
+
644
+ Short exponents like `K=10⁻³` can be written with Unicode superscripts as a last resort in tight layouts, but lose LaTeX fidelity — only acceptable for trivial cases.
645
+
646
+ ## Theme System
647
+
648
+ ### Dark Theme (Conference / Invited Talks)
649
+
650
+ ```yaml
651
+ style: |
652
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=JetBrains+Mono:wght@400&display=swap');
653
+ :root {
654
+ --accent: #60a5fa;
655
+ --dark: #0f172a;
656
+ --card: #1e293b;
657
+ --border: #334155;
658
+ --body: #94a3b8;
659
+ --label: #64748b;
660
+ --muted: #475569;
661
+ --light: #f1f5f9;
662
+ --green: #4ade80;
663
+ --red: #f87171;
664
+ --yellow: #fbbf24;
665
+ }
666
+ section {
667
+ background: var(--dark);
668
+ color: var(--light);
669
+ font-family: 'Inter', sans-serif;
670
+ font-weight: 300;
671
+ padding: 48px 64px;
672
+ }
673
+ section.lead {
674
+ display: flex;
675
+ flex-direction: column;
676
+ justify-content: center;
677
+ text-align: center;
678
+ }
679
+ h1 { font-weight: 700; font-size: 2.2em; color: var(--light); margin-bottom: 0.3em; line-height: 1.2; }
680
+ h2 { font-weight: 300; font-size: 1.3em; color: var(--body); margin-top: 0; }
681
+ h3 { font-weight: 600; font-size: 0.75em; color: var(--label); text-transform: uppercase; letter-spacing: 0.1em; }
682
+ p, li { color: var(--body); line-height: 1.6; font-size: 1em; }
683
+ strong { color: var(--light); font-weight: 600; }
684
+ em { color: var(--accent); font-style: normal; }
685
+ code { font-family: 'JetBrains Mono', monospace; font-size: 0.85em; background: var(--card); padding: 2px 6px; border-radius: 4px; }
686
+ pre { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; }
687
+ table { width: 100%; border-collapse: collapse; font-size: 0.85em; }
688
+ th { color: var(--label); font-weight: 600; text-transform: uppercase; font-size: 0.75em; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); padding: 8px 12px; text-align: left; }
689
+ td { color: var(--body); border-bottom: 1px solid var(--border); padding: 8px 12px; }
690
+ a { color: var(--accent); text-decoration: none; }
691
+ blockquote { border-left: 3px solid var(--accent); padding-left: 16px; color: var(--muted); font-style: italic; }
692
+ footer { color: var(--muted); font-size: 0.6em; }
693
+ ```
694
+
695
+ ### Light Theme (Lab Meetings / Classrooms / Print)
696
+
697
+ ```yaml
698
+ style: |
699
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=JetBrains+Mono:wght@400&display=swap');
700
+ :root {
701
+ --accent: #2563eb;
702
+ --dark: #f8fafc;
703
+ --card: #ffffff;
704
+ --border: #e2e8f0;
705
+ --body: #475569;
706
+ --label: #64748b;
707
+ --muted: #94a3b8;
708
+ --light: #0f172a;
709
+ --green: #16a34a;
710
+ --red: #dc2626;
711
+ --yellow: #ca8a04;
712
+ }
713
+ section {
714
+ background: var(--dark);
715
+ color: var(--light);
716
+ font-family: 'Inter', sans-serif;
717
+ font-weight: 300;
718
+ padding: 48px 64px;
719
+ }
720
+ section.lead {
721
+ display: flex;
722
+ flex-direction: column;
723
+ justify-content: center;
724
+ text-align: center;
725
+ }
726
+ h1 { font-weight: 700; font-size: 2.2em; color: var(--light); margin-bottom: 0.3em; line-height: 1.2; }
727
+ h2 { font-weight: 300; font-size: 1.3em; color: var(--body); margin-top: 0; }
728
+ h3 { font-weight: 600; font-size: 0.75em; color: var(--label); text-transform: uppercase; letter-spacing: 0.1em; }
729
+ p, li { color: var(--body); line-height: 1.6; font-size: 1em; }
730
+ strong { color: var(--light); font-weight: 600; }
731
+ em { color: var(--accent); font-style: normal; }
732
+ code { font-family: 'JetBrains Mono', monospace; font-size: 0.85em; background: var(--card); padding: 2px 6px; border-radius: 4px; border: 1px solid var(--border); }
733
+ pre { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; }
734
+ table { width: 100%; border-collapse: collapse; font-size: 0.85em; }
735
+ th { color: var(--label); font-weight: 600; text-transform: uppercase; font-size: 0.75em; letter-spacing: 0.05em; border-bottom: 2px solid var(--border); padding: 8px 12px; text-align: left; }
736
+ td { color: var(--body); border-bottom: 1px solid var(--border); padding: 8px 12px; }
737
+ a { color: var(--accent); text-decoration: none; }
738
+ blockquote { border-left: 3px solid var(--accent); padding-left: 16px; color: var(--muted); font-style: italic; }
739
+ footer { color: var(--label); font-size: 0.6em; }
740
+ ```
741
+
742
+ ### Recommended Font Pairings for Research
743
+
744
+ | Heading / Body | Best For | Notes |
745
+ |----------------|----------|-------|
746
+ | Inter 700 / Inter 300 | General research talks | Clean, highly legible, safe default |
747
+ | Outfit 800 / Raleway 200 | Data-heavy dashboards | High contrast weight difference |
748
+ | DM Serif Display / DM Sans 300 | Humanities, social science | Warmer, editorial feel |
749
+ | Space Grotesk 700 / IBM Plex Mono 300 | CS/Systems talks | Technical, monospace body for code-heavy content |
750
+ | Plus Jakarta Sans 800 / Plus Jakarta Sans 200 | Internal team presentations | Friendly, modern |
751
+
752
+ ## Slide Templates
753
+
754
+ ### Title slide
755
+
756
+ ```markdown
757
+ <!-- _class: lead -->
758
+ <!-- _paginate: false -->
759
+
760
+ # Paper or Talk Title Here
761
+ ## Subtitle or Key Finding in One Line
762
+
763
+ **Presenter Name**, Co-author, Co-author
764
+ *Affiliation — Conference / Venue, Date*
765
+ ```
766
+
767
+ ### Section divider
768
+
769
+ ```markdown
770
+ <!-- _class: lead -->
771
+ <!-- _paginate: false -->
772
+
773
+ # Methodology
774
+ ```
775
+
776
+ ### Assertion-Evidence content slide (default)
777
+
778
+ ```markdown
779
+ # LEGO-xtal generated 1,741 new sp² allotropes from 25 starting structures
780
+
781
+ ![w:700](./figures/energy_distribution.png)
782
+
783
+ **A ~70× expansion** of the known low-energy sp² carbon space, achieved without a single extra DFT calculation during generation.
784
+ ```
785
+
786
+ ### Two-column comparison
787
+
788
+ ```markdown
789
+ # Pre-relaxation cuts optimization time by 10× versus pure energy-based search
790
+
791
+ <div style="display: flex; gap: 40px;">
792
+ <div style="flex: 1;">
793
+
794
+ ### Without pre-relaxation
795
+ - Random init → MACE optimization
796
+ - ~120 min per 1k samples
797
+ - Many stuck in bad minima
798
+
799
+ </div>
800
+ <div style="flex: 1;">
801
+
802
+ ### With SO(3) pre-relaxation
803
+ - Descriptor-guided warm start
804
+ - ~9.5 min per 1k samples
805
+ - Higher fraction reach sp² geometry
806
+
807
+ </div>
808
+ </div>
809
+ ```
810
+
811
+ ### Data table slide
812
+
813
+ ```markdown
814
+ # Our model outperforms all baselines on three metrics
815
+
816
+ | Method | Accuracy | Latency (ms) | Memory (GB) |
817
+ |--------|----------|--------------|-------------|
818
+ | Baseline A | 78.2% | 120 | 4.2 |
819
+ | Baseline B | 81.5% | 95 | 6.1 |
820
+ | **Ours** | **86.3%** | **72** | **3.8** |
821
+
822
+ **Bold = best in column.** Averaged over 5 runs, all std < 0.3%.
823
+ ```
824
+
825
+ ### Equation slide
826
+
827
+ ```markdown
828
+ # Our training objective combines supervised and contrastive losses
829
+
830
+ $$
831
+ \mathcal{L} = \underbrace{\mathcal{L}_{\text{CE}}(f(x), y)}_{\text{supervised}} + \lambda \underbrace{\mathcal{L}_{\text{CL}}(z_i, z_j)}_{\text{contrastive}}
832
+ $$
833
+
834
+ - $\lambda = 0.1$ chosen by validation
835
+ - $z_i, z_j$: augmented views of same input
836
+ ```
837
+
838
+ ### Thank you / questions
839
+
840
+ ```markdown
841
+ <!-- _class: lead -->
842
+ <!-- _paginate: false -->
843
+
844
+ # Thank You
845
+
846
+ **Questions?**
847
+
848
+ your.email@university.edu
849
+ Paper: arxiv.org/abs/xxxx.xxxxx
850
+ Code: github.com/yourname/project
851
+ ```
852
+
853
+ ## Inline Component Library
854
+
855
+ ### Metric cards
856
+
857
+ ```html
858
+ <div style="display: flex; gap: 24px; margin-top: 24px;">
859
+ <div style="flex: 1; background: var(--card); border: 1px solid var(--border); border-top: 3px solid var(--accent); border-radius: 8px; padding: 20px;">
860
+ <div style="color: var(--label); font-size: 0.7em; text-transform: uppercase; letter-spacing: 0.1em;">New structures</div>
861
+ <div style="font-size: 2.2em; font-weight: 700; color: var(--light); margin: 4px 0;">1,741</div>
862
+ <div style="color: var(--green); font-size: 0.8em;">70× vs training</div>
863
+ </div>
864
+ </div>
865
+ ```
866
+
867
+ ### Simple bar chart (inline SVG)
868
+
869
+ ```html
870
+ <svg viewBox="0 0 500 200" style="width: 100%; max-width: 600px; margin: 20px auto; display: block;">
871
+ <line x1="60" y1="170" x2="480" y2="170" stroke="var(--border)" stroke-width="1"/>
872
+ <rect x="80" y="90" width="60" height="80" fill="var(--muted)" rx="4"/>
873
+ <rect x="180" y="60" width="60" height="110" fill="var(--muted)" rx="4"/>
874
+ <rect x="280" y="30" width="60" height="140" fill="var(--accent)" rx="4"/>
875
+ <text x="110" y="190" fill="var(--label)" font-size="12" text-anchor="middle">Baseline A</text>
876
+ <text x="210" y="190" fill="var(--label)" font-size="12" text-anchor="middle">Baseline B</text>
877
+ <text x="310" y="190" fill="var(--light)" font-size="12" text-anchor="middle" font-weight="600">Ours</text>
878
+ <text x="110" y="82" fill="var(--body)" font-size="12" text-anchor="middle">78.2%</text>
879
+ <text x="210" y="52" fill="var(--body)" font-size="12" text-anchor="middle">81.5%</text>
880
+ <text x="310" y="22" fill="var(--accent)" font-size="13" text-anchor="middle" font-weight="600">86.3%</text>
881
+ </svg>
882
+ ```
883
+
884
+ ## Common Failure Modes
885
+
886
+ | Symptom | Root cause | Fix |
887
+ |---------|-----------|-----|
888
+ | Audience asks "what was the point?" after talk | Phase 1 was skipped; no clear thesis | Return to Phase 1 |
889
+ | Slides look busy and cramped | Phase 3 violated one-idea limits | Split overloaded slides |
890
+ | Listener got lost in the middle | Missing transitions; assertion chain has gaps | Re-read titles in order |
891
+ | Figures illegible from back row | Used publication figures directly | Re-export at slide sizes using `scientific-visualization` |
892
+ | Content overflows and gets clipped | Marp silent-clipping | Visual preview every slide |
893
+ | Polish consumed all the time | Started Phase 4 before content stable | No visual work until content approved |
894
+ | Math renders as literal `$...$` in PDF | `$...$` is inside a single-line HTML block tag (e.g., `<div class="card">...$x$...</div>`), so markdown-it never tokenizes it | Add blank lines inside the `<div>` around the math, OR move block `$$...$$` outside the container. See Math section for the canonical fix. |
895
+
896
+ ## Export Reference
897
+
898
+ ```bash
899
+ # Live preview during authoring
900
+ npx @marp-team/marp-cli slides.md --watch --html --allow-local-files
901
+
902
+ # Final HTML
903
+ npx @marp-team/marp-cli slides.md --html --allow-local-files
904
+
905
+ # PDF backup — ALWAYS produce this
906
+ npx @marp-team/marp-cli slides.md --pdf --allow-local-files
907
+
908
+ # PPTX (only if editing further in PowerPoint)
909
+ npx @marp-team/marp-cli slides.md --pptx --allow-local-files
910
+ ```
911
+
912
+ ## Integration with Other Skills and Tools
913
+
914
+ | Task | Combine with |
915
+ |------|-------------|
916
+ | Publication-quality figures | `scientific-visualization` → PNG/SVG → embed |
917
+ | Custom low-level plots | `matplotlib` or `seaborn` → PNG/SVG → embed |
918
+ | Diagrams and schematics | `scientific-schematics` → SVG → embed |
919
+ | Convert paper draft → talk | `convert-document` tool on PDF/DOCX → extract assertions in Phase 1 |
920
+ | Fresh data-driven numbers | `data-analyze` tool → feed results into Phase 3 |
921
+ | Related-work / references | `literature-search` tool → populate References backup slide; also used as quick tier-2 context scan in Context Gate |
922
+ | Search workspace for prior work | `artifact-search` on `papers`/`notes` during Context Gate (tier 1) |
923
+ | Paper knowledge base lookups | `wiki_search` / `wiki_get` / `wiki_coverage` / `wiki_neighbors` / `wiki_source` during Context Gate (tier 1) |
924
+ | Long-lived user preferences (venues, co-authors, style) | Read `.research-pilot/memory/MEMORY.md` + linked files during Context Gate (tier 1) |
925
+ | Online fill-ins (venue CFP, keynote examples) | `web_search` / `web_fetch` as tier-3 fallback only |
926
+ | Persist storyline and final deck | `artifact-create` with `type='note'` (Phase 1) and `type='tool-output'` (Phase 4) |
927
+ | Sister skill for lectures | `teaching-marp-slides` — use for classroom/course material |
928
+
929
+ ---
930
+
931
+ ## Final Reminder
932
+
933
+ Slide quality is set in Phase 1 (storyline) and by the user's own dry run after delivery. **A deck with a weak thesis and beautiful visuals loses to a deck with a sharp thesis and plain visuals — every time.** In Revise Mode, respect the user's existing choices: change only what's requested or clearly broken.