- Андрей Куманяев/
- Gortex/
- Gortex: Неделя 3 — Temporal-граф, PR-ревью, overlay-сессии, daemon-first и 100+ инструментов/
Gortex: Неделя 3 — Temporal-граф, PR-ревью, overlay-сессии, daemon-first и 100+ инструментов
Десять дней с момента v0.39.0, ~200 коммитов. Количество инструментов перевалило за 100. Вот что вышло.
Daemon-first архитектура #
gortex server — отдельный HTTP-сервер, который раньше жил как самостоятельный бинарник — упразднён. HTTP API теперь это gortex daemon --http, запускаемый из того же процесса, который держит живой граф. Одни процесс, один граф, один набор файловых вотчеров. gortex mcp автоматически определяет запущенный daemon и передаёт ему управление — граф уже тёплый на первом вызове инструмента.
Параллельно появилась федерация daemon’ов. gortex proxy позволяет единому daemon’у маршрутизировать запросы между локальными и удалёнными инстансами Gortex — локальные репозитории через Unix-сокет, общий облачный индекс по HTTPS, и активный daemon выбирает нужный таргет на основе запроса. Управление ростером — через gortex daemon server add/remove.
Temporal-граф: воркфлоу-интеллект #
Граф теперь понимает Temporal. Определения воркфлоу, регистрации активностей, запуски воркфлоу, вызовы активностей, отправки сигналов и query-вызовы извлекаются как полноценные ноды и рёбра графа — в Go и Java, кросс-языково.
Что это даёт на практике: если Go-воркфлоу вызывает Java-активность, ребро вызова существует в графе. flow_between прослеживает данные от триггера воркфлоу до результата активности без чтения промежуточных файлов. analyze kind=temporal_orphans находит определения активностей, которые никто не диспатчит — зарегистрированы, но никогда не вызываются. analyze kind=temporal_verify проверяет, что у каждой активности, запускаемой воркфлоу, есть соответствующая регистрация, и что каждый сигнал, который воркфлоу отправляет, имеет обработчик.
Java-сторона обрабатывает канонические имена классов и wrapper dispatch — паттерн, распространённый в Temporal Java, где стаб получается через типизированную фабрику.
PR-ревью: gortex review #
Полноценная поверхность для PR-ревью, 12 новых инструментов. Подход опирается на граф: changeset проецируется на символы, символы несут blast radius и fan-in по вызовам, граф убирает ложные срабатывания до того, как LLM увидит diff.
Ключевые инструменты:
review_pack — единая точка входа для PR-ревью. Объединяет граф-ревью, семантическую классификацию символов, риск по файлу, проверку impact на контракты и архитектурные границы, а также затронутые тестовые цели — в один ответ с вердиктом BLOCK/REVIEW/APPROVE и verification_command.
critique_review — второй, adversarial проход по результатам предыдущего ревью. Определяет, какие из находок реальные, а какие — ложные срабатывания. Возвращает сохранённые, отклонённые (с причинами) и пересмотренный вердикт.
triage_prs — ранжирует открытые PR по приоритету ревью на основе графа. Пять осей риска (blast-radius flow, caller fan-in, coverage gap, security keywords, community span) складываются в один составной score. use_llm: true добавляет LLM-re-rank проход с обоснованием по каждому PR.
conflicts_prs — риск конфликтов при мёрже. Проецирует каждый PR на сообщества графа, которых он касается, и выявляет PR, конкурирующие за одни и те же сообщества, с предложением безопасного порядка мёржа.
suggest_reviewers — комбинирует CODEOWNERS-матчи, недавнее авторство изменённых символов и co-change эксперты в ранжированный список ревьюеров с обоснованием.
post_review — публикует находки как inline-комментарии к GitHub PR, привязанные к файлу и строке. Перед отправкой редактирует секреты. dry_run: true показывает, что будет отправлено, без сетевого вызова.
gortex prs — дашборд в CLI, показывает открытые PR со статусом ревью (DRAFT/BASE_MISMATCH/CHANGES_REQUESTED/APPROVED/STALE/READY), сводкой CI и блокерами мёржа. gortex review запускает полное ревью из терминала.
change_contract pipeline #
change_contract теперь выполняет проход вердикта перед любой записью: gate риска, блокирующий изменение, если blast radius превышает пороговое значение, и ledger ack-TTL, который фиксирует, какие callers были явно просмотрены. Записи, затрагивающие символ с большим blast radius без ack в ledger’е, отклоняются. propagate-delete выполняет фиксированную точку обхода сирот — при удалении символа проход проверяет, стали ли его callers мёртвыми, и распространяет удаление вверх.
symbols_for_ranges проецирует диапазоны строк из diff’а на идентификаторы символов — мост между авторским diff’ом и граф-уровневыми проверками безопасности.
edit_file и edit_symbol получили защиту от ошибок парсинга: файл разбирается после записи, и если парсинг производит ошибки, которых не было до записи, запись откатывается.
Live overlay-сессии и спекулятивное выполнение #
Overlay-сессии запущены. Расширения редакторов push’ат in-flight (несохранённые) буферы как оверлеи; Gortex формирует теневое представление поверх неизменного базового графа и маршрутизирует каждый вызов инструмента через него. find_usages, get_call_chain, get_dependents и остальные видят состояние буферов редактора без каких-либо изменений в инструментах. Базовый граф никогда не мутирует.
На той же подложке теневого графа preview_edit и simulate_chain отвечают на вопрос «что изменится, если применить эту правку?» — без записи на диск. На входе — стандартный LSP WorkspaceEdit. На выходе: затронутые файлы, добавленные/удалённые/переименованные символы, сломанные callers, сломанные реализаторы интерфейсов, сводка blast radius, рекомендуемые тестовые цели и (при настроенном LSP) диагностика после применения.
simulate_chain выполняет упорядоченную последовательность правок с пошаговым impact и накопленной сводкой. keep: true превращает финальное симулированное состояние в реальную overlay-сессию — агент может спланировать рефакторинг, симулировать его, убедиться, что ничего не сломалось, и затем перевести план в редактируемое рабочее состояние.
Overlay-сессии также поддерживают ветвление: N параллельных спекулятивных веток от одной базовой линии, чтобы агент мог удерживать стратегию A и стратегию B одновременно и сравнивать их через compare_branches.
LSP Java через jdtls #
Java Language Server (jdtls) полностью интегрирован. Парсинг HoverResult исправлен для нестандартного формата расширений jdtls. Concurrency ограничен, чтобы холодный старт на крупных Java-проектах не выедал файловые дескрипторы. Логика переподключения защищена от долгого старта jdtls. Maven и Gradle-проекты требуют явного доверия (.gortex.yaml: lsp.java.trust: true), так как инициализируют build-скрипты. Нормализация URI на Windows исправлена — jdtls отправляет URI вида file:///C:/..., которые нуждаются в специальном roundtrip пути.
Инструменты диагностики (get_diagnostics, subscribe_diagnostics, fix_all_in_file) теперь работают с Java, включая server-driven capability registration — jdtls объявляет возможности после initialize, и Gortex теперь принимает эти поздние регистрации вместо того, чтобы молча возвращать пустые результаты.
Провенанс свежести индекса #
Каждый проиндексированный файл теперь несёт запись провенанса: какая версия экстрактора его разобрала, когда он был последний раз проиндексирован, и какой был хэш содержимого. Версия экстрактора подмешивается в ключи кэша, так что обновление, меняющее разбор языка, автоматически инвалидирует устаревшие кэш-записи для этого языка.
Инструменты чтения файлов (get_symbol_source, get_file_summary, get_editing_context) несут inline freshness rider в ответах — небольшой блок, сообщающий, актуально ли возвращённое содержимое, время последнего индексирования и ожидается ли переиндексирование. Агенты могут проверить это перед критически важными правками.
Фоновый авто-индекс обрабатывает медленные случаи: WSL2-монтирования и сетевые файловые системы, не генерирующие надёжные fsnotify-события, получают периодический reconcile-проход.
Реестр LLM-провайдеров #
Внутреннее использование LLM в Gortex (для ask, critique_review, triage_prs и use_llm-фолдов) теперь настраивается через реестр провайдеров. Новые провайдеры: Azure OpenAI, GitHub Copilot, Cursor, OpenCode CLI и произвольные OpenAI-совместимые эндпоинты. Anthropic API получил prompt caching (включён по умолчанию для подходящих запросов) и extended thinking (opt-in на каждый вызов). Сентинели моделей Claude позволяют закрепить claude-sonnet или claude-opus без отслеживания полной строки модели.
# ~/.config/gortex/config.yaml
llm:
provider: anthropic
model: claude-sonnet
reasoning_effort: medium
# или:
provider: custom
base_url: http://localhost:11434/v1
model: qwen2.5-coder:32b
Retrieval: delta-паковка и RWR #
smart_context получил delta_from: передайте handle предыдущего context pack’а — и ответ будет содержать только символы, которые изменились или появились новыми относительно этого пакета. Полезно в агентных петлях, где кодовая база стабильна, а меняется только рабочий набор.
Reranking теперь включает Random Walk with Restart (RWR) / Personalized PageRank centrality. Символы, центральные для сообществ графа, набирают более высокий score при релевантности retrieval — это вытягивает важные хабы, которые точное совпадение и BM25 в одиночку склонны недооценивать.
Eval-хернесс (gortex eval recall) получил метрики P@K / R@K / MRR и подключаемые стратегии паковки. Нулевые запросы теперь логируются в append-only лог — самый чёткий сигнал о пробелах retrieval-пайплайна.
Git worktrees #
Git worktrees отслеживаются как независимые инстансы репозитория. Каждый worktree получает собственное пространство имён в графе — идентификаторы символов включают префикс worktree — поэтому две ветки могут быть проиндексированы одновременно без конфликтов. Полезно для агентов, которые часто переключаются между ветками и нуждаются в состоянии графа обеих.
Ledger сэкономленных токенов #
Ledger сэкономленных токенов теперь глобален на уровне машины и сохраняется в sidecar-базе данных. Предыдущие версии накапливали tokens_saved в памяти на сессию daemon’а — перезапуск обнулял всё. Теперь ledger переживает перезапуски, накапливается правдиво и периодически очищает старые записи.
gortex savings показывает накопленный итог и разбивку по инструментам. graph_stats по-прежнему возвращает уровень сессии; sidecar обеспечивает долгосрочную картину того, где граф больше всего экономит контекст.
Два дополнения, которые не вписались в основные разделы:
EOL-толерантные правки. edit_file, edit_symbol и batch_edit теперь сопоставляют old_string/old_source независимо от различий в окончаниях строк. LF-написанная замена совпадёт с CRLF-файлом, и запись будет использовать окончания строк самого файла. eol_normalized: true присутствует в ответе. Прежнее поведение (молчаливое несовпадение в CRLF-репозиториях, распространённых на Windows) вызывало много лишних Read-before-Edit roundtrip’ов.
Хуки для Gemini CLI и Antigravity. gortex init теперь пишет lifecycle hooks для Gemini CLI и Antigravity в дополнение к существующим девяти агентам. generate_skill стал graph-aware — генерируемые файлы SKILL.md отражают реальную структуру сообщества. Fence дрейфа skill-render проверяет сгенерированные навыки против живого графа и отмечает файлы, которые устарели.
Источник: github.com/zzet/gortex
curl -fsSL https://get.gortex.dev | sh
gortex install
gortex daemon start --detach
gortex init