Baue den Index als SQLite mit FTS5 und sqlite-vec, dazu die Suche

Entscheidung Andreas 2026-09-04 (spine/core#8): kein Datenbankdienst. Der
Index ist eine abgeleitete Sicht auf die Markdown-Ablage in einer Datei im
Volume, jederzeit neu baubar. image/km/index.py zerlegt die Dateien in
Chunks (Chunking aus info/ai/scripts/index_docs.py übernommen), hält
Volltext in FTS5 und Vektoren aus bge-m3 in sqlite-vec, inkrementell über
SHA-256 je Datei. image/km/search.py sucht Volltext führend, Vektor
ergänzend, mit Filtern vor dem Ranking (0 Treffer statt gesperrt).

Ingest: Kommentare bei der Erstbefüllung repo-weit statt je Vorgang —
die erste Fassung hing bei live/live nach 371 Vorgängen; jetzt 2175 in zwei
Minuten. Gemessen: Volltext über 61.000 Chunks in 3 s, Vektoren 0,31 s je
Chunk auf der CPU-Box. Kein Bytecode mehr im Repo.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 18:04:35 +02:00
co-authored by Claude Fable 5.1
parent 1e08de2d05
commit 4986ef0575
9 changed files with 599 additions and 14 deletions
+10 -8
View File
@@ -67,11 +67,15 @@ KM_GITEA_URL=https://git.home KM_NAMESPACE=familie KM_CLASSIFICATION=home \
|---|---|---|---|
| spine/core | 20 | 6 s | Erstbefüllung |
| spine/core | 0 gesehen | 0,3 s | inkrementell, nichts geändert |
| 42i/intern | 1165 | ~3 min | Erstbefüllung, ein API-Aufruf je Vorgang für die Kommentare |
| 42i/intern | 1165 | ~3 min | Erstbefüllung, noch ein API-Aufruf je Vorgang für die Kommentare |
| live/live | 2175 | ~2 min | Erstbefüllung mit repo-weitem Kommentar-Endpunkt (ein Aufruf je 50 Kommentare) |
| elf Repos (live, intern, spine/*, hive/*) | 2241 | 94 s | ein Lauf |
Die Erstbefüllung kostet einen Aufruf je Vorgang mit Kommentaren; das ist
die Last auf der Forge, von der #13 spricht. Sie fällt einmal an. Danach
kostet ein Lauf einen Aufruf je Repo plus einen je geändertem Vorgang.
Die erste Fassung holte die Kommentare je Vorgang und blieb bei live/live
nach 371 Vorgängen an einer offenen Verbindung hängen. Seitdem gilt: bei der
Erstbefüllung kommen die Kommentare **repo-weit** (`/issues/comments`, älteste
zuerst), inkrementell je geändertem Vorgang. Dazu ein Verbindungs-Timeout und
Fortschritt je 100 Vorgänge auf stderr.
## Was noch fehlt (Reihenfolge)
@@ -79,10 +83,8 @@ kostet ein Lauf einen Aufruf je Repo plus einen je geändertem Vorgang.
`wake.km` geweckt werden (spine/core#12: Gitea-Webhook → HTTP→Bus-Adapter
→ Bus → km) und dann den inkrementellen Lauf machen. Der periodische
Abgleich bleibt daneben Pflicht.
2. **Suche über die Ablage.** Volltext führend, Vektor ergänzend (spine/core#1).
Der bestehende Indexer `info/ai/scripts/index_docs.py` chunkt Markdown mit
Frontmatter — die Vorgangsdateien sind dafür gebaut. Welche Datenbank(en)
dahinter stehen, ist noch nicht entschieden (Stand 04.09.).
2. ~~Suche über die Ablage.~~ Gebaut: SQLite mit FTS5 und sqlite-vec, siehe
[index-suche.md](index-suche.md).
3. **Verknüpfung mit Doku und Memory.** Die `verweise:` sind erst Kanten
zwischen Vorgängen. Kanten zu Doku-Seiten (ein Ticket, das eine Seite
betrifft) und die Konsistenzprüfung gegen abgelegte Festlegungen kommen