Releases: edvardgrishin27/frameproof
Release list
frameproof 0.7.1 — скрипты OCR внутри пакета
Хвост к 0.7.0.
Скрипты contrib/ocr_windows.py и contrib/ocr_tesseract.py лежали в репозитории, но не попадали в дистрибутив. README при этом предлагает команду --ocr-command "python .../ocr_windows.py", и после pip install этого файла у человека просто нет.
Это ровно та ошибка, из-за которой в прошлый раз молчал хук nativeprompt: файл есть у автора, нет у пользователя.
Скрипты переехали в frameproof/contrib/ и объявлены в package-data. Пути в README обновлены. Два теста сторожат и объявление в манифесте, и путь в документации.
frameproof 0.7.0 — восемь правок по отзыву с Windows
Человек прогнал инструмент на Windows из России и прислал восемь пунктов. Проверил каждый по коду: подтвердились все восемь, один оказался хуже описанного.
Инструмент не работал для целой аудитории
Вывод падал на первой команде. Консоль Windows по умолчанию cp1251 и не кодирует «✓». Ломалась не одна команда, а все, включая --help. Теперь stdout и stderr переводятся в UTF-8 на старте.
Прокси задать было нечем. Появился --proxy, плюс читаются ALL_PROXY, HTTPS_PROXY, HTTP_PROXY. Отзыв «переменные не помогают» был точным: yt-dlp как библиотека их не читает, в отличие от бинаря. Прокси доезжает до всех четырёх мест, где создаётся YoutubeDL.
YouTube не отдавал форматы без JS-рантайма. yt-dlp по умолчанию включает только deno, а требование нигде не было заявлено. Теперь подхватывается первый найденный из deno, node, bun, quickjs, есть флаг --js-runtime и строка в doctor.
Вводило в заблуждение
doctor противоречил сам себе: печатал «✗ yt-dlp НЕ НАЙДЕН» рядом с «✓ yt_dlp». Первая проверка искала бинарь, вторая импортировала модуль. Бинарь не вызывается в коде нигде — проверка убрана, на её отсутствие поставлен сторож.
Номера кадров нестабильны между сборками. f0084 в индексе на 97 кадров и в индексе на 150 — разные моменты. verify называл это TIME_MISMATCH, то есть фактически обвинял автора разбора во лжи. Теперь у индекса есть отпечаток index_id, у verify — причина INDEX_MISMATCH с инструкцией, а TIME_MISMATCH при чужой сборке понижается до предупреждения.
99:99 молча превращалось в 1:40:39. Теперь это ошибка формата. При этом 90:00 для полутора часов остался рабочим: так пишут постоянно.
Смешанные слеши в путях. display_path в семи местах вывода.
Хуже, чем в отзыве
Человек написал «--ocr-command — пустой контракт, нужен готовый пример». На деле README предлагал команду со ссылкой на ocr_windows.py, которого в репозитории не было.
Написаны два рабочих скрипта:
contrib/ocr_windows.py— встроенныйWindows.Media.Ocr, офлайн, без ключей, толькоpip install winsdkcontrib/ocr_tesseract.py— для Linux и остальных, языкrus+engпо умолчанию
Поставлен сторож: тест вычитывает из README все команды --ocr-command и проверяет, что файл существует. Он покраснел сразу.
Тесты
Было 149, стало 201. Все 52 новых написаны до правок и краснели на них.
frameproof 0.6.1
Патч к 0.6.0.
Версия живёт в трёх файлах: pyproject.toml, frameproof/__init__.py
и .claude-plugin/plugin.json. В 0.6.0 её подняли только в первом.
Итог: uv ставил frameproof==0.6.0, frameproof --version отвечал 0.5.6,
плагин Claude Code сообщал третье. Код при этом был новый, и понять по номеру,
обновилось ли что-то, было нельзя.
Существующий тест сверял только __init__ с plugin.json, поэтому пару
pyproject↔__init__ не ловил никто. Теперь тест проверяет все три источника
разом, и разъезд любой пары роняет сборку. Проверено мутацией каждого файла.
frameproof 0.6.0
Поиск говорит, где искать было не по чему
search отвечал на вопрос и молчал о границах ответа. Вы получали совпадение
на 12:30, отвечали уверенно и не знали, что на 15:00 лежат двадцать минут без
единого кадра, где тот же разговор мог продолжиться с другим ответом.
Теперь:
[12:30 / seg#1] speech: цена подписки двадцать долларов
1 совпадений. Ни одной картинки не загружено.
⚠ рядом с найденным 1 участок без кадров: 15:00–18:00
Ответ мог быть и там.
Разрывы считались при индексации всегда, но печатала их только команда
report, а перед ответом её никто не зовёт. Оговорка приехала туда, где
на неё смотрят.
Это оговорка к вашему ответу, а не общая статистика. Расстояние меряется
до ближайшего совпадения, поэтому разрыв в сорока минутах от всего найденного
под ногами не мешается. Иначе предупреждение превращается в шум, который
перестают читать вместе с настоящими оговорками.
gaps_near_hits — чистая функция: ничего не печатает, индекс не меняет.
Тесты
122 → 130. Проверены мутациями, каждая роняет свой тест:
- убрать вывод предупреждения из
search - сделать порог близости бесконечным, чтобы предупреждать всегда
- мерить расстояние до первого совпадения вместо ближайшего
frameproof 0.5.6
Накопленные изменения с 0.4.0. Главное — устойчивость загрузки: в 0.4.0 инструмент падал там, где площадка отдавала не то, что просили.
Загрузка
- 403 лечится сменой формата, а не паузой: запрет приходит на конкретный формат, а не на видео целиком, поэтому идём по лесенке 720 → 480 → 360
- cookies браузера через
--cookies-from-browser— закрывает 403, вызванные требованием входа - предупреждение, когда yt-dlp старше 120 дней: половина «непонятных» отказов лечится его обновлением
- повторы при 429: одна общая лесенка на все четыре точки загрузки, вместо четырёх разных
Kinescope
- своя загрузка вместо yt-dlp, который забирал не тот поток
- звук: разобран второй вариант DASH-разметки, где размер считается по концам диапазонов
- подпись читается из JS-экранированного адреса
- субтитры берутся из HLS
Замер
- поправка к собственной цифре в бенчмарке: прежний счёт занижал нас на нашей же особенности, потому что не учитывал якоря по речи
- порядок прореживания, разрешение OCR и сравнение с чужими движками
122 теста.
frameproof 0.4.0
Агент смотрит видео без слепых зон и доказывает тайм-кодом, что именно он видел. Работает офлайн, API-ключи не нужны.
Что умеет
Покрытие без слепых зон. Кадры отбираются по доле изменившихся пикселей в ячейках сетки, откалиброванной по собственному фону каждой ячейки, а не по средней дельте всего кадра. Плюс жёсткая гарантия: без кадра не остаётся участок длиннее --max-gap секунд.
Честный отчёт. Инструмент называет адреса слепых зон: БЕЗ КАДРА 25:30–25:59. В этих участках агенту запрещено утверждать, что было на экране.
Индекс вместо кучи картинок. Три команды разделены намеренно: index и search не отдают ни одного изображения, frames — единственная, которая отдаёт. Поиск идёт по речи и по тексту с экрана.
Проверяемые метки. frameproof verify механически ловит выдуманный кадр, разъехавшийся тайм-код, цитату, которой на экране нет, и утверждение о кадре, который агенту не выдавали. Ни одного обращения к модели. Для смысла — отдельный слепой субагент, который видит только кадр и утверждение.
Два тира скорости. --fast берёт кандидатов из ключевых кадров: 1,1 секунды против 32, при 85 % той же информации.
Замер
Полная таблица со всеми режимами конкурента — в bench/RESULTS.md, включая режим, где он впереди по покрытию.
Честные границы — в CLAIMS.md.
Установка
pip install frameproof
frameproof doctor
frameproof installMIT