A parent asked our agent to turn a student's science-fair report — a Word document about a thermoelectric drinking-water dispenser — into a presentation for a city-level innovation competition. A real task, with a real deadline and a real teacher reading the output.
The finished deck came out well — clean enough that the editable version looked as polished as the fancy rendered one. But getting there broke four different ways, and each break was the kind of bug you only find when someone actually downloads the file and opens it on a school laptop. Here is what happened, and what we changed in the system because of it.
Break 1: three slides came back empty
The preview looked perfect. The downloaded HTML did not — nine images rendered blank.
The cause: the deck referenced images by relative path (src="assets/chart.png"),
which resolves fine inside the workspace preview but points nowhere once the .html file
travels alone to a downloads folder.
The fix that matters is not "embed the images" — it is the invariant: before a deck is
called a deliverable, grep -c 'src="assets/' must return zero. Patching images
one at a time is how the first fix attempt missed three charts. Every rule in this story
ends the same way: close the loop with a check, not with eyes.
Break 2: charts that only exist online
Interactive chart libraries render onto a live canvas. In our preview's scroll-mode DOM clone the painted pixels vanish; offline, the CDN script never arrives. For a deck that has to be projected in a classroom, "works when online" is not good enough — so presentation decks now pre-render charts to PNG and embed them as images. Interactive charts stay an option only when the environment is known and interaction is the point.
Break 3: the export that couldn't fit
The user wanted two versions: a polished rendered PPTX and an editable one the student could tweak before presenting. The editable-export pipeline turned out to have a hard input cap — a fully self-contained deck is far too large — and it also dropped relative-path images and merged text boxes incorrectly. So the editable deck was rebuilt natively with python-pptx. That surfaced three more real-world failures:
- Font-size math has to come from the slide, not the screen. A 16:9 slide is
960×540pt while the design canvas is 1920×1080px, so
pt = px × 0.5— the intuitive 96dpi conversion over-sizes every run by 50% and text wrapped into collisions everywhere. - Layout must survive different font metrics. "Big number + small caption" pairs aligned beautifully in the browser and overlapped in WPS, whose glyph widths differ. Stacking them vertically is immune; side-by-side with fixed offsets is not.
- Geometry needs a lint. One cover image ran 200px past the slide edge — caught by the parent's eyes, not the build. Every shape now gets a bounds assertion before save.
Break 4: verification that broke the deliverable
The QA script once moved the finished file out of place while validating it — the check
itself destroyed the thing being checked. Two quieter lessons also survived: batch text
edits need per-item tolerance plus a leftover-grep for residue, and chart
numbers may only come from the source document's tables — never re-read off a small
screenshot, where 4.62 once became 5.89.
What changed in the product
Each of these is now a written rule in the agent's skill set — the same skills every user gets. The delivery-state invariant (zero external references, hash-verified), the export pipeline limits, the python-pptx geometry and layout rules, smoke-one-slide-then-batch builds, and the QA loop that renders every page before handing it over. We also kept the raw write-up as a workspace skill, so lessons from a real project compound instead of evaporating.
This is the part of "AI makes slides" that nobody demos: the file still has to survive the trip to a school laptop, a WPS install, and a projector. The gap between "looks great in preview" and "opens correctly everywhere" is exactly where craft lives — and it's why we run real tasks through the product ourselves and write down every break.
Try the same pipeline yourself at Document to Slides — free preview, pay only if you want the clean file.