--- type: other source_url: https://neoneye.github.io/agent-memory-atlas/systems/plur1bus/ retrieved: 2026-09-05 title: "Agent Memory Atlas: PLUR1BUS (7.11.0 Update)" tags: [plur1bus, openclaw, agent-memory, memory-atlas, lancedb, neo, acl, retrieval, safe-update, drift-gate, conflict, curation] --- # Agent Memory Atlas: PLUR1BUS — 7.11.0 Update Die Seite „PLUR1BUS" im [Agent Memory Atlas](https://neoneye.github.io/agent-memory-atlas/systems/plur1bus/) wurde aktualisiert und analysiert nun den Release-Stand **7.11.0** (vorher: 7.4.0). ## Neue Metriken gegenüber 7.4.0 - **12.418 Zeilen** in `index.js` (war ~10.900 bei 7.4.0) - **73.743 Zeilen** über 254 Dateien in `lib/` (war ~61.000) - **50 Konfigurationsgruppen** in `openclaw.plugin.json` (war 47) - **361 Testdateien** — „test suite is larger than the implementation it covers" ## Neue Details gegenüber der 7.4.0-Dokumentation ### Safe-Update und Drift-Gate `lib/safe-update.js` (414 Zeilen) wird detaillierter beschrieben: - Content-Änderung wird verweigert, wenn Aufrufer keine Update-Quelle und kein Evidenzzitat liefert - Ersatzzeile wird geschrieben und durable gemacht, bevor die alte Zeile als `superseded` markiert wird - Ganzer Übergang wird an ein Reconsolidation-Event-Log mit Idempotency-Hash angehängt - **Drift-Gate** (`safe-update.js:398`): Kosinus-Distanz > 0,45 → Update wird abgelehnt. Der `/correct`-Aufruf an `index.js:8995` setzt bewusst `skipDriftGate: true` — mit Begründung an der Aufrufstelle: das Gate wirft statt zu degradieren, eine große Korrektur ist genau was ein User bei `/correct` beabsichtigt, der Bestätigungsdialog zeigt alt und neu vollständig vor dem Schreiben. Gemessener Drift wird trotzdem im Reconsolidation-Event aufgezeichnet. „A gate that is off by argument is a different thing from a gate that is off by accident." ### ACL und Scope `checkAccess` (`lib/acl-middleware.js:103`): - Denies by default - Denies on missing owner - Denies on conflicting ownership tuple - Angewendet als Filter auf dem Read-Pfad an drei Stellen - Tests assert die Denials, nicht die Permissions ### Conflict-Handling mit Messung `conflict` bleibt eine Ranking-Penalty, kein Hard-Filter — mit einer konkreten Messung als Begründung: - Detector ist „an unvalidated LLM" - Live-Probe am 16. August 2026: **4.017** newest-revision Records mit `conflict` (2.505 auf einem einzigen Agent) - „No resolve path that clears the status" - 20-Row-Sample war nicht pairwise contradiction - „Hard-filtering on that signal would have withheld thousands of records on a flag the system cannot yet clear" - Distinktion: **withhold on a state a person set, rank on a state a model guessed** ### Status-/Trust-Arithmetik `scoreNeoRecallItem` returns `-Infinity` für `pruned`, `tombstoned` und `demoted` — drei States genuinely withheld. `conflict` bleibt in der Arithmetik: ```javascript const trustBoost = ({ curated: 0.3, validated: 0.25, user_asserted: 0.18, tool_observed: 0.18, assistant_asserted: -0.2, untrusted: -0.3 })[item.origin?.trustLevel] ?? 0; // ... const penalties = (item.origin?.role === "assistant" ? 0.2 : 0) + (item.status === "demoted" ? 0.35 : 0) + (item.status === "conflict" ? 0.3 : 0) + (item.stale === true ? 0.15 : 0); ``` ### Curation-Subcommands - `/plur1bus curation resolve keep|drop` (`lib/curation-resolve.js`, dispatched at `index.js:8065`) - `/plur1bus curation drop-injected` (`lib/drop-injected-conflicts.js`, `index.js:8082`) — Bulk-Form, doppelt begrenzt: `previewDropInjected` zeigt Set vor Apply, Apply verweigert Records deren `status !== "conflict"` oder deren Text nicht `isInjectedContextText` erfüllt - Kein Auto-Resolve: ein `conflict` den nie jemand ansieht bleibt eine Penalty für immer — „the honest cost of leaving an unvalidated detector's output in the ranking rather than in a filter" ### Epistemic Status — drei Read-Layer `invalidated` wird an allen drei Read-Layern ausgeschlossen: - `recall-pipeline.js:157` - `neo-arch.js:1464` - SQL clause at `db-adapter.js:562` ### LanceDB-Karten: Status-Filter `lib/recall-pipeline.js:153`: jeder Eintrag mit gesetztem `status` der nicht `active` ist wird gedroppt — nicht ranked-down, sondern „gone from the read path". ### Neo-Status-Aufteilung Die Neo-Status trennen sich jetzt dreifach statt zweifach: 1. **Deletion-States + `demoted`** → withhold (`-Infinity`) 2. **`conflict` + Trust-Ladder** → rank (mit Penalties) 3. Die Trennung folgt dem Verursacher: Person setzt → withhold; LLM rät → rank ### Validitätsfenster und Tombstones (unverändert zu 7.4.0) - `validFrom`/`validUntil` getrennt von `createdAt`/`updatedAt`, abfragbar via `validAt` - `/forget` schreibt Content-Fingerprint in durable append-only Registry, wird als Schritt 0 jedes Capture geprüft ### Zwei Stores - **LanceDB**: Memory-Karten, eine Tabelle pro Agent - **Neo (JSONL)**: Turn-Journal, Kandidaten, Behavior-Cards, Graph-Kanten, Dream-Diary, Episoden — tragen die Epistemics ## Einordnung Das Atlas-Dokument ist die umfassendste externe Architektur-Analyse von PLUR1BUS. Der Sprung von 7.4.0 auf 7.11.0 bringt signifikant neue Details insbesondere zu Conflict-Handling (mit Live-Messung), Curation-Subcommands und der dreifachen Status-Aufteilung. Die Atlas-Seite ist unabhängig von den Release-Ankündigungen im OME und ergänzt sie um Code-Ebene-Details.