Операции RAGRAF: выбор и границы¶
Справочник к навыку ragraf-core. Задача — выбирать операцию вместо чтения файлов
и знать, чего операция не показывает.
1. Полный набор¶
Фасад объявляет 38 операций вида op_* (src/ragraf/facade.py). Поверхность
инструментов агента — 40 инструментов с префиксом ragraf_
(src/ragraf/mcp_server.py). Разница не ошибка: инструментов больше, потому что
дополнительно выставлены приведение корпуса в актуальное состояние, выбор корпуса,
сводка телеметрии и состояние индекса, а одна операция фасада наружу не выставляется.
2. По типу вопроса¶
| Вопрос | Операция | Что показывает | Чего не показывает |
|---|---|---|---|
| Где определён символ | symbol |
файл, строки, вид, подпись, разобранные параметры | тела функции |
| Где ещё используется | references |
все места со ссылками | порядок выполнения |
| Кто вызывает | callers |
вызывающие с доказательством | вызовы через строку или ссылку из данных |
| Что вызывает | callees |
вызываемые | то же |
| Что затронет правка | impact |
достижимые места по графу | конфликты веток и время выполнения |
| Структурный срез | slice |
контекст без тел, только при полной сборке CPG | ничего при capability=degraded |
| Тело символа | code |
точный текст | смысл вызывающих его мест |
| Карта репозитория | repo_map |
файлы и объёмы в бюджете | связи между ними |
| Поиск по смыслу и словам | search |
чанки с путями и строками | доказательство связи, это поиск, а не граф |
| Несколько строк сразу; где копии и какая рабочая | search_multi |
все вхождения по каждому запросу, кодировка файла, группировка по семействам, роль файла (точка входа / активный / копия) с ссылкой path:line |
смысл найденного кода |
| Какие файлы — копии друг друга | duplicates |
группы «одно имя с номерами» и байт-идентичные, главный файл и доказательство его активности | намерение автора: копия может быть веткой развития |
| Точки входа | entrypoints |
роуты, HTTP-обработчики, CLI-скрипты, endpoint'ы разметки; с path — достижим ли файл |
порядок выполнения внутри обработчика |
| Что не подключено | dead_code |
файлы и подпрограммы без входящих ссылок И вне достижимости, с причиной и списком оправданных (refuted) |
«удалять»: это находка, а не решение |
| Что в таблице | schema |
колонки, типы, PK/UNIQUE/AUTO_INCREMENT и генерируемые колонки из миграций | фактическое состояние живой базы |
| Кто читает или пишет таблицу | table_usage |
места чтения и записи, текст запроса и способ вызова (prepared/прямой) |
права доступа базы данных |
| Можно ли так записать | write_check |
сверка плана записи со схемой до выполнения | типы значений и ограничения |
| Кто и почему получает право | policy_trace |
ветви решения, точки отказа | фактическую роль пользователя |
| Что в ЖИВОЙ базе | db_schema |
базы, таблицы, колонки, типы, индексы | схему из миграций |
| Устройство одной таблицы | db_table |
колонки, индексы, ключи, скрытые поля | связь derived как факт |
| Связи таблицы | db_relations |
stated (факт) и derived (вывод) раздельно |
считать вывод структурой |
| Как выглядят данные | db_sample |
сборный пример, домены значений | текущее состояние данных |
| Что изменилось в структуре | db_drift |
изменения между ревизиями И расхождения «миграции ↔ живая база» | изменение данных |
| Чего нет в базе из используемого кодом | db_cross |
used_missing (с источником имени, видом доступа и доказательством path:line), unused (с размером и признаком «база используется кодом»), write_paths, case_mismatch и слепые зоны dynamic_sql |
что удалять: это находка, а не решение |
| Что изменилось между ревизиями | diff |
файлы, символы, рёбра, а также регрессии: callers_lost (символ потерял всех вызывающих) и writes_lost (таблица перестала заполняться) |
смысл изменения: «исчезло» при capability=degraded может означать «не было разобрано» |
| Что мы уже знаем о проекте | note / notes |
короткие заметки с автором, временем и задачей | проверку: заметка — знание агента, а не факт индекса (source: note) |
| Можно ли искать по файлам, а не по индексу | gate |
решение allow/ask/deny, правило, причина и ответ в формате хука DSH (отказ — код 2) |
что гейт перепишет команду: он только разрешает, спрашивает или отказывает |
| Чем подтверждена работа по задаче | task_stats |
готовый отчёт: обращения, факты, заменённое чтение, ответы по устаревшей ревизии, решения гейта, заметки | смысл фактов: это сводка по журналу, а не проверка кода |
| Классы оформления | class_usage |
описано правило или нет, где применён | итоговый вид в браузере, каскад |
| Маршруты и обработчики | routes |
HTTP-маршруты и их обработчики | поведение за обработчиком |
| Актуальность индекса | freshness |
расхождение сумм, при необходимости реиндексация | качество самих фактов |
| Состояние индекса | index_status |
ревизия, полнота разбора, покрытие, стадии | ничего сверх состояния |
| Журнал расхождений | drift_report |
что изменилось после ревизии | тела изменений |
| Живое чтение | live_read |
текущее содержимое файла с пометкой отличий | связи и граф |
| Статистика обращений | usage |
вызовы, факты, экономия | смысл фактов |
| Реестр разработок | catalog |
что заведено и с какими числами | содержимое индекса |
3. Правила выбора¶
- Навигация — операция, содержание — чтение. «Где» отвечает операция; «как именно работает» требует чтения того фрагмента, который операция указала.
- План записи — всегда
write_check. Это единственная проверка, которая ловит несуществующую колонку до запуска кода. - Решения о правах — всегда
policy_trace. Читать большой набор ветвей глазами бесполезно: неизвестное действие, оставшееся разрешённым по умолчанию, видно только статически. - Перед правкой разметки —
class_usage. Отсутствие правила в стилях не даёт ошибки: страница отрисуется оформлением браузера и будет работать. sliceтолько при полной сборке. Иначе операция откажет с кодом 3 — это ожидаемое поведение, а не поломка.live_read— когда файл точно изменился после ревизии. В остальных случаях достаточно индекса, и это дешевле.
4. Готовые рецепты (десять типовых вопросов)¶
| Вопрос агента | Вызов | Что считается ответом |
|---|---|---|
| Где выводится эта строка | search / search_multi (несколько строк через |) |
пути и строки; в search_multi — кодировка файла и роль копии |
| Все списки расширений в проекте | search_multi с массивом запросов |
все вхождения сразу, сгруппированные по семействам |
| Кто пишет в таблицу | table_usage --mode write |
места записи, текст запроса, via (prepared или прямой вызов) |
| Какие ключи перевода есть | search по ключу, затем references("tpl:<ключ>") |
шаблон и код в одном узле графа |
| Что затронет правка кнопки/функции | impact |
достижимые места с разделением факт/вывод |
| Какие файлы — копии | duplicates |
группы, главный файл, чем доказана активность |
| Какие файлы не подключены | entrypoints, затем dead_code |
список с причиной и опровергнутыми кандидатами |
| Генерируемые колонки таблицы | schema (миграции), db_schema (живая база), write_check до записи |
generated_columns, generated_kind, columns_marks |
| Поиск в CP1251 | search_multi |
поле encoding у каждого хита подтверждает, что файл прочитан верно |
| Что изменилось после правок | diff (код), drift_report (расхождения), db_drift (схема) |
ревизии, что добавилось и исчезло, кто потерял вызывающих, какая таблица перестала заполняться |
| Ответ, а не сырые хиты | любая из search, search_multi, symbol, callers, impact с answer=true |
готовая фраза и ссылки файл:строка (≤ 1–2 КБ) вместо структурного JSON |
| «Что мы уже знаем» | notes (по задаче или подстроке), запись — note |
заметки агента с автором и временем; source: note отличает их от фактов |
5. Как читать ответ¶
Обязательные поля конверта: op (операция), index_rev (какая ревизия отвечала),
capability (full или degraded), drift (есть ли незакрытые расхождения),
provenance (откуда данные: индекс, живое чтение или смешанно), limits,
result, stale_warnings, found. Дополнительно бывают error и freshness.
found=falseпри коде 0 — это «не найдено», а не сбой.- Непустые
stale_warningsозначают, что факт мог быть затронут правками после ревизии; такой факт нельзя выдавать за актуальный без пометки. provenance=liveозначает, что данные получены чтением файла, а не из индекса: их доказательство — сам файл, а не ревизия.
6. Чего в проекте нет¶
- Нет языка запросов к графу. Только фиксированные операции; текст, похожий на запрос к графу, отвергается с ошибкой вызова.
- Нет штатной команды проверки версий зависимостей, хотя
requirements.txtеё обещает. - Нет единого раннера проверок: конфигурации pytest нет, файлы в каталоге
testsзапускаются по отдельности. Есть обёрткаpython tools/check_all.py(группаcore— по умолчанию,--listпоказывает состав групп), но это запуск существующих скриптов, а не pytest.