Zum Inhalt springen

Daten in Experimenten ​

Werte wandern durch einen Durchlauf: Ein Parameter wählt das Ziel, ein Feld einer Antwort wird zu einem Header der nächsten Anfrage, eine erzeugte ID geht in einem Befehl hinaus und kommt in einer Prüfung zurück. Diese Seite behandelt, woher diese Werte kommen und wie ein Feld sie verwendet.

QuelleGeschrieben alsFestgelegt wo
Parameter{{api}} oder {{params.api}}Bereich Parameter, ein Profil, Ausführen mit…
Variable{{token}} oder {{vars.token}}ein Knoten während des Durchlaufs: Wert extrahieren, ein Warteknoten, ein Senden, das auf eine Antwort wartet
Geheimnis{{secret.API_TOKEN}}der Anmeldeinformationsspeicher des Computers oder Umgebung und Dateien des Servers
Eingebauter Wert{{run.seed}}, {{now.iso}}, {{counter}}der Durchlauf selbst
Generator{{uuid}}, {{random_int(1, 100)}}aus dem Startwert des Durchlaufs gezogen

Parameter ​

Ein Parameter ist ein benannter Textwert, den jedes Feld mit Vorlagen verwenden kann. Halten Sie Ziele in Parametern, sodass eine Adressänderung eine einzige Änderung ist statt einer pro Knoten.

Einen Parameter hinzufügen ​

  1. Drücken Sie Parameter ({ }) in der Werkzeugleiste des Editors.
  2. Drücken Sie auf der Registerkarte Standardwerte auf Parameter hinzufügen.
  3. Tippen Sie den Name und den Wert, zum Beispiel api und http://127.0.0.1:8080.
  4. Schreiben Sie in ein Feld eines Knotens {{api}}/login.

Jede Änderung im Bereich ist eine Bearbeitung des Experiments: Sie wird mit ihm gespeichert und mit Ctrl+Z rückgängig gemacht wie jede andere.

Regeln ​

RegelGrenze
Namebeginnt mit einem Buchstaben oder _, danach Buchstaben, Ziffern und _
Reservierte Namenvars, params, secret, run, node, now, uuid, counter, random_int, random_float, pick
Parameter pro Experiment64
Größe eines Werts64 KiB
Nameneindeutig; eine Variable darf nicht den Namen eines Parameters haben

Ein Wert ist reiner Text und wird so eingefügt, wie er geschrieben ist: {{…}} in einem Wert wird nicht aufgelöst. Verlangt ein Feld einen Teil eines Parameters ({{config.ports[0]}}), wird der Wert als JSON gelesen; ein Wert, der kein JSON ist, hat keine Teile.

Ein Parameter, dessen Name ungültig, reserviert oder doppelt vergeben ist, hindert das Experiment nicht am Speichern, sodass Sie weiter tippen können; das Experiment läuft erst, wenn der Name korrigiert ist.

Profile ​

Ein Profil ist eine benannte Menge von Parameterwerten — Laptop, Bühne, Veranstaltungsort —, sodass das Wechseln des Ziels eine Wahl ist, keine Bearbeitung jedes Knotens. Ein Profil ändert einige Parameter; die anderen behalten ihren Standard.

Ein Profil anlegen ​

  1. Öffnen Sie Parameter und drücken Sie Profil. Eine neue Registerkarte öffnet sich.
  2. Benennen Sie es in Profilname um.
  3. Tippen Sie für jeden Parameter, den das Profil ändert, seinen Wert. Ein leeres Feld behält den Standard, im Feld grau angezeigt; Standardwert verwenden (↺) löscht einen Wert.
  4. Drücken Sie Aktivieren, um damit auszuführen. Die Registerkarte des aktiven Profils trägt ● Aktiv. Aktivieren auf der Registerkarte Standardwerte kehrt zu den Standardwerten zurück.

Sobald ein Experiment Profile hat, wechselt eine Liste Profil in der Werkzeugleiste zwischen ihnen. Das aktive Profil wird von Durchläufen, der Vorschau und Jetzt senden verwendet, und es wird im Experiment gespeichert, sodass eine exportierte Datei mit denselben Zielen öffnet. Profil löschen löscht das angezeigte Profil.

RegelGrenze
Profile pro Experiment32
Name1–64 Zeichen, eindeutig (Leerzeichen an den Enden zählen nicht)
Wertenur Parameter, die es gibt; höchstens 64

Das Umbenennen oder Entfernen eines Parameters ändert ihn in jedem Profil auf einmal.

Welchen Wert ein Durchlauf verwendet ​

Später gewinnt:

  1. der Standard des Parameters, auf der Registerkarte Standardwerte;
  2. der Wert des aktiven Profils, wenn es einen setzt;
  3. ein in Ausführen mit… nur für diesen Durchlauf getippter Wert — siehe mit anderen Werten ausführen.

Ausführen mit… darf nur Parameter setzen, die das Experiment hat. Der Bericht des Durchlaufs hält das Profil, die für den Durchlauf getippten Werte und jeden verwendeten Wert fest.

Profile, die nicht laufen würden ​

Jedes Mal, wenn das Experiment geprüft wird, werden auch die anderen Profile und die Standardwerte geprüft. Eines, das fehlschlagen würde — etwa eine URL, die nicht http:// oder https:// ist —, trägt ⚠ in den Registerkarten und in der Liste der Werkzeugleiste, und sein Tooltip nennt den Grund. Es hält Durchläufe mit dem verwendeten Profil nicht auf.

Vorlagen ​

Text in {{ }} ist ein Ausdruck; alles andere in einem Feld bleibt genau so erhalten, wie es geschrieben ist.

text
{{api}}/users/{{user.id}}?trace={{uuid}}
Bearer {{secret.API_TOKEN}}
  • Leerzeichen in den Klammern spielen keine Rolle: {{ token }} ist {{token}}.
  • \{{ schreibt ein wörtliches {{.
  • Ein }} allein ist reiner Text.
  • Ein Wert wird so eingefügt, wie er ist, ohne Anführungszeichen. Schreiben Sie in einem JSON-Body die Anführungszeichen selbst: "id": "{{uuid}}".

Namen ​

AusdruckWert
{{name}}die Variable name, wenn auf diesem Pfad eine gesetzt ist, sonst der Parameter name
{{vars.name}}nur die Variable
{{params.name}}nur der Parameter
{{secret.NAME}}das gespeicherte Geheimnis NAME — siehe Geheimnisse
{{name.field}}ein Feld eines JSON-Werts
{{name[0]}}ein Element eines JSON-Arrays
{{name["a b"]}}, {{name['a b']}}ein Feld, dessen Name andere Zeichen enthält

Ein Feldname nach . darf Buchstaben, Ziffern, _ und - enthalten. Schritte verketten sich: {{reply.args[0]}}, {{order.items[2].sku}}.

Wie Werte geschrieben werden ​

WertGeschrieben als
Textder Text
Zahlihre kürzeste Form: 42, 0.5
true, falsetrue, false
nullnull
Objekt, Arraykompaktes JSON: ["x","y"]

Eingebaute Werte ​

AusdruckWert
{{run.id}}die Jobnummer des Durchlaufs; 0 in der Vorschau und in Jetzt senden
{{run.seed}}der Startwert dieses Durchlaufs
{{node.id}}die id des ausgeführten Knotens
{{now}}die aktuelle Zeit, Unix-Millisekunden
{{now.iso}}die aktuelle Zeit in UTC, ISO 8601 mit Millisekunden: 2026-09-30T12:34:56.789Z
{{counter}}wie oft dieser Knoten in diesem Durchlauf gelaufen ist, dieses Mal eingeschlossen, ab 1

{{counter}} zählt pro Knoten: im Rumpf einer Schleife ist es die Nummer der Iteration, in einem Knoten, der sich wiederholt, die Nummer des Sendens. run, node und now haben nur die aufgelisteten Felder; alles andere ist ein Fehler.

Generatoren ​

AusdruckWert
{{uuid}} oder {{uuid()}}eine UUID der Version 4
{{random_int(min, max)}}eine ganze Zahl von min bis max, beide eingeschlossen; ganzzahlige Argumente, min ≤ max
{{random_float(min, max)}}eine Zahl von min bis ausschließlich max, mit 3 Dezimalstellen; min < max
{{random_float(min, max, digits)}}dasselbe mit digits Dezimalstellen, 0–9
{{pick(a, b, c)}}eines der Argumente, mindestens eines

Argumente werden durch Kommas getrennt. Eines in Anführungszeichen ("dark blue" oder 'a, b') darf alles außer seinem eigenen Anführungszeichen enthalten; eines ohne Anführungszeichen darf Buchstaben, Ziffern und _ - . : / + enthalten. Ein leeres Argument ist ein Fehler.

Jeder Generator zieht aus dem Startwert des Durchlaufs. Die Werte einer Ausführung eines Knotens hängen nur vom Startwert, der id des Knotens und davon ab, wie oft der Knoten gelaufen ist, sodass parallele Zweige nie die Werte des jeweils anderen ändern, und ein Durchlauf mit demselben Startwert erzeugt dieselben Werte erneut. Ziehungen innerhalb eines Knotens folgen der Reihenfolge seiner Felder. {{now}} und {{run.id}} sind nicht reproduzierbar. Siehe Startwerte.

Vorschläge ​

Das Tippen von {{ in einem Feld mit Vorlagen oder Ctrl+Space öffnet eine Liste in vier Gruppen: Parameter mit ihren Werten, Variablen, die vor diesem Knoten gesetzt wurden, mit dem Knoten, der sie setzt (auch Felder einer Antwort, etwa reply.args[0]), Geheimnisse und Generatoren. ↑ und ↓ wählen, Enter oder Tab fügt ein, Esc schließt die Liste und behält das Feld.

Unbekannte Namen sind Fehler ​

Ein Name ohne Wert wird nie zu einer leeren Zeichenkette. Vor einem Durchlauf muss jeder Name, den ein Feld verwendet, ein Parameter, ein gültiger Geheimnisname oder eine Variable sein, die auf jedem Pfad gesetzt ist, der zu dem Knoten führt. Der Editor zeigt auf den Knoten und das Feld:

ProblemVor dem DurchlaufWährend des Durchlaufs
Ein Name, den niemand setztname.unknown—
Eine Variable, die nur auf einigen Pfaden gesetzt istname.not_on_every_path—
{{params.x}} ohne einen Parameter xparam.unknown—
Ein Feld, das ein Wert nicht hat—template.no_field
Nicht geschlossenes {{, ein leeres {{}}, ein fehlerhaftes Argumenttemplate.*, mit der Position—

Die Texte dieser Codes stehen unter Fehler.

Welche Felder Vorlagen annehmen ​

KnotenFelder mit Vorlagen
HTTP-AnfrageURL, Header-Namen und -Werte, Body, der Benutzername und das Passwort von Basic und Digest, der Bearer-Token
OSC-NachrichtZiel, Adresse, Textargumente; mit einer Antwort: ihr Adressmuster und die Regelwerte
UDP-DatagrammZiel, Nutzdaten; mit einer Antwort: ihr Muster
TCP-NachrichtHost, Nutzdaten
MQTT veröffentlichenBroker-Host, Topic, Nutzdaten
Log-MarkierungNachricht
Antworttexterwarteter Text
Antwort-HeaderHeader-Name, erwarteter Text
Wert prüfen, Nach Wert verzweigen, die Abbruchbedingung einer SchleifeWert, erwarteter Wert
Auf OSC wartenAdressmuster, Regelwerte
Auf UDP warten, Auf WebSocket wartenMuster
Auf MQTT wartenBroker und Topic (nur Parameter), Muster
Auf HTTP-Anfrage wartenPfadmuster, Bedingungen
StörungEmpfangen und Ziel (nur Parameter)
WebSocket verbindenURL, Header-Namen und -Werte
WebSocket sendenNutzdaten
WebSocket schließenGrund

Zahlen — Ports, Timeouts, Verzögerungen, Status, typisierte OSC-Zahlen — und die Empfangsadressen von Warteknoten sind wörtlich. Ein Emulator rendert seine eigenen Antworten mit dem Eingetroffenen ({{request.…}}) und den Parametern; siehe Störungen.

Nur Parameter. Manche Felder werden vor dem ersten Schritt geöffnet, wenn es noch keine Variable gibt: der Broker und das Topic eines Auf MQTT warten, das Empfangen und Ziel eines Störung. Sie nehmen Text und Parameter an, nichts anderes (node.params_only).

Wie Literale geprüft. Ein Feld, das nur Parameter verwendet, wird vor dem Durchlauf aufgelöst und als der Text geprüft, den der Durchlauf senden wird: Eine URL muss http:// oder https:// sein, ein OSC-Ziel IP:port oder host:port, ein Header-Name gültig. Ein Feld mit Variablen oder Generatoren wird geprüft, wenn es läuft.

Vorschau ​

Hat der ausgewählte Knoten eine Vorlage, zeigen seine Eigenschaften, was er mit den jetzt bekannten Werten tun wird: Wird gesendet für ein Senden, Wartet auf für ein Warten, Vergleicht für einen Vergleich. Die Engine löst es auf, mit demselben Code, den ein Durchlauf verwendet, sodass die Vorschau dem Durchlauf nie widerspricht.

  • Parameter kommen aus dem aktiven Profil.
  • Variablen kommen aus dem, was der Editor in dieser Sitzung gesehen hat: die Schritte des letzten Durchlaufs und Jetzt senden.
  • Ein gespeichertes Geheimnis erscheint als ••••.
  • Ein Name ohne Wert bleibt wie geschrieben, und die Vorschau listet ihn auf. Ein Geheimnis, das nicht gespeichert ist, wird getrennt aufgelistet.
  • Generatoren verwenden den fixierten Startwert des Experiments oder 0, wenn keiner fixiert ist, als erste Ausführung des Knotens. Mit einem fixierten Startwert zeigt die Vorschau die erzeugten Werte, die die erste Ausführung des Knotens in einem Durchlauf senden wird.

Werte extrahieren ​

Wert extrahieren liest einen Wert der neuesten HTTP-Antwort auf seinem Pfad und schreibt ihn in eine Variable.

FeldWas
Variabledie zu schreibende Variable; es gelten die Benennungsregeln von Parametern
Entnehmen auswoher der Wert kommt (unten)
JSON-Pfad, Header-Name oder Muster (Gruppe 1, falls vorhanden)was gelesen wird, je nach Quelle
Entnehmen ausLiestWert
JSON-Feldden Body als JSON, an einem Pfadden JSON-Wert: Text, Zahl, Objekt, Array
Headerden ersten Header mit diesem Namen, unabhängig von der SchreibweiseText
Statuscodeden Statuscodeeine Zahl
Gesamter Bodyden ganzen BodyText
Regulärer Ausdruckden ersten Treffer im Bodydie Erfassungsgruppe 1, wenn das Muster eine hat, sonst den ganzen Treffer

JSON-Pfade. $.token, $.items[0].id, $["a b"], $['a b']['c-d']; das führende $. darf weggelassen werden (token, items[0].id), und $ allein ist der ganze Body.

Reguläre Ausdrücke verwenden die Syntax der Rust-regex-Engine, die kein Look-around und keine Rückverweise hat. Der Treffer wird überall im Body gesucht; verankern Sie ihn mit ^ und $, wenn das wichtig ist.

Der Schritt schlägt fehl und nennt, was fehlt, wenn:

  • vor ihm auf diesem Pfad keine HTTP-Anfrage lief (check.no_response; der Editor lehnt bereits einen Graphen ab, in dem keine laufen kann, graph.needs_http);
  • der Body kein JSON ist oder der Pfad nicht darin vorkommt;
  • der Header nicht da ist oder das Muster nicht passt;
  • der Body über den 256 KiB liegt, die eine Antwort behält, bei einem JSON-Pfad oder dem ganzen Body, und bei einem Muster, das im behaltenen Teil nichts getroffen hat (extract.truncated).

Die Zeitleiste zeigt den geschriebenen Wert: token = abc123.

Durch Klicken extrahieren

Jetzt senden an einem HTTP-Anfrage zeigt seine JSON-Antwort. Klicken Sie einen Wert darin an: Nach der Anfrage wird ein Knoten Wert extrahieren hinzugefügt, mit ausgefülltem Pfad und einem vom Schlüssel übernommenen Namen, und der Wert ist der Vorschau sofort bekannt.

Variablen ​

Eine Variable hält einen JSON-Wert. Diese Knoten schreiben eine:

KnotenSchreibtAm Ausgang
Wert extrahierenden extrahierten Wertseinen Ausgang
Auf OSC warten, Auf UDP warten, Auf MQTT warten, Auf HTTP-Anfrage warten, Auf WebSocket wartenwas eingetroffen ist, Standardname reply (request bei HTTP)nur Treffer
OSC-Nachricht, UDP-Datagramm mit auf eine Antwort wartendie Antwort, Standardname replyseinen Ausgang

Was ein Warteknoten schreibt, ist ein Objekt; spätere Felder lesen seine Teile:

WartenFelder
OSCaddress, args, from, ms
UDPtext, hex, bytes, from, ms und match bei einem Muster
MQTTtopic und die Felder von UDP
WebSocketdie Felder von UDP und json, wenn die Nachricht JSON ist
HTTP-Anfragemethod, path, query, headers, body, json, params, from, ms

ms ist die Zeit von der letzten Aktion des Zweigs bis zum Eintreffen. Der genaue Inhalt steht in der Referenz der Knoten.

Wo eine Variable bekannt ist ​

Eine Variable existiert ab dem Ausgang, der sie schreibt, auf den Pfaden, die durch diesen Ausgang führen:

  • Nach einer Zusammenführung alternativer Pfade — dem Ja und Nein eines Zweigs, die wieder zusammentreffen — ist nur das bekannt, was jeder Pfad gesetzt hat.
  • Nach Zweige zusammenführen ist bekannt, was irgendein Zweig dorthin gesetzt hat: Sie alle liefen.
  • Nach dem Fertig oder Limit einer Schleife und in ihrer Abbruchbedingung ist bekannt, was jede Iteration des Rumpfs setzt.
  • Die Variable eines Warteknotens ist nach seinem Timeout-Ausgang nicht bekannt.

Jeder parallele Zweig arbeitet an seiner eigenen Kopie der Variablen. Ein Join führt die Kopien in der Reihenfolge seiner eingehenden Verbindungen zusammen, wobei die spätere Verbindung einen Namen gewinnt, den beide gesetzt haben, sodass das Ergebnis nie davon abhängt, welcher Zweig zuerst fertig wurde. Siehe wie ein Durchlauf sich bewegt.

Werte vergleichen ​

Wert prüfen lässt den Durchlauf fehlschlagen, wenn ein Vergleich nicht gilt; Nach Wert verzweigen verlässt den Knoten durch Ja oder Nein; eine Schleife verwendet denselben Vergleich als Abbruchbedingung. Jeder hat einen Wert, einen Bedingung und einen Erwartet-Wert, und beide Texte sind Vorlagen:

WertBedingungErwartet
{{status}}kleiner als300
{{reply.args[0]}}gleich{{nonce}}
BedingungGilt, wenn
gleich, ungleichdie beiden gleich (nicht gleich) sind — als Zahlen, wenn beide Zahlen sind (200 gleich 200.0), sonst als exakter Text, Schreibweise eingeschlossen
kleiner als, höchstens, größer als, mindestensals Zahlen; eine Seite, die keine Zahl ist, lässt den Schritt fehlschlagen (compare.not_numbers) statt eines stillen Nein
enthältder Wert enthält den erwarteten Text, Schreibweise eingeschlossen
passt auf Regexder reguläre Ausdruck im erwarteten Wert passt irgendwo im Wert
ist leer, ist nicht leerder Wert ist leer oder nicht, nach dem Trimmen von Leerzeichen; der erwartete Wert wird nicht verwendet

Eine Zahl ist Text, der nach dem Trimmen von Leerzeichen als solche gelesen wird: 42, -1.5, 1e3. Die Zeitleiste zeigt den Vergleich, wie er durchgeführt wurde, 401 = 200, jede Seite auf 120 Zeichen gekürzt.

Geheimnisse ​

Ein Token oder Passwort geht als {{secret.NAME}} in ein Feld. Die Experimentdatei behält nur den Namen; der Wert bleibt, wo er gespeichert ist, und erreicht nie die Oberfläche.

Wo Geheimnisse liegen ​

Wo Signal Lab läuftSpeicherAus der Oberfläche
Desktop-App unter Windowsdie Windows-Anmeldeinformationsverwaltung, unter dem Dienst SignalLab, ein Eintrag pro Namesetzen, ersetzen, entfernen
Desktop-App unter Linuxkeiner: Ein Durchlauf, der ein Geheimnis braucht, schlägt mit secret.unsupported fehl—
Serverdie Umgebungsvariable SIGNALLAB_SECRET_<NAME>, sonst die Datei <NAME> in seinem Geheimnisordner, /run/secrets/signallab, sofern nicht anders gesetztnur lesend
signallab auf der Kommandozeilewie ein Server, oder die Windows-Anmeldeinformationsverwaltung mit --secrets system—

Die Überschrift des Bereichs Geheimnisse hat einen Tooltip, der sagt, welcher davon gilt, wo Sie sind: der Windows-Speicher, Umgebung und Dateien des Servers oder — in der Desktop-App unter Linux — dass es keinen Speicher gibt. Dort sagt secret.unsupported, dass die Geheimnisse in der Windows-Anmeldeinformationsverwaltung gehalten werden, die das System nicht hat.

Ein Geheimnis gehört dem Computer oder dem Server, nicht einem Experiment: Zwei Experimente, die {{secret.API_TOKEN}} verwenden, verwenden denselben Wert.

Auf einem Server gewinnt die Umgebungsvariable über die Datei. Ein abschließender Zeilenumbruch einer Datei gehört nicht zum Wert, und eine leere Datei zählt als kein Geheimnis. Der Ordner des Servers wird mit --secrets-dir oder SIGNALLAB_SECRETS_DIR gesetzt; siehe den Server. Für die Kommandozeile siehe signallab run.

RegelGrenze
Namebeginnt mit einem Buchstaben oder _, danach Buchstaben, Ziffern und _; höchstens 128 Zeichen
Wertnicht leer, höchstens 16 KiB

Ein Geheimnis setzen ​

Unter Windows:

  1. Öffnen Sie Parameter. Der Bereich Geheimnisse listet jedes Geheimnis auf, das die Felder des Experiments verwenden, jeweils gespeichert oder auf diesem Computer nicht gesetzt.
  2. Drücken Sie Festlegen… neben dem Namen oder Geheimnis für einen Namen, den noch kein Feld verwendet.
  3. Tippen Sie den Wert — das Feld zeigt Punkte — und drücken Sie Speichern oder Enter. Das Feld wird geleert; nichts kann den Wert zurücklesen.

Ersetzen… speichert einen neuen Wert und Entfernen löscht ihn aus dem Anmeldeinformationsspeicher. Ein in dieser Sitzung gespeicherter Name wird auch in den Vorschlägen angeboten.

In einem Browser, der mit einem Server verbunden ist, sagt der Bereich nur auf dem Server gesetzt oder auf dem Server nicht gesetzt: Setzen Sie den Wert dort, wo der Server läuft, auf eine von zwei Arten:

bash
# in the server's environment
SIGNALLAB_SECRET_API_TOKEN='…'
# or as a file in its secrets folder
printf '%s' '…' > /run/secrets/signallab/API_TOKEN

Eine Datei wird jedes Mal gelesen, wenn ein Durchlauf startet, eine geänderte Datei zählt also ab dem nächsten Durchlauf; eine geänderte Umgebungsvariable erfordert einen Neustart des Servers.

Vor einem Durchlauf ​

Jedes Geheimnis, das die Felder des Durchlaufs verwenden, muss gespeichert sein. Ein fehlendes stoppt den Durchlauf vor jedem Verkehr, am ersten Knoten und Feld, die es verwenden (secret.missing). Jetzt senden prüft dasselbe für seinen Knoten.

Maskierung ​

Solange ein Durchlauf oder ein Jetzt senden Geheimnisse verwendet, wird jedes Vorkommen ihrer Werte in allem, was die Engine verlässt, durch •••• ersetzt:

  • Schritttexte, Fehler und die Variablen, die ein Schritt geschrieben hat;
  • der Bericht des Durchlaufs;
  • das Ergebnis von Jetzt senden, die gezeigte HTTP-Antwort eingeschlossen;
  • die Frames des Inspektor, die aufgezeichnet wurden, solange der Durchlauf dauert — in einem Hex-Dump wird jedes Byte eines Werts zu *, sodass die Offsets stimmen.

Basic-Authentifizierung sendet name:password in Base64; enthält einer der Teile ein Geheimnis, wird auch dieser Base64-Text maskiert. Der Verkehr selbst trägt den echten Wert. Die Vorschau zeigt ein gespeichertes Geheimnis als ••••. Die Antworten eines Emulator können keine Geheimnisse verwenden.

Befehle ​

Die Vorschau ist experiment_resolve; Geheimnisse werden mit secret_status, secret_set und secret_delete aufgelistet, gesetzt und entfernt. Kein Befehl gibt den Wert eines Geheimnisses zurück.