230 lines
28 KiB
Markdown
230 lines
28 KiB
Markdown
# План реализации (ROADMAP)
|
||
|
||
## 1. Очистка от регулярок и костылей (`tool_injector.py`) `[ЗАВЕРШЕНО]`
|
||
- [x] Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов.
|
||
- [x] Оставить в модуле только базовую санитарную очистку сырых тегов (`<tool_call>`).
|
||
|
||
---
|
||
|
||
## 2. Настройка контекста и инструкций сессии (`agent.py`) `[ЗАВЕРШЕНО]`
|
||
- [x] Передать управление диалогом языковой модели через системный блок `role: "system"`.
|
||
- [x] При активном состоянии `PROMPT_PREVIEW` передавать модели инструкцию[cite: 2]:
|
||
- **Подтверждение / отмена / корректировка:** продолжать работу с превью и вызывать соответствующие инструменты[cite: 2].
|
||
- **Смена темы:** вежливо напомнить об открытом изменении и запросить решение[cite: 2].
|
||
- [x] Обеспечить видимость эфемерных сообщений (`is_ephemeral = 1`) для модели во время активной работы с превью[cite: 2].
|
||
- [x] Внедрить семантический Topic Drift Guard (`idle_turns` = 3) с вопросами и кнопками из `tool_action_registry`[cite: 2].
|
||
- [x] Реализовать детерминированный мгновенный сброс сессии и зачистку эфемерного контекста при вызове сторонних инструментов[cite: 2].
|
||
|
||
---
|
||
|
||
## 3. Очистка эфемерных сообщений при завершении (`fast_path.py` / `context_manager.py`) `[ЗАВЕРШЕНО]`
|
||
- [x] Настроить удаление временных сообщений превью (`db_purge_ephemeral_messages`) строго в момент нажатия кнопок **«Подтвердить»** или **«Отменить»**[cite: 2].
|
||
- [x] Сбрасывать состояние сессии в базе данных после фиксации решения[cite: 2].
|
||
- [x] Внедрить прямое точечное применение изменений через `db_apply_prompt_node_action`[cite: 2].
|
||
- [x] Добавить обработку фазы `PROMPT_FOLLOWUP` с кнопками завершения и очистки контекста[cite: 2].
|
||
- [x] Создать `context_manager.py` для строгого разграничения служебных tool-пар (`is_ephemeral=1`) и содержательного диалога (`is_ephemeral=0`), сохраняя беседы Topic Drift в истории[cite: 2].
|
||
|
||
---
|
||
|
||
## 4. Инлайн-редактор в окне диалога (`core.js`) `[ЗАВЕРШЕНО]`
|
||
- [x] Проверить работу блока ручного редактирования (`inline-prompt-editor-container`) с кнопками **«Сохранить правки»** и **«Свернуть»**[cite: 2].
|
||
- [x] Обеспечить сохранение черновика через API (`/api/v1/chat/draft`) и отображение обновленного текста перед подтверждением[cite: 2].
|
||
- [x] Реализовать двусторонний клиентский Diff-рендерер (одновременная подсветка добавленных строк и зачеркивание удаленных `[УДАЛЕНИЕ]`)[cite: 2].
|
||
- [x] Добавить авто-форматирование и отступы подпунктов (`X.Y.`) при ручном сохранении черновика[cite: 2].
|
||
|
||
---
|
||
|
||
## 5. Тестирование и валидация системного промпта `[ЗАВЕРШЕНО]`
|
||
- [x] **Нативные вызовы:** проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (`db_prompt_node_edit`)[cite: 2].
|
||
- [x] **Контекстные сценарии:** проверить поведение модели при смене темы диалога оператором (Guardrail)[cite: 2].
|
||
- [x] **UI и очистка:** проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (`db_purge_ephemeral_messages`)[cite: 2].
|
||
- [x] **Строгий вызов Базы Знаний:** внедрено правило 2.9 в системный промпт для пресечения текстовой имитации вызова `db_get_rules`[cite: 2].
|
||
|
||
---
|
||
|
||
## 6. Распространение архитектурного паттерна на модуль задач (`tasks`) `[ЗАВЕРШЕНО]`
|
||
- [x] **Масштабирование UI задач:**
|
||
- Увеличена ширина карточки до `max-w-4xl` и динамическая высота скролла до `70vh`[cite: 2].
|
||
- Реализованы переключатели фильтрации: «В работе» (по умолчанию), «В планах», «Готово», «Все»[cite: 2].
|
||
- Разделены кнопки действия: «В работу» (для плановых) и «Готово» (для текущих)[cite: 2].
|
||
- [x] **Инлайн-редактирование карточки задачи:**
|
||
- Плавная трансформация карточки в 3-строчную форму (текст, дата со встроенным пикером, выпадающий список важности)[cite: 2].
|
||
- Отображение даты создания задачи[cite: 2].
|
||
- Сохранение через REST API эндпоинт `PATCH /api/v1/tasks/{id}`[cite: 2].
|
||
- [x] **Детерминированный Fast-Path и двухфазное удаление:**
|
||
- Мгновенная смена статусов без задержек LLM[cite: 2].
|
||
- Карточка подтверждения удаления с автоочисткой контекста[cite: 2].
|
||
- [x] **Генерация отчетов задач в Markdown:**
|
||
- Добавлен инструмент `db_export_tasks_markdown` для формирования Markdown-файла с группировкой по модулям и чекбоксами `[x]` / `[ ]`[cite: 2].
|
||
- Реализован роутер безопасной отдачи файлов с сохранением имени (`/api/v1/files/download/...`)[cite: 2].
|
||
- [x] **Доменная консолидация задач:**
|
||
- Реализован консолидированный инструмент `db_tasks_edit(action: ["ADD", "UPDATE", "DELETE", "EXPORT"], ...)`[cite: 2].
|
||
|
||
---
|
||
|
||
## 7. Распространение на модуль снапшотов (`snapshots`) `[ЗАВЕРШЕНО]`
|
||
- [x] **Поддержка Y-снапшотов:** универсальный парсинг и поиск по `snapshot_id LIKE 'Y%'` и срезам за 22:00:00 / 23:59:59[cite: 2].
|
||
- [x] **Single Active Snapshot View:** сохранение активного среза в контексте для аналитики с автоматической ротацией и зачисткой при запросе новых дат[cite: 2].
|
||
- [x] **Интерактивный UI с чекбоксами и защитой срезов:**
|
||
- Чекбоксы в строках дневных срезов и кнопка «Выбрать все» в шапке[cite: 2].
|
||
- Защита итогового вечернего среза Y (иконка замочка `🔒`, блокировка выбора)[cite: 2].
|
||
- Динамическая кнопка «Удалить выбранные (N)» в подвале карточки[cite: 2].
|
||
- [x] **Декларативное управление удалением срезов:**
|
||
- Добавлен параметр `confirmed` в схему `TOOLS_SCHEMA` для `db_delete_snapshots`, исключающий зацикливание подтверждений в LLM.
|
||
- Двухфазное подтверждение удаления (одиночное и пакетное) с корректным счётчиком количества удаляемых элементов[cite: 2].
|
||
- Корректное отображение времени создания срезов в интерфейсе (устранение смещения UTC относительно локального времени сервера).
|
||
|
||
---
|
||
|
||
## 8. Глубокий архитектурный рефакторинг ядра и сервисов `[ЗАВЕРШЕНО]`
|
||
- [x] **Выделение общего слоя ядра (`core/`):**
|
||
- Изолированный пул соединений SQLite (`core/connection.py`) с поддержкой WAL и таймаутов[cite: 2].
|
||
- DDL-схемы таблиц и индексов (`core/schema.py`)[cite: 2].
|
||
- Репозитории СКУД и 1С (`core/repositories/scud_repo.py`, `core/repositories/zup_repo.py`)[cite: 2].
|
||
- Фасад обратной совместимости (`core/database.py`)[cite: 2].
|
||
- [x] **Декомпозиция предметных доменов (`services/`):**
|
||
- Сервис задач (`services/tasks/`), системного промпта (`services/prompts/`), срезов СКУД (`services/snapshots/`), базы знаний (`services/knowledge/`)[cite: 2].
|
||
- [x] **Рефакторинг ETL-конвейера (`services/scud_etl/`):**
|
||
- Оркестратор `pipeline.py`, детектор аномалий `anomaly_detector.py`, слияние `merger.py`[cite: 2].
|
||
- [x] **Модульный ИИ-оркестратор (`modules/ai_engine/`):**
|
||
- Динамический строитель системного контекста (`context_builder.py`)[cite: 2].
|
||
- Изолированные обработчики инструментов в `handlers/`[cite: 2].
|
||
|
||
---
|
||
|
||
## 9. Реляционный реестр исключений, схлопывание мульти-пропусков и кадровый аудит `[ЗАВЕРШЕНО]`
|
||
- [x] **Реестр исключений в SQLite (`exceptions_registry`):**
|
||
- Хранение категорий `departments`, `positions`, `fio`, `position_keywords`, `include_fio` в БД[cite: 2].
|
||
- Доменный сервис `exceptions_repo.py` и полная поддержка в CLI `scripts/db_cli.py exceptions`[cite: 2].
|
||
- [x] **Агрегация мульти-пропусков физлиц в СКУД:**
|
||
- Функция `aggregate_scud_by_person` в `merger.py`: объединение событий всех пропусков одного человека (ранний вход, поздний выход, присутствие)[cite: 2].
|
||
- Автоматическая фиксация аномалий дублирования пропусков (`DUPLICATE_SCUD_CARD`)[cite: 2].
|
||
- [x] **Умный выбор ставки совместителей 1С:ЗУП:**
|
||
- Функция `select_best_zup_position` в `merger.py`: привязка ставки 1С по подразделению физического нахождения в СКУД[cite: 2].
|
||
- [x] **Отказ от искусственного автозакрытия смен:**
|
||
- Полное отключение механизма дорисовывания 8.5 часов (`calculate_autoclose_time`) по согласованию с отделом кадров.
|
||
- Сохранение честного статуса «Нет выхода» для прозрачности кадрового аудита и выявления нарушений.
|
||
- [x] **Кэш сопоставлений личностей (`person_identity_mapping`):**
|
||
- Таблица в SQLite и команды `db_cli.py mapping [list|add|del]`[cite: 2].
|
||
- Теневой режим ИИ-подсказок по нечетким ФИО в `text_reporter.py`[cite: 2].
|
||
- [x] **Каскадный fallback кадровых отсутствий:**
|
||
- `MS SQL ЗУП` $\rightarrow$ резервный парсинг `Отсутствия_*.xlsx` $\rightarrow$ `static_reason_workers.csv`[cite: 2].
|
||
|
||
---
|
||
|
||
## 10. Разделение генераторов и почасовые срезы `[ЗАВЕРШЕНО]`
|
||
- [x] Разделение логики генерации на `svodka_generator.py` и `otchet_generator.py`[cite: 2].
|
||
- [x] Перевод времени суточного среза `Y` на `23:59:59`[cite: 2].
|
||
- [x] Интеллектуальный поиск срезов `services/snapshots/finder.py` (Snap-to-Grid ±20 мин)[cite: 2].
|
||
- [x] Флаг `--time` и интерактивный help в `main_etl.py`[cite: 2].
|
||
- [x] Флаг `--export-only` для почасового крона[cite: 2].
|
||
- [x] Политика ночной ротации промежуточных срезов `services/snapshots/retention.py`[cite: 2].
|
||
- [x] Исправление целочисленного инкремента `snapshot_id`[cite: 2].
|
||
|
||
---
|
||
|
||
## 11. Стабилизация генератора отчетов и верстки `[ЗАВЕРШЕНО]`
|
||
- [x] **Миграция на `XlsxWriter`:** полный перевод экспорта книг (`scud_export.py`, `excel_exporter.py`) на чистый генератор, устранивший ошибки OpenXML и окна восстановления при открытии[cite: 2].
|
||
- [x] **Интективные группировки в Сводке:** восстановление сворачивания категорий по умолчанию (`level=1`, `collapsed=True`) и кнопок управления уровнями `[+]`/`[-]` (`outline_settings(symbols_below=False)`)[cite: 2].
|
||
- [x] **Компактная экранная верстка Детального отчета:** центрирование столбца «Подразделение», расширение столбца «ФИО» (+10%, ширина 33), оптимизация ширины колонок «Первая активность» (11) и «Отклонение от нормы» (11) для отображения без горизонтальной прокрутки[cite: 2].
|
||
- [x] **Защита от блокировок занятых файлов (Fallback Timestamp):** механизм перехвата `FileCreateError`/`OSError` в `safe_close_workbook` с сохранением копии при открытом в Excel файле[cite: 2].
|
||
- [x] **Безопасная синхронизация 1С с сетевой шары:** переход на `shutil.copyfile` в `share_copier.py` для устранения сбоев прав доступа (`Operation not permitted`) на SMB/CIFS-ресурсах[cite: 2].
|
||
|
||
---
|
||
|
||
## 12. UI/UX веб-интерфейса и управление реестрами `[ЗАВЕРШЕНО]`
|
||
- [x] **Паттерн Gemini-скролла:** реализация функции `scrollToUserMessageTop` в `core.js`, позиционирующей свежий вопрос пользователя строго по верхней кромке видимой области[cite: 2].
|
||
- [x] **Полное скрытие истории:** предыдущие объемные ответы модели гарантированно вытесняются за верхний край экрана[cite: 2].
|
||
- [x] **Стабилизация панели ввода:** настройка `padding-bottom: 80vh` для `#chat-messages-container` в `index.html`, обеспечивающая необходимый запас высоты прокрутки без сдвига строки ввода текста[cite: 2].
|
||
- [x] **Модальные формы реестров с автокомплитом 1С:**
|
||
- Полный отказ от браузерного `prompt()` при работе со списками исключений.
|
||
- Единое Tailwind-окно для добавления исключений с живым поиском сотрудников по базе 1С:ЗУП (`staff-autocomplete`) и полем для комментария/основания.
|
||
|
||
---
|
||
|
||
## 13. Архитектура обработки событий турникетов и двухконтурный учет `[ЗАВЕРШЕНО]`
|
||
- [x] **Опора на физический факт прохода (Event 32):**
|
||
- Устранение потери событий из-за рассинхронизации меток Event 28 (разрешение) и Event 32 (проход).
|
||
- Переход на плоский SQL-запрос выборки первого входа (`Mode = 1`) и последнего выхода (`Mode = 2`).
|
||
- [x] **Двухконтурная модель турникетов (Левый/Правый PERCo):**
|
||
- Разрешение использования обоих турникетов (`DoorIndex IN (1, 2)`) для сотрудников дворовых служб (отделы `ЭТО`, `ЛЦ` и др.).
|
||
- Защита основного пула офисных сотрудников от транзитных отметок на правом турникете (`DoorIndex = 1`).
|
||
- Реестр «Пр. турникет» (`turnstile_fio`, `turnstile_departments`) в базе данных и веб-панели.
|
||
- Корректное сопоставление составных ФИО (`Name + FirstName + MidName`) в запросе к `pList`.
|
||
- [x] **Таблица сырых событий (`scud_events_raw`):**
|
||
- Создание DDL-схемы таблицы и логирование всех физических проходов дня параллельно со снапшотами.
|
||
|
||
---
|
||
|
||
## 14. Миграция инфраструктуры, отказоустойчивость отчетов и Упрощенный отчет `[ЗАВЕРШЕНО]`
|
||
- [x] **Миграция на новый сервер (Debian 12):**
|
||
- Актуализация путей виртуального окружения в cron-скриптах (`scripts/cron/*.sh`).
|
||
- Восстановление прямого подключения к базе 1С:ЗУП (MS SQL Server `ACCOUNT-01`).
|
||
- Настройка автоматического CIFS-монтирования шары отчетов `//storage/SCUD/Отчеты` в `/etc/fstab` с правами пользователя.
|
||
- [x] **Разделение статусов наличия в кадровых реестрах (`merger.py`):**
|
||
- Выделение сотрудников, заведенных в СКУД, но не принятых в ЗУП (`not_hired_yet = True`), в отдельный раздел сводки **«Не приняты на работу»**.
|
||
- Полное исключение непринятых сотрудников из детального суточного табеля за прошлые смены.
|
||
- Обособление штатных сотрудников без карт СКУД (`no_scud_pass = True`) в раздел **«Нет пропуска»** с исключением их из «Неизвестных».
|
||
- Устранение предупреждений `UserWarning: Boolean Series key will be reindexed` при вычислении метрик штата.
|
||
- [x] **Стабилизация генерации Excel-книг (`otchet_builder.py`):**
|
||
- Включение защитной опции `nan_inf_to_errors: True` в `xlsxwriter.Workbook`.
|
||
- Санитизация ячеек от значений `NaN` / `None` / `pd.NA` перед записью, устранившая критический сбой `TypeError: NAN/INF not supported in write_number()`.
|
||
- [x] **Генератор «Упрощенного отчета» (`services/reports/simplified_builder.py`):**
|
||
- Создание генератора по эталонному шаблону: заголовок `Упрощенный отчет: c ДД.ММ.ГГГГ по ДД.ММ.ГГГГ`, сокращение ФИО до инициалов (`Фамилия И.О.`), отображение времени с текстовыми заглушками (`Нет входа (0:00)`, `Нет выхода (23:59)`).
|
||
- Сортировка по подразделениям и алфавиту сотрудников.
|
||
- Интеграция этапа сборки упрощенного отчета за вчера в ETL-конвейер (`main_etl.py`).
|
||
- [x] **Компактный динамический сборщик слепков (`make_etl_snapshot.py`):**
|
||
- Автоматический обход дерева (auto-discovery) с отсечением дублирующих архивных манифестов, временных файлов и пустых `__init__.py`.
|
||
|
||
---
|
||
|
||
## 15. ПРИОРИТЕТ 1: Внутридневной контроль, экран «Кто в здании» и On-Demand генерация `[В РАБОТЕ]`
|
||
- [x] **Оперативный контроль «Кто в здании прямо сейчас» (Live Presence):**
|
||
- [x] REST API эндпоинт `GET /api/v1/presence/live` на базе таблицы `scud_events_raw` и оконной функции последнего события прохода.
|
||
- [x] Выделенная модальная панель в веб-интерфейсе:
|
||
- Метрики реального времени: *Штат 1С*, *В здании*, *Вышли*, *На удаленке*, *В командировке/отпуске*, *Не пришли*, *Исключения*.
|
||
- Быстрый поиск сотрудника и фильтрация по подразделениям.
|
||
- Учет специфики служебных входов/выходов во двор (флигель/двор).
|
||
- [x] **On-Demand генерация отчетов из UI и сайдбара:**
|
||
- [x] Кнопка **«Сводка»** в сайдбаре: моментальный сбор книги по последнему готовому срезу SQLite без блокирующих опросов MS SQL.
|
||
- [x] Кнопки **«Детальн.»** и **«Упрощ.»**: строгое формирование отчетов за **ВЧЕРА** (с учетом выходных) по финальному суточному срезу `Y` (23:59:59).
|
||
- [x] Каскадный fallback кадровых файлов: при отсутствии свежего штата за текущее утро автоматическое использование актуального среза из `zup_staff` в SQLite.
|
||
- [x] **Атомарная публикация и отдача файлов (Report Delivery Engine):**
|
||
- [x] Устранение 404 ошибок: рекурсивный поиск файлов в иерархии `output/reports/{ГОД}/{МЕСЯЦ}/` и декодирование URL-имён.
|
||
- [x] Синхронизация при отдаче: автоматическая отдача прямой ссылки на скачивание в браузер.
|
||
- [ ] **Реестр «Графики работы» (Custom Work Schedules):**
|
||
- [ ] Таблица в SQLite `work_schedules_registry` (`fio_clean`, `department`, `schedule_type`, `norm_hours`, `time_start_window`, `time_end_window`, `valid_from`, `valid_to`).
|
||
- [ ] Интеграция индивидуальной нормы часов (4, 7, 11, 24 ч) в калькулятор выработки `calculators.py` вместо константы 8 ч.
|
||
- [ ] Вкладка управления графиками в сайдбаре «Реестры» с автоподбором сотрудников из 1С.
|
||
|
||
---
|
||
|
||
## 16. ПРИОРИТЕТ 2: Кадровый арбитраж до отчетов и интеграция с MS Exchange `[В ПЛАНАХ]`
|
||
- [ ] **Почтовый агент MS Exchange (Email-Driven Controller & Human-in-the-Loop):**
|
||
- [ ] Фоновый сервис `services/mail/exchange_bot.py` для опроса служебного ящика по IMAP/SMTP (`imaplib` / `email`) или EWS (`exchangelib`).
|
||
- [ ] Белый список доверенных отправителей (адреса сотрудников ОК, СБ и руководства).
|
||
- [ ] **Генерация отчетов по письму:** распознавание запросов в теме/теле писем (*«Сводка на 14:00»*, *«Отчет за 22.09.2026»*) и отправка файла в ответном письме.
|
||
- [ ] **Разрешение кадровых коллизий через почту:** обработка ответов СБ на утреннюю рассылку аномалий (подтверждение связок в `person_identity_mapping`) и регистрация командировок/служебок в `manual_absences`.
|
||
- [ ] Двухфазный Guardrail: запрос подтверждения у кадровика по почте при низкой уверенности в сопоставлении тёзок (<90%).
|
||
- [ ] **Интеллектуальный кадровый арбитраж ДО генерации отчетов:**
|
||
- [ ] Перенос арбитража не сопоставившихся персон на этап [2.5] ДО сохранения Excel-файлов `сводка.xlsx` и `отчет.xlsx`.
|
||
- [ ] **Якорный табельный номер (TabNo Matching):** извлечение `TabNo` из MS SQL СКУД Орион и 1С:ЗУП, защита от смены фамилий и опечаток.
|
||
- [ ] 4-уровневая система предохранителей (Точный матч $\rightarrow$ Табельный номер $\rightarrow$ Кэш связок $\rightarrow$ ИИ-арбитраж).
|
||
|
||
---
|
||
|
||
## 17. ПРИОРИТЕТ 3: Векторная база знаний (RAG) и внешний контекст `[В ПЛАНАХ]`
|
||
- [ ] **Векторный поиск по регламентам компании (ChromaDB / RAG Engine):**
|
||
- [ ] Встраиваемая векторная база для семантического поиска по ПВТР, положениям о пропускном режиме и должностным инструкциям.
|
||
- [ ] Мгновенная выдача ссылок на пункты локальных нормативных актов при консультации оператора в чате.
|
||
- [ ] Семантическая классификация нестандартных формулировок причин отсутствий из писем и заявлений.
|
||
- [ ] **Внешний контекстный инструмент (Web Search Agent):**
|
||
- [ ] Нативный инструмент `web_search` для обращения к производственному календарю РФ (переносы праздников, предпраздничные сокращенные смены по ст. 95 ТК РФ).
|
||
- [ ] Справка по статьям Трудового кодекса РФ (сверхурочные, выходные дни).
|
||
|
||
---
|
||
|
||
## 18. Исследовательский трек: Изолированная песочница кода `[ОТЛОЖЕНО]`
|
||
- [ ] **Docker/gVisor контур:**
|
||
- [ ] Изолированный контейнер без доступа к внешней сети (`network: none`) с жесткими cgroups-лимитами и монтированием данных в режиме Read-Only.
|
||
- [ ] Генерация и выполнение Python/Pandas скриптов для построения сложных графиков и нестандартной статистики на лету. |