Image: AI generated
how-make-quest была о том, как построить Quest CLI голыми руками, а reins вынес тот инвариант во фреймворк. Эта статья — следующая клетка той родословной: инструмент, вбивший то же утверждение в один домен, — abloq (Agentic blog Quest).
Статья появится, ей просто нельзя верить
Кто поручал блог агенту, тот знает. Статья появится. Бросишь одну тему — он соберёт материалы, нарастит абзацы и выдаст правдоподобный текст. Настоящая проблема в другом — ей нельзя верить.
Агент фабрикует источники. Вбивает в сноску несуществующий URL, вешает как цитату страницу, не имеющую отношения к заголовку. Тихонько поднимает lastmod у статьи, которую даже не правил, чтобы та выглядела свежей. Попросишь поправить одну статью — а он трогает front matter и layout соседней. И в итоге человеку приходится перечитывать всё заново. Но если человек будет вычитывать каждую статью построчно, то и поручать было незачем. Автоматизация просто породила новый труд вычитки.
Это не исчезнет, если раздуть модель крупнее. Пока ей позволено судить собственный текст, рост способностей лишь поможет ей лучше находить зазоры в вердикте.
Человек пишет лишь одну страницу — insight.yaml
Ответ abloq — разделение труда: генерация может быть вероятностной, но проверка обязана быть детерминированной. Недетерминированный труд по созданию прозы делает агент, а годность его продукта решает машина.
Поэтому человек пишет лишь одну спецификацию инсайта, insight.yaml. Тему·позицию·разбираемые утверждения (claims) записывают в форме, которую машина может сверить.
# insight.yaml — всё, что пишет человек
topic: "robots.txt — как 30-летняя практика стала стандартом"
stance: "robots.txt — это не средство контроля доступа, а сигнал"
claims:
- id: rep-standardized-2022
text: "практика robots.txt началась в 1994 году, но стандартом IETF (RFC 9309) стала лишь в 2022"
requires_source: true
anchors: ["RFC 9309", "1994"]
Записанные здесь claims становятся критерием gate написания. Утверждение, которого нет в спецификации, не может стать основной частью статьи, а утверждение из спецификации обязано иметь соответствие в тексте. Сбор материалов·написание·правка·перевод·публикация·обновление — всё это дальше дело агента.
blog.yaml — полная декларация одного блога
Если спецификация — SSOT одной статьи, то blog.yaml — SSOT одного блога. Сайт·языки·секции·каноническую структуру статьи·пороги GEO·деплой он держит в одном файле.
site: { baseURL: https://example.com, title: My Blog }
languages: [en, ko, ja] # первый элемент = язык по умолчанию
sections: [tech, opinion]
structure:
order: [image, attribution, body, related, sources, changelog]
geo: { min_sources: 1, freshness_days: 90 }
Отсюда выводятся все параметры hugo.toml·robots.txt·llms.txt·sitemap (hreflang)·JSON-LD·правил gate. Пока blog.yaml не меняется, ни одна статья не может обойти gate — ограничение это контракт. Дрейф, при котором переписанные руками конфиг-файлы расходятся между собой, становится структурно невозможным.
FAIL — это не мнение, а факт
Когда агент сдаёт статью (submit), gate выносит вердикт. Ниже — реальная запись прогона: агент пропустил секцию источников и повесил недостижимый URL как цитату:
en/tech/robots-exclusion-protocol -> FAIL
- min-sources: content/en/tech/robots-exclusion-protocol.md:1
actual="sources section missing — geo.min_sources requires >= 1"
- citation-exists: content/en/tech/robots-exclusion-protocol.md:19
actual="https://www.robotstxt.org/orig.html is not reachable (HTTP 403)"
FAIL — это не мнение вроде «как-то странно». Это факт (Fact) с вбитыми местом (файл:строка) и ожидаемым значением. Чинить нужно не догадку, а тот единственный Fact. Агент сходится по этой обратной связи, и лишь когда исправленная заявка проходит все правила, машина запирает PASS.
Здесь снова срабатывает парадокс how-make-quest. Модель угодлива — она покорно следует указаниям. Для мнений угодливость яд, но для фактов угодливость актив. Скорми Fact обратно — и чем угодливее модель, тем покорнее она примет этот Fact и сойдётся.
Запертое не отмотать назад — ratchet
Суть gate не в вердикте, а в необратимости. Однажды запертый PASS не скользит назад. Даже если агент следующей сессии испортит ту же статью, ниже базовой линии опуститься нельзя.
Поэтому агент одноразов, но прогресс накапливается. Слетел контекст, сменилась модель, оборвалась сессия — а запертая клетка остаётся запертой. Это и есть ratchet: запираем ровно столько, сколько прошло, и запертое не допускает регресса. Это же и причина отдать право выносить вердикт завершения не вероятностному LLM, а детерминированной машине. То, что самопроверка почти не повышает качество, уже измерено, и поскольку LLM-as-Judge структурно невозможен, судьёй обязан быть код.
Пять квестов, каждый закрывается своим gate
abloq оставляет квестами лишь недетерминированный труд по обращению с прозой. Обнаружение·генерация·измерение·вызовы внешних API делает детерминированный код, а агент занимается лишь пятью видами работы по написанию статей. Каждый квест закрывается своим gate.
| Квест | Триггер | Gate (суть) |
|---|---|---|
| writing | insight.yaml от человека | каждый пункт спецификации имеет соответствие в тексте · проверка реальности цитат · источники ≥ порога |
| translation | новая статья + реальное изменение текста | структура без потерь (translation-parity) + совпадение slug по всем языкам + сборка 0 ошибок |
| refresh | очередь сканера свежести | сопровождается реальным изменением текста · блокировка пустого обновления lastmod (honest-lastmod) |
| evidence | очередь сканера утверждение-источник | источники ≥ порога · реальность новых цитат · утверждения вне очереди неизменны до буквы |
| cluster | очередь сканера кластеров | тег существует в taxonomy · 0 осиротевших тегов · внутренние ссылки ≥ порога |
Защита от cheese общая для всех квестов: сохранение front matter, побайтовое совпадение вердикта gate и отражения в репозитории, запрет менять файлы вне области элемента очереди. Агент не бьёт по внешним API напрямую — побочные эффекты вроде архивации·индексации обрабатываются квитанцией бэкенда.
Измерение назначает следующий труд — GEO это операция
То, цитирует ли ИИ твою статью, напрямую не наблюдается. abloq измеряет это тремя слоями прокси: слой обхода (хиты ИИ-ботов в логах CloudFront, детерминирован), слой индексации (тренды показов·кликов GSC, детерминированы), слой цитирования (периодический прогон набора стандартных запросов с фиксацией цитат в ответах ИИ как тренда; недетерминирован, потому не выводится в gate).
Суть в том, что измерение на этом не кончается. Результат измерения становится весом приоритетной очереди и назначает вход следующего квеста. Устаревшая статья падает в очередь refresh, утверждение без источника — в очередь evidence, изолированная статья — в очередь cluster. Ratchet, в котором измерение назначает труд, — потому GEO это не состояние, а операция. Не балл, который оптимизируешь раз и навсегда, а постоянно крутящийся цикл. То, что факторы, поднимающие цитируемость (источники·статистика·цитаты), значимо повышают видимость, количественно показали исследования оптимизации генеративных движков.
Поверх reins — родословная
Gate у abloq стартует не с голого пола. Он стоит на детерминированном gate-движке reins. reins поставляет ratchet·скелет команд (scan/next/submit)·свод·export, а abloq реализует лишь gate домена блога (свод правил структуры·доказательств·политики).
Родословная ясна. how-make-quest научила принципу построения квеста голыми руками, reins вынес тот принцип во фреймворк, а abloq вбил тот фреймворк в один домен — блог. Одна и та же фраза приземляется трижды на разной высоте: генерация вероятностна, проверка детерминирована.
Эту статью тоже запер abloq
Эту статью я написал квестом writing у abloq. Засеял (scan) показанный выше insight.yaml как семя, получил промпт написания (next) и написал текст, сдал (submit) и провёл через gate. Превышает ли секция источников порог, действительно ли достижимы URL цитат, имеет ли каждый claim спецификации соответствие в тексте — этот вердикт выносили не глаза человека, а машина.
Агент-писатель не может REVIEW собственную статью. REVIEW обязательно пишет рецензент из другого контекста, и правило review-record детерминированно проверяет эту изоляцию. Структурно исключить угодливого судью — устройство, не давшее этой статье похвалить саму себя, и есть тот самый принцип, который эта статья объясняет.
Когда обещание проверяемо, нарушение определено, а соблюдение принудимо — система сходится. Блог не исключение.
Связанные статьи
- reins — оставь домен от Quest CLI, а ratchet вынеси во фреймворк — детерминированный gate-движок, на котором стоит gate у abloq.
- Как создать Quest CLI — принцип (почему) и скелет (как) того, чтобы завершение судила машина.
- huma — ratchet, не пропускающий ни одного эндпоинта — пример применения того же ratchet к домену тестирования API.
- Ratchet Pattern — паттерн, запирающий пройденное и пресекающий регресс.
- Кто определяет «завершено» — перенос вердикта завершения в незачизиваемый машинный gate.
- GEO: чтобы ИИ цитировал твою статью — теоретическая основа слоя видимости abloq.
Что почитать ещё (внешнее)
- abloq — репозиторий GitHub — тело фреймворка·свод правил gate·пак квестов (MIT).
- reins — репозиторий GitHub — gate-движок, на котором стоит abloq (MIT).
- Предложение llms.txt — практика индекса сайта для ИИ.
Источники
- Aggarwal, P. et al. (2024). “GEO: Generative Engine Optimization.” KDD 2024. arXiv:2311.09735 — измерение того, что добавление источников·статистики·цитат количественно повышает видимость внутри генеративного движка. Основание операции видимости abloq.
- Stechly, K., Valmeekam, K., & Kambhampati, S. (2024). “On the Self-Verification Limitations of Large Language Models.” arXiv:2402.08115 — самопроверка почти не повышает качество → причина отдать право выносить вердикт завершения детерминированной машине.
- Koster, M., Illyes, G., Zeller, H., & Sassman, L. (2022). “Robots Exclusion Protocol.” RFC 9309 — случай, когда 30-летняя практика стала стандартом IETF (источник примера про robots.txt).
История изменений
- 2026-06-11: Первая версия