nxsflow

Changelog

Neu

0.205.0

2026-10-08
  • GeändertDie Ansichten stützen sich nicht mehr auf das Op-Log. Das Elternteil eines Tickets, das Gewicht einer Faden-Verknüpfung, der Erstellungs- und Änderungszeitpunkt eines Tickets sowie Reihenfolge und Datum einer Notiz stehen jetzt in den gefalteten Zeilen selbst, statt bei jedem Lesen im Log nachgeschlagen zu werden. So lassen sich dieselben Ansichten auch dort falten, wo kein Log danebenliegt. Eine Nachricht und ein neuer Faden gehören jetzt der Op, die sie anlegt: Ihre ID wird aus der ID dieser Op geprägt, und eine andere Op, die dieselbe ID beansprucht, übernimmt Nachricht oder Faden nie, gleich mit welcher Koordinate. Bisher gewann die zuerst angekommene Op, sodass zwei Replikate unter einer ID verschiedene Nachrichten zeigen konnten. Für eine vor dieser Version geprägte ID ist die Op mit der kleinsten Koordinate die Nachricht, und eine Op mit einer Nummer unter 1 wird aufbewahrt, aber nie angezeigt. Beim ersten Öffnen eines Workspaces baut diese Version die Ansichten von Board und Chat einmal aus dem Log neu auf; dabei werden auch Nachrichten berichtigt, die ein alter Build unter dem in ihrer Nutzlast behaupteten Absender abgelegt hatte. Erstellungs- und Änderungszeitpunkt eines Tickets zählen jetzt die Ops, die diese Version faltet; eine Op, die sie aufbewahrt, aber nicht falten kann, verschiebt sie nicht mehr. Das Workspace-Schema geht auf v8; ältere Versionen arbeiten auf derselben Datei weiter — ein Ticket zeigt weiter ein Elternteil und eine Faden-Verknüpfung ein Gewicht, und ein Elternteil oder Gewicht, das sie dort setzen, wirkt, sobald diese Version die Datei das nächste Mal öffnet —, und dieses Öffnen baut neu auf, was sie geschrieben haben. Für einbettende Apps: Ein `Reducer` faltet nicht mehr selbst in eine Verbindung, sondern gibt die Änderungen zurück, die eine Op bewirkt (`Reducer::changes`, gebaut aus `nxs_foundation::change`); das Substrat setzt sie um. Ändern sich seine Regeln, erhöht ein Reducer `fold_revision`. Neu: `Change::register_ranked`, `Store::emit_owned`, `Op::owns_target` und `ChatStore::open_new_thread`. `Image` bekommt `fold_revision`, `RefoldReason` bekommt `OtherRevision`.
  • GeändertWelche Tickets bereit, in Arbeit, zurückgestellt oder blockiert sind — und wie `next` sie in Stufen ordnet —, entscheidet jetzt eine Rust-Bibliothek über die aktiven Tickets mit ihren Abhängigkeiten und Elternteilen (`nexus_flow_core::graph`). Das Board wählt diese Tickets per SQL aus; ein Server kann sie aus seinem eigenen Index auswählen und bekommt genau dieselben Spalten. Dazu gehört eine Regel: Ein Ticket, das nicht aktiv ist — geschlossen, archiviert oder gelöscht —, gilt überall als geschlossen, wo ein anderes von ihm abhängt oder unter ihm hängt. Vier Antworten ändern sich, alle in Zuständen, die nur das Zusammenführen nebenläufiger Änderungen erzeugt: Eine Abhängigkeit von einem archivierten, wieder geöffneten Ticket blockiert nicht mehr; ein offenes Ticket, dessen einziges Elternteil gelöscht wurde, ruht wie unter einem geschlossenen Elternteil; und ein Abhängigkeitszyklus über ein geschlossenes Ticket blockiert nichts mehr. Ebenso ruht ein offenes Ticket, dessen Elternteil noch nie als Ticket gesehen wurde (eine Kante, die vor ihrem Elternteil ankommt); `nxf search` ordnet ein ruhendes Ticket unter „geschlossen“ ein, und `nxf show` nennt das Elternteil als Grund. `nxf blocked` nennt nur noch aktive Blocker, und die Zahl „blockiert N“ in `nxs prime` zählt nur noch aktive abhängige Tickets.
  • HinzugefügtEin Server kann einen Strom jetzt selbst falten, nach denselben Regeln wie ein lokales Replikat: Die neue Crate `nxs-fold-ddb` setzt die beschriebenen Änderungen von Board, Chat und Memory als bedingte Schreibvorgänge in einer DynamoDB-Tabelle um. Neben den Zeilen pflegt sie zwei dünn besetzte Indizes: `active` (die aktiven Tickets und die Abhängigkeiten und Elternteile, die eines berühren) und `dated` (die Spalten geschlossen und archiviert, neueste zuerst). Bereit, blockiert und zurückgestellt liest sie über dieselbe Bibliothek `nexus_flow_core::graph`, die ein lokales Board nutzt — mit einer Query und ohne Scan. Weder die Reihenfolge, in der Ops ankommen, noch doppelt gelieferte Ops ändern das Ergebnis, und ein Lauf, der mittendrin abbricht und seinen Stapel erneut faltet, endet dort, wo ein ununterbrochener endet. Eine Op, die die Grenzen von DynamoDB sprengt, wird abgelehnt und gemeldet, statt das Falten anzuhalten. Ein Schnappschuss zum Anlaufen eines solchen Faltens besteht aus den Tabellen und der Relay-Position, die sie erreichen, ohne das Log; er lässt sich aus einem Server-Strom oder aus den Ansichten eines lokalen Replikats ziehen. Die erwartete Tabelle ist in der Crate und in der Sync-Spezifikation festgehalten. Der DynamoDB-Adapter steckt hinter dem Feature `dynamodb` der Crate; ein Build ohne braucht kein AWS-SDK. Für einbettende Apps: `nxs_foundation::reducer::folder_for` ist die eine Regel, welcher Reducer eine Op faltet, und `nexus_flow_core::model::is_active` die Aktivitätsregel über drei Zellen. Zyklen in Abhängigkeiten zu finden dauert jetzt linear in der Größe des Boards.

0.204.0

2026-10-06
  • HinzugefügtEine Persona-Definition für jedes Repository auf einer Maschine. Neben dem eigenen `.nxs-personas/` liest jeder Arbeitsbereich jetzt den Ordner auf Benutzerebene `~/.nexusflow/personas/` — Personas und eine `channels.yaml`, genauso aufgebaut — und führt beide je Name zusammen: Eine Persona oder ein Kanal, den das Repository selbst deklariert, verdeckt den gleichnamigen Eintrag auf Benutzerebene, alles andere kommt hinzu. Ein einmal geschriebener `pm` läuft in jedem Repository als dessen eigener Teilnehmer, mit dessen Board, Gedächtnis und Arbeitskopie. `nxc list` markiert jeden Eintrag aus dem Ordner auf Benutzerebene und sagt, welche das Repository verdeckt, `nxs prime` ebenso; eine Persona von dort erfährt beim Sitzungsstart, wo ihre Deklaration liegt, denn ein Pfad in ihren Anweisungen relativ zu „diesem Repository" meint das Repository, in dem sie läuft. Das Einfrieren je Vorgang gilt dort wie für den eigenen Ordner. Ein `external` auf Benutzerebene lässt Aufrufer nur aus Arbeitsbereichen zu, denen das laufende Repository selbst beim Namen vertraut. Ein Entwicklungs-Build liest einen Ordner auf Benutzerebene nur unter einer benannten Dienst-Instanz (`~/.nexusflow-<name>/personas/`), nie den produktiven. Eine Maschine ohne den Ordner verhält sich wie bisher. Für einbettende Apps: `Engine::definitions`, `Engine::directory` und `Engine::prime_as` lesen denselben Ordner (eine App kann keinen anderen wählen); neu sind `user_path`, `from_user` und `shadowed` an `DeclarationSource`, `origin` an `PersonaEntry` und `ChannelEntry`, `declared_in` an `PersonaBrief`, `user_declarations_dir`, `merged_channels` sowie `Definitions::resolve_with_user_dir` / `Definitions::from_source` — ein Struct-Literal dieser vier Typen braucht die neuen Felder.
  • BehobenÜber die Grenze eines Arbeitsbereichs: Entzieht der Arbeitsbereich des Aufrufers dem Empfänger das Vertrauen, während ein Auftrag offen ist, liegt die Antwort nicht mehr ungelesen bis zur Zwei-Stunden-Frist — der Auftrag wird sofort abgebrochen und der Auftraggeber mit „the answer arrived from <workspace>, a workspace no longer trusted here" geweckt. Eine Übergabe beim Nachbarn, die ihre 60-Sekunden-Grenze überschreitet, wird jetzt gestoppt und eingesammelt, statt weiterzulaufen; der Hintergrunddienst sammelt so keine hängenden Prozesse mehr an. Der Guide sagt jetzt deutlich, dass die Tiefengrenze über die Grenze auf dem Wort des vertrauten Arbeitsbereichs beruht.
  • HinzugefügtEin veröffentlichter Skill ist eine Persona. Eine Persona kann jetzt als Ordner `.nxs-personas/<name>/SKILL.md` deklariert werden, in der Form der Agent-Skills-Spezifikation: `name`, `description` und `allowed-tools` oben im Frontmatter, die Anleitung als Rumpf, und alles, was nexus-flow darüber hinaus braucht, unter einem Schlüssel `nxs:` (`title`, `expected_output`, `stage`, `model`, `addressable`, `prime`, `claude_md`, `base_prompt`, `permissions`, `working_tree`, `machine` und das neue `requires`). Ein Skill-Ordner von anderswo, unverändert hineinkopiert, erscheint in der Liste, lässt sich anschreiben und antwortet; ohne `nxs:` läuft er mit allen Standardwerten. Ein relativer Pfad im Rumpf eines Skills meint den eigenen Ordner der Persona, sodass sie ihre `references/` auch aus dem Ordner auf Benutzerebene findet, und die Sitzung erfährt, wo dieser Ordner liegt. `allowed-tools` behält die drei Zustände von `tools` und nimmt den Leerzeichen-getrennten Text, einen Komma-getrennten Text oder eine YAML-Liste. `license`, `compatibility` und `metadata` werden durchgereicht und in `nxc list --json` gezeigt, das jetzt zu jedem Eintrag Datei, Form und Ordner unter `declaration` trägt. `nxs.requires` nennt benötigte Fähigkeiten und wird in dieser Version nur gezeigt; noch bindet nichts sie. Kanäle können einzeln deklariert werden, eine Datei je Kanal unter `.nxs-personas/channels/<name>.yaml`; `channels` ist jetzt ein reservierter Name, den keine Persona tragen darf. Die älteren Formen — `<handle>.yaml` und `channels.yaml` — werden weiter gelesen, im Ordner des Repositorys wie im Ordner auf Benutzerebene, und ein Name in beiden Formen wird abgelehnt, mit Nennung beider Dateien. Neu: `nxs personas migrate` schreibt einen Ordner in die neue Form um (`--dry-run` zeigt den Plan, `--user` nimmt den Ordner auf Benutzerebene), behält die Kommentare, meldet, was es weglässt, beweist jede Umschrift, bevor es etwas schreibt, lehnt einen Schlüssel ab, den es nicht zuordnen kann, und findet beim zweiten Lauf nichts mehr zu tun. `nxs prime` warnt bei einem Namen, der die Namensregel der Agent-Skills- Spezifikation verletzt, bei den wirkungslosen Schlüsseln `session`, `sub_agents` und `reports_to`, bei einem nexus-flow-Schlüssel oben in einer `SKILL.md` und bei `nxs.requires`, das noch nichts bindet, bei einem Skill ohne `allowed-tools` (er läuft mit dem vollen Standard-Werkzeugsatz, und für seine Antwort wird die Shell freigegeben) und bei einer Persona, die Rückfragen überspringt und zugleich Rufer aus anderen Arbeitsbereichen zulässt. Ein Handle darf keine Leer- oder Steuerzeichen mehr enthalten, und eine Deklarationsdatei über 1 MiB wird abgelehnt. Fehler in `nxs prime` nennen die echte Datei einer Persona oder eines Kanals, und eine kaputte Kanaldatei schließt nur ihre eigenen Kanäle aus dem Roster aus. Für einbettende Apps: `DeclarationSource::files` und `file_of`, `DeclarationFile` / `DeclarationForm`, `declaration` an `PersonaEntry` und `ChannelEntry`, `declared_form` an `PersonaBrief` (dessen Builder `declared_in` jetzt die Form nimmt), die Module `skill` und `persona_migration`, `role::load_declared_personas`, `channel::load_declared_channels` und `declaration_quality::warn_declarations_in`; `persona_migration::migrate_declarations` ist die Bibliotheks-Naht von `nxs personas migrate`. Ein älterer Engine-Stand sieht keinen Skill-Ordner: Ein Repository, das eine App liest, erst migrieren, wenn die App auf diesem Stand ist.
  • Entfernt`address_book` ist abgeschafft. Wen eine Persona ansprechen kann, ergibt sich daraus, was jede andere Persona und jeder Kanal zulässt — jeweils in deren eigenen Worten beschrieben —, und keine Persona führt mehr eine eigene Liste. Eine Deklaration, die den Schlüssel noch trägt, lädt unverändert; der Schlüssel wird ignoriert, `nxs prime` warnt, und `nxs personas migrate` lässt ihn weg. Eine Persona, die `address_book: []` deklariert hatte, sieht jetzt das abgeleitete Verzeichnis wie jede andere. Für einbettende Apps: `RoleDecl::address_book` und `AddressBookEntry` entfallen, ebenso `why` an `PersonaEntry` und `ChannelEntry` und `unresolved` an `Directory`. Das abgeleitete `address_book` von `nxc prime --json` bleibt unverändert.

0.202.0

2026-10-04
  • BehobenEine Antwort, die einen Aufrufer erreicht, während er seinen Zug noch beendet, wird jetzt zugestellt. Auf der Kommandozeile bekam der Hintergrunddienst die Zustellung als Kanal-Frist auf eine Sitzungs-ID („no such thread“), eine zurückgehaltene Antwort wurde also nie übergeben; und die Sidecar des Aufrufers sah seine Unterrunde schon beantwortet, erinnerte ihn und postete dann eine Ersatzantwort in seinem Namen. Eine Unterrunde, deren Antwort für ihren Auftraggeber zurückgehalten wird, zählt jetzt weiter als unterwegs (`waiting_on_sub_round` in `nxc status --json` und in der Fassade). Außerdem behoben: Eine Persona ohne `tools:`, die mit einer Antwort geweckt wird, die sie noch weitergeben muss, darf ihr `nxc reply` ausführen (die Weckung trägt die Pflicht mit, die sie noch hat), und eine Sitzung, die ein Entwicklungs-Build startet, nutzt dessen Dienst-Verzeichnis, nicht das installierte.
  • HinzugefügtEine Persona kann eine Persona eines anderen Arbeitsbereichs auf derselben Maschine beauftragen, und die Antwort kommt zurück. `nxc send --to <besitzer>/<repo>/<persona>` legt den Auftrag im eigenen Arbeitsbereich ab und übergibt genau diesen einen Faden; der andere Arbeitsbereich prüft den Zugang, startet seine Persona in seiner eigenen Arbeitskopie, und die Antwort — oder eine Rückfrage, die immer an den Auftraggeber geht — weckt den Aufrufer. Nur der Grenzfaden geht hinüber. Den Zugang bestimmt der Empfänger: `addressable.external` lässt eine Rolle aus vertrauten Arbeitsbereichen zu (`"*/pm"`, `nxsflow/manufakt-io/pm`), ohne das Feld kommt nichts herein. Neu: `nxs name` (der gespeicherte Name `<besitzer>/<repo>` eines Arbeitsbereichs), `nxs sync trust add --workspace <besitzer>/<repo>` (einem benachbarten Arbeitsbereich beim Namen vertrauen; auf beiden Seiten nötig) und `nxc status`, das einen Grenzfaden in beiden Arbeitsbereichen mit der Gegenseite und seinem Zustand zeigt (submitted, working, input-required, completed, rejected, canceled). Zwei Stunden ohne Lebenszeichen brechen ihn ab; `nxc withdraw` zieht ihn auf beiden Seiten zurück. Eine Engine, die älter ist als dieses Release, kann eine Persona-Datei mit `external:` nicht laden — setzen Sie das Feld erst, wenn alle Leser des Repositorys diesen Stand haben. Für einbettende Apps: `EngineConfig::peers` und `Ctx::peers` (der Weg des Hosts zu anderen Arbeitsbereichen; `None` lässt alles wie bisher), `Engine::handover`, `Addressable::OnlyWithExternal`, `Coordinator::Border` und neue Felder `border` an `Refs`, `SendToReceipt`, `ReplyReceipt` und `StatusThread` — ein Struct-Literal von `EngineConfig`, `Ctx`, `Adapter` oder `Refs` ohne `..Default::default()` braucht das neue Feld.
  • BehobenSicherheitskorrektur: Eine Persona mit `tools: []` kann keine beliebigen Shell-Befehle mehr ausführen, wenn sie eine Antwort schuldet. Bisher gewährte die Engine jeder solchen Sitzung das nackte, automatisch freigegebene `Bash`, damit sie antworten konnte — eine Persona ohne Werkzeuge hatte damit eine volle Shell (`gh pr merge`, `git push --force`, ein Release). Jetzt gewährt sie `Bash(nxc reply:*)`: Die Antwort läuft, jeder andere Befehl braucht eine Freigabe, die niemand erteilen kann, und wird abgewiesen. Eine Persona ohne `tools:` oder mit `Bash` in der Liste verhält sich wie bisher; eine, die selbst `Bash(nxc reply:*)` deklariert, bleibt jetzt so eng. Für den eigenen Worker einer einbettenden App: `RoleSpec::granted_tools` (`grantedTools` in der Sidecar-Spezifikation) kann jetzt eine eingeschränkte Berechtigungsregel statt eines Werkzeugnamens tragen — das genannte Werkzeug gehört in `tools` des SDK, die Regel selbst in `allowedTools`, wie es die mitgelieferte Sidecar tut.

0.201.0

2026-10-03
  • Geändert`nxf show` verweist auf die Eltern eines Eintrags jetzt in einer neutralen Zeile — `Parents: <ids> (read for full context)` — statt mit „URGENT RECOMMENDATION: … !!!“. Agenten, die das Board lesen, hatten die alte Zeile als möglichen Prompt-Injection-Versuch gemeldet. Das Feld `parents_notice` in `--json` und in der Fassade trägt denselben neuen Text; Name und Bedingung, wann es erscheint, bleiben gleich.

0.200.2

2026-10-02