Skip to content

Latest commit

 

History

History
149 lines (118 loc) · 6.38 KB

File metadata and controls

149 lines (118 loc) · 6.38 KB

Gardener ROADMAP

🇬🇧 English Version

Aktualisiert: 2026-08-13 Aktuelle Version: v0.4.0 (Prototyp)

Prototyp (v0.1) — ERLEDIGT

  • 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

Nächste Schritte (v0.2)

Lernen & Evolution

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.

Weitere Themen v0.2

  • Pinning sinnvoll nutzen (pinned=1 verhindert Decay)
  • Fachtabellen bei Bedarf (shelves-Registry ist vorbereitet)
  • Mehr Bridge-Tools nach Bedarf portieren (aus BACH)

Später (v0.3+)

  • 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)

Architektur-Entscheidungen (Logbuch)

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

Cross-Source federated index (v0.3+) — 2026-07-06

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: eigene format-Presets für Codex-/Gemini-/Kimi-Transkriptformate (bislang claude_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. Der agent_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 als Memory-Modul

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.