Effektvertrag
Ein Vertrag pro Server, geschrieben aus Tool-Beschreibungen, MCP-Annotationen und README — vor dem ersten Probe-Aufruf, mit Vorhersagen, die vor dem Lauf feststehen.
Forschung · AI Safety · Agent Control
Effektverträge für Tools, die niemand geprüft hat.
Autonome Agenten handeln über Tools, deren Beschreibungen verschweigen können, was sie mit Dateien, Prozessen, dem Netzwerk und ihrem eigenen Zustand tun. VAC baut überprüfbare Effektverträge, die drei Dinge verbinden: was ein Tool deklariert, was isolierte Ausführung zeigt und was ein Controller vor dem Aufruf freigeben darf. Und VAC misst, was diese Entscheidungen kosten — in zurückgehaltenen legitimen Aufrufen.
tools/list01 Die Frage
Agenten handeln über Tools, und Tools kommen schneller hinzu, als jemand ihren Code liest. Das Model Context Protocol verlangt nicht, dass die Beschreibung eines Tools seiner Implementierung entspricht, und erklärt seine eigenen Effekt-Annotationen (readOnlyHint, destructiveHint) für nicht vertrauenswürdig.
Berechtigungssysteme, Informationsfluss-Grenzen und AI-Control-Protokolle leiten trotzdem aus genau diesen Deklarationen ab, was ein Agent tun kann: Ein als read-only annotiertes Tool wird automatisch freigegeben, ein Tool ohne deklariertes Netzwerk gilt nicht als Senke. Ein Tool, das zusätzlich außerhalb des überwachten Bereichs schreibt, einen Prozess startet oder einen unbekannten Host kontaktiert, öffnet einen Aktionskanal, den der Controller nicht modelliert.
VAC macht diese Lücke messbar und entscheidet sie vor dem Aufruf.
Was muss ein Controller über die Effekte eines Tools wissen, um einen Aufruf zu entscheiden — wie viel davon kann er aus Dokumentation und isolierter Ausführung gewinnen, für ein Tool, das er nicht geschrieben hat, zu welchen Kosten in abgelehnten legitimen Aufrufen, und wo endet dieses Wissen?Die Forschungsfrage von VAC
02 Methode
Ein durchgehender Evidenzpfad von der Dokumentation eines Tools bis zur Entscheidung, die ein Controller vor dem Aufruf trifft.
Ein Vertrag pro Server, geschrieben aus Tool-Beschreibungen, MCP-Annotationen und README — vor dem ersten Probe-Aufruf, mit Vorhersagen, die vor dem Lauf feststehen.
Der unveränderte Server läuft in einer frischen Sandbox in einem privaten Netzwerk-Namespace, dessen einziger Ausgang die Harness ist. Aufgezeichnet werden Dateisystem-Snapshots, jeder fork und exec über den Process Connector des Kernels, Sockets und jeder Netzwerkversuch beim Namen.
Ein Grader klassifiziert jede beobachtete Änderung gegen den Vertrag. Controller entscheiden vor dem Aufruf; der Guard setzt die Entscheidung als MCP-Proxy vor dem unveränderten Server durch und schreibt sie in ein hash-verkettetes Ledger.
Grader-Klassen
03 Befunde
13 Server, ausgewählt nach einer Regel, die vor dem ersten Probe-Aufruf feststand: alle offiziellen Referenzserver, die lokal über stdio laufen, vier Varianten des MSB-Benchmark-Servers und zwei weit verbreitete Drittanbieter-Server mit reichem lokalem Zustand.
Ein nicht deklarierter Subprozess bei jedem der 267 Aufrufe (python3 --version). DNS-Anfragen an einen Telemetrie-Fallback-Host, den die README nicht abdeckt, bei 81 Aufrufen.
Als readOnlyHint annotierte Tools schreiben .git/index neu: Nach einem git_reset hinterlässt git read-tree Einträge ohne Stat-Daten, und der nächste git_status oder git_diff_unstaged frischt sie auf.
Journal-, Lock- und Papierkorbdateien bei jeder Mutation, die nur die README deklariert; move_note schreibt die Notizen um, die auf die verschobene Notiz verlinken.
Zwei Varianten weichen bei jedem Aufruf ab und werden beim ersten Probe-Aufruf erkannt; die dritte steckt ausschließlich in der ausgelieferten Tool-Definition, als zusätzlicher Parameter.
ab Probe 1filesystem, sqlite, memory, everything, fetch, time und MSB normal verhalten sich genau wie deklariert.
04 Entscheidung vor der Ausführung
Die Index-Rewrites von git hängen vom Zustand ab, nicht von den Argumenten. Das Zustandsprädikat S liest .git/index vor dem Aufruf und markiert Einträge ohne Stat-Daten. Es wurde vorregistriert, im Controller-Lauf geprüft — 12 von 12 Rewrites über 85 Aufrufe — und dann eingefroren auf zehn Seeds angewendet, die kein früherer Lauf verwendet hat.
| Controller | Rewrites erkannt | Zusätzliche Reviews |
|---|---|---|
S — Indexzustand vor dem Aufrufliest .git/index, markiert Einträge ohne Stat-Daten |
||
P2 — Historie seit dem letzten git_resetvorregistriertes Historien-Prädikat |
||
| Entscheidungsbaum, Tiefe 2ausgewählt auf den Controller-Seeds 7–8 | ||
| Per-Tool-Baselineangepasst auf denselben Seeds |
Quelle: real-mcp/analysis/GUARDED_RUN.md · aus den Receipts regeneriert
→ Durchsetzung
runtime/mcp_proxy.py attestiert Installation, Vertrag und ausgelieferte tools/list gegen gepinnte Digests, wertet S vor jedem Aufruf auf dem Index aus, schreibt die Entscheidung per fsync in ein hash-verkettetes Ledger und leitet nur freigegebene Aufrufe weiter. Die Prozessereignisse des Kernels und die Sandbox-Snapshots zeigen für keinen zurückgehaltenen Aufruf Aktivität.
Ein zurückgehaltener git_status lässt den Index für den nächsten Leser veraltet; wie ein Review aufgelöst wird — einmal freigeben, auffrischen, ablehnen — ist der operative Parameter, den WP2 misst.
05 Weitere Ergebnisse
Netzwerk
Auf die aufgezeichneten Receipts angewendet, markieren aufrufbezogene Netzwerk-Deklarationen 81 von 81 Aufrufen, die den undokumentierten Telemetrie-Host erreichten — darunter 8, die die toolweite Deklaration entschuldigt hatte.
Vertragsautorschaft
Verträge von sieben Sprachmodellen aus derselben Dokumentation stimmen bei 92–98 % der Tools in der Read-only-Absicht mit den menschlichen überein und weichen bei 13–46 % der Aufrufbewertungen ab. Dokumentation sagt, wofür ein Tool da ist; die Ausführung zeigt, was es berührt.
Statisch und dynamisch
Von 17 Verhaltensweisen fand der beste statische Scan 15; die Harness beobachtete alle 12, die Ausführung sehen kann — darunter den Index-Rewrite im git-Binary, den kein Scan sah.
Kontrollierte Studie
Mit dem unveränderten CaMeL-Interpreter führten zwei gehostete Modelle einen verborgenen zustandsabhängigen Effekt in allen 53 schädlichen Episoden ohne Veto aus und in keiner mit Veto.
06 Forschungsprogramm
Die Conformance-Map ist für Maintainer, die MCP-Registry und Client-Hersteller gemacht, die Annotationen in ihren Freigaberegeln verwenden — und für alle, die Controller auf CaMeL, FIDES oder AI-Control-Protokollen bauen.
Mindestens 60 lokal lauffähige MCP-Server, Dokumentation gegen beobachtete Effekte, bestehende statische und dynamische Werkzeuge als Vergleich neben der Harness.
Vor-Aufruf-Prädikate über Zustand und Historie für den zustandsabhängigen Teil der Map, ausgewählt vor dem Verkehr, auf dem sie bewertet werden, gegen budgetgleiche Baselines — mit der Review-Auflösung des Proxys als gemessenem Parameter.
Der eingefrorene Controller auf versiegelten Hidden-Effect-Tools, die eine zweite Person baut, mit Live-Agentenausführungen und einem unabhängigen Outcome-Grader.
Kerninvariante
VAC verengt eine bestehende Sicherheitsgrenze und erweitert sie nie. Unbekannte Effekte und geänderte Revisionen werden zur Prüfung zurückgehalten.
07 Reproduzierbar
Das Paket ist eine einzige Evidenzkette: Harness, Receipts, Controller- und Guarded-Runs, Guard und Proxy, Vertrags- und Static-Studien, die AgentDojo/CaMeL-Studie, Verifikation, Forschungsprotokoll und die Benachrichtigungen an die Maintainer.
$ git clone https://github.com/cakbudak/vac
$ cd vac
$ bash VERIFY.sh
# regeneriert jedes Label, jede Zusammenfassung und jeden Bericht
Kontakt
Für Zusammenarbeit, Fragen zu den Messungen oder den Einsatz der Conformance-Map in Client, Registry oder Controller.