Architecture Update: проектная память для Codex
Долговечная проектная память через ARCHITECTURE.md, runbooks, project skills и компактные agent pointers
Консервативная маршрутизация артефактов для фактов, которые будущие Codex-сессии не должны открывать заново
Maintenance skill, который сохраняет архитектурный контекст без превращения AGENTS.md в свалку знаний
Codex skills, архитектурная память и AI coding workflow

$ architecture-update
> scan durable project changes
> route facts to architecture, runbooks, or project skills
> keep AGENTS.md compactКороткая идея
architecture-update — это глобальный Codex skill, который поддерживает проектную память после значимой работы. Его цель не в том, чтобы писать красивую документацию ради документации. Его цель — сделать так, чтобы следующий AI-агент, новая сессия Codex или другой совместимый coding agent быстро понял:
- что это за проект;
- где лежат важные части;
- какие модули за что отвечают;
- как идут основные runtime/data/content/deploy flows;
- где менять конкретные вещи;
- какие операции уже описаны как runbooks;
- какие проектные AI-skills уже существуют;
- что известно точно, а что пока требует проверки.
Главный принцип: долговечные факты сохраняются, шум отбрасывается.
Skill не должен превращать AGENTS.md в огромный справочник. Наоборот, он разделяет проектную память по слоям:
| Слой | Файл/директория | Роль |
|---|---|---|
| Project map | ARCHITECTURE.md | Фактическая карта проекта |
| Agent pointer | AGENTS.md | Короткие always-on инструкции для Codex |
| Procedures | docs/runbooks/*.md | Пошаговые повторяемые операции |
| Project automation | .agents/skills/*/SKILL.md | Узкие project-specific skills для AI |
| Human onboarding | README.md | Быстрый вход человека в проект |
Такой подход уменьшает повторное исследование проекта. Если через месяц нужно снова опубликовать статью, задеплоить релиз или изменить поток данных, агенту не нужно заново читать весь репозиторий. Он читает нужный слой памяти.
Зачем нужен architecture-update
В длинных проектах AI-сессии часто теряют контекст. Даже если агент сегодня разобрался, где лежат статьи блога, как работает импорт данных или как устроен деплой, завтра новая сессия начнет почти с нуля. Это дорого по токенам, времени и риску ошибок.
architecture-update решает эту проблему как maintenance skill:
- После значимой работы он смотрит, появилось ли новое долговечное знание.
- Отбрасывает одноразовые детали, временные хаки, недоказанные догадки и секреты.
- Определяет, куда именно знание должно попасть.
- Обновляет минимальный нужный файл.
- Связывает
ARCHITECTURE.md, runbooks, project skills иAGENTS.mdбез дублирования.
Это не skill для выполнения задачи. Он не публикует статьи, не деплоит и не рефакторит код. Он запускается после работы, чтобы проектная память догнала реальное состояние проекта.
Почему нельзя хранить всё в AGENTS.md
AGENTS.md — это always-on project guidance для Codex. Это значит, что его содержимое влияет на работу агента постоянно. Если положить туда всю архитектуру, все инструкции деплоя, все процедуры публикации контента и все нюансы модулей, файл станет тяжелым и шумным.
Практический риск:
- агент будет загружать лишний контекст для простых задач;
- важные правила потеряются среди деталей;
- файл станет трудно поддерживать;
- архитектурные факты смешаются с operational procedures;
- project-specific workflows начнут конфликтовать с общими правилами.
Поэтому architecture-update оставляет AGENTS.md компактным. В него попадает только указатель:
Project Architecture
- Treat
ARCHITECTURE.mdas the source of truth for repository structure, runtime flows, integrations, content pipelines, deployment layout, and project-specific gotchas. - Before cross-module, deployment, content/CMS, data-model, or integration changes, read the relevant section of
ARCHITECTURE.md. - Use
$architecture-updateafter meaningful changes that alter architecture, project flows, deployment/content procedures, or reusable project-specific agent workflows.
Идея простая: AGENTS.md говорит куда смотреть, но не пытается быть всем проектом.
Главная модель: один факт — один слой
architecture-update работает как маршрутизатор. Он не просто спрашивает "надо ли записать это куда-нибудь?". Он спрашивает точнее: в какой единственный слой это знание должно попасть?
| Тип знания | Куда писать | Почему |
|---|---|---|
| Где лежит модуль, как идет flow, какие есть интеграции | ARCHITECTURE.md | Это фактическая карта проекта |
| Как выполнить повторяемую операцию по шагам | docs/runbooks/*.md | Это процедура, а не архитектура |
| Как AI должен выполнять частую проектную операцию | .agents/skills/*/SKILL.md | Это триггерная автоматизация для агента |
| Что агент должен помнить всегда | AGENTS.md | Это короткое persistent guidance |
| Как человеку быстро запустить проект | README.md | Это onboarding, а не внутренняя карта |
Такое разделение защищает проект от "документационной каши". Если процедура публикации статьи попадает в ARCHITECTURE.md целиком, архитектура раздувается. Если архитектурная карта попадает в runbook, runbook перестает быть пошаговой инструкцией. Если всё попадает в AGENTS.md, контекст становится тяжелым.
Default outcome: ничего не менять
Самая важная часть skill — консервативность.
architecture-update должен по умолчанию выбирать no changes. Это значит: если завершенная работа не дала устойчивого знания, которое поможет будущим сессиям, файлы не трогаются.
Не нужно обновлять проектную память из-за:
- мелкой правки текста;
- одноразового бага;
- временного workaround;
- локального эксперимента;
- предположения, которое не подтверждено кодом;
- приватного токена, payload или credential;
- детали, которая очевидна из уже существующего кода;
- косметического желания "чтобы было красивее".
Это критично. Если skill будет записывать всё подряд, через несколько недель ARCHITECTURE.md станет таким же бесполезным, как длинная история чата.
Когда обновлять ARCHITECTURE.md
ARCHITECTURE.md обновляется, когда сессия изменила или обнаружила долговечный факт об устройстве проекта.
Хорошие причины:
- появилась новая крупная директория;
- изменился runtime entrypoint;
- изменился build/start/deploy flow;
- появился новый content pipeline;
- изменилась логика blog/CMS/uploads;
- добавилась интеграция с внешним сервисом;
- изменилась схема данных или storage;
- появился новый invariant;
- обнаружился важный gotcha;
- создан новый runbook;
- создан новый project skill.
Плохие причины:
- "мы сегодня поменяли кнопку";
- "нашли баг и сразу исправили";
- "кажется, возможно, деплой работает так";
- "хочу записать историю сессии";
- "добавим на всякий случай".
ARCHITECTURE.md должен отвечать на вопрос: как проект устроен и где менять важные вещи?
Структура ARCHITECTURE.md
Skill задает стандартную форму файла. Она нужна не ради формальности, а чтобы разные AI-агенты могли быстро ориентироваться в любом проекте.
Purpose
Объясняет назначение файла.
Здесь важно указать:
- файл является фактической картой проекта;
- это не
README.md; - это не
AGENTS.md; - это не runbook;
- это не журнал сессии;
- непроверенные факты должны попадать в
Unknowns.
Пример:
Purpose
This file is the durable architecture map for the project. It explains repository structure, runtime flows, integrations, deployment layout, content pipelines, and project-specific gotchas. Agent behavior belongs in AGENTS.md. Step-by-step operations belong in docs/runbooks.
System Snapshot
Краткий паспорт проекта.
| Area | Value | Evidence |
|---|---|---|
| App type | Static content site | package.json, src/pages |
| Runtime | Node.js build, static output | package.json |
| Content source | content/blog | src/lib/blog.ts |
Колонка Evidence обязательна по смыслу. Она заставляет отличать доказанный факт от догадки.
Repository Map
Карта директорий и ответственности.
| Path | Responsibility | Edit when | Verify with |
|---|---|---|---|
| src/components | Shared UI components | Changing reusable UI | npm run build |
| content/blog | Blog source files | Adding or editing posts | npm run build |
| scripts | Operational scripts | Updating automation | targeted script run |
Это один из самых полезных разделов для AI. Он отвечает на вопрос: "куда идти, если нужно поменять X?"
Runtime Entry Points
Точки входа.
| Entrypoint | Owns/starts | Config source | Notes |
|---|---|---|---|
| src/main.tsx | Browser app bootstrap | vite.config.ts | Client entry |
| server/index.ts | API server | .env, package.json | Production process |
Этот раздел особенно важен для проектов, где есть несколько процессов: frontend, backend, worker, cron, queue consumer, admin panel.
Core Flows
Описание основных потоков.
Пример flow:
Blog Rendering Flow
- Trigger: build or dev server route render.
- Source: content/blog/*.md.
- Parser: src/lib/blog.ts.
- Output: generated blog pages under /blog/:slug.
- Verification: npm run build and open /blog/<slug>.
Flow должен быть конкретным. Не "данные проходят через backend", а какие данные, откуда, через какие файлы, куда попадают и как проверить.
Content / Blog / CMS Pipeline
Этот раздел специально важен для проектов с контентом.
| Concern | Local source | Runtime/production location | How it works | Verification |
|---|---|---|---|---|
| Blog posts | content/blog/*.md | Generated /blog/:slug pages | Parsed by src/lib/blog.ts during build | npm run build |
| Images | public/blog/* | Static public assets | Referenced from markdown frontmatter/body | open rendered post |
Если проект публикует статьи, здесь должно быть видно:
- куда положить
.md; - где frontmatter;
- куда класть картинки;
- как создается slug;
- кто рендерит страницу;
- где это оказывается на production;
- как проверить публикацию.
Integrations And External Systems
Все внешние системы.
| System | Purpose | Code location | Config/env | Verification |
|---|---|---|---|---|
| Stripe | Payments | src/integrations/stripe | STRIPE_SECRET_KEY | test webhook |
| CMS API | Content sync | scripts/sync-cms.ts | CMS_TOKEN | dry-run sync |
Здесь нельзя записывать секреты. Только имена env-переменных и места кода.
Data Model And Storage
Где живут данные.
| Data/entity | Storage/schema source | Owner module | Used by | Notes |
|---|---|---|---|---|
| Post | content/blog frontmatter | src/lib/blog.ts | blog pages, RSS | slug must be unique |
| User | prisma/schema.prisma | src/modules/users | auth, admin | migrations required |
Deployment And Environments
Как проект попадает в runtime.
| Environment | Build/deploy path | Runtime process | Content/uploads location | Verification |
|---|---|---|---|---|
| Production | npm run build -> dist | static host | public/uploads | open smoke pages |
Если production details не доказаны, они не должны выдумываться. Их нужно отправить в Unknowns.
Change Map
Самый практичный раздел для будущих агентов.
| If you need to change... | Start here | Also check | Verify with |
|---|---|---|---|
| Blog rendering | src/lib/blog.ts | content/blog, routes/blog | npm run build |
| Shared buttons | src/components/Button.tsx | design tokens, stories | npm run test |
Это снижает количество повторных поисков по репозиторию.
Runbooks
Индекс процедур.
| Runbook | Use when | Notes |
|---|---|---|
| docs/runbooks/publish-blog-post.md | Publishing a new article | Covers frontmatter, images, build verification |
ARCHITECTURE.md не должен копировать весь runbook. Он должен дать ссылку и объяснить, когда его читать.
Project Skills
Индекс локальных AI-skills.
| Skill | Use when | Notes |
|---|---|---|
| .agents/skills/publish-blog-post/SKILL.md | Agent must publish a blog post | Project-specific content rules |
Это важно для новой сессии: агент видит, какие специальные project skills существуют, но не загружает их все сразу.
Invariants And Gotchas
Правила, которые нельзя ломать.
Примеры:
- Slugs must remain stable after publication.
- Uploaded images must live under
public/blog. - Migrations must be generated before schema-dependent code is merged.
- Admin routes must never be statically generated.
Invariants должны быть конкретными и проверяемыми.
Verification Matrix
Команды и проверки.
| Area | Command/check | Expected result |
|---|---|---|
| Build | npm run build | exits 0 |
| Blog post | open /blog/<slug> | page renders with images |
Documentation Relationships
Объясняет, какой документ за что отвечает.
| File | Role |
|---|---|
| README.md | Human quickstart |
| AGENTS.md | Always-on Codex guidance |
| ARCHITECTURE.md | Durable project map |
| docs/runbooks | Repeatable procedures |
| .agents/skills | Project-specific AI workflows |
Unknowns
Место для честной неопределенности.
| Unknown | Why it matters | How to verify |
|---|---|---|
| Production upload path | Needed to publish media safely | inspect deploy config or server |
Это лучше, чем выдумывать. Хороший ARCHITECTURE.md не обязан знать всё. Он обязан отделять доказанное от недоказанного.
Когда создавать runbook
Runbook — это пошаговая инструкция для повторяемой операции.
architecture-update создает или обновляет runbook, если операция:
- повторяется;
- состоит из нескольких шагов;
- имеет side effects;
- требует проверки;
- может быть опасной при неправильном выполнении;
- вероятно будет снова запрошена человеком или AI.
Хорошие кандидаты:
docs/runbooks/publish-blog-post.md;docs/runbooks/deploy-production.md;docs/runbooks/rollback-release.md;docs/runbooks/import-products.md;docs/runbooks/rotate-api-key.md;docs/runbooks/restore-backup.md.
Плохие кандидаты:
- "как поменять текст в одном месте";
- "как исправили этот конкретный баг";
- "как сегодня запускали команду";
- "как сделать то, что уже очевидно из README".
Стандартный runbook должен включать:
- purpose;
- when to use;
- prerequisites;
- steps;
- verification;
- rollback/recovery, если есть риск;
- ссылку на релевантный раздел
ARCHITECTURE.md.
Когда создавать project skill
Project skill — это локальный skill внутри проекта:
.agents/skills/<skill-name>/SKILL.mdОн нужен, когда AI-агент будет часто выполнять специфичную для проекта операцию, и простой runbook недостаточен.
Порог высокий. Skill создается только если:
- workflow специфичен для этого репозитория;
- будущие AI-агенты вероятно будут повторять его;
- trigger можно ясно описать в
description; - процедура неочевидна из кода;
- runbook сам по себе не даст достаточно надежного исполнения;
- skill узкий и не пытается охватить весь проект.
Хороший пример:
.agents/skills/publish-blog-post/SKILL.mdЕсли публикация статьи требует особых frontmatter fields, image placement, slug rules, build verification и production checks, это хороший project skill.
Плохой пример:
.agents/skills/change-button/SKILL.md"Изменить кнопку" слишком общее. Но если в проекте есть строгий, повторяемый workflow для добавления action buttons через shared primitive, registry, stories и tests, тогда возможен более конкретный skill:
.agents/skills/add-design-system-action-button/SKILL.mdКак architecture-update связан с end-session
end-session — это хаб завершения сессии. Он не должен сам решать архитектурные вопросы. Его роль — вызвать правильные skills в правильном порядке.
После изменения логики порядок стал таким:
- Обновить active ExecPlan, если он есть.
- Переписать
Summarizations.mdкак компактный handoff. - Вызвать
project-diary-write. - Вызвать
architecture-update. - Только затем решать, нужно ли обновлять repo-level guidance через
create-agents-md/promote-lessons.
Это важно по двум причинам.
Во-первых, архитектурная память обновляется после того, как session summary и diary уже помогли отделить важное от шума.
Во-вторых, AGENTS.md остается последним уровнем. Его нельзя обновлять просто потому, что что-то произошло. Он меняется только если есть durable repo-level lesson или компактный указатель на новую/обновленную архитектурную память.
Как architecture-update связан с new-session
new-session — это bootstrapper. Он стартует свежую сессию и читает минимальный набор контекста.
Важно: new-session не создает ARCHITECTURE.md, runbooks или project skills. Это не его задача.
Он может читать ARCHITECTURE.md, но только если:
- файл существует;
- он релевантен запросу;
- на него ссылается
AGENTS.mdилиSummarizations.md; - задача касается cross-module, deployment, content/CMS, data model или integrations.
Также new-session не должен загружать тела всех .agents/skills/*/SKILL.md заранее. Project skills должны оставаться trigger-based. Агент читает конкретный skill, когда задача действительно совпадает с его description.
Почему важны AGENTS.override.md и цепочка инструкций
Codex project guidance не сводится к одному файлу ./AGENTS.md.
Эффективная логика:
- Codex идет от project root к текущей директории;
- в каждой директории может быть instruction file;
AGENTS.override.mdимеет приоритет надAGENTS.mdв той же директории;- fallback names могут существовать, если настроены;
- ближние инструкции могут уточнять более общие.
Поэтому architecture-update не должен blindly создавать или редактировать любой AGENTS.md. Он должен:
- предпочитать root instruction file для общей архитектурной ссылки;
- не создавать
AGENTS.override.mdдля обычных обновлений; - уважать существующий override;
- не трогать fallback-файлы, если проект явно их не использует;
- обновлять nested instruction file только если архитектурное знание относится к subtree.
Это защищает проект от неправильной записи правил в неэффективное место.
Evidence standard: доказательства важнее догадок
architecture-update должен предпочитать факты из:
- changed files;
git diff;- существующей документации;
- build/deploy/CI configs;
- package manifests;
- routes;
- entrypoints;
- schema/migration files;
- tests;
- явных пользовательских решений в текущей сессии.
Если факт не доказан, он не должен попадать в основные разделы как истина.
Правильный путь:
Unknowns
| Unknown | Why it matters | How to verify |
|---|---|---|
| Production content upload path | Needed to publish blog media safely | inspect deployment server or deploy config |
Такой подход делает файл честным. Для AI это особенно важно: если документация уверенно говорит неправду, агент будет ошибаться быстрее и увереннее.
Анти-паттерны
Анти-паттерн 1: ARCHITECTURE.md как session log
Плохо:
Today we fixed the navbar and tried three approaches.
Хорошо:
Shared navigation lives in src/components/Nav.tsx; route labels are sourced from src/config/nav.ts.
Анти-паттерн 2: runbook внутри архитектуры
Плохо:
To deploy, run step 1, step 2, step 3, step 4...
Хорошо:
Deployment procedure: see docs/runbooks/deploy-production.md.
Анти-паттерн 3: project skill для слишком общей задачи
Плохо:
.agents/skills/fix-frontend/SKILL.mdХорошо:
.agents/skills/add-design-system-action-button/SKILL.mdАнти-паттерн 4: выдуманные production facts
Плохо:
Uploads are stored in /var/www/uploads.
Если это не доказано, правильно:
| Production upload path | Required for safe media publishing | Verify server/deploy config |
Практический пример: блог
Допустим, в проекте есть блог. Во время работы агент выяснил:
- статьи лежат в
content/blog; - картинки лежат в
public/blog; - markdown парсится через
src/lib/blog.ts; - страницы генерируются как
/blog/:slug; - публикация требует build verification.
Что делает architecture-update?
В ARCHITECTURE.md
Добавляет карту:
Content / Blog / CMS Pipeline
| Concern | Local source | Runtime/production location | How it works | Verification |
|---|---|---|---|---|
| Blog posts | content/blog/*.md | /blog/:slug | Parsed by src/lib/blog.ts during build | npm run build |
| Blog images | public/blog/* | static public assets | Referenced from markdown/frontmatter | open rendered post |
В docs/runbooks/publish-blog-post.md
Если публикация статьи повторяемая, создает процедуру:
Purpose
Use this runbook when adding or updating a blog article.
Steps
- Create or edit the markdown file in
content/blog. - Validate frontmatter.
- Put images under
public/blog. - Run
npm run build. - Open
/blog/<slug>and verify rendering.
В .agents/skills/publish-blog-post/SKILL.md
Если агент будет часто сам публиковать статьи, и правила проекта достаточно специфичны, создает project skill:
name: publish-blog-post description: Use when adding or updating blog posts in this repository, including frontmatter, image placement, slug verification, and build checks. ---
Follow the project blog pipeline in ARCHITECTURE.md and the runbook in docs/runbooks/publish-blog-post.md.
В AGENTS.md
Добавляет только компактный pointer, если его еще нет:
Project Architecture
- Before content/CMS changes, read the relevant section of
ARCHITECTURE.md. - Use
$architecture-updateafter changing content pipeline behavior or reusable content publishing procedures.
Практический пример: кнопки
Если в проекте просто изменили одну кнопку, architecture-update ничего не делает.
Если выяснилось, что в проекте есть устойчивый UI workflow:
- все кнопки должны идти через
src/components/ui/Button.tsx; - действия регистрируются в
src/features/actions/registry.ts; - layout rows создаются через
ActionRow; - нужно обновлять stories/tests;
- это повторяется часто,
тогда можно добавить:
В ARCHITECTURE.md:
| If you need to change action buttons | Start here | Also check | Verify with |
|---|---|---|---|
| Add an action button | src/components/ui/Button.tsx | src/features/actions/registry.ts, stories | npm run test |
И, если AI будет часто делать это сам:
.agents/skills/add-design-system-action-button/SKILL.mdНо skill не создается просто потому, что "кнопок много". Он создается только если есть повторяемая, проектно-специфичная процедура.
Почему это долгосрочно экономит токены
Без architecture-update каждая новая сессия заново платит за discovery:
- поиск директорий;
- чтение package/config files;
- понимание routing;
- чтение deployment scripts;
- изучение content pipeline;
- восстановление решений из истории чата.
С architecture-update проект постепенно получает индекс:
ARCHITECTURE.mdговорит, куда смотреть;- runbook говорит, как выполнить операцию;
- project skill говорит AI, как надежно повторить проектный workflow;
AGENTS.mdкратко направляет агента к нужным слоям;new-sessionчитает только релевантное;end-sessionподдерживает память актуальной.
Это не убирает необходимость читать код. Но резко снижает количество бесполезного повторного исследования.
Итоговая логика skill
architecture-update можно описать как строгий маршрутизатор:
- Найти реальный project root.
- Проверить существующие memory artifacts.
- Посмотреть завершенную работу.
- Вытащить кандидаты на долговечное знание.
- Отбросить шум.
- Для каждого оставшегося факта выбрать один слой.
- Создать или обновить минимальный нужный файл.
- Проверить ссылки и пути.
- Неподтвержденное записать в
Unknowns. - Кратко отчитаться.
Главное не "писать больше документации". Главное — сохранять только ту проектную память, которая уменьшает будущую неопределенность.
Финальная формула
architecture-update нужен не для красоты markdown-файлов. Он нужен, чтобы AI-сессии перестали каждый раз начинать с археологии.
Правильная архитектурная память:
- компактна в always-on контексте;
- подробна в нужном файле;
- доказательна;
- разделяет карту, процедуры и automation;
- честно помечает unknowns;
- обновляется после значимой работы;
- по умолчанию ничего не меняет.
Именно это делает связка:
end-session -> architecture-update -> ARCHITECTURE.md / runbooks / project skills -> new-sessionОна превращает разовые открытия в долговечную проектную навигацию.