diff --git a/AGENTS.md b/AGENTS.md
index c78fbbd..77b13ff 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -223,3 +223,15 @@ docker logs aegisone-app --tail 10
- Следуй существующему стилю кода
- Удаляй неиспользуемый код при изменениях
- Не добавляй лишних зависимостей без необходимости
+
+---
+
+## 11. Стили UI (сервисный портал)
+
+- **Единый гайд:** `py_service/SERVICE_STYLE_GUIDE.md` — читать перед работой с фронтендом
+- **Нельзя** использовать `confirm()`, `alert()`, `prompt()` — только `showNotification()` и кастомные модалки
+- **Удаление:** простая модалка (Variant A), кнопки: **Действие** (слева) → **Отмена** (справа)
+- **Иконки:** `✕` = удалить, `✎` = редактировать, `+` = создать
+- **Модалки:** `.modal-overlay` + `.modal`, открытие через `classList.add('open')`
+- **Структура страницы:** `card` > `card-header` > `filter-bar` > `table-wrap` > `table`
+- **CSS классы кнопок:** `.btn-primary` (создать), `.btn-secondary` (редактировать), `.btn-danger` (удалить), `.btn-success` (выполнено)
diff --git a/max_bot/version.txt b/max_bot/version.txt
index fe4e75f..7b378be 100644
--- a/max_bot/version.txt
+++ b/max_bot/version.txt
@@ -1 +1 @@
-1.8.3
\ No newline at end of file
+1.8.4
\ No newline at end of file
diff --git a/py_service/CHANGELOG.md b/py_service/CHANGELOG.md
index bb95409..d100e60 100644
--- a/py_service/CHANGELOG.md
+++ b/py_service/CHANGELOG.md
@@ -1,5 +1,22 @@
# Changelog — AegisOne Service Portal
+## 1.8.4 (02.06.2026)
+### Новые функции
+- **SERVICE_STYLE_GUIDE.md:** единый гайд стилей сервисного портала
+- **AGENTS.md (раздел 11):** правила стилей UI — см. SERVICE_STYLE_GUIDE.md
+- **CSS `.modal-actions`:** общий класс для кнопок в модалках
+
+### Исправления
+- **bot_dialogues.html:** скрыт `main-header` (дублирующий заголовок с датой)
+- **bot_kb.html:** замена кастомных классов на `.modal-overlay`/`.modal`, `confirm()` → кастомная модалка, иконки ✎/✕
+- **bot_unknown.html:** `.modal-box` → `.modal`, `confirm()` → кастомная модалка, иконки ✎/✕
+- **bot_consent.html:** `confirm()` → кастомная модалка удаления пользователя
+- **bot_test.html:** `confirm()` → кастомная модалка очистки тестовых данных
+- **charts.html:** `prompt()` → кастомная модалка ввода имени графика, `confirm()` → кастомная модалка удаления
+- **role_settings.html:** `alert()` → `showNotification()`
+- **10 простых страниц:** blog, cases, coefficients, customers, formulas, ideas, objects, questionnaire_config, tasks, users — `confirm()` → кастомные модалки с уникальными ID
+- **migrations_runner.py:** split SQL на `;` для совместимости с asyncpg
+
## 1.8.3 (02.06.2026)
### Новые функции
- **Docstrings:** добавлены docstrings и комментарии по AGENTS.md ко всем ключевым Python-файлам
diff --git a/py_service/SERVICE_STYLE_GUIDE.md b/py_service/SERVICE_STYLE_GUIDE.md
new file mode 100644
index 0000000..4acac07
--- /dev/null
+++ b/py_service/SERVICE_STYLE_GUIDE.md
@@ -0,0 +1,230 @@
+# Сервисный портал AegisOne — Единый стиль
+
+> Этот документ ОБЯЗАН прочитать каждый AI-агент перед изменением шаблонов/CSS сервисного портала.
+
+---
+
+## 1. Структура страницы
+
+Каждая страница наследует `page.html` и реализует блок `page_content`.
+
+### Порядок элементов в правой части (main):
+
+```
+page.html main-header:
+ left: h1 (заголовок) + breadcrumb
+ right: page_actions block + дата {{ now }}
+
+page_content:
+ 1. div.card — основной контент
+ ├── div.card-header — заголовок + кнопка действия
+ ├── div.filter-bar — фильтры (если нужны)
+ └── div.table-wrap > table — таблица данных
+
+ 2. div.modal-overlay#modal-xxx — модалка создания/редактирования
+ 3. div.modal-overlay#confirm-delete-xxx — модалка подтверждения удаления
+```
+
+### Card Header:
+
+```html
+
+```
+
+---
+
+## 2. Модалки
+
+### Единые CSS-классы
+
+| Класс | Назначение |
+|-------|-----------|
+| `.modal-overlay` | Затемнённый фон (position: fixed, z-index: 200) |
+| `.modal-overlay.open` | Показать модалку (display: flex) |
+| `.modal` | Контейнер модалки (фон, рамка, скругление) |
+| `.modal-close` | Кнопка закрытия (✕) в правом верхнем углу |
+| `.form-actions` | Блок кнопок внизу модалки (display: flex, gap: 10px) |
+
+### Открытие/закрытие
+
+```javascript
+// Открыть
+document.getElementById('modal-xxx').classList.add('open');
+
+// Закрыть
+document.getElementById('modal-xxx').classList.remove('open');
+
+// Или изнутри кнопки
+this.closest('.modal-overlay').classList.remove('open');
+```
+
+**ЗАПРЕЩЕНО:** использовать `style.display = 'flex'` / `style.display = 'none'`
+
+### Модалка создания/редактирования (стандарт)
+
+```html
+
+```
+
+### Модалка подтверждения удаления (единый шаблон)
+
+**ЗАПРЕЩЕНЫ:** `confirm()`, `alert()`, `prompt()` — только кастомные модалки!
+
+```html
+
+
+
Удалить [объект]?
+
+ будет удалён навсегда.
+ Это действие нельзя отменить.
+
+
+
+
+
+
+
+```
+
+### Порядок кнопок в модалках
+
+```
+[ Действие (btn-danger / btn-primary) ] [ Отмена (btn) ]
+ слева справа
+```
+
+---
+
+## 3. Кнопки
+
+### Иконки
+
+| Иконка | Назначение | CSS-класс |
+|--------|-----------|-----------|
+| `+` | Создание (перед текстом) | `btn btn-primary btn-sm` |
+| `✎` | Редактирование | `btn btn-secondary btn-sm` |
+| `✕` | Удаление | `btn btn-danger btn-sm` |
+| `✓` | Завершение/включение | `btn btn-success btn-sm` |
+| `🗑` | Удаление (только в карточках) | `btn btn-danger btn-sm` |
+
+### CSS-классы кнопок
+
+| Класс | Назначение |
+|-------|-----------|
+| `.btn` | Базовая кнопка |
+| `.btn-primary` | Основное действие (синий) |
+| `.btn-secondary` | Вторичное действие (серый) |
+| `.btn-danger` | Удаление/опасное действие (красный) |
+| `.btn-success` | Успех/завершение (зелёный) |
+| `.btn-warning` | Предупреждение (жёлтый) |
+| `.btn-sm` | Маленький размер |
+
+### Таблицы — колонка действий
+
+```html
+ |
+
+
+
+ |
+```
+
+---
+
+## 4. Уведомления
+
+### Показ уведомлений
+
+```javascript
+showNotification('Текст уведомления', 'success'); // зелёное
+showNotification('Текст уведомления', 'error'); // красное
+showNotification('Текст уведомления', 'warning'); // жёлтое
+showNotification('Текст уведомления', 'info'); // синее
+```
+
+**ЗАПРЕЩЕНЫ:** `alert()`, `prompt()`, `confirm()` — только `showNotification()` и кастомные модалки!
+
+---
+
+## 5. Фильтры
+
+```html
+
+
+
+
+```
+
+---
+
+## 6. Таблицы
+
+```html
+
+
+
+
+ | Колонка 1 |
+ Колонка 2 |
+ |
+
+
+
+ {% for item in items %}
+
+ | {{ item.field }} |
+ {{ item.field2 }} |
+
+
+
+ |
+
+ {% endfor %}
+
+
+
+```
+
+---
+
+## 7. Страницы с JS-рендерингом
+
+Для страниц, где данные загружаются через `fetch()` (bot_consent, bot_dialogues, bot_kb, bot_tickets, bot_unknown, charts):
+
+- Таблица рендерится через `renderXxx(data)` в JavaScript
+- Фильтрация через `filterXxx()` на клиенте
+- Модалки подтверждения удаления — те же HTML-шаблоны
+
+---
+
+## 8. Чек-лист перед коммитом
+
+- [ ] Нет `confirm()`, `alert()`, `prompt()` в коде
+- [ ] Модалки открываются через `classList.add('open')`
+- [ ] Модалки закрываются через `classList.remove('open')`
+- [ ] Кнопки удаления: `✕` (btn-danger)
+- [ ] Кнопки редактирования: `✎` (btn-secondary)
+- [ ] Порядок кнопок в модалках: Действие → Отмена
+- [ ] Уведомления через `showNotification()`
+- [ ] CSS-классы модалок: `.modal-overlay` / `.modal`
diff --git a/py_service/app/static/css/service.css b/py_service/app/static/css/service.css
index 531dd26..87585d5 100644
--- a/py_service/app/static/css/service.css
+++ b/py_service/app/static/css/service.css
@@ -576,6 +576,12 @@ table .actions button {
cursor: pointer;
}
+.modal-actions {
+ display: flex;
+ gap: 10px;
+ margin-top: 20px;
+}
+
/* ---------- TABS ---------- */
.tabs {
display: flex;
diff --git a/py_service/app/templates/pages/blog.html b/py_service/app/templates/pages/blog.html
index 608a9a5..32053f0 100644
--- a/py_service/app/templates/pages/blog.html
+++ b/py_service/app/templates/pages/blog.html
@@ -11,7 +11,7 @@
{{ p.created_at.strftime('%d.%m.%Y') if p.created_at else '' }} |
-
+
|
{% endfor %}
@@ -33,7 +33,34 @@
+
+
+
Удалить запись?
+
+ будет удалён навсегда. Это действие нельзя отменить.
+
+
+
+
+
+
+
{% endblock %}
diff --git a/py_service/app/templates/pages/users.html b/py_service/app/templates/pages/users.html
index e17e4c7..5d57c68 100644
--- a/py_service/app/templates/pages/users.html
+++ b/py_service/app/templates/pages/users.html
@@ -16,9 +16,9 @@
{% if u.role != 'owner' %}
- {% endif %}
|
{% endfor %}
@@ -53,7 +53,34 @@
+
+
+
Удалить пользователя?
+
+ будет удалён навсегда. Это действие нельзя отменить.
+
+
+
+
+
+
+