↓Перейти к содержанию
  1. Gortex/

Gortex: Неделя 3 — Temporal-граф, PR-ревью, overlay-сессии, daemon-first и 100+ инструментов

·7 минут·

Десять дней с момента 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