anthropics/skills · error · ValueError
LibreOffice rendered {len(visible_images)} page(s) for {visi
Error message
LibreOffice rendered {len(visible_images)} page(s) for {visible_count} visible slide(s) of {len(slide_info)}; thumbnails would be mislabeled What it means
build_slide_list() in thumbnail.py aligns LibreOffice-rendered page images with the deck's slide list. It knows how many visible (non-hidden) slides there are; if the number of rendered images differs AND the special case 'LibreOffice rendered hidden slides too' (len(images)==len(slide_info)!=visible_count) does not hold, the one-to-one mapping between images and slides is broken and thumbnails would be mislabeled — so it refuses with ValueError.
Source
Thrown at skills/pptx/scripts/thumbnail.py:151
part = rid_to_part.get(sld_id.getAttribute("r:id"))
if part is not None and part in present:
slides.append(
{"name": posixpath.basename(part), "hidden": _is_hidden(zf, part)}
)
return slides
def build_slide_list(
slide_info: list[dict],
visible_images: list[Path],
temp_dir: Path,
) -> list[tuple[Path, str]]:
visible_count = sum(1 for info in slide_info if not info["hidden"])
rendered_hidden = len(visible_images) == len(slide_info) != visible_count
if not rendered_hidden and visible_count != len(visible_images):
raise ValueError(
f"LibreOffice rendered {len(visible_images)} page(s) for {visible_count} "
f"visible slide(s) of {len(slide_info)}; thumbnails would be mislabeled"
)
if visible_images:
with Image.open(visible_images[0]) as img:
placeholder_size = img.size
else:
placeholder_size = (1920, 1080)
slides = []
visible_idx = 0
for info in slide_info:
if info["hidden"] and not rendered_hidden:
placeholder_path = temp_dir / f"hidden-{info['name']}.jpg"
placeholder_img = create_hidden_placeholder(placeholder_size)
placeholder_img.save(placeholder_path, "JPEG")View on GitHub (pinned to f6656c1256)
Solutions
- Check the LibreOffice version/behavior: re-render with 'soffice --headless --convert-to pdf' and count pages vs visible slides to see which side is wrong.
- Ensure the temp image directory is fresh per run so stale images are not counted.
- Re-save the deck in PowerPoint to normalize hidden-slide (show) attributes, then retry.
- If a corrupt slide is skipped by LibreOffice, repair or remove that slide and re-render.
Example fix
# before
slides = build_slide_list(slide_info, visible_images, temp_dir) # may raise
# after
visible_count = sum(1 for i in slide_info if not i["hidden"])
if visible_count != len(visible_images):
raise RuntimeError(f"render mismatch: {len(visible_images)} images vs {visible_count} visible slides — re-render deck")
slides = build_slide_list(slide_info, visible_images, temp_dir) Defensive patterns
Strategy: validation
Validate before calling
def render_count_matches(slide_info: list[dict], visible_images: list[Path]) -> bool:
visible_count = sum(1 for i in slide_info if not i["hidden"])
rendered_hidden = len(visible_images) == len(slide_info) != visible_count
return rendered_hidden or visible_count == len(visible_images) Try / catch
try:
slides = build_slide_list(slide_info, visible_images, temp_dir)
except ValueError as e:
if "thumbnails would be mislabeled" in str(e):
log.warning("render mismatch (%s) — re-rendering deck once", e)
visible_images = render_pages(pptx_path, temp_dir) # fresh render, clean temp dir first
slides = build_slide_list(slide_info, visible_images, temp_dir)
else:
raise Prevention
- Use a fresh temp directory per render so stale images cannot skew counts.
- Verify the LibreOffice export completed (conversion subprocess exit 0) before globbing images.
- Pin a known LibreOffice version in CI so hidden-slide rendering behavior is stable.
- Compare page count of the exported PDF against visible slide count before aligning thumbnails.
When it happens
Trigger: Rendering a deck where soffice produced fewer/more pages than visible slides: e.g. get_slide_info miscounted hidden slides (show attribute parsed as hidden when not), LibreOffice skipped a corrupt slide, export produced a partial PDF/PNG set, or a race where output images were read before conversion finished.
Common situations: Headless LibreOffice versions that render hidden slides differently than desktop; decks with unusual 'show' attribute values; truncated PDF-to-image conversion; temp-dir cleanup or glob ordering issues picking up stale images from a previous run.
Related errors
- relationship target is not a POSIX part name: {target!r}
- relationship target resolves to nothing: {target!r}
- relationship target is not a POSIX part name: {target!r}
- relationship target resolves to nothing: {target!r}
- PDF conversion failed: {detail}
AI-assisted analysis of anthropics/skills@f6656c1256 (2026-08-14).
Data as JSON: /api/errors/90463cbba3177053.
Report an issue: GitHub.