Skip to content

v1.18.0

Choose a tag to compare

@github-actions github-actions released this 07 Jun 11:37
· 6 commits to master since this release

Исправлено

  • Устойчивость контрактов хелперов («хрупкость контрактов»). Сравнительный e2e-раунд показал, что агент берёт задачи, но «цена» (retry, токены) — это угадывание правдоподобного, но неверного контракта хелпера: жёсткая ошибка либо «тихо пустой» результат. Лечим сами контракты, делая их толерантными (принимают оба варианта) или самокорректирующимися (вместо тихой ошибки — HINT, который агент уже умеет читать). Без изменения поисковых движков, схемы индекса и BUILDER_VERSION (14) — перестройка боевых индексов НЕ требуется (нормализация только на read/return-слое, build↔update байт-сходимость не затронута).
    • Толерантность ключей атрибутов (Фикс 1). get_object_full_structure отдаёт {name, synonym, type}, а find_attributes{attr_name, attr_synonym, attr_type}; агент, переносящий паттерн с одного хелпера на другой, писал a['attr_name'] на структуре и получал детерминированный KeyError (6 из 10 e2e-тестов). Новый dict-подкласс _AttrRecord принимает доступ по «чужому» имени ключа прозрачно (через [], .get, in), но итерация / .keys() / len() / json.dumps остаются каноничными — агент по-прежнему видит реальные имена и учится, нулевая цена по токенам (алиасы не сериализуются). Применён на всех helper-return-поверхностях обоих хелперов + parse_object_xml (вложенные записи attributes/dimensions/resources + tabular_sections[*].attributes). Алиасинг охватывает только триаду name/synonym/type; служебный attr_kind алиаса не имеет (намеренно — у структурных записей его нет). Teaching-тексты (slim/full-help, registry-recipe, Sandbox-hint) смягчены с «будет KeyError» на «attr_name — допустимый алиас».
    • params строкой → list[str] (Фикс 2). Сигнатура метода в extract_procedures/find_exports/search_methods возвращалась строкой → AttributeError при итерации. Новый разборщик _split_params (мини state-machine, устойчивый к удвоенным кавычкам BSL "" и строковому default с запятой вида Разделитель = ", "; отбрасывает регистронезависимый по-значению-префикс Знач/Val и хвост = <default>) применяется на helper-границе (после вызова IndexReader + в live-парсере _parse_procedures) идемпотентно (isinstance str-guard — list-вход не ломается, покрывает duck-typed/fake-ридеры). Build-time и хранение (params TEXT) не тронуты — нормализация только на агент-слое, без reindex. Дополнительно: sandbox-hint про форму params — если агент по привычке обращается к элементу как к list[dict] (p['name'] / p.get('name')) и ловит TypeError: string indices must be integers / AttributeError: 'str' object has no attribute …, _add_error_hints подсказывает, что элемент уже строка-имя (for name in m['params']), — самокоррекция вместо повторного угадывания.
    • find_callers_context — самокоррекция вместо тихой пустоты (Фикс 3). (1) module_hint=int (агент сдвинул позиционные аргументы) больше не роняет AttributeError внутри _normalize_module_hint (hint.strip()) — коэрсится в '' + _meta.arg_warning с явной сигнатурой find_callers_context(proc_name, module_hint, offset, limit); int-guard стоит ДО вызова ридера. (2) offset >= total (страница пуста, но вызывающие есть — total=6, returned=0) больше не выглядит как «нет вызовов»: _meta.hint сообщает о вероятно перепутанных позиционных аргументах. Guard симметричен для индексного (total_callers) и FS-fallback (total_files) путей; в индексном — ранним возвратом ДО authoritative-ветки и FS-fallback (которые перетёрли бы _meta). Поисковый механизм (get_callers, FS-scan) не изменён.
    • git_search пустой паттерн (Фикс 4a). Пустой/пробельный pattern уходил в git-движок и возвращал невнятную таймаут-заглушку → теперь ранний [{"error": "empty pattern", "hint": ...}] (list-форма, как любой результат git_search, а не голый dict).
    • HINT путей по формату дампа (Фикс 4b). _resolve_object_xml гадал .mdo vs Ext/*.xmlFileNotFoundError на CF. Теперь порядок XML-кандидатов и текст HINT ведутся фактическим форматом дампа (format_info.primary_format: CF → Ext/*.xml первым, EDT → *.mdo первым). Кандидаты переупорядочиваются, не сокращаются — все по-прежнему пробуются, корректность на смешанных CF+EDT-расширениях сохраняется. format_info уже прокинут в make_bsl_helpers — новых проводок не потребовалось.

Тесты

  • Новый файл tests/test_v1_18_0.py (32 теста): _AttrRecord (оба диалекта через []/.get/in, каноничные .keys()/json, isinstance dict, KeyError без алиаса) + интеграция обоих хелперов (index/live/parse_object_xml, включая ТЧ-колонки); _split_params (много/ноль/Знач+ЗНАЧ+Val case-insensitive/= default/строка с запятой/удвоенные кавычки/многострочная сигнатура/имя на Знач…) + идемпотентность на границе и stub-ридере; find_callers_context (offset-overshoot индекс+FS, module_hint=int без падения); git_search пустой паттерн → [{error,hint}]; format-aware HINT (CF/EDT ведут своим форматом) + порядок кандидатов на CF-дампе.

Проверено-неактуально

  • «Фолбэк при недоступности classifier» (Фикс 5) — НЕ реализуем. Поиск объектов 100% детерминирован (search_objects/search_methods → SQLite + Python-ранжирование с live-scan фолбэком); llm_query — явный опциональный хелпер, на пути поиска LLM нет. Сообщение «недоступность classifier» из e2e — слой re-ranking внешнего тест-агента, не наш код; наш сервер оба раза вернул корректный результат, фолбэк уже есть — добавлять нечему.
  • CF-aware HINT на glob_files (Фикс 4c) — вне скоупа. glob_files приходит колбэком из generic-слоя; CF-aware подсказка на его вызов = изменение контракта generic-хелпера, а не дешёвая правка в bsl_helpers.

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

  • Схема индекса и BUILDER_VERSION (14) не менялись — перестройка боевых индексов не требуется. Все изменения — на runtime/контракт-слое (read/return); семантика результатов (те же объекты/рёбра/тела) сохранена, меняется только их «упаковка». build↔update байт-сходимость не затронута.

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