Skip to content

v1.27.0

Choose a tag to compare

@github-actions github-actions released this 05 Jul 17:41

Исправительно-качественный релиз: три доработки для качества поиска и экономии токенов, намайненные из e2e-прогона v1.26.1 (аудит code=<…> в server.log). Read-only слой: схема и BUILDER_VERSION (14) НЕ менялись, пересборка боевых индексов НЕ требуется — существующие индексы лечатся read-time фильтром; правки build/live-экстракторов и runtime-нуджей касаются будущих сборок и стратегии.

Исправлено

  • find_register_movements больше не возвращает ложный «регистр» Записать (и другие методы набора движений). Регексп Движения.(\w+) захватывал имя BSL-метода из Движения.Записать() (фиксация всех наборов движений), Движения.Очистить() и т.п., и клал его в code_registers — агент видел несуществующий регистр. Теперь во всех экстракторах стоит lookahead-before-capture Движения\.(?!\w+\s*\()(\w+) (запрет ставится ДО захвата — иначе жадный \w+ откатывался бы к Записат без «ь» и протаскивал усечённый артефакт), а рядом — консервативный стоп-набор однозначных collection-методов (записать/прочитать/очистить/выгрузить/модифицированность/…). Реальный регистр (Движения.Рег. / Движения.Рег[…]) никогда не сопровождается ( и сохраняется; неоднозначные имена (Количество/Добавить/Отбор/…) в стоп-набор НЕ включены, чтобы read-time не дал false-negative на чужой конфигурации. Существующие индексы чинятся централизованным read-time фильтром в IndexReader.get_register_movements() / get_register_writers() (без пересборки), покрывающим всех потребителей таблицы — и find_register_movements, и секцию registers в get_object_profile. Фильтруется только source="code"; erp_mechanism/manager_table/adapted (кавыченные регекспы) не трогаются. Документ, где все code-строки — шум, отдаёт [] (авторитетное «нет движений»), а не None.
  • get_object_profile(...).sections.roles больше не недосчитывает роли. Секция звала get_roles_exact(ref) (только объектные гранты object_name = 'Document.X') и роняла member-level гранты (Document.X.Command.Y), тогда как find_roles их учитывает — агрегат расходился с прямым запросом, агент не доверял ему и перезапрашивал (лишние токены + неверный первый ответ). Теперь секция зовёт get_roles_exact(ref, include_members=True): WHERE стал якорным (object_name = ? OR object_name LIKE ? || '.%'), поэтому member-гранты попадают в счёт, а омонимы-префиксы (Document.XYZ) — нет; агрегат стал точнее самого find_roles (тот над-матчит подстрокой). При этом LIKE-метасимволы _/% в ref экранируются (ESCAPE), чтобы легальный _ в имени объекта 1С (напр. тст_Смета) не работал как one-char wildcard и не подтягивал member-гранты near-омонима. Схема/данные не менялись — только семантика WHERE.

Добавлено

  • Efficiency-hint redundant_get_index_info. В ответе rlm_execute появляется нудж, если get_index_info() вызван 1-м или 2-м вызовом сессии (низкий seq) — его полезная нагрузка (builder_version/has_*/counts) уже приходит в rlm_start.index, так что отдельный вызов на старте тратит round-trip впустую. Мид-сессийный вызов ради нишевых полей (has_regions/has_module_headers/extension_overrides) имеет высокий seq и нудж не вызывает. Механика зеркалит существующие 3 хинта (throttle — один раз за сессию, живёт в метаданных ответа, не в stdout/return); сообщение — позитивный редирект на rlm_start.index.
  • Ротация server.log по времени на старте (Win + Linux). При каждом старте службы/сервера записи старше RLM_LOG_RETENTION_DAYS дней (по умолчанию 20) удаляются, чтобы лог не распухал. Лог append-only и хронологический: ищется первая строка с меткой YYYY-MM-DD HH:MM:SS не старше сегодня − N, и всё до неё срезается (строки без метки — из stderr-редиректа службы — группируются с блоком, в котором стоят; если распознаваемых меток нет вовсе, лог не трогается). Распознаёт и timestamp watchdog-строк службы ([watchdog …], метка не в начале строки); чтение/запись побайтовые, поэтому хвост сохраняется verbatim и старые логи смешанной кодировки (до фикса 1.26.1) не портятся (без замены байтов на U+FFFD). Перезапись атомарная (temp + os.replace) и выполняется ДО открытия файла на запись: на Windows — в самой службе перед редиректом stderr дочернего процесса (дочерний свой прогон пропускает через RLM_UNDER_SERVICE, чтобы не усекать открытый службой файл); на Linux/при прямом запуске — перед созданием RotatingFileHandler. Ротационные бэкапы server.log.1..3 (по 5 МБ) не трогаются — они и так ограничены размером. 0/отрицательное значение отключает. Новый модуль log_retention.py, никогда не бросает исключений (ретенция не должна ронять старт). См. docs/ENV_REFERENCE.md.

Изменено

  • Нудж «не зови get_index_info() на старте» перенесён к данным и усилен. Строка-подсказка добавлена прямо в шапку динамического INDEX-блока стратегии (там, где физически лежат builder_version/has_*/counts), а обе существующие копии в секции BATCHING (slim + full) усилены формулировкой «пустая трата execute» и держатся в синхроне (тест test_strategy_data.py стережёт дрейф).

Совместимость

  • Схема и BUILDER_VERSION (14) НЕ менялись — пересборка боевых индексов не требуется. Лечение старых БД от register-movements-шума выполняется read-time фильтром в IndexReader. Новых таблиц/колонок нет; добавлена одна env-переменная RLM_LOG_RETENTION_DAYS (по умолчанию 20; ретенция server.log). Контракты хелперов сохранены; наблюдаемые изменения — исчезновение ложных регистров-методов из find_register_movements/get_object_profile, точный счёт ролей в агрегате и новый efficiency_hints-id redundant_get_index_info.

Полный список изменений: CHANGELOG.md