Skip to main content
Glama

agent-semaphore

Eine Koordinationsschicht für parallele Codierungs-Agenten. Worktrees beseitigen Merge-Konflikte nicht – sie verschieben sie auf den Integrationszeitpunkt. agent-semaphore schließt die Lücke: absichtstragende Beanspruchungen (claims) von Bereichen, eine Warnung im Moment des Schreibens, Konfliktvorhersage bevor etwas committet wird und eine serialisierte Landing-Queue mit einem obligatorischen Test-Gate.

Local-first: kein Daemon, keine Cloud, kein Konto. Eine einzelne SQLite-Datei im git-common-Verzeichnis ist der gesamte Treffpunkt, sodass jeder Worktree des Repos sie konstruktionsbedingt sieht. Von Haus aus herstellerübergreifend — Claude Code Hooks und MCP, Codex CLI über MCP, alle anderen über einen git pre-commit Hook.

CI License: MIT Python 3.12+


Das Problem

Von Agenten geschriebene Pull-Requests haben eine Konfliktrate von 27,7 % – im Vergleich zu 10–20 % bei menschlichen (AgenticFlict, 107K+ Agenten-PRs). Bei ko-aktiven Paaren beträgt die Aufteilung 19,8 % Intra-Agent vs. 41,7 % Cross-Agent: Agenten haben keine horizontale Wahrnehmung voneinander, und jedes Produkt, das Koordination ausliefert, koordiniert nur seine eigenen Agenten. Ein schlecht gelöster Konflikt weist eine bis zu ~26x höhere Fehlerdichte auf als normaler Code (EMSE 2020) – der teure Teil ist nicht der Konflikt, sondern die stille, schlechte Lösung.

Isolation ist gelöst und standardisiert (ein Worktree oder Container pro Agent – jeder liefert es aus). Vorhersage und Integration nicht: niemand führt git merge-tree zwischen aktiven Worktrees aus, und eigenständige lokale Merge-Queues existieren praktisch nicht.

Was es tut

Ebene

Mechanismus

Beanspruchungen

Leases, keine Locks: TTL, Verlängerung durch Aktivität, monotone Fencing-Epochen, eine obligatorische Absicht (reason). Atomare Alles-oder-Nichts-Akquisition des gesamten Scope-Sets in kanonischer Pfadreihenfolge, sodass Deadlocks konstruktionsbedingt unmöglich sind. exclusive / shared / intent Modi. Stehlen ist nur von einem toten Halter oder einem Menschen legal und wird protokolliert. Das Freigeben eines Scopes weckt die Wartenden und teilt ihnen mit, auf welchen Branch sie rebasen sollen.

Durchsetzung

Ein PreToolUse Hook (schreibgeschützt gegen die DB, p95 ≈ 16–47 ms), der jeden Schreibzugriff sieht: geschützte ("heiße") Klassen werden immer verweigert, der Scope eines anderen Agenten wird im warn-Modus einmal und im strict-Modus dauerhaft verweigert. Der Verweigerungstext ist für das Modell geschrieben – er nennt den Halter, seine Absicht, seinen Branch und den genauen nächsten Aufruf. Ein PostToolUse Hook beansprucht automatisch, was geschrieben wurde. Ein git pre-commit Hook ist der herstellerneutrale Boden für Agenten ohne Hooks und für Menschen.

Radar

Schnappschüsse von schmutzigen Worktrees, erstellt über einen temporären Index (niemals den Arbeitsbaum verändernd), paarweise verglichen mit git merge-tree --write-tree. Der Baum wird zweimal erstellt: wenn die beiden Erstellungen abweichen, wird der Schnappschuss als UNSTABLE gemeldet, niemals als CLEAN. Status: CLEAN / TEXTUAL / STRUCTURAL / HEAVY, mit ConE-artigen Rauschfiltern.

Warteschlange

FIFO unter flock, ein Eintrag in Bearbeitung. Rebase in einem Scratch-Worktree, dann ein obligatorisches Test-Gate, dann Fencing gegen die globale High-Water-Epoche, dann ein git update-ref CAS in einen Staging-Branch. Ein Konflikt wird an den Autor zurückgeworfen mit Anweisungen ("your context is freshest"), und nach jeder Landung wird allen mitgeteilt, dass sich das Ziel verschoben hat.

Harte Garantien existieren an genau einer Stelle: dem Landing-Pfad. Hooks und pre-commit sind kooperative Zugangskontrolle und Telemetrie, keine Sicherheitsgrenze — ASEM_HOOK_OFF=1 und ASEM_OVERRIDE=1 sind dokumentierte, geprüfte Notausgänge. Dies wird vorab gesagt, weil eine Koordinationsschicht, die vorgibt, eine Sandbox zu sein, schlimmer ist als keine.

Schnellstart

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

Exit-Codes sind Teil des Vertrags: 0 ok/frei, 3 gehalten/Konflikt/zurückgeworfen, 2 Nutzung, 1 interner Fehler — ein Skript kann "Koordination sagt nein" von "das Werkzeug ist kaputt" unterscheiden.

Gemessen

Niemand in diesem Bereich hatte gemessen, ob Beanspruchungen tatsächlich Konflikte reduzieren, daher liefert das Repo zwei eigene Benchmarks.

Skriptbasiert (docs/benchmark.md, 60 Läufe, deterministische Agenten, Compliance = 1 konstruktionsbedingt): Integrationskonflikte 60 % → 0 %, menschliche Eingriffe 9 → 0.

Live-Agenten (docs/bench-llm.md, 40 Läufe von zwei gleichzeitigen claude -p Agenten, $17,95):

Modus

ICR

WME

did_work

caught-up

$/Lauf

COR

keine Koordination

40%

2

100%

0%

$0.34

1.00x

beratende Beanspruchungen

20%

1

100%

40%

$0.50

1.72x

Beanspruchungen + Radar

10%

2

80%

40%

$0.46

1.93x

streng + Warteschlange

0%

0

100%

40%

$0.50

1.98x

Drei Erkenntnisse, die das skriptbasierte Testgerüst strukturell nicht produzieren konnte:

  1. Konflikte werden durch das Catch-up beseitigt, nicht durch die Beanspruchung. 10 von 10 Läufen, in denen ein Agent auf den Branch seines Peers rebasierte, fusionierten sauber; jeder konfliktreiche koordinierte Lauf ist einer, in dem beide Agenten höflich beanspruchten und keiner rebasierte. Eine Beanspruchung serialisiert Schreiben — sie gibt dir nicht das Ergebnis des anderen Agenten. Diese Erkenntnis führte zur Funktion "Freigabe weckt die Wartenden und nennt den Branch".

  2. Der Hook wurde in 40 Läufen kein einziges Mal ausgelöst. Mit dem Protokoll im Prompt beanspruchen Agenten vor dem Bearbeiten und schreiben nie in einen gehaltenen Scope, sodass sich die Durchsetzung als nicht benötigte Versicherung herausstellte — nicht als die arbeitende Schicht.

  3. Koordination kann einen Konflikt in Arbeit verwandeln, die nie stattfand. In zwei Läufen zitierte der blockierte Agent den Halter, seine Absicht und seinen Branch und gab seine Aufgabe auf. Ohne die did_work-Spalte neben ICR lesen sich diese Läufe als sauberer Erfolg — weshalb die Spalte da ist.

Semantische Drift (textuell sauber, semantisch kaputt) überlebt jede beratende Schicht in beiden Benchmarks und wird nur durch das obligatorische Gate der Warteschlange abgefangen.

Wie es eingebunden wird

  • Claude Codeasem install schreibt .claude/settings.json des Projekts (PreToolUse + PostToolUse), fügt Bash(asem:*) und mcp__semaphore__* zur Allow-Liste hinzu und registriert den MCP-Server in .mcp.json. Committete Verkabelung ist host-portabel ($HOME und ein nacktes asem), sodass ein über Maschinen geteiltes Repo nicht die Pfade eines Hosts trägt.

  • MCP (asem mcp, server key semaphore) — claim, release, check, status, extend, report_intent, radar, enqueue_land, land_status. Jede Antwort leert ausstehende Benachrichtigungen, sodass Agenten ohne Polling von Diebstählen, Zurückweisungen und verschobenen Zielen erfahren.

  • Codex CLI — derselbe MCP-Server via ~/.codex/config.toml, plus ein Protokollschnipsel für AGENTS.md. Headless Codex bricht MCP-Aufrufe stillschweigend ab, es sei denn, die Tools sind vorab genehmigt; docs/integration.md enthält die funktionierende Konfiguration.

  • Alles andereasem install --git-hooks platziert ein pre-commit-Gate im gemeinsamen Hooks-Verzeichnis (es lädt jeden vorher vorhandenen Hook nach).

Dokumentation

Status

v1 ist implementiert und dogfooded: das Repository koordiniert seine eigenen Agenten darüber. 150 Tests, ein p95 Hook-Latenz-Gate in CI, beide Benchmarks aus dem Repo reproduzierbar.

Bekannte Grenzen, klar ausgesprochen: Promotion vom Staging-Branch zu main ist noch manuell und ungated (asem promote ist das nächste Feature); die Warteschlange pusht nie; es gibt kein Symbol-Level-Scoping, keine semantische Konflikterkennung jenseits des Test-Gates, keine LLM-Autoauflösung (die veröffentlichte Obergrenze liegt bei ~55–60 % Korrektheit, was nicht gut genug ist, um unbeaufsichtigt zu laufen); und Multi-Host ist ein v2-Design, obwohl das Schema bereits die host-Spalte trägt.

Entwicklung

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

Das PreToolUse Hook-Skript wird außerhalb des Pakets mitgeliefert und muss stdlib-only bleiben — es wird bei jedem Schreibvorgang jedes Agenten ausgeführt, hat also ein Latenzbudget statt Abhängigkeiten. Siehe CONTRIBUTING.md.

Lizenz

MIT — siehe 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