Files
scud_ai/docs/in_progress/ROADMAP.md
T

28 KiB
Raw Blame History

План реализации (ROADMAP)

1. Очистка от регулярок и костылей (tool_injector.py) [ЗАВЕРШЕНО]

  • Полностью удалить принудительные перехваты текста регулярными выражениями для команд добавления, редактирования и удаления пунктов.
  • Оставить в модуле только базовую санитарную очистку сырых тегов (<tool_call>).

2. Настройка контекста и инструкций сессии (agent.py) [ЗАВЕРШЕНО]

  • Передать управление диалогом языковой модели через системный блок role: "system".
  • При активном состоянии PROMPT_PREVIEW передавать модели инструкцию[cite: 2]:
    • Подтверждение / отмена / корректировка: продолжать работу с превью и вызывать соответствующие инструменты[cite: 2].
    • Смена темы: вежливо напомнить об открытом изменении и запросить решение[cite: 2].
  • Обеспечить видимость эфемерных сообщений (is_ephemeral = 1) для модели во время активной работы с превью[cite: 2].
  • Внедрить семантический Topic Drift Guard (idle_turns = 3) с вопросами и кнопками из tool_action_registry[cite: 2].
  • Реализовать детерминированный мгновенный сброс сессии и зачистку эфемерного контекста при вызове сторонних инструментов[cite: 2].

3. Очистка эфемерных сообщений при завершении (fast_path.py / context_manager.py) [ЗАВЕРШЕНО]

  • Настроить удаление временных сообщений превью (db_purge_ephemeral_messages) строго в момент нажатия кнопок «Подтвердить» или «Отменить»[cite: 2].
  • Сбрасывать состояние сессии в базе данных после фиксации решения[cite: 2].
  • Внедрить прямое точечное применение изменений через db_apply_prompt_node_action[cite: 2].
  • Добавить обработку фазы PROMPT_FOLLOWUP с кнопками завершения и очистки контекста[cite: 2].
  • Создать context_manager.py для строгого разграничения служебных tool-пар (is_ephemeral=1) и содержательного диалога (is_ephemeral=0), сохраняя беседы Topic Drift в истории[cite: 2].

4. Инлайн-редактор в окне диалога (core.js) [ЗАВЕРШЕНО]

  • Проверить работу блока ручного редактирования (inline-prompt-editor-container) с кнопками «Сохранить правки» и «Свернуть»[cite: 2].
  • Обеспечить сохранение черновика через API (/api/v1/chat/draft) и отображение обновленного текста перед подтверждением[cite: 2].
  • Реализовать двусторонний клиентский Diff-рендерер (одновременная подсветка добавленных строк и зачеркивание удаленных [УДАЛЕНИЕ])[cite: 2].
  • Добавить авто-форматирование и отступы подпунктов (X.Y.) при ручном сохранении черновика[cite: 2].

5. Тестирование и валидация системного промпта [ЗАВЕРШЕНО]

  • Нативные вызовы: проверить добавление, редактирование и удаление пунктов через нативные вызовы модели (db_prompt_node_edit)[cite: 2].
  • Контекстные сценарии: проверить поведение модели при смене темы диалога оператором (Guardrail)[cite: 2].
  • UI и очистка: проверить ручное редактирование через кнопку в окне чата и последующую очистку контекста (db_purge_ephemeral_messages)[cite: 2].
  • Строгий вызов Базы Знаний: внедрено правило 2.9 в системный промпт для пресечения текстовой имитации вызова db_get_rules[cite: 2].

6. Распространение архитектурного паттерна на модуль задач (tasks) [ЗАВЕРШЕНО]

  • Масштабирование UI задач:
    • Увеличена ширина карточки до max-w-4xl и динамическая высота скролла до 70vh[cite: 2].
    • Реализованы переключатели фильтрации: «В работе» (по умолчанию), «В планах», «Готово», «Все»[cite: 2].
    • Разделены кнопки действия: «В работу» (для плановых) и «Готово» (для текущих)[cite: 2].
  • Инлайн-редактирование карточки задачи:
    • Плавная трансформация карточки в 3-строчную форму (текст, дата со встроенным пикером, выпадающий список важности)[cite: 2].
    • Отображение даты создания задачи[cite: 2].
    • Сохранение через REST API эндпоинт PATCH /api/v1/tasks/{id}[cite: 2].
  • Детерминированный Fast-Path и двухфазное удаление:
    • Мгновенная смена статусов без задержек LLM[cite: 2].
    • Карточка подтверждения удаления с автоочисткой контекста[cite: 2].
  • Генерация отчетов задач в Markdown:
    • Добавлен инструмент db_export_tasks_markdown для формирования Markdown-файла с группировкой по модулям и чекбоксами [x] / [ ][cite: 2].
    • Реализован роутер безопасной отдачи файлов с сохранением имени (/api/v1/files/download/...)[cite: 2].
  • Доменная консолидация задач:
    • Реализован консолидированный инструмент db_tasks_edit(action: ["ADD", "UPDATE", "DELETE", "EXPORT"], ...)[cite: 2].

7. Распространение на модуль снапшотов (snapshots) [ЗАВЕРШЕНО]

  • Поддержка Y-снапшотов: универсальный парсинг и поиск по snapshot_id LIKE 'Y%' и срезам за 22:00:00 / 23:59:59[cite: 2].
  • Single Active Snapshot View: сохранение активного среза в контексте для аналитики с автоматической ротацией и зачисткой при запросе новых дат[cite: 2].
  • Интерактивный UI с чекбоксами и защитой срезов:
    • Чекбоксы в строках дневных срезов и кнопка «Выбрать все» в шапке[cite: 2].
    • Защита итогового вечернего среза Y (иконка замочка 🔒, блокировка выбора)[cite: 2].
    • Динамическая кнопка «Удалить выбранные (N)» в подвале карточки[cite: 2].
  • Декларативное управление удалением срезов:
    • Добавлен параметр confirmed в схему TOOLS_SCHEMA для db_delete_snapshots, исключающий зацикливание подтверждений в LLM.
    • Двухфазное подтверждение удаления (одиночное и пакетное) с корректным счётчиком количества удаляемых элементов[cite: 2].
    • Корректное отображение времени создания срезов в интерфейсе (устранение смещения UTC относительно локального времени сервера).

8. Глубокий архитектурный рефакторинг ядра и сервисов [ЗАВЕРШЕНО]

  • Выделение общего слоя ядра (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].
  • Декомпозиция предметных доменов (services/):
    • Сервис задач (services/tasks/), системного промпта (services/prompts/), срезов СКУД (services/snapshots/), базы знаний (services/knowledge/)[cite: 2].
  • Рефакторинг ETL-конвейера (services/scud_etl/):
    • Оркестратор pipeline.py, детектор аномалий anomaly_detector.py, слияние merger.py[cite: 2].
  • Модульный ИИ-оркестратор (modules/ai_engine/):
    • Динамический строитель системного контекста (context_builder.py)[cite: 2].
    • Изолированные обработчики инструментов в handlers/[cite: 2].

9. Реляционный реестр исключений, схлопывание мульти-пропусков и кадровый аудит [ЗАВЕРШЕНО]

  • Реестр исключений в SQLite (exceptions_registry):
    • Хранение категорий departments, positions, fio, position_keywords, include_fio в БД[cite: 2].
    • Доменный сервис exceptions_repo.py и полная поддержка в CLI scripts/db_cli.py exceptions[cite: 2].
  • Агрегация мульти-пропусков физлиц в СКУД:
    • Функция aggregate_scud_by_person в merger.py: объединение событий всех пропусков одного человека (ранний вход, поздний выход, присутствие)[cite: 2].
    • Автоматическая фиксация аномалий дублирования пропусков (DUPLICATE_SCUD_CARD)[cite: 2].
  • Умный выбор ставки совместителей 1С:ЗУП:
    • Функция select_best_zup_position в merger.py: привязка ставки 1С по подразделению физического нахождения в СКУД[cite: 2].
  • Отказ от искусственного автозакрытия смен:
    • Полное отключение механизма дорисовывания 8.5 часов (calculate_autoclose_time) по согласованию с отделом кадров.
    • Сохранение честного статуса «Нет выхода» для прозрачности кадрового аудита и выявления нарушений.
  • Кэш сопоставлений личностей (person_identity_mapping):
    • Таблица в SQLite и команды db_cli.py mapping [list|add|del][cite: 2].
    • Теневой режим ИИ-подсказок по нечетким ФИО в text_reporter.py[cite: 2].
  • Каскадный fallback кадровых отсутствий:
    • MS SQL ЗУП \rightarrow резервный парсинг Отсутствия_*.xlsx \rightarrow static_reason_workers.csv[cite: 2].

10. Разделение генераторов и почасовые срезы [ЗАВЕРШЕНО]

  • Разделение логики генерации на svodka_generator.py и otchet_generator.py[cite: 2].
  • Перевод времени суточного среза Y на 23:59:59[cite: 2].
  • Интеллектуальный поиск срезов services/snapshots/finder.py (Snap-to-Grid ±20 мин)[cite: 2].
  • Флаг --time и интерактивный help в main_etl.py[cite: 2].
  • Флаг --export-only для почасового крона[cite: 2].
  • Политика ночной ротации промежуточных срезов services/snapshots/retention.py[cite: 2].
  • Исправление целочисленного инкремента snapshot_id[cite: 2].

11. Стабилизация генератора отчетов и верстки [ЗАВЕРШЕНО]

  • Миграция на XlsxWriter: полный перевод экспорта книг (scud_export.py, excel_exporter.py) на чистый генератор, устранивший ошибки OpenXML и окна восстановления при открытии[cite: 2].
  • Интективные группировки в Сводке: восстановление сворачивания категорий по умолчанию (level=1, collapsed=True) и кнопок управления уровнями [+]/[-] (outline_settings(symbols_below=False))[cite: 2].
  • Компактная экранная верстка Детального отчета: центрирование столбца «Подразделение», расширение столбца «ФИО» (+10%, ширина 33), оптимизация ширины колонок «Первая активность» (11) и «Отклонение от нормы» (11) для отображения без горизонтальной прокрутки[cite: 2].
  • Защита от блокировок занятых файлов (Fallback Timestamp): механизм перехвата FileCreateError/OSError в safe_close_workbook с сохранением копии при открытом в Excel файле[cite: 2].
  • Безопасная синхронизация 1С с сетевой шары: переход на shutil.copyfile в share_copier.py для устранения сбоев прав доступа (Operation not permitted) на SMB/CIFS-ресурсах[cite: 2].

12. UI/UX веб-интерфейса и управление реестрами [ЗАВЕРШЕНО]

  • Паттерн Gemini-скролла: реализация функции scrollToUserMessageTop в core.js, позиционирующей свежий вопрос пользователя строго по верхней кромке видимой области[cite: 2].
  • Полное скрытие истории: предыдущие объемные ответы модели гарантированно вытесняются за верхний край экрана[cite: 2].
  • Стабилизация панели ввода: настройка padding-bottom: 80vh для #chat-messages-container в index.html, обеспечивающая необходимый запас высоты прокрутки без сдвига строки ввода текста[cite: 2].
  • Модальные формы реестров с автокомплитом 1С:
    • Полный отказ от браузерного prompt() при работе со списками исключений.
    • Единое Tailwind-окно для добавления исключений с живым поиском сотрудников по базе 1С:ЗУП (staff-autocomplete) и полем для комментария/основания.

13. Архитектура обработки событий турникетов и двухконтурный учет [ЗАВЕРШЕНО]

  • Опора на физический факт прохода (Event 32):
    • Устранение потери событий из-за рассинхронизации меток Event 28 (разрешение) и Event 32 (проход).
    • Переход на плоский SQL-запрос выборки первого входа (Mode = 1) и последнего выхода (Mode = 2).
  • Двухконтурная модель турникетов (Левый/Правый PERCo):
    • Разрешение использования обоих турникетов (DoorIndex IN (1, 2)) для сотрудников дворовых служб (отделы ЭТО, ЛЦ и др.).
    • Защита основного пула офисных сотрудников от транзитных отметок на правом турникете (DoorIndex = 1).
    • Реестр «Пр. турникет» (turnstile_fio, turnstile_departments) в базе данных и веб-панели.
    • Корректное сопоставление составных ФИО (Name + FirstName + MidName) в запросе к pList.
  • Таблица сырых событий (scud_events_raw):
    • Создание DDL-схемы таблицы и логирование всех физических проходов дня параллельно со снапшотами.

14. Миграция инфраструктуры, отказоустойчивость отчетов и Упрощенный отчет [ЗАВЕРШЕНО]

  • Миграция на новый сервер (Debian 12):
    • Актуализация путей виртуального окружения в cron-скриптах (scripts/cron/*.sh).
    • Восстановление прямого подключения к базе 1С:ЗУП (MS SQL Server ACCOUNT-01).
    • Настройка автоматического CIFS-монтирования шары отчетов //storage/SCUD/Отчеты в /etc/fstab с правами пользователя.
  • Разделение статусов наличия в кадровых реестрах (merger.py):
    • Выделение сотрудников, заведенных в СКУД, но не принятых в ЗУП (not_hired_yet = True), в отдельный раздел сводки «Не приняты на работу».
    • Полное исключение непринятых сотрудников из детального суточного табеля за прошлые смены.
    • Обособление штатных сотрудников без карт СКУД (no_scud_pass = True) в раздел «Нет пропуска» с исключением их из «Неизвестных».
    • Устранение предупреждений UserWarning: Boolean Series key will be reindexed при вычислении метрик штата.
  • Стабилизация генерации Excel-книг (otchet_builder.py):
    • Включение защитной опции nan_inf_to_errors: True в xlsxwriter.Workbook.
    • Санитизация ячеек от значений NaN / None / pd.NA перед записью, устранившая критический сбой TypeError: NAN/INF not supported in write_number().
  • Генератор «Упрощенного отчета» (services/reports/simplified_builder.py):
    • Создание генератора по эталонному шаблону: заголовок Упрощенный отчет: c ДД.ММ.ГГГГ по ДД.ММ.ГГГГ, сокращение ФИО до инициалов (Фамилия И.О.), отображение времени с текстовыми заглушками (Нет входа (0:00), Нет выхода (23:59)).
    • Сортировка по подразделениям и алфавиту сотрудников.
    • Интеграция этапа сборки упрощенного отчета за вчера в ETL-конвейер (main_etl.py).
  • Компактный динамический сборщик слепков (make_etl_snapshot.py):
    • Автоматический обход дерева (auto-discovery) с отсечением дублирующих архивных манифестов, временных файлов и пустых __init__.py.

15. ПРИОРИТЕТ 1: Внутридневной контроль, экран «Кто в здании» и On-Demand генерация [В РАБОТЕ]

  • Оперативный контроль «Кто в здании прямо сейчас» (Live Presence):
    • REST API эндпоинт GET /api/v1/presence/live на базе таблицы scud_events_raw и оконной функции последнего события прохода.
    • Выделенная модальная панель в веб-интерфейсе:
      • Метрики реального времени: Штат 1С, В здании, Вышли, На удаленке, В командировке/отпуске, Не пришли, Исключения.
      • Быстрый поиск сотрудника и фильтрация по подразделениям.
      • Учет специфики служебных входов/выходов во двор (флигель/двор).
  • On-Demand генерация отчетов из UI и сайдбара:
    • Кнопка «Сводка» в сайдбаре: моментальный сбор книги по последнему готовому срезу SQLite без блокирующих опросов MS SQL.
    • Кнопки «Детальн.» и «Упрощ.»: строгое формирование отчетов за ВЧЕРА (с учетом выходных) по финальному суточному срезу Y (23:59:59).
    • Каскадный fallback кадровых файлов: при отсутствии свежего штата за текущее утро автоматическое использование актуального среза из zup_staff в SQLite.
  • Атомарная публикация и отдача файлов (Report Delivery Engine):
    • Устранение 404 ошибок: рекурсивный поиск файлов в иерархии output/reports/{ГОД}/{МЕСЯЦ}/ и декодирование URL-имён.
    • Синхронизация при отдаче: автоматическая отдача прямой ссылки на скачивание в браузер.
  • Реестр «Графики работы» (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 скриптов для построения сложных графиков и нестандартной статистики на лету.