# πŸ“‹ Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (CHANGELOG) ВсС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ измСнСния Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹, инструмСнтов ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° SCUD Orion AI Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. ## [3.2.0] β€” 2026-08-27 ### 🧠 Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π±ΠΈΡ‚Ρ€Π°ΠΆ личностСй, агрСгация ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-пропусков ΠΈ Π°Π²Ρ‚ΠΎΠ·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ смСн #### ✨ Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ: - **Кэш сопоставлСний личностСй (`person_identity_mapping`)**: - Π‘ΠΎΠ·Π΄Π°Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² SQLite (`core/schema.py`) для постоянного хранСния ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… связок ΠΌΠ΅ΠΆΠ΄Ρƒ сырыми ЀИО Π‘ΠšΠ£Π” ΠΈ эталонными ЀИО 1Π‘:Π—Π£ΠŸ. - ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ извлСчСния ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… сопоставлСний Π² `merger.py` (врСмя Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ < 1 мс). - **АгрСгация Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² пропусков ΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-ΡƒΡ‡Π΅Ρ‚ΠΎΠΊ Π‘ΠšΠ£Π” (`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` $\rightarrow$ `static_reason_workers.csv`. #### πŸ”§ ИзмСнСно: - **Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² Excel (`excel_exporter.py`)**: - ИзмСнСн Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ сохранСния ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² Π½Π° `output/reports/Π“ΠžΠ”/ΠœΠ•Π‘Π―Π¦/`. - Π’ Π•ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ сводкС Π±Π»ΠΎΠΊ Β«Π’ Ρ‚ΠΎΠΌ числС Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅Β» вынСсСн ΠΏΠΎΠ΄ Β«Π˜Ρ‚ΠΎΠ³ΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅Β», Π° Π±Π»ΠΎΠΊ Β«Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΒ» Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² самом Π½ΠΈΠ·Ρƒ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ. - Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Excel (`PermissionError`/`OSError`): ΠΏΡ€ΠΈ занятости Ρ„Π°ΠΉΠ»Π° создаСтся рСзСрвная копия с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ. - **ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π‘ΠšΠ£Π” (`services/scud_export.py`)**: - Актуализирован адрСс сСрвСра MS SQL ΠžΡ€ΠΈΠΎΠ½ (`172.16.200.147\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`). ### πŸ”§ ИзмСнСно * **`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`), Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΎ спам нСсколькими Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ инструмСнтов Π½Π° ΠΎΠ΄ΠΈΠ½ запрос. * **`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`) с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ быстрого дСйствия.