Skip to content

Releases: edvardgrishin27/frameproof

frameproof 0.7.1 — скрипты OCR внутри пакета

Choose a tag to compare

@edvardgrishin27 edvardgrishin27 released this 07 Sep 14:03

Хвост к 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

Choose a tag to compare

@edvardgrishin27 edvardgrishin27 released this 07 Sep 14:00

Человек прогнал инструмент на 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 winsdk
  • contrib/ocr_tesseract.py — для Linux и остальных, язык rus+eng по умолчанию

Поставлен сторож: тест вычитывает из README все команды --ocr-command и проверяет, что файл существует. Он покраснел сразу.

Тесты

Было 149, стало 201. Все 52 новых написаны до правок и краснели на них.

frameproof 0.6.1

Choose a tag to compare

@edvardgrishin27 edvardgrishin27 released this 01 Sep 22:18

Патч к 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

Choose a tag to compare

@edvardgrishin27 edvardgrishin27 released this 01 Sep 19:12

Поиск говорит, где искать было не по чему

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

Choose a tag to compare

@edvardgrishin27 edvardgrishin27 released this 27 Aug 08:08

Накопленные изменения с 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

Choose a tag to compare

@edvardgrishin27 edvardgrishin27 released this 31 Jul 16:38

Агент смотрит видео без слепых зон и доказывает тайм-кодом, что именно он видел. Работает офлайн, 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 install

MIT