Назад в блог
Codex Skills

Controlled Skill Routing

Архитектура обслуживания Codex skills для reusable engineering lessons

Family updater routing, project-noise rejection и controlled agent memory

AI coding workflow article для durable software engineering automation
Codex skill routing and agent memory architecture
Тема$update-all
ФокусManual Family Routing
СтатусACTIVE / CONTROLLED
Разбор

Обзор

Сводка reusable lesson routing

Мы построили небольшой механизм обслуживания skills для Codex: переносимые уроки из реальной работы можно продвигать в глобальные инструкции, не превращая их в проектные заметки.

Центральный элемент - $update-all. Он не должен хранить domain knowledge сам по себе. Его задача - анализировать завершённую conversation или project session, находить reusable lessons и маршрутизировать их к правильному family updater skill. Затем каждый family updater сам решает, нужно ли что-то менять.

Это важно, потому что active project work часто даёт смесь разных типов knowledge. Без routing layer всё это легко смешивается. Цель $update-all - предотвратить это: помогать Codex учиться на повторяющейся работе, сохраняя global skills clean, reusable and safe.

  • реальный reusable failure mode
  • stack-specific workflow improvement
  • project-only implementation detail
  • private business rule
  • one-off workaround
  • existing lesson already covered well enough

The core rule

Default to no changes

Главное правило: по умолчанию ничего не менять. $update-all не должен обновлять skills только потому, что работа завершилась. Обновление оправдано лишь тогда, когда сессия дала урок, который с высокой вероятностью поможет будущим несвязанным проектам.

Когда после фильтра ничего не остаётся, $update-all должен явно сообщить, что updater не выбран и файлы не изменены.

  • project-specific implementation details
  • company-specific business logic
  • private URLs, credentials, tokens, domains or payloads
  • isolated hacks that do not generalize
  • cosmetic wording preferences
  • duplicate lessons already covered by existing skills

Family updater skills

Durable ownership model

Вместо одного giant global memory skill используются отдельные family updater skills. Каждый владеет широкой технической областью и следует паттерну $n8n-skill-update.

Текущие registered updater families включают:

  • $n8n-skill-update
  • $amocrm-update
  • $frontend-skill-update
  • $react-next-skill-update
  • $astro-static-site-skill-update
  • $django-skill-update
  • $database-skill-update
  • $deployment-skill-update
  • $docker-nginx-skill-update
  • $webhook-integration-skill-update
  • $security-auth-skill-update
  • $browser-qa-skill-update
  • $document-pdf-skill-update
  • $ios-builder

Registry boundary

Broad maintainers only

В registry должны попадать только broad family updater or maintainer skills. Focused subskills остаются внутри своих families и не добавляются в global registry.

Например, browser-qa-localhost, deployment-vps-systemd, static-site-seo или vite-react-build - полезные focused skills, но они должны referenced by their family updater, not by $update-all directly.

How routing works

Candidate lesson classification flow

$update-all сначала анализирует завершённую работу и извлекает candidate lessons. Затем каждый surviving lesson отправляется самому специфичному family updater.

Примеры маршрутизации:

  • MongoDB, MySQL, SQL migrations, query integrity -> $database-skill-update
  • React, Next.js, Vite, TypeScript build behavior -> $react-next-skill-update
  • general UI layout, responsive behavior, visual polish -> $frontend-skill-update
  • browser screenshots, Playwright checks, console logs -> $browser-qa-skill-update
  • VPS rollout, systemd, Nginx, production smoke checks -> $deployment-skill-update
  • Docker Compose, Nginx proxying, TLS/container topology -> $docker-nginx-skill-update
  • webhooks, provider callbacks, payload normalization -> $webhook-integration-skill-update
  • tokens, auth, signatures, secrets, CORS/CSRF -> $security-auth-skill-update

Specific ownership

Specific beats broad

Specific ownership beats broad ownership. React/Vite build lesson должен идти в $react-next-skill-update, а не в более общий $frontend-skill-update. Docker/Nginx proxy lesson должен идти в $docker-nginx-skill-update, а не в broader deployment updater.

Multiple updaters можно использовать только когда lessons genuinely independent. One lesson should not be duplicated across several families.

Inside a family updater

Updater decision model

Каждый family updater следует одной базовой decision model:

  • no update needed
  • update one existing skill
  • create one new focused subskill
  • update itself if its family map or routing rules changed

Updater ownership

$update-all только маршрутизирует

Updater должен предпочитать update existing skill. Он создаёт new focused subskill только когда lesson narrow, recurring, reusable and not already covered.

Например, если сессия дала реальный reusable MongoDB lesson, $update-all должен route it to $database-skill-update. Затем database updater решает: ничего не делать, обновить existing database skill или создать focused skill вроде database-mongodb.

$update-all сам не должен создавать database-mongodb. Он только routes the lesson to the right owner.

Unowned stack triage

Handling new reusable domains

Мы добавили explicit logic для новых stacks or tools, которые не названы в registry.

Ключевое правило: new stack is not automatically a new family. Сначала $update-all проверяет, принадлежит ли lesson существующей broad family.

  • MongoDB belongs under database
  • S3 or object storage often belongs under deployment
  • image/media rendering often belongs under frontend
  • Stripe callbacks often belong under webhook integration, with security only if there is an independent signature/auth lesson

Unowned family reporting

No silent updater creation

Если stack был только небольшим implementation detail и не дал reusable lesson, update не должен происходить.

Если stack дал reusable lesson, но никакая existing family clearly owns it, $update-all не должен silently create a new updater. Он должен report the unowned lesson and recommend a candidate updater name.

Skill creator integration

Family updater registration rules

Мы также обновили $skill-creator, чтобы будущие family updater skills регистрировались корректно.

Когда Codex создаёт или переименовывает skill, whose primary job is maintaining a named family over time, $skill-creator должен проверить $update-all и добавить одну compact registry entry.

Он должен регистрировать только skills, которые являются:

  • family updater or maintainer skills
  • durable across future projects
  • distinct from existing updater families
  • capable of choosing between no update, updating one existing skill, creating one focused subskill, or refreshing their own family map

What not to register

Implementation skills stay outside registry

$skill-creator не должен регистрировать normal implementation skills, one-off project skills, focused subskills inside a family или skills, которые merely mention update, upgrade, migration or generation but do not maintain a family.

Это значит, что если позже появится new durable area вроде Acumatica ERP, future $acumatica-skill-update можно cleanly add to $update-all. Но обычный Acumatica implementation helper не должен попадать в registry.

Audit results

Global skill registry verification

После active work мы audited global skills directory, чтобы проверить, корректно ли работает $update-all.

Важный результат: $update-all не зарегистрировал focused subskills или project skills. Его registry по-прежнему содержал только broad updater/maintainer skills.

Были reviewed several new focused skills:

  • browser-qa-console-logs
  • browser-qa-localhost
  • deployment-vps-systemd
  • static-site-seo
  • vite-react-build
  • ios-list-thread-details

Audit cleanup

Project-shaped wording removed

Большинство focused skills были cleanly generalized. Они описывали reusable workflows, а не private project details.

Главная найденная проблема была в iOS family. $ios-builder содержал phrase For this workspace specifically, из-за чего global updater выглядел привязанным к одному workspace. Мы исправили wording и generalized surrounding section.

Также мы softened project-shaped wording в ios-list-thread-details, заменив узкие фразы вроде CRM-like dialogs, React + Tauri + WebView и dialog switch на более broad terms: contact-heavy apps, hybrid WebView apps, thread switching и reusable mobile pane patterns.

  • static-site-seo теперь использует more neutral static-export examples
  • vite-react-build теперь использует /old-subpath/ and /legacy-prefix/ вместо project-shaped /design/ example

Current status

Controlled learning loop state

Архитектура сейчас в хорошем состоянии.

$update-all работает как manual command. Он не должен запускаться автоматически в конце каждой сессии. Пользователь вызывает его явно, когда хочет, чтобы Codex проанализировал завершённую работу и решил, justified ли any global skill updates.

Текущая модель:

  • user manually calls $update-all
  • $update-all analyzes the session
  • weak or project-only lessons are rejected
  • reusable lessons are routed to the right family updater
  • family updaters decide whether to change anything
  • focused subskills stay inside their family, not in the global registry
  • new family updaters require explicit user confirmation
  • useful patterns can be preserved, but project details do not leak into global skills by default
UPDATE_ALL_ROUTING.TXT
analyze completed session
extract reusable lessons
reject project-only noise
route each survivor to the most specific family updater
create no new family without explicit confirmation
report result without silent family creation