Knowledge as Code: формат памяти для AI-агентов получил спецификацию

· 1 мин чтения
ai-agents memory knowledge-as-code standards infrastructure
Knowledge as Code: формат памяти для AI-агентов получил спецификацию

Пять недель назад инженер Pulumi Энгин Дири написал о том, что ключевой элемент агентного цикла — не промпт и не инструменты, а память. Обычный Markdown-файл вне контекстного окна, который хранит сделанное, запланированное и усвоенное агентом между запусками. Проблема была в том, что у каждого такой файл выглядел по-своему — и агенты не могли читать чужие. Через три дня после того поста Google опубликовал ответ: спецификацию Open Knowledge Format.

Паттерн, который скопировали все

В апреле 2026 года Андрей Карпатый опубликовал gist под названием LLM wiki, который собрал тысячи звёзд и форков. Идея: вместо того чтобы индексировать документы в RAG и пересобирать ответы из сырого текста при каждом запросе, агент строит вики и поддерживает её в актуальном состоянии.

Структура простая: связанные Markdown-страницы, index.md с однострочными аннотациями к каждой странице, log.md с записью каждого изменения и страницы сущностей, которые растут по мере поступления новых источников. Сбрасываете транскрипт встречи — агент читает его, обновляет десяток страниц, фиксит перекрёстные ссылки и дописывает лог за один проход.

Паттерн взлетел по той же причине, по которой вики обычно умирают. База знаний ценна ровно настолько, насколько качественно сделана рутинная работа, которую никто не хочет делать: суммаризация, линковка, разрешение противоречий, удаление устаревших утверждений. LLM «не скучают, не забывают обновить перекрёстную ссылку и могут коснуться 15 файлов за один проход» — формулировка Карпатого, которую Google теперь цитирует в собственном анонсе. Человек курирует источники и задаёт вопросы, агент делает чёрную работу.

Вики, которую читает только ваш агент

Проблема возникла, когда паттерн начали копировать. Каждая реализация — отдельный диалект. У одного связанные страницы перечислены во фронтматтере, у другого — внизу тела документа. У одного поле tags, у другого — categories. Пока вики обслуживает одного человека, это неважно: схема живёт в CLAUDE.md, и агент читает её при каждом запуске.

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

Что Google представил на самом деле: Open Knowledge Format

12 июня 2026 года два техлида из подразделения data analytics в Google Cloud анонсировали Open Knowledge Format, с полной спецификацией и инструментарием на GitHub. Если убрать брендинг, OKF v0.1 — это формализация паттерна Карпатого:

  • Бандл — директория с Markdown-файлами. Два имени зарезервированы: index.md для прогрессивного раскрытия информации и log.md для истории обновлений. Всё остальное — документы концепций.
  • Фронтматтер — YAML с одним обязательным полем: type. Пять рекомендованных: title, description, resource, tags, timestamp. Продюсеры могут добавлять что угодно; консьюмеры обязаны сохранять непонятные поля при обработке.
  • Связи — ссылка из одного концепта на другой утверждает связь. Тип связи определяется окружающим текстом.

Вся спецификация умещается на одну страницу, и это осознанное решение. Анонс называет три принципа: минимальная навязчивость, независимая заменяемость продюсеров и консьюмеров, формат вместо платформы. Никакого обязательного SDK, никакой схемы сжатия, никакого нового рантайма. Чтение бандла — это cat, распространение — git clone. Репозиторий дополнен референсным инструментарием: enrichment-агент, создающий документы концепций из датасетов BigQuery, и статический визуализатор, отрисовывающий бандл в виде графа. Три примера бандлов дают готовую базу для копирования.

Критика — это и есть фича

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

Стандарты, которые приживаются, embarrassingly small. MCP не моделировал ваши инструменты — он стандартизировал сокет, в который они вставляются. AGENTS.md зафиксировал только имя файла, и этого хватило, чтобы Neo читал тот же файл конвенций, что и любой другой агент. Agent Skills дали процедурам место для жизни, а сайты документации остановились на /llms.txt для публикуемого контента. Знания были тем слоем, которому всё ещё не хватало своего скучного маленького стандарта. Выживет ли именно OKF — вопрос вторичный. Важнее форма, которую он фиксирует: Markdown, фронтматтер, git. Каждый другой слой агентного стека уже пришёл к этому, так что ставка безопасна.

Knowledge as Code

Платформенные команды должны обратить на это внимание раньше всех. Infrastructure as Code описывает что: ресурсы, конфигурацию, граф зависимостей. Оно никогда не описывало почему. Runbook для ротации учётных данных, decision record с объяснением замороженной версии CNI, кто владеет кластером, чему научил ноябрьский инцидент. Эти знания живут в вики за API, на общем диске, в треде Slack и в головах двух старших инженеров. Google называет эту фрагментацию проблемой: агенты пересобирают ответы из систем, каждая из которых говорит на своём проприетарном формате.

Ответ OKF — ход, который платформенные инженеры узнают, потому что это тот же ход, который породил IaC: положить в git, сделать diffable, ревьюить изменения в pull request-ах. Knowledge as Code, лежащий рядом с Infrastructure as Code, который он объясняет:

platform/
├── index.md
├── log.md
├── services/
│   ├── index.md
│   ├── checkout-api.md
│   └── payments-worker.md
├── runbooks/
│   ├── index.md
│   └── rotate-database-credentials.md
└── decisions/
    ├── index.md
    └── why-we-pin-the-vpc-cni-version.md

Рекомендованное поле resource принимает URI, идентифицирующий актив, который описывает концепт. Pulumi URN — это именно такой идентификатор:

---
type: runbook
title: Rotate the payments database credentials
description: Zero-downtime credential rotation for the payments Postgres instance.
resource: urn:pulumi:prod::payments::aws:rds/instance:Instance::payments-db
tags: [payments, postgres]
timestamp: 2026-07-01T09:30:00Z
---

Теперь runbook называет ровно тот ресурс, с которым работает. Агент, планирующий изменение этой базы данных, может пройти от URN к runbook и дальше к decision record, объясняющему ограничения, — прежде чем что-либо предлагать. В посте о цикле Дири сказал, что skills — это записанное намерение, конвенции, которые агент читает вместо того чтобы угадывать. Бандл знаний — вторая половина: записанный опыт. Инструменты дают циклу руки, skills — привычки, а бандл — то, что цикл может помнить.

Автор проверил это на практике. Свежий агент получил два входа — спецификацию и бандл — и один вопрос: какие сервисы касаются платёжной базы данных и как ротировать её учётные данные без даунтайма? Агент прочитал шесть файлов и ответил правильно, вплоть до объяснения, почему повторная ротация слишком быстро — опасный шаг. Что убедило автора — файл, который агент не прочитал. Decision record по CNI остался закрытым, потому что перекрёстные ссылки маркируют эту страницу как кластерную, а не базу данных. Бандл публичный — github.com/dirien/pulumi-platform-okf-bundle.

Чего стандарт не делает

Три оговорки, чтобы никто не принял это за магию.

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

v0.1 — это черновик, и имя может не выжить. Google сам об этом говорит: анонс называет v0.1 «отправной точкой, а не законченным стандартом». OKF может проиграть лучшей спецификации в следующем году. Начинать всё равно стоит, потому что конвертация Markdown с фронтматтером в Markdown с чуть другим фронтматтером — самая дешёвая миграция, механический проход, который агент завершает за полдня. Форма — это обязательство. Имя — деталь.

Конформность — это пол, а не гигиена. Спецификация требует от консьюмеров терпимости к битым ссылкам, пропущенным индексам и неизвестным типам. Терпимость сохраняет читателей работоспособными, но она же означает, что ничто не заставляет бандл оставаться здоровым. Gist Карпатого включал lint-проход не просто так: противоречия, осиротевшие страницы, устаревшие утверждения. Сохраните этот шаг и запускайте его, как линтер кода, по расписанию, с результатами, которые доходят до человека.

С чего начать

  1. Выберите знания, которые уже болят. Runbook, который никто не может найти во время инцидента, onboarding-документ, который неверен способом, о котором знает только один человек. Один домен, а не вся организация.
  2. Пусть агент сделает конвертацию. Вставьте спецификацию в своего coding-агента, укажите на существующую папку с документами и попросите отрефакторить их в бандл. Это ровно та рутинная работа, в которой LLM хороши, и она работает одинаково хорошо на экспорте из вики и на чистом старте.
  3. Положите бандл туда, где лежит код. Тот же репозиторий или соседний, но в git, за pull request-ами. В день, когда изменение знаний получит ревью-комментарий, бандл станет заслуживающим доверия.
  4. Подключите бандл в цикл. Агенты читают index.md первым и углубляются, только когда концепт этого заслуживает, что сохраняет контекстное окно небольшим. Файл памяти, который нужно писать перед циклом, теперь имеет формат, и каждый агент, в любом harness-е, который вы построили, может читать один и тот же.

Совет из июня остаётся в силе: пишите файл памяти перед циклом. Что изменилось — файлу больше не обязательно быть частным диалектом. Теперь есть одностраничная, git-нативная спецификация для слоя, которым думают ваши агенты. Малость, которая делает её тривиальной на вид, — это свойство, позволяющее ей распространяться. Цикл печатает. Вики помнит. А память теперь можно положить в pull request и передать следующему агенту, как всё остальное, что вы поставляете.

Источник: https://www.pulumi.com/blog/knowledge-as-code-the-memory-file-just-got-a-spec/