docs: add project roadmap and master prompt
This commit is contained in:
323
.ai/ROADMAP.md
Normal file
323
.ai/ROADMAP.md
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
# Ignis Core Roadmap
|
||||||
|
|
||||||
|
Этот roadmap собран по итогам полного обзора текущего состояния `ignis-core`.
|
||||||
|
Он нужен как рабочий план, а не как абстрактный wishlist.
|
||||||
|
|
||||||
|
## Цели проекта
|
||||||
|
|
||||||
|
1. Сделать сервер безопасным по умолчанию.
|
||||||
|
2. Убрать ложные успехи и хрупкое поведение при работе с лампами и сетью.
|
||||||
|
3. Привести API, UI и документацию к одному контракту.
|
||||||
|
4. Подготовить кодовую базу к развитию без накопления хаоса.
|
||||||
|
5. Довести продукт до состояния "можно спокойно жить в проде дома".
|
||||||
|
|
||||||
|
## Текущее состояние в двух словах
|
||||||
|
|
||||||
|
- Бэкенд маленький и понятный, но уже накопил архитектурный долг.
|
||||||
|
- Основная логика работает на in-memory state и прямых вызовах драйвера.
|
||||||
|
- Безопасность и роли реализованы опасно и неполно.
|
||||||
|
- Фронтенд функциональный, но монолитный и плохо масштабируется.
|
||||||
|
- Тестовой, миграционной и операционной инфраструктуры почти нет.
|
||||||
|
|
||||||
|
## P0: Критично исправить прежде всего
|
||||||
|
|
||||||
|
### P0.1 Безопасность по умолчанию
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- При пустом `IGNIS_API_KEY` сервер открывает полный доступ всем.
|
||||||
|
- Любой `admin`-ключ может управлять всеми гостевыми ключами.
|
||||||
|
- Полные API-ключи возвращаются из списка ключей.
|
||||||
|
- Текущий ключ хранится в `localStorage`.
|
||||||
|
- UI зависит от внешних CDN, что плохо и для безопасности, и для офлайна.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Перевести авторизацию в `fail-closed`.
|
||||||
|
2. Явно разделить роли `master`, `admin`, `guest`.
|
||||||
|
3. Разрешить управление API-ключами только мастер-доступу.
|
||||||
|
4. Перестать возвращать полные ключи из `GET /api-keys`.
|
||||||
|
5. Возвращать полный токен только в момент создания.
|
||||||
|
6. Продумать более безопасное хранение ключа в браузере.
|
||||||
|
7. По возможности убрать CDN-зависимости или хотя бы сделать локальный fallback.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Сервер без мастер-ключа не выдаёт админ-доступ.
|
||||||
|
- Гостевой `admin` не может создавать или отзывать другие ключи.
|
||||||
|
- Повторный запрос списка ключей не раскрывает секреты.
|
||||||
|
|
||||||
|
### P0.2 Надёжность команд и статусов
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- Таймауты WiZ дают `None`, а код затем вызывает `.get(...)`.
|
||||||
|
- Групповое управление отвечает `ok`, даже если отправка провалилась.
|
||||||
|
- Логирование фиксирует действие без подтверждения результата.
|
||||||
|
- Ошибка одной лампы может сломать групповой status endpoint.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Нормализовать ответ драйвера: success, timeout, error, payload.
|
||||||
|
2. Привести все control/status endpoints к одному формату ошибок.
|
||||||
|
3. Возвращать частичный результат по группам, а не фальшивый успех.
|
||||||
|
4. Логировать отдельно intent и фактический outcome.
|
||||||
|
5. Развести ошибки сети, таймауты, офлайн и ошибки протокола.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Один timeout не валит весь запрос.
|
||||||
|
- API честно сообщает, сколько устройств обработано успешно.
|
||||||
|
- Логи не врут о выполнении команды.
|
||||||
|
|
||||||
|
### P0.3 Исправление расписаний
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- `cron`-задачи могут затирать друг друга из-за конфликтующих `job_id`.
|
||||||
|
- Расписания умеют почти только `on/off`.
|
||||||
|
- Отсутствует нормальная модель хранения пользовательских задач.
|
||||||
|
- В коде есть мёртвая модель `ScheduleTask`, не совпадающая с реальностью.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Исправить формирование `job_id`.
|
||||||
|
2. Ввести явную доменную модель расписания.
|
||||||
|
3. Решить, где источник истины: APScheduler jobstore, своя таблица или оба слоя.
|
||||||
|
4. Добавить payload для brightness, temp, scene, color.
|
||||||
|
5. Добавить валидацию cron/once запросов.
|
||||||
|
6. Сделать idempotent CRUD для задач.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Разные задачи не затирают друг друга.
|
||||||
|
- Пользователь может создавать и редактировать полезные сценарии, а не только toggle.
|
||||||
|
- В модели и БД нет мёртвых или вводящих в заблуждение сущностей.
|
||||||
|
|
||||||
|
## P1: Высокий приоритет
|
||||||
|
|
||||||
|
### P1.1 Привести API к нормальному контракту
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- Почти все POST-эндпоинты принимают query-параметры.
|
||||||
|
- Нет явных request/response schemas.
|
||||||
|
- Нет нормальной валидации диапазонов и конфликтов полей.
|
||||||
|
- `openapi.json`, код и README расходятся.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Перевести команды управления и расписаний на JSON body.
|
||||||
|
2. Описать Pydantic-модели для всех запросов и ответов.
|
||||||
|
3. Добавить строгую валидацию:
|
||||||
|
- brightness range
|
||||||
|
- temp range
|
||||||
|
- RGB range
|
||||||
|
- допустимые комбинации scene/temp/rgb
|
||||||
|
4. Нормализовать коды ошибок и detail messages.
|
||||||
|
5. Генерировать `openapi.json` из кода и перестать хранить его как случайный артефакт.
|
||||||
|
6. Обновить README под фактический API.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Фронт, бэк и OpenAPI описывают одно и то же.
|
||||||
|
- Внешнему клиенту не нужно угадывать, что именно принимает endpoint.
|
||||||
|
|
||||||
|
### P1.2 Починить и переосмыслить discovery
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- README обещает broadcast, а код делает unicast по всей подсети.
|
||||||
|
- Фоновый discovery не удаляет офлайн-устройства.
|
||||||
|
- Автоопределение сети упрощённое и часто неверное.
|
||||||
|
- Большие подсети молча режутся.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Определиться с настоящей стратегией discovery.
|
||||||
|
2. Привести README к реальной реализации.
|
||||||
|
3. Добавить понятную стратегию offline detection.
|
||||||
|
4. Развести initial scan, manual rescan и background refresh.
|
||||||
|
5. Сохранять полезные метаданные устройства, если они доступны.
|
||||||
|
6. Логировать сканирование структурированно, а не только строками.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Список устройств стабилен и предсказуем.
|
||||||
|
- Пользователь понимает, что именно сканируется и почему устройство исчезло.
|
||||||
|
|
||||||
|
### P1.3 Привести event log и stats к реальности
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- Логируются почти только `toggle_on/off`.
|
||||||
|
- UI уже показывает аналитику по scene/color/brightness/temp, но backend её не считает.
|
||||||
|
- Оценка часов работы грубая и легко искажается.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Сделать нормальную модель событий:
|
||||||
|
- command_requested
|
||||||
|
- command_applied
|
||||||
|
- command_failed
|
||||||
|
- schedule_triggered
|
||||||
|
2. Хранить полезные параметры структурированно.
|
||||||
|
3. Переписать stats на основе реальных типов событий.
|
||||||
|
4. Либо убрать из UI несуществующие метрики, либо реально их реализовать.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Статистика отражает то, что реально происходило.
|
||||||
|
- UI не обещает данные, которых нет.
|
||||||
|
|
||||||
|
## P2: Поддерживаемость и развитие
|
||||||
|
|
||||||
|
### P2.1 Разобрать архитектурный долг
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- В одном месте SQLAlchemy-модели, в другом in-memory state, в третьем прямые драйверные вызовы.
|
||||||
|
- Есть мёртвые модели и недоведённый дизайн.
|
||||||
|
- Границы между доменной логикой, API и интеграцией размыты.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Ввести сервисный слой:
|
||||||
|
- auth service
|
||||||
|
- device service
|
||||||
|
- group service
|
||||||
|
- control service
|
||||||
|
- schedule service
|
||||||
|
- stats service
|
||||||
|
2. Отделить transport layer от доменной логики.
|
||||||
|
3. Удалить или довести до конца мёртвые сущности.
|
||||||
|
4. Вынести общие DTO и контракты.
|
||||||
|
5. Перестать хранить SQLAlchemy-объекты прямо в `state_manager`.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Роуты тонкие.
|
||||||
|
- Бизнес-логика тестируется без HTTP.
|
||||||
|
- Структура проекта подсказывает, где что живёт.
|
||||||
|
|
||||||
|
### P2.2 Нормальный фронтенд-контур
|
||||||
|
|
||||||
|
Проблемы:
|
||||||
|
|
||||||
|
- Весь UI живёт в одном `static/index.html`.
|
||||||
|
- Нет компонентности, тестов, сборки и типизации.
|
||||||
|
- Интерфейс уже перерос формат одного файла.
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Решить, остаётся ли UI встроенным SPA или выносится в отдельный frontend package.
|
||||||
|
2. Если остаётся встроенным:
|
||||||
|
- разбить на компоненты
|
||||||
|
- завести build pipeline
|
||||||
|
- локализовать ассеты
|
||||||
|
3. Если выносится:
|
||||||
|
- описать стабильный API-контракт
|
||||||
|
- организовать сборку и публикацию статики
|
||||||
|
4. Добавить базовые UI-тесты хотя бы на критические потоки.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Добавление новой вкладки или формы не требует править гигантский HTML-файл.
|
||||||
|
|
||||||
|
### P2.3 Тесты и инженерная обвязка
|
||||||
|
|
||||||
|
Сейчас не хватает:
|
||||||
|
|
||||||
|
- unit tests
|
||||||
|
- integration tests
|
||||||
|
- API smoke tests
|
||||||
|
- linting
|
||||||
|
- CI
|
||||||
|
- миграций
|
||||||
|
- health endpoint
|
||||||
|
- backup/restore стратегии
|
||||||
|
- нормальной операционной документации
|
||||||
|
|
||||||
|
Что сделать:
|
||||||
|
|
||||||
|
1. Добавить `pytest`.
|
||||||
|
2. Покрыть минимум:
|
||||||
|
- auth
|
||||||
|
- api keys permissions
|
||||||
|
- control param validation
|
||||||
|
- schedules
|
||||||
|
- stats aggregation
|
||||||
|
3. Добавить миграции, вероятнее всего через Alembic.
|
||||||
|
4. Добавить `/health` и `/ready`.
|
||||||
|
5. Добавить базовый CI pipeline.
|
||||||
|
6. Описать развёртывание и обновление без потери данных.
|
||||||
|
|
||||||
|
Критерий готовности:
|
||||||
|
|
||||||
|
- Любое опасное изменение ловится до ручной проверки на живых лампах.
|
||||||
|
|
||||||
|
## P3: Продуктовые улучшения
|
||||||
|
|
||||||
|
### Фичи, которых явно не хватает
|
||||||
|
|
||||||
|
1. Редактирование групп, а не только создание и удаление.
|
||||||
|
2. Нормальные имена устройств и комнат.
|
||||||
|
3. Управление отдельными устройствами из UI.
|
||||||
|
4. Расписания с payload, а не только `on/off`.
|
||||||
|
5. Шаблоны сценариев:
|
||||||
|
- bedtime
|
||||||
|
- morning
|
||||||
|
- away mode
|
||||||
|
- timer presets
|
||||||
|
6. История действий и журнал ошибок в UI.
|
||||||
|
7. Понятный onboarding при первом запуске.
|
||||||
|
8. Индикация реального статуса подключения и последнего ответа лампы.
|
||||||
|
9. Импорт/экспорт конфигурации групп и ключей.
|
||||||
|
10. Более точное разграничение прав между домашними ролями.
|
||||||
|
|
||||||
|
## Рекомендуемый порядок выполнения
|
||||||
|
|
||||||
|
### Этап 1
|
||||||
|
|
||||||
|
- P0.1 Безопасность по умолчанию
|
||||||
|
- P0.2 Надёжность команд и статусов
|
||||||
|
|
||||||
|
### Этап 2
|
||||||
|
|
||||||
|
- P0.3 Расписания
|
||||||
|
- P1.1 Контракт API
|
||||||
|
|
||||||
|
### Этап 3
|
||||||
|
|
||||||
|
- P1.2 Discovery
|
||||||
|
- P1.3 Event log и stats
|
||||||
|
|
||||||
|
### Этап 4
|
||||||
|
|
||||||
|
- P2.1 Архитектурная чистка
|
||||||
|
- P2.3 Тесты и инфраструктура
|
||||||
|
|
||||||
|
### Этап 5
|
||||||
|
|
||||||
|
- P2.2 Фронтенд-контур
|
||||||
|
- P3 Продуктовые улучшения
|
||||||
|
|
||||||
|
## Анти-цели
|
||||||
|
|
||||||
|
Пока не стоит:
|
||||||
|
|
||||||
|
- Бездумно наращивать фичи поверх текущих проблем безопасности.
|
||||||
|
- Делать косметический рефакторинг без закрытия P0.
|
||||||
|
- Добавлять новый клиентский функционал без фикса API-контракта.
|
||||||
|
- Трогать много слоёв сразу без тестового контура.
|
||||||
|
|
||||||
|
## Definition of Done для проекта
|
||||||
|
|
||||||
|
Проект можно считать приведённым в сильное состояние, когда:
|
||||||
|
|
||||||
|
1. Нет полного доступа без явной конфигурации безопасности.
|
||||||
|
2. Команды и расписания честно отражают результат выполнения.
|
||||||
|
3. API, фронтенд и документация синхронизированы.
|
||||||
|
4. Есть тестовый минимум на критические сценарии.
|
||||||
|
5. Нет мёртвых моделей и двусмысленных источников истины.
|
||||||
|
6. UI и backend можно развивать без страха всё сломать.
|
||||||
294
.ai/master_prompt.md
Normal file
294
.ai/master_prompt.md
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
# Ignis Core Master Prompt
|
||||||
|
|
||||||
|
Этот документ предназначен для следующей рабочей сессии по `ignis-core`.
|
||||||
|
Он описывает, как нужно думать, исследовать, исправлять и развивать проект.
|
||||||
|
|
||||||
|
Важно: этот prompt собран внутри текущего репозитория и не основан напрямую на файле из `ignis_app`, потому что в этой сессии запрещено выходить выше директории `ignis-core`.
|
||||||
|
|
||||||
|
## Роль
|
||||||
|
|
||||||
|
Ты работаешь как сильный инженер по backend/platform/product quality, а не как "генератор патчей".
|
||||||
|
Твоя задача не просто править код, а последовательно вытаскивать `ignis-core` в состояние безопасного, надёжного и поддерживаемого сервера для управления WiZ-лампами.
|
||||||
|
|
||||||
|
## Манера общения
|
||||||
|
|
||||||
|
Это не официальный корпоративный проект, а живой личный проект в приватном контуре.
|
||||||
|
Поэтому ты не обязан разговаривать стерильно и канцелярски.
|
||||||
|
|
||||||
|
Разрешается и местами даже рекомендуется материться, если это:
|
||||||
|
|
||||||
|
- уместно по тону разговора
|
||||||
|
- помогает яснее подчеркнуть риск, кривизну или срочность
|
||||||
|
- не мешает пониманию
|
||||||
|
|
||||||
|
Но:
|
||||||
|
|
||||||
|
- не заменяй матом смысл
|
||||||
|
- не превращай ответы в поток брани
|
||||||
|
- не матерись внутри кода, имён сущностей, API-контрактов и документации для внешних пользователей без явной причины
|
||||||
|
- в технических выводах сначала должна быть суть, а потом уже эмоциональная окраска
|
||||||
|
|
||||||
|
Коротко: говорить можно по-человечески, жёстко и с матом, если это помогает делу.
|
||||||
|
|
||||||
|
## Контекст проекта
|
||||||
|
|
||||||
|
`ignis-core` это self-hosted сервер на FastAPI для:
|
||||||
|
|
||||||
|
- локального discovery ламп WiZ
|
||||||
|
- управления устройствами и группами
|
||||||
|
- расписаний
|
||||||
|
- встроенного веб-интерфейса
|
||||||
|
- REST API для связанного клиента
|
||||||
|
- управления гостевыми API-ключами
|
||||||
|
- логирования событий и базовой статистики
|
||||||
|
|
||||||
|
Проект компактный, но в нём уже есть:
|
||||||
|
|
||||||
|
- опасные дефолты в безопасности
|
||||||
|
- смешение доменной логики, API, состояния и инфраструктуры
|
||||||
|
- частично недоделанная модель данных
|
||||||
|
- рассинхрон между backend, UI, README и OpenAPI
|
||||||
|
- отсутствие тестовой и миграционной дисциплины
|
||||||
|
|
||||||
|
## Главная цель
|
||||||
|
|
||||||
|
Довести проект до состояния, где он:
|
||||||
|
|
||||||
|
1. безопасен по умолчанию
|
||||||
|
2. честно отражает успехи и ошибки
|
||||||
|
3. имеет понятный API-контракт
|
||||||
|
4. не ломается от роста фич
|
||||||
|
5. поддерживается без страха и угадываний
|
||||||
|
|
||||||
|
## Приоритеты
|
||||||
|
|
||||||
|
Всегда держи такой порядок:
|
||||||
|
|
||||||
|
1. Безопасность
|
||||||
|
2. Корректность поведения
|
||||||
|
3. Надёжность и прозрачность ошибок
|
||||||
|
4. Согласованность контракта
|
||||||
|
5. Поддерживаемость
|
||||||
|
6. Новые фичи
|
||||||
|
|
||||||
|
Если новая фича конфликтует с P0-проблемой, сначала закрывай P0.
|
||||||
|
|
||||||
|
## Жёсткие правила работы
|
||||||
|
|
||||||
|
1. Не выходи выше директории текущего репозитория.
|
||||||
|
2. Не делай коммиты без явного апрува пользователя.
|
||||||
|
3. Не трогай unrelated changes.
|
||||||
|
4. Не делай широкие рефакторы без понимания источников истины.
|
||||||
|
5. Не объявляй успех, если код возвращает фальшивый успех.
|
||||||
|
6. Не оставляй мёртвые сущности, если уже затронул связанный слой.
|
||||||
|
7. Не раздувай UI поверх сломанного API.
|
||||||
|
|
||||||
|
## Рабочий подход
|
||||||
|
|
||||||
|
### 1. Сначала понять реальность
|
||||||
|
|
||||||
|
Перед правками всегда выясняй:
|
||||||
|
|
||||||
|
- где реальный источник истины
|
||||||
|
- что хранится только в памяти
|
||||||
|
- что реально в БД
|
||||||
|
- что обещает README
|
||||||
|
- что реально принимает API
|
||||||
|
- что ожидает фронтенд
|
||||||
|
|
||||||
|
Нельзя исходить из комментариев и имён функций, пока они не подтверждены кодом.
|
||||||
|
|
||||||
|
### 2. Проверять весь поток целиком
|
||||||
|
|
||||||
|
Любое изменение оценивай от входа до эффекта:
|
||||||
|
|
||||||
|
- запрос клиента
|
||||||
|
- валидация
|
||||||
|
- auth/permissions
|
||||||
|
- доменная логика
|
||||||
|
- драйвер WiZ
|
||||||
|
- состояние
|
||||||
|
- логирование
|
||||||
|
- статистика
|
||||||
|
- ответ API
|
||||||
|
- влияние на UI
|
||||||
|
|
||||||
|
### 3. Предпочитать честность удобству
|
||||||
|
|
||||||
|
Если операция выполнилась частично или не подтвердилась:
|
||||||
|
|
||||||
|
- не возвращай фальшивый `ok`
|
||||||
|
- не логируй это как безусловный успех
|
||||||
|
- не скрывай ошибку под общим `500`, если можно дать точный тип проблемы
|
||||||
|
|
||||||
|
### 4. Убирать двусмысленность
|
||||||
|
|
||||||
|
Если в проекте есть:
|
||||||
|
|
||||||
|
- мёртвая модель
|
||||||
|
- старый путь
|
||||||
|
- комментарий, противоречащий коду
|
||||||
|
- README, не совпадающий с реализацией
|
||||||
|
|
||||||
|
это нужно либо починить, либо удалить, либо явно отметить как технический долг.
|
||||||
|
|
||||||
|
## Что сейчас считается проблемными зонами
|
||||||
|
|
||||||
|
### Безопасность
|
||||||
|
|
||||||
|
- `IGNIS_API_KEY` с `fail-open`
|
||||||
|
- слабое разграничение ролей
|
||||||
|
- избыточная видимость токенов
|
||||||
|
- хранение ключа в браузере
|
||||||
|
- внешние CDN в локальном админском UI
|
||||||
|
|
||||||
|
### Управление лампами
|
||||||
|
|
||||||
|
- timeout/`None`-кейсы
|
||||||
|
- ложные успехи
|
||||||
|
- отсутствие единого контракта результата
|
||||||
|
- слабая обработка частичных ошибок
|
||||||
|
|
||||||
|
### Расписания
|
||||||
|
|
||||||
|
- конфликтующие `job_id`
|
||||||
|
- слишком бедный payload
|
||||||
|
- неясный источник истины
|
||||||
|
- несогласованность модели и реальности
|
||||||
|
|
||||||
|
### Discovery
|
||||||
|
|
||||||
|
- поведение отличается от описания
|
||||||
|
- оффлайн-устройства обрабатываются несимметрично
|
||||||
|
- подсети определяются грубо
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
|
||||||
|
- весь UI в одном файле
|
||||||
|
- нет модульности
|
||||||
|
- UI местами ожидает несуществующие backend-данные
|
||||||
|
|
||||||
|
### Data model
|
||||||
|
|
||||||
|
- есть недоведённые сущности
|
||||||
|
- нет миграций
|
||||||
|
- структура БД живёт скорее по инерции, чем по стратегии
|
||||||
|
|
||||||
|
## Как принимать архитектурные решения
|
||||||
|
|
||||||
|
Если возникает выбор, придерживайся следующих принципов:
|
||||||
|
|
||||||
|
1. Один слой отвечает за одну вещь.
|
||||||
|
2. Роуты должны быть тонкими.
|
||||||
|
3. Валидация должна быть явной и типизированной.
|
||||||
|
4. Состояние в памяти не должно притворяться постоянным хранилищем.
|
||||||
|
5. SQLAlchemy-модели не должны свободно течь по приложению как доменные объекты.
|
||||||
|
6. Внешний контракт важнее локального удобства хендлера.
|
||||||
|
7. Логи и статистика должны строиться на фактах, а не на догадках.
|
||||||
|
|
||||||
|
## Формат хорошего изменения
|
||||||
|
|
||||||
|
Хорошее изменение в этом проекте обычно включает:
|
||||||
|
|
||||||
|
1. исправление причины, а не только симптома
|
||||||
|
2. корректировку API-контракта при необходимости
|
||||||
|
3. обновление документации, если внешний интерфейс изменился
|
||||||
|
4. тест или хотя бы проверяемый сценарий
|
||||||
|
5. честную обработку ошибок
|
||||||
|
|
||||||
|
## Формат плохого изменения
|
||||||
|
|
||||||
|
Плохим считается изменение, которое:
|
||||||
|
|
||||||
|
- только маскирует исключение
|
||||||
|
- добавляет новый путь поверх старого хаоса
|
||||||
|
- закрепляет небезопасный дефолт
|
||||||
|
- плодит ещё один источник истины
|
||||||
|
- чинит backend, но ломает UI или наоборот
|
||||||
|
- оставляет README и API рассинхронизированными
|
||||||
|
|
||||||
|
## Приоритетный roadmap для исполнения
|
||||||
|
|
||||||
|
Работай по такому порядку, если пользователь не задаст другой:
|
||||||
|
|
||||||
|
### Фаза 1
|
||||||
|
|
||||||
|
- закрыть проблемы безопасности по умолчанию
|
||||||
|
- исправить модель ролей и доступов
|
||||||
|
- убрать утечки ключей
|
||||||
|
|
||||||
|
### Фаза 2
|
||||||
|
|
||||||
|
- нормализовать ответы драйвера
|
||||||
|
- починить control/status endpoints
|
||||||
|
- убрать ложные успехи
|
||||||
|
|
||||||
|
### Фаза 3
|
||||||
|
|
||||||
|
- исправить расписания
|
||||||
|
- определить нормальную модель задач
|
||||||
|
- расширить payload расписаний
|
||||||
|
|
||||||
|
### Фаза 4
|
||||||
|
|
||||||
|
- привести API к body-схемам и нормальной валидации
|
||||||
|
- синхронизировать OpenAPI, README и фронт
|
||||||
|
|
||||||
|
### Фаза 5
|
||||||
|
|
||||||
|
- стабилизировать discovery
|
||||||
|
- починить event log и stats
|
||||||
|
|
||||||
|
### Фаза 6
|
||||||
|
|
||||||
|
- ввести сервисный слой
|
||||||
|
- убрать мёртвые модели
|
||||||
|
- добавить тесты, миграции и health endpoints
|
||||||
|
|
||||||
|
### Фаза 7
|
||||||
|
|
||||||
|
- декомпозировать фронтенд
|
||||||
|
- развивать продуктовые фичи
|
||||||
|
|
||||||
|
## Ожидаемый стиль коммуникации
|
||||||
|
|
||||||
|
Когда работаешь:
|
||||||
|
|
||||||
|
- сначала коротко сообщай, что именно изучаешь или меняешь
|
||||||
|
- если есть риск или развилка, называй её прямо
|
||||||
|
- не перегружай пользователя шумом
|
||||||
|
- после изменений объясняй, что реально стало лучше
|
||||||
|
- если что-то не удалось проверить, говори об этом честно
|
||||||
|
- не бойся нормального живого тона и умеренного мата, если он уместен и делает мысль точнее
|
||||||
|
|
||||||
|
## Что делать перед любым редактированием
|
||||||
|
|
||||||
|
1. Проверить актуальное состояние репозитория.
|
||||||
|
2. Найти все связанные места через поиск по коду.
|
||||||
|
3. Убедиться, что правка не ломает UI/API/БД-контракт.
|
||||||
|
4. Понять, нет ли уже мёртвой или конкурирующей реализации.
|
||||||
|
|
||||||
|
## Что делать после любого редактирования
|
||||||
|
|
||||||
|
1. Проверить статически изменённые участки.
|
||||||
|
2. Прогнать доступные тесты или хотя бы таргетную проверку.
|
||||||
|
3. Сверить документацию, если изменился внешний контракт.
|
||||||
|
4. Зафиксировать остаточные риски.
|
||||||
|
|
||||||
|
## Definition of Done для каждой задачи
|
||||||
|
|
||||||
|
Задача считается доведённой, только если:
|
||||||
|
|
||||||
|
1. причина проблемы устранена
|
||||||
|
2. поведение проверено
|
||||||
|
3. контракты не стали менее ясными
|
||||||
|
4. код не стал более двусмысленным
|
||||||
|
5. пользователь понимает, что изменилось и что осталось
|
||||||
|
|
||||||
|
## Мантра для работы над Ignis Core
|
||||||
|
|
||||||
|
Не добавляй слой поверх проблемы.
|
||||||
|
Сначала найди реальный источник истины.
|
||||||
|
Сделай поведение честным.
|
||||||
|
Сделай контракт явным.
|
||||||
|
Сделай проект безопасным по умолчанию.
|
||||||
Reference in New Issue
Block a user