slides check: как ИИ-агент проверяет собранные презентации

slides check: как ИИ-агент проверяет собранные презентации
Содержание

Когда ИИ-агент собирает презентацию, самое дорогое — не сборка, а приёмка. Агент не может открыть PowerPoint, поэтому раньше единственным способом поймать наложившийся текст или съехавший за край слайд был ты: открываешь файл и смотришь. Я сделал slides check — команду, которая сама проверяет собранный .pptx на две главные неприятности: текст за границами слайда и пересекающиеся текстбоксы.

Проблема: два движка, и оба могли врать

Всё началось с того, что превью презентаций (PNG) рисовалось отдельным движком (Pillow), который повторял геометрию сборщика (python-pptx). Координаты в .pptx — не дюймы и не пиксели, а миллидюймы (EMU): слайд это 13,333 × 7,5 дюйма, или 12 192 000 × 6 858 000 EMU. И вот однажды в превью заголовок съехал, а в PowerPoint всё стояло ровно — потому что рендер повторял геометрию неточно. Добавь к этому ручную приёмку «глазами в PowerPoint» — и получаешь цикл «собрал → проверил → пересобрал», который агент делает медленно и вслепую.

Решение — не верить ни рендеру, ни догадкам, а проверять собранный файл как есть: открывать .pptx после сборки, читать реальные координаты каждой текстовой фигуры из XML и проверять два правила.

Правило 1: текст не за слайдом

Каждая фигура с непустым текстом должна целиком лежать в прямоугольнике слайда. Допуск — 0,001 дюйма (микроскопический, на глаз не уловить, но ловит «вылезший на миллиметр» синий текст из спеки). Проверяется нижняя и правая граница — они уезжают первыми при ошибочных расчётах.

Правило 2: текстбоксы не пересекаются

Если два текстовых прямоугольника перекрываются — в PowerPoint будет каша. Но не всё пересечение — баг: свободные плашки (layout: free) специально кладут поверх слайда, а номера страниц стоят в углу поверх фона. Поэтому плашки и номера страниц исключены: их помечает при сборке само построение (имена фигур free и pagenum), а честный контент проверяется строго.

Вывод команды короткий:

ок: проблем нет (слайдов: 41)

Или, если что-то нашли:

слайд 13: overlap: боксы 'Заголовок…' и 'первый буллет' пересекаются (1.22 in²)
найдено проблем: 2 на 41 слайдах

Рамки боксов в превью

Смотр на геометрию глазами — флаг --boxes у slides render: красным рисуются текстбоксы, синим — прямоугольник картинки. Наложение рамок или выход за границу виден мгновенно, ещё до PowerPoint.

Боксы заголовка и контента видны сразу

Например, на слайде с буллетами рядом видно: узкая красная рамка — текстбокс заголовка, нижняя — область контента. Они не пересекаются, не выходят за край.

А вот слайд с «честными» рамками узкой текстовой колонки image-split: заголовок в колонке, а не во всю ширину (это рендер пришлось подгонять под реальную композицию — отдельная история).

Рамки повторяют реальные текстбоксы собранной презентации

Что нашёл check в собственной «витрине»

Когда я прогнал новую проверку на собственном демо-наборе (витрина из 41 слайда и ещё полдюжины демок), она сразу нашла пять настоящих багов, которые месяцами жили незамеченными:

  • EMU-ошибка: в двух лейаутах SLIDE_H - 2.0 вычитало 2 EMU вместо 2 дюймов — бокс получался 7,5 дюйма вместо 5,5, а низ контента уезжал за 9 дюймов (за пределы слайда);
  • mirror: нижний ряд текста строился от верха фигуры, а не от нижнего края;
  • stat: подпись под большой цифрой геометрически наезжала на неё на всю ширину (11,93 квадратного дюйма перекрытия);
  • рендер image-split: превью рисовало заголовок во всю ширину слайда, а в сборке он живёт в узкой текстовой колонке — после правки рендер повторяет и зону, и уменьшенный кегль заголовка.

Все пять починены, и именно это главное достижение: проверка нашла реальные дефекты, которые ты никогда бы не заказал вручную — потому что без рамок их просто не видно, пока не откроешь PowerPoint, а открывать PowerPoint ради каждого слайда не хочется даже человеческим глазам.

Мелочь, но приятная: подчёркивание

Заодно встроил в разметку спеки __подчёркнуто__ и литеральный код в бэктиках: `__init__` — просто пиши метод в кавычках, и подчёркивание не сработает. Или экранируй: \__init__.

Итог

  • slides check открывает собранный .pptx и проверяет реальные координаты — это не превью, не догадка, а факт геометрии;
  • slides render --boxes рисует рамки боксов — геометрия видна глазами без PowerPoint;
  • автотестов стало 30 (16 старых + 14 новых), включая проверку check на всех демках без внешних зависимостей — они должны проходить начисто.

Принцип, который я теперь применяю: инструмент, который собирает файлы, должен уметь сам себя проверять. Не «потом посмотрим в PowerPoint», а сразу, на той же машине, где собрали. Это в сотни раз дешевле циклов «собери → открой → найди на глаз → исправь». Слайды на витрине — 41 шт, 0 проблем.

Комментарии

Пока нет комментариев.

Войдите, чтобы комментировать.