Aktualisiert: 2026-08-13 Aktuelle Version: v0.4.0 (Prototyp)
- Kern: find/get/put/run
- Zwei DBs: gardener.db + user.db (transparent via ATTACH)
- FTS5-Volltextsuche mit Triggern
- .absorber/ (Briefkasten) + .output/ (Ausgabe)
- config.json Sync-Modi (selective/always_absorb/observe_only)
- Blob-Halde für große Dateien (>50MB)
- Workspace-Materialisierung für Code-Ausführung
- Drei Beziehungstypen: beobachten / absorbieren / direkt bearbeiten
- Tasks (task/tasks/done/task_status)
- Memory (memo/lesson/session_end/recall/consolidate)
- Decay/Boost/Forget (Gewichtung im meta-Feld)
- Bridge-Tools: shell, http-fetch, backup, encoding-fix
- Haut-Tools: text-stats, datei-info, ordner-scanner
- list/delete Verwaltung
- CLI mit 19 Befehlen
- seed.py (Grundwissen + Tools)
- Dokumentation: KONZEPT.md, README.md, ERKENNTNISSE.md
Tools, Skills und Wissenseinträge sollen wie Memory-Einträge altern und frisch bleiben können:
- Decay für alles: Nicht nur memory/lesson/session, sondern auch tools und knowledge bekommen Gewicht. Unbenutzte Tools verblassen, oft genutzte bleiben frisch.
- Nutzungs-Tracking:
run()erhöht das Gewicht eines Tools.get()erhöht das Gewicht von Knowledge. Wer gebraucht wird, lebt. - Natürliche Selektion: Wenn ein besseres Tool für die gleiche
Aufgabe gefunden wird, ersetzt es das alte. Das alte verfällt durch
Nicht-Nutzung und wird irgendwann von
consolidate()entfernt. - Erfahrung = Gewicht: Ein Tool das 100x gelaufen ist, hat mehr Gewicht als eines das 2x lief. Das spiegelt echte Erfahrung.
Neues Tool: weight=0.5 (unbewiesen)
Nach 10x run: weight=0.8 (bewährt)
Nach 100x run: weight=1.0 (Kern-Tool)
Nie benutzt: weight sinkt → consolidate() entfernt es
Ersetzt: Altes Tool wird nicht mehr gerufen → verfällt
Das ist Lernen: Nicht alles behalten, sondern das Bessere behalten und das Schlechtere vergessen lassen.
- Pinning sinnvoll nutzen (pinned=1 verhindert Decay)
- Fachtabellen bei Bedarf (shelves-Registry ist vorbereitet)
- Mehr Bridge-Tools nach Bedarf portieren (aus BACH)
- Selbstheilung/Respawn (System-Einträge aus gardener.db wiederherstellen)
- DB-Viewer (aus BACH portieren)
- MCP-Server (Gardener als MCP: find/get/put/run als Tools)
- Versionierung (Änderungshistorie in DB)
- Rechte-Modell (wer darf gardener.db ändern?)
- Workspace-Verwaltung (aufräumen, max. Größe)
- Externe Anbindungen (MCP, APIs)
- Multi-LLM (mehrere LLMs teilen sich user.db)
| Datum | Entscheidung | Grund |
|---|---|---|
| 2026-03-12 | Eine Tabelle (everything) | Alles in einer Suche |
| 2026-03-12 | Kein separates Task-System | Tasks = type='task' in everything |
| 2026-03-12 | Kein separates Memory-System | Memory/Lessons = Typen in everything |
| 2026-03-12 | Kein Dematerialize | absorb() IST Dematerialisierung |
| 2026-03-12 | FTS5 statt Trigger-Tabelle | Die Suche IST das assoziative Gedächtnis |
| 2026-03-12 | Körper-Modell | Haus=Geist, Haut=Filter-Tools, Draußen=Bridge-Tools |
| 2026-03-12 | Text-Grenze | Im Haus kein Tool, an der Haut Filter, draußen Werkzeuge |
| 2026-03-12 | DB-Viewer aus BACH | Nicht neu bauen, portieren |
| 2026-03-12 | Sketchboard-Modell | LLM IST das Haus (Kontext), DB ist Fotoalbum (Gedächtnis) |
| 2026-03-12 | Decay für alles (geplant) | Tools/Knowledge sollen auch altern können |
Gardener wird der Sucheinstieg über verteiltes Wissen, nicht nur über die
eigene DB. observe() ist konzeptionell schon der richtige, föderierte
Mechanismus („beobachten statt besitzen", read-only).
Status 2026-07-23: erste Ausbaustufe umgesetzt (sources.py,
Gardener.observe_source_*/observe_sources(), CLI gardener observe-source add/list/remove/refresh, 17 Tests). Details: README_de.md Abschnitt
"Cross-Source Federated Index", CHANGELOG.md 2026-07-23.
- Vier read-only-Adapter:
markdown_dir,remember_files,sqlite_table(generisch: Pfad+Tabelle+Spalten-Mapping aus config.json, deckt rinnsal-/bach.db-artige Tabellen ab ohne deren Schema fest zu verdrahten),agent_transcripts(JSONL, inkrementell ab gespeichertem Byte-Offset, kein GB-Reread). Offen: eigeneformat-Presets für Codex-/Gemini-/Kimi-Transkriptformate (bislangclaude_code+ generisches Role/Text-Mapping). - Treffer zitieren zurück zur Quelle via
meta.source_ref. - Föderierte FTS-Suche über eigene + beobachtete Quellen in einem Query
(bestehendes
find()durchsuchte bereits beide DBs gemeinsam). - Agenten-Memory-Verzeichnisse (
markdown_dir, deckt eine konfigurierbare Projekt-Memory-Konvention ab) und.remember-Dateien (remember_files) als eigene Adapter. Deragent_transcripts-Adapter ist eine eigenständige, generische Neu-Implementierung — es wurden keine privaten Pfade oder Inhalte aus interner Werkzeugkette übernommen.
Abgrenzung: absorb = ins Haus holen (klein/kuratiert) vs. observe-Index =
föderiert (fremd/groß, read-only). Vorbild ctx (ctxrs, Apache-2.0,
pull/passiv) — deckt aber nur Coding-Agent-Transkripte ab, nicht beliebige
lokale Datenbanken. Hintergrund und Recherche:
docs/decisions/knowledge-index.md.
Gardener wird primär als Memory-Modul verstanden und funktioniert zugleich als absolut minimales Betriebssystem. Im ellmos-Memory-Stack sind die Rollen dreigeteilt:
- USMC — kuratiertes Session- und Kern-Gedächtnis, zugleich Fassade und Einstiegspunkt des Memory-Systems.
- Gardener — der Memory-Zulieferer: organischer Wildwuchs (absorb / observe / decay) plus Cross-Source-Index.
- TASKPLAN — das Task-System als eigenes Modul.
Damit ist auch eine ältere offene Designfrage beantwortet: Taskverwaltung
gehört zu TASKPLAN; Gardeners type='task'-Einträge bleiben, was sie waren —
organisches Beobachtungsgut, kein Task-System.
- BACH-Transfer (geplant): BACHs stärkere Memory-Funktionen nach USMC überführen; BACH importiert anschließend den gemeinsamen Memory-Stack, statt einen eigenen zu pflegen.