results-to-slides — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited results-to-slides (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Discover experiments, collect images/metrics, organize into slides. You provide the story — this skill handles the grunt work. Output: slide markdown + editable PPTX.
"breakthrough", "key insight", "importantly". Just experiment + number.
has no experiment images, create a diagram. If no diagram makes sense, show dataset examples.
can't find an image for a slide, restructure or merge it.
Maximize use of the Agent tool. Whenever you have 2+ independent tasks, launch parallel agents.
${CLAUDE_SKILL_DIR}${CLAUDE_SKILL_DIR}/md_to_pptx.py${CLAUDE_SKILL_DIR}/backgrounds/${CLAUDE_SKILL_DIR}/theme.cssThe user provides: /results-to-slides START_DATE END_DATE
Arguments come as $ARGUMENTS containing two MMDD date strings (e.g., 0301 0308).
Parse the dates:
$0 = start date (MMDD), $1 = end date (MMDD)find bounds)If no arguments provided, use AskUserQuestion:
Output directory: presentation/YYYY_MM_DD/ using the end date.
Ask all preferences upfront before discovery, in a SINGLE AskUserQuestion call:
results comparison, failed approaches)" — free text, helps prioritize slide count allocation.
| Choice | Background file | --theme flag |
|---|---|---|
| Light | slide_bg_light.png | light |
| Warm | slide_bg_warm.png | light |
| Dark | slide_bg_dark.png | dark |
Do NOT ask for slide count. Generate as many slides as the content needs — images drive the count, not a preset number.
Scan project docs (CLAUDE.md, README.md, memory files, docs/) to understand:
presentation/ directory for prior slide decks to recap)If no research goal found, use AskUserQuestion:
Use this context internally for smart organization (grouping, filtering, prioritization). Do NOT let it leak into slide text.
Use ALL methods — each catches things the others miss.
git log --after="YYYY-MM-DD_START" --before="YYYY-MM-DD_END+1" --oneline --statExtract: commit messages (often contain results), files changed, dates.
find . -maxdepth 2 -type d -newermt "YYYY-MM-DD_START" ! -newermt "YYYY-MM-DD_END+1" 2>/dev/null | sortAlso check: outputs/, results/, experiments/, runs/, logs/, checkpoints/. Do NOT assume MMDD_ naming — use modification time as primary signal.
For each folder: list contents, look for metrics files (metrics.json, *.pkl, scores.txt, *.log) and images (*.png, *.jpg, *.gif).
find . -name "*.py" -newermt "YYYY-MM-DD_START" ! -newermt "YYYY-MM-DD_END+1" 2>/dev/null | grep -v __pycache__ | sortAlso check .sh scripts. Read the code to understand what each experiment does — folder names are opaque, scripts tell you everything.
Collect FAR more images than you think you need. This is the most important discovery step.
plt.savefig(...), Image.save(...), cv2.imwrite(...) callsbaseline.*, best_*.*, comparison.*, grid.*, eval*.*.mp4, .avi, .mov — the converter embeds them as playable mediacols-2, 2 → cols-2, 3 → cols-3, 4 → cols-4Cross-reference git commits ↔ output folders ↔ scripts. Build:
DATE | EXPERIMENT_NAME | SCRIPT | OUTPUT_FOLDER | KEY_RESULT | IMAGESFor slides explaining concepts, pipelines, or architectures — create diagrams.
# One-time setup: cd /tmp && npm install puppeteer
node ${CLAUDE_SKILL_DIR}/render_diagram.js input.html output.png [--width 1200] [--scale 2]far more readable in presentations.
Order slides chronologically — the audience follows the story of discovery.
Every slide in the outline must have one of: [IMG], [DIAGRAM], [TABLE], [DATASET]. If a slide has none, merge it into an adjacent slide or add a visual.
cols-4 gridsof baseline | method variants. Pick diverse examples — don't repeat the same prompt. Annotate failures: "(no change)", "(worse)", "(baseline better)".
Each experiment slide contains:
Generate a structured outline:
SLIDE SCRIPT
============
Slide 1: Title
Type: Title (lead)
Heading: [Project Name — Weekly Update]
Subtitle: [Date range, N experiments]
Chips: [N slides], [date range], [key topics]
Visual: [HERO_IMG]
Slide 2: [Experiment Name]
Type: Content
Heading: [What was done: key metric]
Bullets:
- [Configuration detail]
- [Result metric]
Visual: [IMG] path/to/image.png | [DIAGRAM] pipeline | [TABLE] | [DATASET]
Grid: cols-[2/3/4]Every slide MUST have a Visual field. Flag any slide without one.
Use AskUserQuestion:
For per-slide review, use AskUserQuestion per slide with options: "Approve", "Edit", "Remove".
mkdir -p presentation/YYYY_MM_DD
cp ${CLAUDE_SKILL_DIR}/theme.css presentation/YYYY_MM_DD/
cp ${CLAUDE_SKILL_DIR}/backgrounds/CHOSEN_BG.png presentation/YYYY_MM_DD/slide_bg.pngWrite to presentation/YYYY_MM_DD/slides.md.
Use ONLY elements from [slide_reference.md](slide_reference.md). The PPTX converter only understands those specific HTML elements.
File header:
---
theme: notebook-status
paginate: true
size: 16:9
html: true
---Slide separator: --- on its own line.
Element order (strict, top to bottom): heading → bullets (max 3, prefer 2) → table → images (always last).
Banned elements on content slides: chips, split layout, arch-box, stat cards, eyebrow, decision card, timeline. Chips are ONLY allowed on the title (lead) slide.
Do NOT generate: next steps slides, takeaway slides, or any slide requiring editorial interpretation.
Headings: factual label of experiment + result. "ResNet-50 on ImageNet: 76.1% Top-1" not "ResNet-50 Is the Clear Winner".
Bullets: facts only. Max 3 per slide (prefer 2 — more space for images). Keep short.
Table slides: NO bullets. One context line above the table instead. Max 5 rows.
Formatting: **bold** for key numbers and method names. ` code ` for technical identifiers.
Image captions: terse identifiers, not sentences. Use <strong> for scores.
Image paths: relative to project root. Converter resolves via --base-dir.
Title slide hero image: The title slide can include a cols-2 image grid below the chips.
One visual concept per slide — never mix grid types or have multiple unrelated sections.
Image-to-claim consistency: If a slide mentions a specific example, the images on that slide MUST show that exact example. Verify image filenames match the described content.
When uncertain about an experiment's purpose, present observable facts and let the user interpret. Do NOT guess intent.
python ${CLAUDE_SKILL_DIR}/md_to_pptx.py \
--input presentation/YYYY_MM_DD/slides.md \
--output presentation/YYYY_MM_DD/slides.pptx \
--bg-image presentation/YYYY_MM_DD/slide_bg.png \
--theme light \
--base-dir .Use --theme dark for dark background. Use --theme light for light and warm.
If python-pptx is missing: check conda/mamba environments, CLAUDE.md, or ask the user.
Presentation generated!
Markdown: presentation/YYYY_MM_DD/slides.md
PPTX: presentation/YYYY_MM_DD/slides.pptx
Slides: [count]
Open in PowerPoint or LibreOffice Impress to edit further.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.