Statischer Analyzer · Salesforce Agentforce

Der Aksu Index definiert die Messung. Agent Blast Radius ist die Referenzimplementierung.

Ihr Agent läuft als Benutzer.
Sein Code nicht.

Ein Agentforce-Agent ist durch die Berechtigungen des Benutzers begrenzt, als der er läuft — genau so lange, bis der Apex dahinter im System-Modus ausgeführt wird. Dann liest er Datensätze, die dieser Benutzer nicht sehen darf, und Felder, auf die er überhaupt keine Berechtigung hat. Nichts in der Agent-Builder-Oberfläche zeigt Ihnen das. Entschieden wird es von einer Versionsnummer in einer XML-Datei.

Ausgegeben wird der Aksu Index — vier Zahlen für einen Agenten und einen ausführenden Benutzer, definiert durch eine öffentliche Spezifikation, damit eine Zahl, die seinen Namen trägt, von Personen geprüft werden kann, die sie nicht erzeugt haben.

Agent Blast Radius löst genau das auf, mechanisch, für einen Agenten und einen ausführenden Benutzer. Es ruft keinen Agenten auf und verbraucht keine Flex Credits, denn es führt Ihren Agenten nie aus — es liest den Code dahinter.

Aksu Index: 6 proven (1 regulated) · 0 unproven boundaries · 1 unresolved
AKSU:1.0/P:6/C:1/B:0/U:1/fp:da237145496c
https://aksuindex.com/spec/v1.0

Das Ergebnis eines echten Berichts, vollständig: vier Zahlen, die Version der Spezifikation und der Fingerabdruck, der sie versiegelt. Eine Zahl ohne diese Angaben ist nicht diese Messung — so wie eine Temperatur ohne ihre Skala keine Temperatur ist.

Dieser Fingerabdruck gehört zu diesem Bericht, nicht zu Ihrem. Er versiegelt, was die Analyse-Identität sehen konnte, und die veröffentlichten Berichte wurden gegen ein Permission Set gemessen, während measure.py den eigenen ausführenden Benutzer des Agenten modelliert — eine andere Identität muss also ein anderes Siegel ergeben. Die vier Zahlen sind die Messung; der Fingerabdruck sagt, welcher Lauf sie erzeugt hat.

Wegen der Berichte hier? Einen davon lesen

Der Teil, den niemand misst

Unten läuft der tatsächliche Resolver, in Ihrem Browser. Stellen Sie die apiVersion von 58 auf 67 und sehen Sie zu, wie beide Achsen umspringen. Diese eine Zahl ist der Unterschied zwischen einem Agenten, der durch seinen Benutzer begrenzt ist, und einem, der es nicht ist — und die meisten Orgs haben Klassen auf beiden Seiten dieser Grenze.

Stellen Sie die drei Dinge ein, die darüber entscheiden

Sonst ändert sich nichts an der Klasse. Dies ist der Resolver, den der Analyzer ausführt, und es ist der Teil von Apex, der entscheidet, was Ihr Agent erreichen kann — bevor überhaupt jemand ein Permission Set ansieht.

apiVersionin der -meta.xml
sharing-Deklarationan der Klasse
Mode-Clausean der Query
Reader.cls
public with sharing class Reader {
  public List<Invoice__c> go() {
    return [SELECT Id, IBAN__c
            FROM Invoice__c];
  }
}
Reader.cls-meta.xml
<apiVersion>58.0</apiVersion>
Ergibt
Datensatz-Achsedurchgesetzt

Welche Datensätze zurückkommen — Eigentümerschaft und Sharing-Regeln.

Feld-Achsenicht durchgesetzt

Welche Felder zurückkommen — Objekt-CRUD und Field-Level Security.

weilAPI v<=66 system-mode default

Sharing wird beachtet, Objekt- und Feldsicherheit jedoch nicht — dies kann ein Feld lesen, auf das der Benutzer überhaupt keine Berechtigung hat.

Regeln, die dadurch in Betracht kommen
PS502Feldzugriff an der FLS des Benutzers vorbei, für jedes Feld in der Query, auf das dieser Benutzer keine Feldberechtigung hat
PS506reguliertes Feld erreicht das Modell, wenn ein solches Feld die org-eigenen Compliance-Kennzeichnungen trägt — dies ist der Leitfall

„Kann greifen“, nicht „greift“. Welche davon tatsächlich greift, hängt vom Sharing-Modell Ihrer Org und den Berechtigungen dieses Benutzers ab — den beiden Dingen, die diese Seite nicht hat und nicht erraten wird.

Dies ist eine Portierung des analyzer-eigenen _resolve(); der Build dieser Website schlägt fehl, sobald beide voneinander abweichen: Alle 24 Kombinationen werden aus dem Python erzeugt und bei jedem Deploy verglichen. Ein Widget, das eine Regel lehrt, der das Werkzeug nicht mehr folgt, wäre schlechter als gar kein Widget.

Belege

Zwei echte Orgs, am selben Tag gemessen

Die vier sind: nachgewiesen, reguliert, nicht nachgewiesene Grenzen, ungeklärt. Hier sind zwei Orgs, am selben Tag gemessen. Der nützlichste Satz, den dieses Werkzeug hervorbringt, lautet nicht „Ihre Org ist veraltet“ — er lautet: Sie können nicht wissen, welcher Teil zählt, bevor er gemessen ist, und es ist ein weit kleinerer Teil, als Sie befürchten.

Eine Handels-Org

Alle 113 Apex-Dateien vor v67. Die zwei Actions ihres Agenten sitzen auf genau diesem Altcode.

6 nachgewiesen (1 reguliert)
0 nicht nachgewiesene Grenzen
1 ungeklärt

Bericht lesen
Eine Versorger-Org

182 von 219 Apex-Dateien vor v67 — 83 % Altbestand. Und dennoch sind alle neun Actions ihres Agenten auf v67.

0 nachgewiesen (0 reguliert)
0 nicht nachgewiesene Grenzen
7 ungeklärt

Bericht lesen

Beide Links öffnen die Datei, die der Analyzer tatsächlich geschrieben hat — kein Muster, keine nachgezeichnete Abbildung. Jeder Bericht trägt sein Erstellungsdatum und den Fingerabdruck, der ihn versiegelt, einschließlich der Prüfsumme des Analyzers, der das Urteil gefällt hat. Sie sehen also genau, welchen Build Sie lesen.

Lesen Sie die zweite genau, denn das Werkzeug besteht darauf: Das ist nicht unbedenklich. Null nachgewiesen neben sieben ungeklärt heißt null nachgewiesen und sieben ungeklärt. Der Bericht sagt das ungefragt, in der Demo-Org des Autors selbst — denn ein Werkzeug, das sich weigert, den eigenen Agenten durchfallen zu lassen, hat sich das Recht nicht verdient, Ihren durchzulassen.

Jetzt Sie

Messen Sie Ihren eigenen Agenten

Alles bisher kam ohne Sie aus. Dies ist der einzige Schritt, der eine Organisation braucht — und er läuft auf Ihrem Rechner, gegen Ihre eigene authentifizierte Sitzung. Hier ist, was herauskommt, und danach, was es erzeugt.

  Org: TechnoStore

  Agent:        TechnoStore_Revenue_Assistant
  Planner bundle: TechnoStore_Revenue_Assistant_v1   (the org's name for it)
  Agent type:   ExternalCopilot
  Running user: ...@example.ext   (the agent's own, from BotUserId)

  Reading metadata. No agent is invoked and no Flex Credits are spent.

retrieving agent metadata ...
retrieving action sources: ApexClass:GetRevenueSummaryAction, ApexClass:SendPaymentRemindersAction
objects reached: ['Invoice', 'Invoice_Payment_Requested__e']

AKSU INDEX: 6 PROVEN (1 REGULATED) / 0 UNPROVEN BOUNDARIES / 1 UNRESOLVED
ESCALATION GAP: 6 field(s), 1 regulated
  ERROR: 8
  WARN: 4
  INFO: 2
reports written: reports\TechnoStore_Revenue_Assistant_v1.md , reports\TechnoStore_Revenue_Assistant_v1.html
RESOLUTION COVERAGE: 1 OF 2 ACTION(S) FULLY RESOLVED (50%) - 1 CARRY REACH THIS ANALYSIS COULD NOT DETERMINE

Das Protokoll eines Laufs gegen die erste der beiden oben genannten Organisationen, an beiden Enden gekürzt und mit ersetzter Adresse des ausführenden Benutzers — sie enthält eine Org-ID, und diese Website veröffentlicht keine. Alles Weitere ist wörtlich, einschließlich der Zeile, die sagt, dass die Hälfte der Aktionen nicht vollständig aufgelöst werden konnte.

Keine Argumente. Das Werkzeug fragt die Organisation nach Ihren Agenten und ermittelt für jeden die Identität, unter der Salesforce ihn tatsächlich ausführt — BotDefinition.BotUserId, also eine Tatsache und keine Vermutung.

macOS / Linux
sf org login web --set-default
git clone --branch v1.0.0 --depth 1 https://github.com/aksumustafa1625/agent-blast-radius ~/agent-blast-radius
cd ~/agent-blast-radius
python3 measure.py
Windows
sf org login web --set-default
git clone --branch v1.0.0 --depth 1 https://github.com/aksumustafa1625/agent-blast-radius $HOME\agent-blast-radius
cd $HOME\agent-blast-radius
py measure.py

git meldet „You are in 'detached HEAD' state“ und nennt einen Commit. Genau so sieht das Festlegen auf ein Release-Tag aus — das ist der Zweck des Tags, kein Problem. Sie erzeugen hier keine Commits; Sie lesen einen.

Python 3.12 oder neuer · git · Salesforce CLI · eine authentifizierte Organisation. Node ist optional, und nichts davon installiert es: diese vier Zeilen laufen immer mit dem Regex-Extraktor, und der Bericht sagt das in seiner eigenen Fußzeile. Für das Parse-Baum-Backend zuvor npm install in blast_radius/ ausführen — die beiden oben verlinkten Berichte sind so entstanden. Kein pip install. Ausschließlich die Python-Standardbibliothek.

Falls Ihr Rechner den Browser-Login blockiert, überspringen Sie die erste Zeile: sf org list ausführen und dann measure.py --org <alias> mit einem vorhandenen Alias aufrufen.

Meist anderthalb bis drei Minuten, und es kann länger dauern. Gemessen auf einem Windows-Rechner: 97 und 118 Sekunden gegen eine Org mit drei Aktionen, 135 gegen eine mit zwei — und am 1. September 2026 brauchte dieselbe Org mit neun Aktionen in drei aufeinanderfolgenden Läufen 167, 185 und 260 Sekunden. Gleicher Befehl, gleiche Org, fast die doppelte Spanne. Das sind Beobachtungen, keine Zusage. Länger dauert es, je mehr Aktionen der Agent hat, je mehr Objekte und Felder diese Aktionen erreichen und je mehr Agenten und Topics Ihre Org enthält — der erste Schritt ruft die Topic-Metadaten Ihrer Org ab, eine große Org zahlt dafür also auch bei einem kleinen Agenten. Es ist absichtlich langsamer geworden: Das Werkzeug ruft den analysierten Apex-Code jetzt immer neu ab, statt zu verwenden, was zufällig im Ordner liegt — eine veraltete lokale Kopie bedeutete einen Bericht über Code, den Ihre Org gar nicht ausführt. Fast der ganze Rest ist die Antwortzeit Ihrer Org: Die Compliance-Kennzeichnungen müssen Objekt für Objekt abgefragt werden — die Plattform verweigert eine unbegrenzte Abfrage. Die Analyse selbst dauert unter einer Sekunde; alles andere ist Warten auf Salesforce. Der Login-Schritt ist nicht enthalten; der liegt zwischen Ihnen und Ihrer IT-Abteilung.

Wenn der erste Lauf stehen bleibt

  • 'py' is not recognized — der py-Launcher ist nicht im PATH. Er kommt mit dem Python-3.12-Installer von python.org und erhält einen eigenen PATH-Eintrag; die Microsoft-Store-Variante liefert ihn nicht. Python 3.12 von python.org installieren, oder python measure.py verwenden, falls bereits ein echter Interpreter im PATH liegt.
  • Python was not found — unter Windows sind python und python3 in WindowsApps 0-Byte-Platzhalter des Microsoft Store, die standardmäßig im PATH stehen. Verwenden Sie py measure.py: Der py-Launcher kommt mit dem Installer von python.org und erhält einen eigenen PATH-Eintrag, unabhängig vom Häkchen "Add to PATH".
  • running scripts is disabled on this system — PowerShell bevorzugt den .ps1-Wrapper, den npm für sf anlegt, und die voreingestellte Ausführungsrichtlinie verweigert ihn. Führen Sie sf.cmd org login web --set-default aus, oder installieren Sie die Salesforce CLI mit ihrem Windows-Installer statt über npm.
  • git is not recognized — git installieren, oder ganz darauf verzichten: das Quell-ZIP von v1.0.0 auf der GitHub-Releases-Seite herunterladen, entpacken und ab der cd-Zeile weitermachen.
  • sf: command not found — die Salesforce CLI ist nicht im PATH. Unter Windows vermeidet ihr eigener Installer das oben genannte Richtlinien-Problem; sonst npm install --global @salesforce/cli
  • No default org is set — sf org login web --set-default ausführen. Eine Sandbox oder eine kostenlose Developer Edition genügt; es wird nichts hineingeschrieben.
  • This org has no Agentforce agents — dann gibt es hier nichts zu messen. Nehmen Sie stattdessen den Korpus-Weg unten.
  • This is an employee agent — ein Mitarbeiter-Agent läuft im Kontext des jeweils angemeldeten Benutzers; es gibt also keinen einzelnen ausführenden Benutzer. Das Werkzeug sagt das, statt einen auszuwählen, und fragt nach einer repräsentativen Identität.

Keine Agentforce-Organisation?

Sie können trotzdem den öffentlichen Korpus ausführen und das Ausführungssemantik-Modell selbst prüfen — 28 Fälle, ohne Organisation. Das validiert die Methode; es misst nicht Ihre Organisation. Der Korpus mit 28 Fällen

Und danach: den Wert halten

Baseline:  AKSU:1.0/P:6/C:1/B:0/U:1/fp:da237145496c
Current:   AKSU:1.0/P:7/C:1/B:0/U:1/fp:9d3ba…
→ FAIL: proven 6 → 7

--baseline fragt, ob es schlechter geworden ist, nicht ob es null ist — ein Gate, das null verlangt, wird in einer Legacy-Organisation binnen einer Woche gelöscht. Jeder Eimer rastet ein: eine Abfrage dynamisch zu machen, um einen Befund von „bewiesen“ nach „ungeklärt“ zu verschieben, bricht das Gate ebenfalls.

Methode

Was es tatsächlich tut

Es beantwortet mechanisch eine einzige Frage: Welche Objekte und Felder kann der Code hinter diesem Agenten für diesen ausführenden Benutzer erreichen — und wo geht das über das hinaus, was dieser Benutzer sehen darf?

  • Löst die Ausführungssemantik auf. apiVersion, sharing-Deklaration, Mode-Clauses — für Apex und für Flow, als zwei getrennte Achsen geführt, weil sie getrennt versagen.
  • Gleicht gegen die effektiven Berechtigungen ab. Profil, Permission Sets, Permission Set Groups und deren Muting — so aufgelöst, wie die Plattform sie auflöst, nicht angenähert.
  • Verschneidet mit Ihren eigenen Kennzeichnungen. Es liest die Compliance-Klassifizierungen, die Ihre Administratoren bereits vergeben haben. Welche Felder als reguliert gelten, entscheidet Ihre Org, nicht wir — DSGVO, CCPA, HIPAA oder interne Richtlinien nutzen denselben Mechanismus.
  • Verfolgt die Kette Daten → Prompt. Schritt für Schritt, vom Feld, das eine Query liest, bis zur Variable, die ein Prompt einsetzt.

Das Ergebnis ist ein Bericht und vier Zahlen: der Aksu Index, definiert durch eine gesondert veröffentlichte Spezifikation — damit die Zahl gegen eine Definition geprüft werden kann, über die ihr Autor im Augenblick Ihres Zitats keine Verfügungsgewalt hat.

Nachweis

Warum Sie das nicht einfach glauben sollten

Alles oben ist eine Behauptung. Dies sind die Dinge, die sie überprüfbar machen — und jede Zahl hier wird neu erhoben, bevor sie zitiert wird.

28 / 28
ein veröffentlichter Korpus

Handgelabelte Apex-Fälle, 21 davon von einer echten Salesforce-Org entschieden statt vom Autor. Öffentlich, per sha256 versiegelt, CC BY 4.0 — prüfen Sie Ihren eigenen Analyzer dagegen.

8 / 8
Mutation Score

Der Analyzer wird absichtlich auf acht Arten kaputtgemacht. Der Korpus fängt alle acht — und genau das verhindert, dass ein Benchmark zum Spiegel wird.

320
Unit-Tests

Darunter eine Kontrolle, für die nachgewiesen wurde, dass sie fehlschlägt: Entfernt man ein Feld aus dem Fingerabdruck, wird der Test, der das fangen soll, rot.

16
Experimente in echten Orgs

Das Vorrangprinzip wird gemessen, nicht nachgelesen. Drei unabhängige Reviews zitierten echte Salesforce-Dokumentation, um es zu korrigieren; alle drei wurden in einer laufenden Org widerlegt, und alle drei hätten korrekten Code gebrochen.

sha256
deterministisch

Gleicher Org-Zustand, gleicher ausführender Benutzer, gleiche Werkzeugversion ergeben bytegleiche Berichte. Live nachgewiesen: zwei Läufe, derselbe Hash. Der Fingerabdruck versiegelt das Werkzeug, das das Urteil gefällt hat, nicht nur die Eingaben.

Grenzen

Was es zu sagen verweigert

Ein stilles falsches „unbedenklich“ ist schlimmer als ein ehrliches Unbekanntes. Deshalb berichtet das Werkzeug, was es nicht auflösen konnte, statt es durchzuwinken. Diese Grenzen stehen hier aus demselben Grund, aus dem sie in jedem Bericht stehen.

  • Es ist kein Zertifikat. Es erzeugt Nachweismaterial für eine Sicherheitsprüfung oder eine Datenschutz-Folgenabschätzung. Es ist genau so viel wert wie die Messung dahinter, und keinen Deut mehr.
  • Es zählt Felder, nie Datensätze. Datensatz-Sichtbarkeit hängt vom Sharing ab; die ehrliche Antwort ist, als dieser Benutzer zu messen. Datensatzzahlen erscheinen daher als Kontext und als obere Schranke — „kann bis zu N erreichen“, nie „erreicht N“.
  • Es ist kein Laufzeit-Scanner. Es testet keine Prompt-Injection, führt keine adversarialen Payloads aus und prüft nicht die Berechtigungen Ihrer Organisation als Ganzes. Das sind andere Fragen für andere Werkzeuge; dieses löst auf, was der Code hinter einem Agenten als ein Benutzer erreichen kann.
  • Es misst Reichweite, nicht Verhalten. Es sagt, was der Code erreichen kann. Es sagt nicht, was Ihr Agent in irgendeinem Gespräch getan hat.
  • Die Lücke ist eine untere Schranke. Restriction- und Scoping-Regeln verringern, was ein Benutzer sieht, und werden nicht modelliert — das Werkzeug hält einen Benutzer also womöglich für privilegierter, als er ist. Diese Richtung wird klar benannt und nicht als „konservativ“ beschrieben, denn sie ist das Gegenteil.
  • Ungeklärte Reichweite nennt ihren Eigentümer. Eine zur Laufzeit zusammengesetzte Query zu schließen ist Ihre Aufgabe; eine Form, die der Analyzer nicht modelliert, ist unsere. Der Bericht sagt welche — gebunden an den Analyzer-Build, der die Aussage getroffen hat.

Es gehört Ihnen. MIT, auf GitHub.

Hier gibt es nichts zu kaufen und nichts anzufragen. Klonen, lesen, gegen Ihre eigene Org ausführen, Bericht behalten. Wenn Sie es forken und etwas Besseres daraus machen, ist das ein gutes Ergebnis.

Die auf dieser Seite veröffentlichten Messungen stammen alle aus Orgs, die ich selbst kontrolliere — das ist die ehrliche Grenze dessen, was sie belegen. Interessant sind die Zahlen aus Orgs, die ich nie gesehen habe. Wenn Sie es also ausführen, würde ich wirklich gern erfahren, was es falsch gemacht hat oder welcher Satz im Bericht nicht angekommen ist. Ein Issue im Repository genügt.

Was bei mir ankommt: nichts

Der Analyzer läuft auf Ihrer Maschine, gegen Ihre eigene authentifizierte Session. Er liest Metadaten — die Konfiguration des Agenten, nur die Apex-Klassen und Flows, die seine Actions tatsächlich aufrufen, und die Berechtigungsstruktur. Es werden keine Datensatzinhalte abgerufen — Metadaten und, nur auf Anforderung, aggregierte COUNT-Ergebnisse, lokal auf Ihrem Rechner verarbeitet. Es wird kein Agent aufgerufen und es werden keine Flex Credits verbraucht.

Nichts wird hochgeladen, und es gibt kein Konto — weil es keinen Server gibt, zu dem hochgeladen werden könnte. Diese Website ist statisch und erhebt nichts. Das ist kein Versprechen, dem Sie vertrauen müssen: Der Quellcode ist veröffentlicht, Sie können ihn also prüfen, bevor Sie ihn ausführen. Genau dafür ist er veröffentlicht.