Skip to main content
Glama

agent-semaphore

Координационный слой для параллельных агентов, пишущих код. Worktree'ы не устраняют конфликты слияния — они откладывают их на этап интеграции. agent-semaphore закрывает этот пробел: намерения-заявки (claims) на области, предупреждение в момент записи, прогнозирование конфликтов до коммита и сериализованная очередь посадки с обязательным тестовым шлюзом.

Локально-ориентированный: без демона, без облака, без аккаунта. Единственный SQLite-файл в общей директории git — это вся точка рандеву, поэтому каждый worktree репозитория видит её по построению. Кроссплатформенный по замыслу — хуки Claude Code и MCP, Codex CLI через MCP, все остальные через git-хук pre-commit.

CI Лицензия: MIT Python 3.12+


Проблема

Pull request'ы, написанные агентами, конфликтуют в 27,7% случаев — против 10–20% для человеческих (AgenticFlict, 107К+ PR'ов от агентов). В парах со-активных агентов разрыв составляет 19,8% внутриагентских против 41,7% межагентских: у агентов нет горизонтальной осведомлённости друг о друге, и каждый продукт, предоставляющий координацию, координирует только своих собственных агентов. Плохо разрешённый конфликт несёт до ~26x плотности ошибок по сравнению с обычным кодом (EMSE 2020) — дорогая часть не сам конфликт, а тихое плохое разрешение.

Изоляция решена и превращена в товар (worktree или контейнер на агента — все это предоставляют). Прогнозирование и интеграция — нет: никто не запускает git merge-tree между живыми worktree'ами, а автономные локальные очереди слияния практически не существуют.

Что он делает

Уровень

Механизм

Заявки

Аренда, никогда не блокировка: TTL, продление по активности, монотонные эпохи ограждения, обязательное намерение (reason). Атомарное приобретение всего набора областей в каноническом порядке путей по принципу «всё или ничего», поэтому взаимоблокировки невозможны по построению. Режимы exclusive / shared / intent. Кража разрешена только у мёртвого держателя или человека и аудируется. Освобождение области пробуждает ожидающих и сообщает им, на какую ветку перебазироваться.

Принуждение

Хук PreToolUse (только чтение БД, p95 ≈ 16–47 мс), который видит каждую запись: защищённые («горячие») классы всегда запрещены, область другого агента запрещена один раз в режиме warn и навсегда в strict. Текст отказа написан для модели — он называет держателя, его намерение, его ветку и точный вызов, который нужно сделать следующим. Хук PostToolUse автоматически заявляет то, что было записано. Git-хук pre-commit — это вендорно-нейтральный минимум для агентов без хуков и для людей.

Радар

Снимки грязных worktree'ов, сделанные через временный индекс (никогда не изменяя рабочее дерево), сравниваются попарно с помощью git merge-tree --write-tree. Дерево строится дважды: если две сборки расходятся, снимок помечается как UNSTABLE, никогда не CLEAN. Статусы: CLEAN / TEXTUAL / STRUCTURAL / HEAVY, с шумовыми фильтрами в стиле ConE.

Очередь

FIFO под flock, одна запись в полёте. Перебазирование в черновом worktree, затем обязательный тестовый шлюз, затем ограждение от глобальной максимальной эпохи, затем CAS через git update-ref в staging-ветку. Конфликт возвращается автору с инструкциями («ваш контекст самый свежий»), и после каждой посадки всем сообщается, что цель сдвинулась.

Жёсткие гарантии существуют ровно в одном месте: путь посадки. Хуки и pre-commit — это кооперативный контроль доступа и телеметрия, а не граница безопасности — ASEM_HOOK_OFF=1 и ASEM_OVERRIDE=1 являются документированными, аудируемыми запасными люками. Это заявлено заранее, потому что координационный слой, притворяющийся песочницей, хуже, чем его отсутствие.

Быстрый старт

uv tool install git+https://github.com/alwh1te/agent-semaphore     # asem on PATH
# or, from a clone: uv tool install -e .

cd <your repo>
curl -O https://raw.githubusercontent.com/alwh1te/agent-semaphore/main/.agent-semaphore.toml.example
mv .agent-semaphore.toml.example .agent-semaphore.toml   # set the gate command, hot classes, target branch
asem init                                   # state in .git/agent-semaphore/
asem install --git-hooks                    # Claude Code hooks + .mcp.json + git pre-commit
asem doctor                                 # PASS checklist
asem claim src/api/ -i "refactor auth parsing" --ttl 30m   # exit 3 = held by someone else
asem check src/api/routes.py                               # who holds it, and what for
asem radar                                                 # conflicts between worktrees, before any commit
asem land feature-branch                                   # rebase -> gate -> CAS into the staging branch
asem notices                                               # messages addressed to you
asem status | asem queue status | asem doctor

Коды выхода являются частью контракта: 0 ок/свободно, 3 занято/конфликт/отклонено, 2 использование, 1 внутренняя ошибка — скрипт может отличить «координация сказала нет» от «инструмент сломался».

Измерено

Никто в этой области не измерял, действительно ли заявки уменьшают количество конфликтов, поэтому репозиторий поставляет два собственных бенчмарка.

Сценарный (docs/benchmark.md, 60 запусков, детерминированные агенты, соответствие = 1 по построению): интеграционные конфликты 60% → 0%, вмешательства человека 9 → 0.

Живые агенты (docs/bench-llm.md, 40 запусков двух одновременных агентов claude -p, $17.95):

режим

ICR

WME

did_work

caught-up

$/run

COR

без координации

40%

2

100%

0%

$0.34

1.00x

рекомендательные заявки

20%

1

100%

40%

$0.50

1.72x

заявки + радар

10%

2

80%

40%

$0.46

1.93x

строгий + очередь

0%

0

100%

40%

$0.50

1.98x

Три вывода, которые сценарный стенд структурно не мог дать:

  1. Конфликты устраняются догонялкой, а не заявкой. В 10 из 10 запусков, где агент перебазировался на ветку своего коллеги, слияние прошло чисто; каждый конфликтный координированный запуск — это тот, где оба агента вежливо заявили области и ни один не перебазировался. Заявка сериализует запись — она не передаёт вам результат другого агента. Именно этот вывод породил функцию «освобождение пробуждает ожидающих и называет ветку».

  2. Хук ни разу не сработал за 40 запусков. С протоколом в подсказке агенты заявляют области перед редактированием и никогда не пишут в занятую область, поэтому принуждение оказалось страховкой, которая не понадобилась — а не рабочим слоем.

  3. Координация может превратить конфликт в работу, которая никогда не была выполнена. В двух запусках заблокированный агент процитировал держателя, его намерение и его ветку и отказался от своей задачи. Без столбца did_work рядом с ICR эти запуски читались бы как чистый успех — вот почему этот столбец существует.

Семантический дрейф (текстуально чисто, семантически сломано) переживает все рекомендательные слои в обоих бенчмарках и обнаруживается только обязательным шлюзом очереди.

Как это подключается

  • Claude Codeasem install записывает файл проекта .claude/settings.json (PreToolUse + PostToolUse), добавляет Bash(asem:*) и mcp__semaphore__* в белый список и регистрирует MCP-сервер в .mcp.json. Зафиксированная разводка переносима между машинами ($HOME и голый asem), поэтому репозиторий, общий для нескольких машин, не несёт пути одного хоста.

  • MCP (asem mcp, ключ сервера semaphore) — claim, release, check, status, extend, report_intent, radar, enqueue_land, land_status. Каждый ответ сливает ожидающие уведомления, поэтому агенты узнают о кражах, отскоках и перемещённых целях без опроса.

  • Codex CLI — тот же MCP-сервер через ~/.codex/config.toml, плюс фрагмент протокола для AGENTS.md. Headless Codex молча отменяет MCP-вызовы, если инструменты не предварительно одобрены; docs/integration.md содержит рабочую конфигурацию.

  • Всё остальноеasem install --git-hooks помещает шлюз pre-commit в общую директорию хуков (он цепляет любой хук, который был там раньше).

Документация

  • docs/00-research.md — исследовательское досье, на котором построен этот дизайн: измеренная проблема, ландшафт инструментов, классические предшествующие работы, которые стоит позаимствовать, статьи 2024–26 годов и три подтверждённых пробела на рынке.

  • docs/adr/ADR-001-architecture.md — архитектура, плюс реестр рисков и десять атак от слепого рецензирования (восемь из них изменили дизайн).

  • docs/adr/ADR-002-stack-and-state.md — стек, именование и местонахождение состояния.

  • docs/benchmark.md / docs/bench-llm.md — оба бенчмарка: метод, результаты и явно указанные ограничения.

  • docs/integration.md — установка и что куда подключено.

Статус

v1 реализована и используется на собственном опыте: репозиторий координирует через неё своих собственных агентов. 150 тестов, шлюз задержки хука p95 в CI, оба бенчмарка воспроизводимы из репозитория.

Известные ограничения, изложенные прямо: продвижение из staging-ветки в main всё ещё ручное и без шлюза (asem promote — следующая функция); очередь никогда не пушит; нет области на уровне символов, нет обнаружения семантических конфликтов за пределами тестового шлюза, нет авторазрешения LLM (опубликованный потолок — ~55–60% корректности, что недостаточно хорошо для работы без присмотра); и многопользовательский режим — это дизайн v2, хотя схема уже содержит столбец host.

Разработка

uv run pytest -q                          # 150 tests
uv run ruff check . && uv run ruff format --check .
uv run python bench/hook_latency.py 200   # hook latency gate (p95 < 100 ms)
uv run python bench/runner.py --seeds 3 && uv run python bench/report.py

Скрипт хука PreToolUse поставляется за пределами пакета и должен оставаться только со стандартной библиотекой — он запускается при каждой записи каждого агента, поэтому у него бюджет задержки, а не зависимости. См. CONTRIBUTING.md.

Лицензия

MIT — см. LICENSE.

-
license - not tested
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Coding agents from Claude Code, Cursor and Codex claim jobs and lock files on one shared board.

  • The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.

  • One shared brain for your AI coding agents: team memory, agent Q&A, tasks, and file claims.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/alwh1te/agent-semaphore'

If you have feedback or need assistance with the MCP directory API, please join our Discord server