23 KiB
23 KiB
Changelog
Все важные изменения проекта документируются в этом файле.
[Unreleased] - 2026-09-07
Добавлено
- Механизм Gemini-скроллинга диалогового окна: функция
scrollToUserMessageTopвcore.jsавтоматически поднимает отправленный вопрос к верхнему срезу экрана, скрывая громоздкие предыдущие ответы. - CSS-отступ
padding-bottom: 80vhу#chat-messages-container, гарантирующий свободное вертикальное пространство для прокрутки без сдвига строки ввода. - Пункт 2.9 системного промпта, жестко обязывающий модель вызывать нативный инструмент
db_get_rulesпри запросах Базы Знаний и регламентов вместо текстовой имитации.
Запланировано
- Рефакторинг интерпретации аппаратных кодов турникетов PERCO в
services/scud_export.py: разделение логики разрешения прохода (Event 28) и факта проворота створки (Event 32), приоритет направления поlog.Mode(1 — вход, 2 — выход) для устранения фантомных выходов. - Создание DDL-схемы и таблицы
scud_events_rawв SQLite для гранулярного хранения всех внутридневных перемещений сотрудников (база для учета перекуров и инструмента «Кто в здании»).
[0.9.5] - 2026-08-28
Добавлено
- Механизм отказоустойчивого сохранения отчетов
safe_close_workbookвservices/excel_exporter.py: при блокировке файла открытым процессом Excel создается резервный файл с таймстемпом вида..._timestamp.xlsx.
Изменено
- Экспорт всех Excel-документов (
services/scud_export.py,services/excel_exporter.py) полностью переведен сopenpyxlнаxlsxwriter. - Скорректирована верстка детального отчета: столбец «Подразделение» выровнен строго по центру, колонка «ФИО» расширена на 10% (ширина 33), а избыточная ширина столбцов «Первая активность» и «Отклонение от нормы» уменьшена до 11 пунктов для корректного размещения на экране без горизонтальной прокрутки.
- В модуле сетевой синхронизации
services/share_copier.pyвызовshutil.copy2заменен наshutil.copyfile, что устранило ошибки метаданных[Errno 1] Operation not permittedпри монтировании SMB-шары.
Исправлено
- Устранена системная ошибка структуры OpenXML (
errorXXXXXX_01.xml, «Обнаружена ошибка в части содержимого книги...»), возникавшая при открытии сгенерированных отчетов в MS Excel. - Восстановлены сворачиваемые интерактивные категории с кнопками
[+]/[-]в файле ежедневной сводки (outline_settings(symbols_below=False)).
[Unreleased] - 2026-08-28
Fixed
- Генерация Excel-книг (
services/excel_exporter.py,services/scud_export.py): полный перевод экспорта сopenpyxlнаxlsxwriter, что устранило хроническую ошибку структуры OpenXML («В книге обнаружено нечитаемое содержимое...»). - Группировки в Сводке: восстановлено корректное отображение интерактивных кнопок
[+]/[-]и сворачивание категорий по умолчанию (outline_settings,level=1,collapsed=True). - Верстка и пропорции Детального отчета: центрирование столбца «Подразделение», калибровка ширины колонок «ФИО» (+10%), «Первая активность» и «Отклонение от нормы» для плотного размещения таблицы на одном экране без горизонтальной прокрутки.
- Безопасное сохранение при блокировках: внедрена функция
safe_close_workbookдля фонового сохранения резервных копий с timestamp, если файл открыт пользователем в Excel. - Сетевое копирование 1С (
services/share_copier.py): заменаshutil.copy2наshutil.copyfileдля устранения сбоя[Errno 1] Operation not permittedпри работе с SMB/CIFS-шарой.
[Unreleased] - 2026-08-28
Fixed
- Инкремент Snapshot ID (
core/repositories/scud_repo.py): заменена строковая сортировкаORDER BY snapshot_id DESCна целочисленный парсинг суффиксов, что устранило залипание номеров снапшотов (-002).
Added
- Режим тихих почасовых срезов (
--export-only): быстрый экспорт данных СКУД напрямую в SQLite без построения отчетов для интеграции в cron. - Интерактивный справочник CLI (
main_etl.py): полный баннер справки по всем аргументам (-h,--help,help). - Автоматическая ротация промежуточных срезов (
services/snapshots/retention.py): ночная очистка устаревших почасовых срезов старше 2 дней с сохранением полуденного (13:00) и итоговогоY(23:59:59).
[Unreleased] - 2026-08-28
Added
- Smart Snap-to-Grid Finder (
services/snapshots/finder.py): интеллектуальный поиск ближайшего среза СКУД в SQLite с допуском ±20 минут и поддержкой On-Demand экспорта из MS SQL при отсутствии готового среза. - Параметр
--timeвmain_etl.py: возможность формирования оперативной сводки на произвольное время суток. - Раздельные генераторы отчетов:
services/scud_etl/svodka_generator.py— оперативная сводка за сегодня с группировками.services/scud_etl/otchet_generator.py— суточный детальный отчет за вчера по финишному срезуY(23:59:59) с учетом рабочего норматива 8.5 ч.
Changed
- Фиксация финишного среза
Yна23:59:59: обновлено время снапшота вservices/scud_export.py,core/repositories/scud_repo.pyиservices/scud_etl/pipeline.pyс сохранением обратной совместимости со срезами на22:00:00. - Путь виртуального окружения в
run_cron_etl.sh: скорректирован на актуальный/home/puh/projects/scud_ai/venv/bin/python. - Игнорирование временных файлов SQLite: добавлены
*.db-shmи*.db-walв.gitignore.
[3.2.0] — 2026-08-27
🧠 Интеллектуальный арбитраж личностей, агрегация мульти-пропусков и автозакрытие смен
✨ Добавлено:
- Кэш сопоставлений личностей (
person_identity_mapping):- Создана таблица в SQLite (
core/schema.py) для постоянного хранения подтвержденных связок между сырыми ФИО СКУД и эталонными ФИО 1С:ЗУП. - Поддержка мгновенного извлечения проверенных сопоставлений в
merger.py(время выборки < 1 мс).
- Создана таблица в SQLite (
- Агрегация дубликатов пропусков и мульти-учеток СКУД (
merger.py):- Функция
aggregate_scud_by_personобъединяет все карты/записи одного физлица: фиксирует самый ранний входmin(valid_ins), самый поздний выходmax(valid_outs)и итоговый статус присутствия. - Исключено ложное попадание сотрудников с несколькими пропусками (например, Кондрашова Е.В.) в категорию «неизвестно».
- Функция
- Интеллектуальный выбор ставки совместителей 1С (
merger.py):- Функция
select_best_zup_positionсопоставляет множественные должности одного сотрудника в 1С со СКУД и подтягивает ставку того подразделения, где человек находится физически.
- Функция
- Автозакрытие незакрытых смен по Правилу 8.5ч (
excel_exporter.py):- При наличии утреннего входа и отсутствии вечернего выхода у офисных сотрудников в детальном отчете за вчера расчетный выход ставится как
Вход + 8ч 30мин, норма 8 часов и нулевое отклонение0:00(вместо ложного штрафа-8:00).
- При наличии утреннего входа и отсутствии вечернего выхода у офисных сотрудников в детальном отчете за вчера расчетный выход ставится как
- Теневой ИИ-арбитраж нераспознанных ФИО (
text_reporter.py):- Модуль
find_ai_identity_suggestionsвыявляет нечеткие совпадения и опечатки операторов СКУД, выводя рекомендации для кадровой службы в блоке «💡 Предложения ИИ по сопоставлению ФИО».
- Модуль
- Расширение CLI-утилиты (
scripts/db_cli.py):- Добавлены команды управления связками:
python scripts/db_cli.py mapping [list|add|del].
- Добавлены команды управления связками:
🔧 Изменено:
services/scud_etl/anomaly_detector.py:- Добавлено авто-детектирование задвоенных карточек СКУД (
DUPLICATE_SCUD_CARD) с передачей информации в ИИ-сводку.
- Добавлено авто-детектирование задвоенных карточек СКУД (
main_etl.py:- Восстановлена передача сырых датасетов (
raw_scud_df,raw_staff_df,raw_absent_df) в ИИ-аудитор и генерация диагностического дампаСКУД_Сырые_данные_ДД.ММ.ГГГГ.xlsx.
- Восстановлена передача сырых датасетов (
[3.1.0] — 2026-08-25
🛡️ Реляционный реестр исключений, Белый список и отказоустойчивость выгрузок
✨ Добавлено:
- Реляционный реестр исключений (
exceptions_registry):- Перенос исключений (
departments,positions,fio,position_keywords) и белого списка (include_fio) из статического JSON в базу данных SQLite (core/schema.py). - Репозиторий
services/exceptions_repo.pyс функциями CRUD и авто-миграцией изexceptions.json.
- Перенос исключений (
- Белый список (
include_fio):- Поддержка явного включения сотрудников в расчет контроллинга в обход должностных и отдельских фильтров (Тарасенко А.А., Журиков М.Н.).
- Управление исключениями в CLI (
scripts/db_cli.py):- Добавлены команды
exceptions list,exceptions add -c ... -v ...,exceptions del,exceptions sync.
- Добавлены команды
- Резервный загрузчик кадровых отсутствий (
data_loader.py):- Реализован каскадный fallback:
MS SQL 1C:ЗУП(таймаут 30с)\rightarrowрезервный парсинг скопированных Excel-файловОтсутствия_*.xlsx\rightarrowstatic_reason_workers.csv.
- Реализован каскадный fallback:
🔧 Изменено:
- Структура отчетов Excel (
excel_exporter.py):- Изменен базовый путь сохранения отчетов на
output/reports/ГОД/МЕСЯЦ/. - В Ежедневной сводке блок «В том числе на удаленной работе» вынесен под «Итого на работе», а блок «Исключения» размещен в самом низу с поддержкой группировки.
- Добавлена защита от блокировок Excel (
PermissionError/OSError): при занятости файла создается резервная копия с временной меткой.
- Изменен базовый путь сохранения отчетов на
- Подключение к СКУД (
services/scud_export.py):- Актуализирован адрес сервера MS SQL Орион (
172.16.200.147\SQL). - Добавлена защита инициализации файлового логгера от ошибок доступа прав пользователей.
- Актуализирован адрес сервера MS SQL Орион (
[3.0.0] — 2026-08-21
🚀 Глубокий архитектурный рефакторинг (Unified Clean Architecture)
Добавлено:
- Пакет ядра
core/:core/connection.py: централизованный менеджер SQLite-подключений с поддержкой WAL-режима и row_factory.core/schema.py: единая точка инициализации схемы данных и индексов.core/repositories/: низкоуровневые репозиторииscud_repo.pyиzup_repo.py.
- Доменные сервисы
services/:services/tasks/: полная изоляция логики задач (CRUD, Markdown-экспорт, генерацияROADMAP.md).services/prompts/: доменный сервис системного промпта, поддержка превью, генерация HTML-Diff и пакетное удаление узлов (BATCH_DELETE).services/snapshots/: бизнес-логика срезов СКУД с защитой финишных Y-снапшотов.services/knowledge/: сервис базы знаний правил и синонимов отделов.services/scud_etl/: модульный ETL-конвейер (pipeline.py,anomaly_detector.py,merger.py,sql_queries.py).
- ИИ-оркестратор
modules/ai_engine/:- Декомпозиция монолитного
agent.pyна узкие обработчикиhandlers/и динамический контекст-билдерcontext_builder.py. - Двухконтурная обработка: нативный Function Calling + семантический страхующий инжектор (
tool_injector.py). - Интеллектуальный Topic Drift менеджер с вежливым напоминанием на 3-й шаг и автоочисткой эфемерных сообщений на 4-й.
- Декомпозиция монолитного
- Интерфейс и UI:
- Кнопка «✏️ Редактировать» прямо в карточке просмотра системного промпта с инлайн-редактором.
Исправлено:
- Устранена утечка системного промпта в постоянный контекст (
chat_messages). - Исправлены ошибки несоответствия сигнатур (
TypeError: create_prompt_preview,save_full_prompt_draft,get_snapshots_registry) в Fast-Path. - Устранена галлюцинация слов-паразитов («Почемучка», «Почемучто») на уровне валидации ответа.
- Исправлено устаревшее противоречивое правило 2.3 в базе данных, блокировавшее интерактивное удаление задач.
Удалено:
- Устаревшие файлы-дубли:
modules/web_api/llm/db/db_tasks.py,db_snapshots.py,prompt_merger.py.
[2026-08-19] — Инлайн-редактор задач, интеллектуальный ContextManager и стабилизация Function Calling
✨ Добавлено
- Инлайн-редактирование задач (
task_widget.js/tasks.py):- Добавлена кнопка редактирования (
✏️) на каждой карточке задачи. - Карточка трансформируется в инлайн-форму с тремя полями: текст задачи, HTML5-пикер календаря планируемого срока и выпадающий список важности (
LOW,MEDIUM,HIGH,CRITICAL). - Добавлен REST API эндпоинт
PATCH /api/v1/tasks/{task_id}с поддержкой комплексного обновления полей в SQLite. - В карточки выведено отображение даты создания задачи.
- Добавлена кнопка редактирования (
- Интеллектуальный ContextManager (
context_manager.py):- Служебные запросы и карточки инструментов сохраняются синхронными парами (
is_ephemeral = 1) и атомарно удаляются при завершении операций. - Свободные диалоги оператора (включая темы Topic Drift) сохраняются в постоянную историю (
is_ephemeral = 0) и не стираются при закрытии сессий промпта/задач.
- Служебные запросы и карточки инструментов сохраняются синхронными парами (
- Поддержка Y-снапшотов (
db_snapshots.py):- Исправлен SQL-запрос
db_get_snapshotsдля точного извлечения ночных и фоновых срезов с префиксомY(например,Y20260817-003).
- Исправлен SQL-запрос
🔧 Изменено
modules/web_api/llm/agent.py:- Полностью удалены эвристические текстовые фильтры и принудительные сортировки инструментов.
- Настроен нативный возврат и исполнение инструментов без зацикливания модели.
- Устранена ошибка
UnboundLocalErrorпри вызове справочных инструментов.
modules/web_api/llm/schemas.py:- Очищены описания инструментов от агрессивных директив и капса, стабилизирована селективность Function Calling для Qwen 2.5.
modules/web_api/llm/core/ollama_client.py:- Оптимизированы параметры генерации для Function Calling (
repeat_penalty: 1.0,presence_penalty: 0.0,temperature: 0.0), что исключило спам несколькими вызовами инструментов на один запрос.
- Оптимизированы параметры генерации для Function Calling (
modules/web_api/static/js/chat/task_widget.js:- Фильтр по умолчанию переведен на вкладку «В работе» (
IN_PROGRESS).
- Фильтр по умолчанию переведен на вкладку «В работе» (
[2026-08-18] — Двухфазный жизненный цикл сессий, двусторонний Diff и Topic Drift Guard
✨ Добавлено
- Двусторонний клиентский Diff (
core.js): Реализован алгоритм сравнения черновика с baseline-промптом. Удаленные строки остаются на экране с красным зачеркиванием[УДАЛЕНИЕ], а добавленные/измененные строки выделяются красной рамкой с авто-отступами. - Topic Drift Guard (
agent.py): Внедрен двухуровневый контроль смены темы:- Мгновенный сброс стейта и зачистка эфемерных сообщений при вызове сторонних инструментов (задачи, снапшоты, база).
- Мягкий счетчик отвлечений (
idle_turns= 3) в свободном диалоге с выводом напоминания и кнопок изtool_action_registry.
- Команда
context purgeв CLI (db_cli.py): Добавлен флаг--allдля полной очистки таблицыchat_messagesи сброса стейтов сессий.
[2026-08-17] — Внедрение CLI-инспекции контекста и переход на нативный Function Calling
✨ Добавлено
scripts/db_cli.py: Добавлена командаcontextдля инспекции истории сообщенийchat_messagesпо сессиям с визуальным отображением флагов[ЭФЕМЕРНОЕ].ROADMAP.md: Сформирована актуальная дорожная карта с планом отказа от регулярных выражений в пользу нативного Function Calling.
[2026-08-15] — Реляционная архитектура системного промпта
✨ Добавлено
system_prompt_nodes: Создана таблица реляционных узлов промпта с индексацией по разделам и пунктам (section_id,item_id).db_prompt_node_edit: Добавлен инструмент точечного добавления, изменения и удаления пунктов системного промпта.- Инлайн-редактор: Добавлен визуальный diff-просмотр изменений с подсветкой и кнопкой
[✏️ Редактировать].
[2026-08-10] — Механизм эфемерных сообщений и очистки диалога
✨ Добавлено
- Эфемерные сообщения (
is_ephemeral): Маркировка временных сервисных ответов и черновиков. db_purge_ephemeral_messages: Механизм физической зачистки временных записей из SQLite при завершении операций.- Интерактивные виджеты: Поддержка карточек задач (
TASK_INTERACTIVE_CARD) с кнопками быстрого действия.