Dauerhafte Task-Läufe: ein Plan aus Aufgaben mit disjunkten Schreibbereichen, nach einer Unterbrechung wiederherstellbare Versuche, unabhängige Prüfung und ein getrennter Abnahmeschritt.
Wenn mehrere Aufgaben erledigt werden müssen und du den Beleg willst, dass jede erledigt wurde, kann der Agent Nexus sie in einem dauerhaften Lauf führen. Der Befehl nexus ist das Register dieses Laufs. Du beschreibst die Aufgaben in einem JSON-Plan; jede Aufgabe besitzt einen Ordner oder eine Datei, die sie schreiben darf (ihren Schreibbereich), und eine Liste von Prüfbefehlen, die entscheiden, ob ihr Ergebnis akzeptabel ist. Das Register hält fest, wer was versucht hat (ein Versuch), bewahrt den Zustand über Abstürze hinweg, führt die Prüfungen selbst aus und lässt dich die Aufgabe erst danach abnehmen. Ein Worker, der „fertig“ sagt, ist nie ein Beleg: die Prüfungen sind es. Diese Seite ist für alle, die Nexus von Hand oder aus CI steuern oder wissen wollen, was der Agent im Hintergrund tut.
Host-Identität, Beobachtung oder Wiederholungsanfrage für eine Aktion, die eine Aufgabe verändert, oder die Lock-Beobachtung für recover-lock. Reguläre Datei, höchstens 1 MiB, JSON-Objekt.
--json
-
aus
Gibt den dauerhaften Zustand und die Belege als JSON statt der Kurzfassung aus.
Nexus hält drei Fragen auseinander. Ausführung: Ist der Worker fertig? Ein Host meldet es mit record, oder der Vordergrund-Supervisor erfasst das echte Ende des von ihm gestarteten Prozesses. Prüfung: Besteht die Arbeit die Checks des Plans? Nexus führt sie selbst aus, mit wörtlichen Argumenten und ohne Shell, und vergleicht die deklarierten Artefakte und den ganzen Schreibbereich davor und danach. Abnahme: Ist der aktuelle Arbeitsstand noch der, der bestanden hat? accept prüft Artefakt-Hashes, geschützte Ressourcen und den abgenommenen Zustand jeder Abhängigkeit erneut. Ein fehlgeschlagener Check verhindert die Abnahme, auch wenn der Worker erfolgreich war. Nexus macht nie Commits, Merges, Dateikopien oder Deployments.
{
"id": "example",
"maxParallel": 1,
"config": { "language": "English" },
"tasks": [
{
"id": "result",
"objective": "Produce the requested result in work/result.txt.",
"acceptance": ["The result satisfies the independent check."],
"dependsOn": [],
"scope": ["work"],
"artifacts": ["work/result.txt"],
"resources": ["checks/check-result.cjs"],
"checks": [
{
"id": "result-content",
"command": "node",
"args": ["checks/check-result.cjs"],
"cwd": ".",
"timeoutMs": 30000
}
],
"maxAttempts": 2,
"deadlineMs": 3600000,
"idempotent": true,
"authorizations": ["Edit work/ and run the listed local check."]
}
]
}
Planfelder und ihre Regeln
Feld
Regel
id
Lauf-ID: 1 bis 64 Kleinbuchstaben, Ziffern, _ oder -. Dieselbe Regel gilt für Aufgaben-IDs.
maxParallel
Zwischen 1 und 32 gleichzeitig aktive Versuche.
config
Nur nicht geheime primitive Einstellungen. Schlüssel, die nach Geheimnissen aussehen, werden abgelehnt.
tasks
1 bis 200 Aufgaben. IDs eindeutig; Abhängigkeiten müssen existieren und dürfen keinen Zyklus bilden.
objective, acceptance
Was die Aufgabe liefern muss und welche Aussagen das Ergebnis erfüllen muss.
dependsOn
IDs der Aufgaben, die zuerst abgenommen sein müssen.
scope
Dateien oder Ordner, die der Worker schreiben darf. Bereiche verschiedener Aufgaben müssen disjunkt sein, auch wenn eine von der anderen abhängt. Nie .git oder der eigene Zustand von Nexus.
artifacts
Dateien, die beim Prüfen im Schreibbereich der Aufgabe existieren müssen.
resources
Geschützte Dateien: der Prüfer und jede dem Worker gegebene Anweisungsdatei. Sie werden gehasht und müssen außerhalb jedes Bereichs liegen.
checks
1 bis 30 pro Aufgabe. command ist node oder ein absoluter Pfad einer ausführbaren Datei; args ist ein wörtliches Array; jedes Dateiargument muss eine deklarierte Ressource sein; timeoutMs von 10 bis 300000.
maxAttempts
1 bis 10. Auch die Prüfrunden sind dadurch begrenzt.
deadlineMs
100 bis 86400000. Eine Frist ist eine Beobachtung, kein Beweis, dass die Arbeit stoppte.
idempotent
Boolesch. Eine nicht idempotente Aufgabe braucht vor einem Retry einen ausdrücklichen Abgleich mit retrySafe: true.
authorizations
Aussagen darüber, was erlaubt wurde. Worker können sie nicht ändern.
execution
Optional. Wählt ein Prozess-Backend statt eines Hosts (siehe unten).
Standardmäßig gehört eine Aufgabe dem Host: Dein Assistent erledigt die Arbeit mit seinen eigenen Werkzeugen und meldet Nexus das Ergebnis mit record. Danach prüft Nexus. Ein execution-Objekt macht die Aufgabe zur Prozess-Aufgabe: launch startet das Programm im Vordergrund, wartet darauf und speichert einen prüfsummengesicherten Beleg dessen, was wirklich geschah. Es gibt zwei Adapter.
Du lieferst den Befehl; er wird nie aus dem Aufgabentext abgeleitet. Die ausführbare Datei ist per SHA-256 fixiert. Exit 0 bedeutet abgeschlossen; ein in blockedExitCodes gelisteter Code bedeutet blockiert. Keine Shell, keine Umgebungs-Überschreibung.
codex-exec
command (absoluter Pfad des installierten codex), input, instructions, sandbox, optional model
Startet die installierte Codex-CLI nicht interaktiv. sandbox ist read-only (Standard) oder workspace-write. Abschluss verlangt Exit 0 plus die Ereignisse für Thread-Start und Turn-Ende; nur ein ausdrücklicher Fehler approval_required wird zu blockiert.
Warnung· Keine Sandbox
Worker teilen dein Projekt und deinen Betriebssystem-Benutzer. Sie können ihren deklarierten Bereich ignorieren; Prüfsummen erkennen versehentliche Änderungen, sind aber keine Signaturen. Es gibt keinen Daemon, keinen Scheduler und keine Prozessbaum-Überwachung: Jedes launch ist ein Vordergrundbefehl. workspace-write ist eine Bitte an den installierten Codex-Host, keine Nexus-Sandbox. Nutze ein isoliertes Projekt oder eine Host-Richtlinie, wenn der Worker nicht vertrauenswürdig ist.
Zustand: .bmad-plus/nexus/runs/<run-id>.json, ein prüfsummengesicherter Umschlag, geschrieben über eine auf Platte geleerte temporäre Datei und ein atomares Umbenennen.
Sperren: .bmad-plus/nexus/writer.lock (eine Änderung zur Zeit) und bei einer außerordentlichen Wiederherstellung .bmad-plus/nexus/recovery.lock. Eine entfernte Sperre wird unter .bmad-plus/nexus/lock-recovery/ archiviert.
inspect schreibt nichts und funktioniert weiter, während eine Prüfung läuft. Alle anderen Aktionen außer create verändern einen bestehenden Lauf; create legt ihn an.
Liest deinen Plan und deine Eingabedateien, die deklarierten Ressourcen und Artefakte und macht Snapshots der Schreibbereiche. Die Prüfung führt deine Prüfbefehle aus; launch startet den Prozess der Aufgabe. Das sind die einzigen Prozesse, die Nexus startet, und nur auf deinen Aufruf.
Prüfbefehle erhalten eine minimale Umgebung (PATH, SYSTEMROOT, WINDIR, TEMP, TMP, TMPDIR sowie feste Locale C und Zeitzone UTC). Zugangsdaten und NODE_OPTIONS werden nicht weitergegeben. Lege keine Geheimnisse in Argumente oder Ausgaben.
verify bestand nicht; launch endete nicht mit completed; collect endete nicht mit completed; oder ein beliebiger Fehler. Ein Code ungleich null bei launch oder collect sagt, was der Prozess tat, nie, dass die Aufgabe akzeptabel ist.
Der kürzeste vollständige Durchlauf braucht drei kleine Dateien neben nexus-plan.json. Der Prüfer ist derjenige, den der Plan als Ressource deklariert; host.json ist die Identität, die dein Assistent start übergibt; rec.json ist das Ergebnis, das er record meldet, mit der Versuchs-ID, die start ausgegeben hat.
checks/check-result.cjs, der Prüfer
const fs = require("node:fs");
const text = fs.readFileSync("work/result.txt", "utf8");
if (!text.includes("done")) {
console.error("work/result.txt must contain done");
process.exit(1);
}
Einen Lauf anlegen, starten, erfassen, prüfen und abnehmen
$ npx bmad-plus nexus create --plan nexus-plan.jsonNexus run example — durable task coordinationresult: not started; verification=pending; acceptance=pendingUse inspect --json for recorded evidence and reconciliation observations.$ npx bmad-plus nexus start example result --input host.jsonNexus run example — durable task coordinationresult: running; verification=pending; acceptance=pending Attempt: c3bbafd1-62ef-4b8b-ac72-0d9b09932427; host: my-assistant/session-1Use inspect --json for recorded evidence and reconciliation observations.$ npx bmad-plus nexus record example result --input rec.jsonNexus run example — durable task coordinationresult: completed; verification=pending; acceptance=pending Attempt: c3bbafd1-62ef-4b8b-ac72-0d9b09932427; host: my-assistant/session-1Use inspect --json for recorded evidence and reconciliation observations.$ npx bmad-plus nexus verify example resultNexus run example — durable task coordinationresult: completed; verification=passed; acceptance=pending Attempt: c3bbafd1-62ef-4b8b-ac72-0d9b09932427; host: my-assistant/session-1Use inspect --json for recorded evidence and reconciliation observations.$ npx bmad-plus nexus accept example resultNexus run example — durable task coordinationresult: completed; verification=passed; acceptance=accepted Attempt: c3bbafd1-62ef-4b8b-ac72-0d9b09932427; host: my-assistant/session-1Use inspect --json for recorded evidence and reconciliation observations.$ npx bmad-plus nexus inspect exampleNexus run example — durable task coordinationresult: completed; verification=passed; acceptance=accepted Attempt: c3bbafd1-62ef-4b8b-ac72-0d9b09932427; host: my-assistant/session-1 Accept only after rechecking current artifacts and resources.Use inspect --json for recorded evidence and reconciliation observations.# Die Wörter nach „acceptance=“ und die zusätzlichen Hinweiszeilen hängen vom Zustand des Laufs ab; lies sie mit inspect --json.
npx bmad-plus nexus create --plan nexus-plan.json
npx bmad-plus nexus start example result --input host.json
npx bmad-plus nexus record example result --input rec.json
npx bmad-plus nexus verify example result
npx bmad-plus nexus accept example result
npx bmad-plus nexus inspect example
Ausgabe eines echten Laufs. Quelle: Mit dem Paket 0.23.0 in einem Wegwerf-Git-Projekt nachgespielt; die Versuchs-ID ändert sich bei jedem Lauf
verify direkt nach create wird abgelehnt, weil noch nichts erfasst wurde: Nexus: Nexus: Verification requires completed, unaccepted, reconciled work. Starte und erfasse zuerst, wie oben. Beachte das doppelte Präfix: Die eigenen Meldungen der Laufzeit beginnen bereits mit Nexus:, und der Befehl fügt sein eigenes hinzu.
Jede Aufgabenzeile lautet <task>: <execution>; verification=<status>; acceptance=<state>, gefolgt vom letzten Versuch mit seinem Backend. inspect --json ergänzt pro Aufgabe resourcesCurrent, evidenceEligible, stale, staleReason und overdue, damit ein alter abgenommener Eintrag nicht behaupten kann, später bearbeitete Dateien bestünden noch. Im JSON-Modus werden Fehler als {"schemaVersion":1,"status":"error","error":"..."} ausgegeben.
Ein unterbrochener oder getrennter Versuch behält seine Kapazität, bis reconcile ihn abschließt. Die Beobachtung verlangt ownerStopped: true, eine Aussage von dir, dass du geprüft hast, keine Telemetrie. Bei einer nicht idempotenten Aufgabe braucht ein Retry zusätzlich retrySafe: true.
cancel hält nur eine Anfrage fest. Bei einer Host-Aufgabe stoppt der Host seine eigene Arbeit; bei einer Prozess-Aufgabe darf nur der ursprüngliche Vordergrund-Supervisor dem von ihm erzeugten Kindprozess Signale senden. Nexus tötet nie eine gespeicherte PID.
retry (oder launch mit {"retry":true}) eröffnet einen neuen Versuch und verbraucht maxAttempts. Eine neue Backend-Sitzung setzt das Limit nicht zurück.
Eine Prüfung mit Zeitüberschreitung wird als mehrdeutig festgehalten, weil Nachkommen des Checks noch Wirkung haben könnten. Inspiziere vor einem Retry.
recover-lock nimmt den exakten Lock-Hash aus inspect, ownerStopped: true und eine nicht leere note. Ein lebender lokaler Schreiber blockiert es. Das Alter allein erlaubt nie das Entfernen.
Fehler erscheinen als Nexus: <message> auf dem Fehlerstrom. Die eigenen Meldungen der Laufzeit beginnen bereits mit Nexus:, daher zeigen die meisten Fehler das Präfix doppelt (Nexus: Nexus: Run ID must use ...).
Fehler von nexus
Meldung
Ursache
Was tun
Use nexus create --plan FILE, inspect RUN, or start|launch|collect|record|reconcile|verify|retry|cancel|accept RUN TASK.
Unbekannte Aktion oder fehlende Lauf-/Aufgaben-IDs.
Syntax prüfen.
--plan requires a JSON file. / --input requires a JSON file.
Die Option fehlt bei einer Aktion, die sie braucht.
Datei ergänzen; siehe Aktionstabelle.
--input must name a regular JSON file no larger than 1 MiB.
Keine reguläre Datei, ein symbolischer Link oder zu groß.
Eine einfache JSON-Datei verwenden.
verify executes its recorded contract and takes no input file.
--input bei verify oder accept angegeben.
--input weglassen.
Overlapping exclusive write scopes: <a> and <b>
Zwei Aufgaben teilen einen Pfad in ihren Bereichen.
Bereiche disjunkt machen.
Verifier/resource lies in a worker write scope: <file>
Eine geschützte Datei liegt im Bereich einer Aufgabe.
Den Prüfer außerhalb jedes Bereichs ablegen.
Run already exists; inspect it instead.
create mit bestehender Lauf-ID.
inspect nutzen oder eine neue Plan-ID.
Stale or missing attempt identity. / Backend handle/session does not own this attempt.
Die Eingabe nennt einen anderen Versuch, ein anderes Handle oder eine andere Sitzung.
Exakte Versuchs-ID und Backend aus start oder launch kopieren.
Protected verifier or agent resource changed since the plan was created.
Eine deklarierte Ressource wurde nach create bearbeitet.
Wiederherstellen oder einen neuen Lauf aus aktualisiertem Plan anlegen.
Dependency has not been accepted: <task>
Eine Abhängigkeit ist noch nicht abgenommen.
Zuerst die Abhängigkeit prüfen und abnehmen.
Run capacity is occupied until active work is reconciled.
Aktive oder unterbrochene Versuche füllen maxParallel.
Erfassen, aufzeichnen oder abgleichen.
Another mutation owns writer.lock; inspect before explicit recovery.
Ein anderer Befehl läuft, oder einer wurde beendet.
Warten; bei Abbruch inspect, dann recover-lock.
Corrupt or foreign run state; original bytes were preserved.
Die Lauf-Datei passt nicht zu ihrer Prüfsumme.
Datei aus einer Sicherung wiederherstellen; nichts wird automatisch repariert.
Current attempt has no eligible passed verification.
accept vor einem bestandenen verify.
verify ausführen; bei Fehlschlag die Arbeit korrigieren.
Stale evidence: checked artifacts or write scope changed.
Drei unabhängige Änderungen berühren verschiedene Ordner. Jede soll durch einen von dir geschriebenen Check belegt werden, nicht durch das Wort des Workers.
In deinem KI-Assistenten
Nexus, teile die freigegebene Arbeit in unabhängige Aufgaben auf, jede mit eigenem Schreibordner und einem Prüfbefehl, den ich ausführen kann. Lege mit `bmad-plus nexus create` einen dauerhaften Lauf an, starte pro Aufgabe einen Versuch und nimm nichts ab, bevor `bmad-plus nexus verify` dafür bestanden hat.
Das solltest du erhalten Nexus schreibt einen Plan mit disjunkten Bereichen und führt create aus, das überlappende Bereiche oder einen Prüfer innerhalb eines Bereichs ablehnt. Für jede Aufgabe erledigt der Host die Arbeit und meldet das Ergebnis; verify führt deinen Check aus und speichert den Beleg; accept gelingt nur bei aktuellen Belegen. Eine Aufgabe mit fehlgeschlagenem Check bleibt unabgenommen und kann im Rahmen von maxAttempts wiederholt werden.
Der Rechner wurde neu gestartet, während eine Aufgabe lief. Du weißt nicht sicher, ob der Worker noch Dateien offen hält.
In deinem KI-Assistenten
Nexus, inspiziere den Lauf `release-prep` mit `bmad-plus nexus inspect release-prep --json`. Sag mir, welche Versuche ungeklärt sind und was ich prüfen muss, bevor du sie abgleichst. Wiederhole nichts auf eigene Faust.
Das solltest du erhalteninspect ist nur lesend und meldet jeden Versuch mit seinem Backend, dem festgehaltenen Ergebnis und den Beobachtungen (stale, overdue). Ungeklärte Versuche behalten ihre Kapazität. Hast du die Wirkungen geprüft und bestätigst, dass der Besitzer gestoppt ist, hält reconcilecompleted, failed oder cancelled fest; erst dann kann ein Retry einen neuen Versuch eröffnen. Blieb ein Schreib-Lock zurück, zeigt inspect ohne Lauf-ID seinen Hash für recover-lock.