Skip to main content
Glama
data-mission

proof-print-dialog

by data-mission

PROOF

A hand holding a printed page up to the window — almost entirely blank, one stray line of text near the middle. Below it, a printer tray full of sheets.

Вы уже распечатали. Вот тогда и узнаёте.

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

Создан для хакертона Cursor Calgary (август 2026), задача которого заключалась в том, чтобы взять скучный, повседневный формат приложения и сделать его значительно лучше — визуально, функционально или и то и другое. Диалог печати практически не менялся с 1995 года. Вот как он выглядит, если кто-то наконец до него добрался.


Проблема, конкретно

Диалог печати, который сегодня поставляется с большинством операционных систем, даёт вам область предварительного просмотра размером примерно с почтовую марку. Это вся видимость, которую вы получаете для документа, который может содержать более дюжины страниц. При таком размере вы не можете сказать, что одна страница — это одинокая строка «Условия и положения применяются», оставшаяся из-за разрыва страницы, что другая — не что иное, как маркер «— продолжение —», переполнившийся на отдельный лист, или что третья говорит «Эта страница намеренно оставлена пустой» одиннадцатипунктовым шрифтом с засечками. Вы нажимаете «Печать». Выходят все страницы. Некоторые из них — мебель, а не контент — и вы заплатили за бумагу и тонер на всех них, прежде чем увидели, что произошло.

Именно этот режим отказа PROOTH призван устранить: диалог, которому вы уже доверяете, не показывает вам достаточно, чтобы принять решение, которое он просит вас принять.

PROOF поставляется с реалистичным демонстрационным документом — ежеквартальным бизнес-отчётом на 20 с лишним абзацев, «Q3_Operating_Review_FINAL_v4.docx», с оглавлением, исполнительным резюме, реальной финансовой таблицей, разделом о цепочке поставок, данными о численности персонала и разделом о перспективах, плюс пять намеренно вставленных мусорных страниц именно того типа, который накапливают реальные документы: осиротевший нижний колонтитул «Условия и положения», артефакт разрыва «— продолжение —», случайная строка об авторских правах, уведомление «намеренно оставлено пустым» и одинокий номер страницы. Загруженный и реально разбитый на страницы, этот документ насчитывает 15 страниц, и собственное живое измерение PROOF — не вручную введённая цифра — помечает 5 из них как мусор, печатая 10. Откройте proof/index.html сами, и боковая панель покажет те же самые числа, потому что они вычисляются заново при каждой загрузке страницы, а не запоминаются здесь.


Related MCP server: MCP Mortgage Server

Как на самом деле получаются числа

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

  1. Разбиение на страницы измеряется, а не предполагается. HTML-код документа размещается в реальном, скрытом элементе DOM при реальной ширине контента, и PROOF проходит по его блочным дочерним элементам (заголовки, абзацы, таблицы, цитаты), накапливая фактическую отрисованную высоту каждого из них (getBoundingClientRect()), переходя на новую страницу всякий раз, когда следующий блок переполнил бы блок страницы 816×1056px — бумага формата Letter 8,5"×11" при 96 dpi, с полями примерно 1 дюйм. Явный маркер разрыва страницы в исходном коде принудительно вызывает ранний разрыв. Таким образом, количество страниц является результатом вёрстки, а не числом, которое кто-то выбрал.

  2. Покрытие чернилами измеряется по реальной геометрии текста. Для каждой готовой страницы PROOF проходит по каждому текстовому узлу и запрашивает у собственного механизма вёрстки браузера точные прямоугольники, которые занимают его глифы (Range.getClientRects()) — не попиксельное сканирование холста, а та же идея, применённая к реальной геометрии, которую браузер уже вычислил. Площадь каждого прямоугольника взвешивается по указанной константе плотности глифов (GLYPH_DENSITY = 0.16, т.е. примерно 16% строки — это реальные чернила для обычного текста, увеличивающиеся с увеличением веса шрифта), а поверх добавляются штрихи границ таблиц/цитат, поскольку они тоже несут чернила. Итог, разделённый на площадь контента страницы, — это процент покрытия чернилами страницы.

  3. Путь растеризации холста тоже существует, но не является основным числом. PROOF также включает второй, независимый метод (inkOf()): сериализует страницу в SVG, растеризует её на закадровый холст и подсчитывает небелые пиксели, взвешенные по темноте яркости. Код явно помечает это как «второе мнение, не используемое для основного числа» — это стоит знать, если вы читаете исходный код, поскольку это более интуитивный из двух методов, но не тот, который управляет тем, что на экране.

  4. Низкое покрытие чернилами само по себе не является мусором. Ниже 2,0% покрытия чернилами (WASTE_THRESHOLD) — необходимое, но не достаточное условие. Страница помечается только тогда, когда она также является либо распознанным элементом пагинационной мебели (уведомление «намеренно оставлено пустым», маркер «— продолжение —», строка об авторских правах, одинокий номер страницы), либо не имеет вообще никакого структурного элемента (h1,h2,h3,table,ul,ol,svg,img,blockquote) и содержит менее 120 символов текста. Именно это не позволяет ошибочно пометить титульную страницу или оглавление только за то, что они разрежены — во встроенном демо титульная страница имеет 2,06% чернил, а оглавление — 1,0%, обе технически тонкие, и обе всё равно печатаются, потому что у каждой есть заголовок.

  5. Причина, а не просто флаг. Фактический текст помеченной страницы сопоставляется с шаблонами тех видов мебели, которые накапливают реальные документы — уведомления «намеренно оставлено пустым», маркеры «— продолжение —», строки об авторских правах, одинокие номера страниц или короткая завершающая строка без чёткой категории — так что причина, показанная для каждой мусорной страницы, выводится из того, что эта страница на самом деле говорит, а не из подписи, написанной для конкретного демо.

Сказано прямо, потому что это важно для доверия: если измерение на основе вёрстки по какой-то причине не может работать, PROOF не молча показывает вам ничего или тихо что-то выдумывает — он переключается на раскрытую, детерминированную оценку (estimateInk(): указанная формула по количеству символов, количеству заголовков и количеству ячеек таблицы), задокументированную в коде именно как оценку, а не измерение. Строка состояния интерфейса сообщает вам, какой из методов произвёл числа, которые вы видите — она показывает либо measured · N glyph runs across N pages, либо estimated · layout measurement unavailable, так что вы никогда не смотрите на догадку, представленную как измерение. Индикатор «метод» на панели деталей каждого листа согласуется с этим, показывая measured · glyph-run geometry или estimated · block model для этого конкретного листа.

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


Что вы на самом деле видите

  • Сначала вердикт. Страниц на входе, страниц на выходе, с количеством отброшенных листов и средним процентом чернил, указанным как главная статистика на боковой панели — а не спрятанным в панели настроек.

  • Стена листов. Каждая страница задания в виде живой миниатюры — фактически отрисованная страница, уменьшенная с помощью CSS transform: scale(), а не графический заполнитель или миниатюра, перерисованная с нуля — с видимыми штампами на мусорных страницах и индикатором чернил для каждой страницы.

  • Вложенное раскрытие. Нажмите на любой лист, и он откроется в собственное объяснение: как он был классифицирован, его измеренное покрытие чернилами относительно порога 2,0% и — для помеченной страницы — какой именно вид мебели это и почему его удаление ничего не меняет из того, что вы собирались напечатать. Это позвоночник дизайна: документ → страницы → один помеченный лист → причина, каждый уровень раскрывает следующий. С той же панели вы можете восстановить или удалить этот один лист по отдельности.

  • Проверьте другой файл, по-настоящему. На боковой панели есть настоящая зона перетаскивания: перетащите свой собственный файл .html, .txt или .md (или нажмите, чтобы выбрать его), и PROOF разобьёт на страницы и измерит этот документ с помощью того же самого конвейера, описанного выше — это не второй демонстрационный режим, это та же функция load(), через которую проходит встроенный документ.

  • Настоящая кнопка «Печать». «Печать» вызывает реальный window.print() браузера для скрытого корня печати, который отражает задание на экране; отброшенные/мусорные страницы несут display:none в @media print, так что листы, которые вы решили не печатать, действительно не печатаются. Также есть явный запасной вариант «Печатать всё равно всё», а CSS для печати скрывает интерфейс приложения, так что на принтер уходит только сам документ.

  • До / после. Диалог 1995 года честно отображён на презентационном слайде (proof/deck.html) рядом с тем, что вместо него показывает PROOF, так что контраст заявлен явно, а не только подразумевается.

Платформы

Десктоп и мобильные устройства спроектированы как полноценные макеты, а не один, уменьшенный из другого — стена листов, строка главной статистики и вложенное детальное представление имеют выделенные точки останова вплоть до ширины телефона.


MCP-сервер — проверка документа без участия человека

Веб-страница — это одна поверхность PROOF. Под ней PROOF предназначен для прямого использования ИИ-агентом: MCP-сервер предоставляет ту же модель документа, которую использует веб-интерфейс, так что агент-кодер, конвейер документов или сам Claude могут проверить задание до того, как сдвинется хотя бы один лист — без скриншотов, без человека, читающего область предварительного просмотра.

Сервер находится в proof/mcp/ и отражает тот же самый документ на 15 страниц, который измеряет веб-приложение — то же имя файла (Q3_Operating_Review_FINAL_v4.docx), те же 5 мусорных страниц (4, 6, 9, 11, 13) с теми же причинами и те же константы стоимости (cost_per_sheet_usd: 0.012, cost_per_ink_point_usd: 0.0009), которые использует сам index.html, так что вызов ink_cost цитирует те же деньги, которые интерфейс показывает на экране (среднее покрытие чернилами 2,97% и $0,0603 сэкономлено здесь, «2,9%» и «$0,06» округлены в интерфейсе). Одна вещь сказана прямо, а не скрыта: проценты чернил в document.js сервера — это захваченные значения, зеркально отражающие реальное измерение браузера, а не пересчитанные самим сервером — не существует переносимого Node-эквивалента метода геометрии глифов Range.getClientRects() из index.html, поскольку этот API существует только в реальном механизме вёрстки, поэтому сервер раскрывает свои числа как "method": "measured_in_browser_layout", а не притворяется, что независимо пересчитывает их. Подключение сервера к измерению произвольного документа, переданного ему — так же, как это уже делает зона перетаскивания веб-интерфейса — является естественным следующим шагом.

Четыре инструмента, которые он предоставляет, проверены живым смоук-тестом (node proof/mcp/smoke_test.mjs):

Инструмент

Что он делает

proof

Измеряет документ и возвращает каждую страницу с её покрытием чернилами и процентом заполнения.

waste_report

Возвращает только помеченные листы, каждый с конкретной причиной, почему это мусор.

drop_pages

Удаляет помеченные листы — возвращает задание, которое действительно будет напечатано. Страницы удаляются, а не переформатируются.

ink_cost

Листы, покрытие чернилами и смоделированная стоимость задания в текущем виде по сравнению с исходным.

Чтобы подключить его к Claude Desktop, Claude Code или любому MCP-совместимому клиенту, укажите клиенту на каталог сервера:

cd proof/mcp
npm install

Затем добавьте его как MCP-сервер (транспорт stdio) в конфигурацию вашего клиента, например, для claude_desktop_config.json в Claude Desktop:

{
  "mcpServers": {
    "proof": {
      "command": "node",
      "args": ["/absolute/path/to/proof/mcp/server.js"]
    }
  }
}

Сеть не задействована, и развёртывать нечего: сервер — это локальный stdio-процесс, точно такой же, как любой другой MCP-сервер, который вы запускаете для локальных инструментов. Это было осознанное ограничение всего проекта — см. «Без бэкенда» ниже, — распространённое и на уровень агента: агентные возможности без зависимости от хостинга, который может отказать во время демонстрации.

Чтобы убедиться, что сервер действительно работает «из конца в конец», не подключая полный клиент, запустите включённый смоук-тест — он порождает server.js как настоящий дочерний процесс через stdio, выполняет MCP-рукопожатие, перечисляет все четыре инструмента и вызывает каждый из них:

cd proof/mcp
node smoke_test.mjs

Более полные инструкции по подключению (включая конфигурацию для Cursor) находятся в proof/mcp/README.md.


Как это запустить

Продукт — это статический HTML/CSS/JS. Никакого шага сборки, никакого бандлера и никакого сервера.

open proof/index.html

или просто дважды щёлкните proof/index.html в Finder/Explorer. Это вся процедура установки — никакого npm install, никакого dev-сервера, никакой зависимости от node_modules этого репозитория, а также никаких внешних шрифтов, CDN-скриптов или сетевых изображений.

Страница работает в паре с proof/sample-document.js, который поставляет полный демонстрационный отчёт на 15 страниц (window.SAMPLE_DOC) — держите оба файла вместе в proof/, и он загрузится автоматически через обычный тег <script src>. Если этот файл когда-либо пропадёт, index.html не сломается: он откатится к меньшему, самодостаточному демонстрационному документу (FALLBACK), встроенному прямо в страницу, так что приложение никогда не покажет пустой экран — просто более короткий документ. В любом случае измерение чернил работает одинаково, открываете ли вы файл напрямую (file://) или раздаёте его, потому что ничто в конвейере не зависит от кросс-доменного сетевого доступа.

Если вы предпочитаете раздавать его по HTTP по какой-либо причине (некоторые расширения браузера или более строгие локальные политики безопасности могут мешать страницам file://), подойдёт любой статический файловый сервер, например:

npx serve proof

Скриншоты и харнесс для захвата

Каталог _brainstorming/ содержит рабочие заметки этого проекта, включая capture.mjs — небольшой Playwright-скрипт, используемый для получения покадрово точных скриншотов страницы при определённых позициях прокрутки и размерах окна просмотра (десктоп и телефон) для подачи на хакатон. Для него требуется devDependency playwright, объявленная в корневом package.json этого репозитория:

npm install
node _brainstorming/capture.mjs proof/index.html --out shots

Это инструмент разработки, а не часть продукта — самому PROOF для работы ничего из этого не нужно.


Без бэкенда — намеренно

У PROOF нет сервера, нет базы данных и нет шага развёртывания для самого продукта. Его встроенные демонстрационные «данные» — это вручную собранный, реалистичный квартальный отчёт, поставляемый как статический контент (sample-document.js, с меньшим встроенным запасным вариантом, если этот файл отсутствует), так что каждое число, вычисленное из него — количество страниц, покрытие чернилами, флаги отходов, стоимость — это настоящая арифметика над реальным контентом в момент загрузки страницы, а не запрос к бэкенду, который может быть недоступен, медленным или отсутствовать во время демонстрации. Он также по-настоящему принимает файл, который вы на него перетаскиваете, прогоняя его через идентичный конвейер. MCP-сервер — это единственный процесс, работающий вне браузера, и это локальный stdio-процесс, а не размещённый, поэтому он не несёт никакого риска развёртывания веб-бэкенда.

Почему диалог печати

Примерно дюжина других кандидатов на «скучный формат» была рассмотрена и отклонена в ходе проектирования по нескольким различным, отдельно обоснованным причинам: менеджер подписок, трекер посылок и счёт за коммунальные услуги были отброшены, потому что честное их воссоздание означало бы выдумывание данных без легитимного источника (банковский баланс, реальный статус отслеживания перевозчика, показания счётчика); поток отмены и CAPTCHA были отброшены как не добавляющие реальной информации; менеджер вкладок браузера и карта мест в самолёте были отброшены как уже хорошо обеспеченные существующими продуктами (OneTab/Arc, SeatGuru); баннер с cookie-файлами был слишком мал как холст для задуманного многослойного раскрытия при прокрутке; а более ранняя концепция дозирования по рецепту была вырезана за провал теста на мгновенное понимание. Диалог печати — единственный кандидат, который прошёл все эти барьеры сразу: мгновенно узнаваем, добавляет реальную информацию, которую текущий диалог скрывает, и каждое впечатляющее число на экране — страницы, обнаружение пустых страниц, покрытие чернилами — это то, что браузер действительно может вычислить из реального документа, вживую, без единой подделки. Полная запись решений, включая отклонённых кандидатов и обоснование на каждом шаге, находится в _brainstorming/SPEC.md.


Структура репозитория

proof/
  index.html          the product — open this
  sample-document.js   the 15-page demo report loaded into the product
  deck.html            a short, seven-slide product presentation, same art direction
  docs.html             the full feature-by-feature reference, verified against live output
  mcp/
    server.js           the MCP server entrypoint (stdio transport)
    document.js          MCP server's document model — mirrors index.html's live document
    smoke_test.mjs        end-to-end check: spawns the server, calls all four tools
    package.json          MCP server package (@modelcontextprotocol/sdk, zod)
    README.md             MCP-specific install/connect instructions
_brainstorming/
  SPEC.md             the full design/decision record for this project
  capture.mjs          Playwright screenshot harness used for the submission
  ...                  earlier design drafts and research notes, kept for the record
shots/                desktop + mobile submission screenshots of proof/index.html
shots-deck/           submission screenshots of proof/deck.html

proof/deck.html — это короткая автономная страница-презентация продукта — откройте её так же, как index.html, — которая за семь слайдов в той же визуальной стилистике, что и сам продукт, рассказывает, почему диалог печати сломан, как PROOF измеряет покрытие чернилами (измеренное против растеризованного) и какова логика классификатора «оставлено, несмотря на низкое покрытие чернилами». proof/docs.html — это более глубокая, прокручиваемая справка: каждая функция — включая MCP-сервер — задокументирована относительно текущего кода с реальными, проверенными вживую числами.

Создано для хакатона Cursor Calgary, август 2026.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides comprehensive print production and color management tools (Pantone lookup, CMYK/RGB conversion, ink estimation, preflight checks, etc.) that work 100% offline without API keys.
    10
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to parse and analyze mortgage documents (Loan Estimates & Closing Disclosures), converting them into structured MISMO-compliant JSON and checking for TRID compliance violations.
    2
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables deterministic visual and structural analysis of PDF and DOCX documents, extracting measurable evidence such as blur, OCR confidence, and image anomalies for auditable forensic workflows.
    1
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables creating professional documents (invoices, contracts, certificates, proposals, reports) via the DocuQueue API, with tools for template management, filling, previewing, and PDF generation.
    1
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/data-mission/proof-print-dialog'

If you have feedback or need assistance with the MCP directory API, please join our Discord server