Repository navigation
Evidence
The quality of SlideBridge is checked in three ways: a suite of 45 tests, one measured end-to-end run, and a set of deliberate probes of the places where the code is most likely to fail. All three use synthetic decks, because no real deck lives in the public repository, and the page lists the failures that the probes found beside the results that passed.
Every deck in the suite is built in code by tests/synthetic_decks.py. It writes two decks of 17 slides each into a temporary folder; every slide has a title placeholder and a body placeholder with two paragraphs, every third slide adds a 2 by 2 table, and every fourth carries speaker notes. The unit tests for classification, title detection, and notes use mock shapes, and the unit tests for reading order, confidence, and warnings build SlideRecord objects by hand. No test uses a deck with a chart, a grouped shape, a picture, or a multi-column layout, and so the behavior on those inputs is untested beyond the hand-built records.
The suite holds 45 tests in 7 files. On the recorded runs on Windows with Python 3.12, 44 passed and 1 skipped in 6.62 seconds without LibreOffice on the PATH, and 45 passed in 8.43 seconds with it.
| File | Tests | What it checks |
|---|---|---|
test_reconcile.py |
16 | Title first and footer last; body blocks sorted top then left; order numbers reassigned; an empty slide unchanged; the ordered character count; confidence of 1.0 for a clean slide and a drop for no title, no text, and grouped shapes; the floor at 0; four warning flags (no detected title, image without text, table detected, confidence below threshold) and no flags on a clean slide |
test_extract.py |
15 | Shape classification for table, group, title, body, footer, and text box; title detection through each tier and on an empty slide; notes extraction, including an exception that returns empty text; extraction of the first synthetic deck and its slide 1 title |
test_integration.py |
6 | Extraction of both decks; reconciliation of two decks; building a DOCX from a manifest; the full extract-to-DOCX path; unique slide identifiers; manifest slide order |
test_manifest.py |
4 | Summary counts, low-confidence counting, empty inputs, and a serialization round trip |
test_gui_smoke.py |
2 | The GUI module imports, and the window opens and closes when a display exists (skipped otherwise) |
test_align.py |
1 | An exact-text edit produces an output file with the table intact |
test_integration_render.py |
1 | LibreOffice renders a 17-slide deck to a PDF and 17 non-empty PNGs; skipped when soffice is not on the PATH |
The penalty tests assert that confidence falls below 1.0, and they do not pin the amount of each penalty, so a change to one constant would pass unnoticed. The alignment suite holds a single exact-match case, which is thin cover for the module that fails first under probing, below.
The sample deck from examples/make_sample_deck.py went through slidebridge run ... --dpi 100 on the test machine, with LibreOffice present, and the command finished in about 5 seconds with exit code 0. The outputs were checked by reading the files:
| Output | Result |
|---|---|
run_report.json summary |
1 file, 17 slides, 17 images, 0 low-confidence slides, 5 warnings |
warnings.csv |
Five rows, all table_detected, on slides 3, 6, 9, 12, and 15 |
slides.csv |
17 rows; slide 1 has the title "Example Deck 2025", confidence 1.0, and no warnings |
review_pack.docx |
17 tables and 17 inline images; the table for slide 3 holds the rows title, body, and table |
slidebridge validate on the manifest |
Manifest is valid. |
In run_report.json, source_hash_sha256 and pdf_file are empty strings, as the README says.
ruff check src reports All checks passed! under the rules configured in pyproject.toml. mypy src, which pyproject.toml sets to strict mode, reports one error in src/slidebridge/orchestration/retry.py at line 65, an incompatible return value from a retry decorator, in 55 checked source files. The repository does not claim a clean type check, and the single error is listed here for completeness.
git clone https://github.com/dboles99/SlideBridge.git
cd SlideBridge
python -m venv .venv
.venv/bin/pip install -e ".[dev]" # Windows: .venv\Scripts\pip install -e ".[dev]"
.venv/bin/python -m pytest
.venv/bin/python -m examples.make_sample_deck
.venv/bin/slidebridge run input/sample.pptx --workdir work --out output/review_pack.docx --dpi 100
cat output/run_report.json output/warnings.csvExpected: 44 passed, 1 skipped without LibreOffice (or 45 passed with it), then the pipeline summary, then a report with 17 slides and 5 warnings and five table_detected rows. The run step needs soffice; without it, the render stage stops the run with a message naming LibreOffice.
Each item was reproduced for this wiki, from the tool's own output or its source.
-
The review pack is not A4.
docx_styles.pysets the page fromA4_WIDTH_EMU = 11,906,400andA4_HEIGHT_EMU = 16,838,400, but A4 measures 7,560,000 by 10,692,000 EMU, so the constants are 1.575 times too large. The generateddocument.xmlcarriesw:pgSz w:w="18750" w:h="26517", which is about 330.7 by 467.7 mm; A4 would be 11906 by 16838 twips. The README and the configuration both call the pack A4. The cause is one pair of constants. -
alignloses line breaks before it splits.normalize_textcollapses all whitespace, newlines included, to single spaces, andsplit_into_sentencesruns afterward, so its newline rule never fires. An edited document of six lines without full stops became one segment, and every matched row came back as "Merged" with the entire document in the Edited Text cell. -
aligncuts a sentence that ends in a number. The splitter breaks before any run of digits followed by a full stop and a space, as it would for a numbered list. With the same six lines now ending in full stops, "Example Deck 2025." became the pieces "Example Deck", "2", "0", "2", and "5."; the title row matched "Example Deck" (Grammar), and the slide 2 rows matched the single character "2" (Split). -
One penalty is defined and never applied.
CONFIDENCE_PENALTY_HIGH_IMAGE_TEXT_MISMATCH = 0.20sits inconstants.pyanddocs/cli.mdlists the penalty, yetscore_slidedoes not use it. -
Part of
integrations/is not wired in. The agent hooks, the capability contracts, and the skill registry are present, and nothing in the CLI path or the tests imports them; only the schema validator is used. -
soffice --versionhung on the test machine while another LibreOffice process was already open.docs/cli.mdsuggests that command as a check. The conversion itself ran normally in the same state, so the hang affected the check and not the pipeline.
Designed and authored by Daniel Boles; implemented with coding agents. Licence: Apache-2.0.