8.1 KiB
8.1 KiB
arch-05. Правила разработки модулей отдельными агентами
Термины — в
arch-00-glossary.md. Настоящий документ описывает процесс разработки и не переопределяет архитектуру. Иерархия приоритета — вREADME.md, раздел «Разрешение конфликтов».
Цель
Этот документ задает единый процесс разработки, чтобы отдельные агенты создавали совместимые части приложения без расхождения архитектуры.
Общие правила
- Каждый агент работает только в границах назначенного модуля.
- Перед разработкой агент читает
README.md, архитектурные документы и профильный документ назначенного модуля. - Любое изменение публичного API сопровождается обновлением OpenAPI.
- Любое изменение структуры данных сопровождается миграцией.
- Все бизнес-параметры — в таблице
app_settings; infra и секреты — в.env. - Нельзя hardcode-ить телефоны, лимиты, тексты, mime types, feature flags и параметры Битрикс24.
- Модули, принимающие пользовательский ввод, должны учитывать rate limits и security/safety проверки.
Правила базы данных
- Перечень таблиц, полей, индексов и миграций определяет модуль-владелец (
database,api-backend,bitrix-sync,message-safety,bitrix-local-app), а не arch-*. - Архитектура фиксирует разделение схем и общие подходы к ведению баз данных, которые должны соблюдаться при проработке модулей.
- У каждой основной прикладной сущности должен быть
record_status. Базовые статусы:A— active,D— deleted. - Физическое удаление строк прикладных сущностей запрещено. Если нужно удалить сущность, сервис меняет
record_statusсAнаD. - При смене статуса на
Dсервис обязан заполнитьstatus_changed_atиstatus_change_reason. - Все сервисы при чтении бизнес-данных по умолчанию запрашивают только
record_status = 'A'. - Исключения допускаются только для аудита, админки, технического восстановления и миграций.
- Прикладные сущности, имеют
id,created_at,updated_at,updater_user_id. - Системные таблицы (
app_settings,text_resources,popular_questions,sync_queue, audit, справочники) могут использоватьuser_id = NULLили отдельное полеactor_type— по спецификации модуляdatabase. - Для строковых enum из arch-00 (
Dialog.status,Message.safety_status,Message.delivery_status,sender_type,scan_statusи т.п.) справочник sequence не обязателен: значения фиксированы контрактом API. - Для больших/изменяемых списков (типы документов post-MVP, причины, классификаторы UI) — справочники с ID (sequence) и расшифровкой.
- Для часто используемых фильтров добавляются индексы.
- Миграции не должны удалять данные без отдельного согласования.
- Все юзеры должны иметь ИД, которое указывается в
updater_user_idкоторое они меняют.
API
Правила:
- endpoint naming должен следовать
arch-02-api-contracts.md; - response schema не должна раскрывать внутренние поля;
- ошибки возвращаются в едином формате;
- для пользовательских данных всегда используется текущий user context из JWT;
- frontend не передает
client_profile_idдля доступа к своим данным; - профиль в MVP не редактируется через
PATCH /me; - сообщения оператора должны приходить в frontend через realtime или polling fallback.
Логирование и OTP
Каждый модуль должен:
- использовать общий формат JSON-логов;
- добавлять
module,event,request_id,trace_id; - для
api-backendдобавлятьux_session_idв JSON-логи, если передан заголовокX-Ux-Session-Id; - не логировать access token, refresh token, raw OTP, документы, полные PII;
- хранить факт отправки OTP через
provider_message_id,sent_at,destination_masked,otp_hash, попытки и итог проверки.
Raw OTP запрещено хранить в открытом виде: это временный секрет. Доказательство отправки и проверки строится на аудите, delivery id провайдера и hash-проверке.
Тесты
Минимум для каждого модуля:
- happy path;
- ошибки авторизации и доступа;
- rate limits, если модуль принимает пользовательский ввод;
- soft delete и фильтрация
record_status = 'A', если модуль работает с БД; - idempotency, если операция может повториться;
- отсутствие секретов и PII в логах.
Дополнительно для модулей с async/worker:
- идемпотентность обработки задач очереди;
- поведение при повторной доставке webhook;
- таймауты и retry/backoff.
Definition of Done
Модуль считается готовым, если:
- реализованы сценарии из задачи;
- обновлен
{service}/openapi.yaml, если менялся HTTP API; - обновлены каталог ошибок в
arch-02и contract tests, если менялась публичная или internal HTTP-семантика; - созданы миграции, если менялась БД;
- обновлены seed
app_settingsи.env.example, если добавлялись настройки, service tokens, лимиты или feature flags; - добавлены тесты;
- сервис запускается в Docker Compose;
- все изменяемые параметры вынесены из кода;
- логи содержат
request_id,trace_idиux_session_id(если передан в запросе); - нет секретов, raw OTP и PII в логах;
- soft delete соблюден;
- агент указал, какие документы архитектуры были затронуты.
Правила изменения архитектуры
Если агент видит, что текущая архитектура мешает задаче, он должен:
- описать проблему;
- предложить минимальное изменение;
- указать затронутые документы;
- не делать широкий рефакторинг без подтверждения.