v1.27.0
Исправительно-качественный релиз: три доработки для качества поиска и экономии токенов, намайненные из 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-idredundant_get_index_info.
Полный список изменений: CHANGELOG.md