Suche
Es gibt drei getrennte Such-Flächen — sie decken unterschiedliche Tabellen ab und teilen sich keinen gemeinsamen Index.
Aussagen und Ereignisse — GET /suche
curl -sS "$COMPASS_URL/suche?q=timeout" -H "X-Compass-Key: $COMPASS_KEY_RO"
Volltextsuche (Postgres tsvector) über Aussagen und Ereignisse zusammen.
Die Antwort nennt immer die Gesamtzahl, nicht nur die Seite:
{
"treffer": [{"typ": "aussage", "id": 4711, "text": "…", "sache": "…",
"status": "gilt", "gilt_seit": "…", "gilt_bis": null, "rang": 0.71}],
"gesamt": 290,
"abgeschnitten": true,
"weiter": 100
}
Das MCP-Werkzeug ist suche(q, subjekt_id?, persona_slug?, alle=False, limit?, offset?); es setzt zusätzlich einen hinweis in Worten („100 von 290 Treffern. Weiter mit offset=100.").
gesamt zählt nach dem Sichtfeld-Filter, nicht davor — die gelieferte
Seite und die Zahl daneben beschreiben dieselbe Menge. abgeschnitten sagt,
ob hinter dieser Seite noch etwas steht, und weiter nennt den offset für
die nächste Seite oder ist null, wenn es nichts mehr gibt. Wer alles will,
blättert, bis weiter null ist — niemand muss selbst nachrechnen, um zu
wissen, ob er fertig ist.
Geändert am 05.10.2026 (brechend). Vorher war die Antwort eine Liste und wurde bei 100 Treffern stumm abgeschnitten: gemessen 290 vorhandene Treffer, 100 gelieferte, kein Hinweis — die Liste sah vollständig aus. Eine halbe Messung darf nicht wie eine ganze aussehen.
persona_slug filtert nur die Aussage-Treffer auf das Sichtfeld dieser
Persona (über die Sache verbunden). Ereignis-Treffer werden nie so
gefiltert — Ereignisse tragen kein bereich-Feld, es gibt also nichts, das
gefiltert werden könnte. Das ist eine dokumentierte Grenze, kein Versehen:
eine persona-gefilterte Suche kann hier Ereignisse unter-repräsentieren,
und der Vertrag sagt das, statt Vollständigkeit vorzutäuschen.
alle=true hebt den Aussage-seitigen Filter auf und wird protokolliert,
wenn dadurch tatsächlich etwas sichtbar wird.
limit setzt die Seitengröße (Standard 100). Zusammen mit persona= gilt
zusätzlich der Deckel der Modellklasse dieser Persona (klein 20 / mittel
50 / groß 200) — ein expliziter Wert darüber wird mit 422 abgewiesen,
nicht still gekappt. Der Deckel begrenzt die Seite, nicht die Menge:
auch eine kleine Persona kommt über offset an alles heran.
Das eigene Gedächtnis einer Persona — GET /personas/{slug}/gedaechtnis
curl -sS "$COMPASS_URL/personas/atlas/gedaechtnis?q=deploy" -H "X-Compass-Key: $COMPASS_KEY_RO"
Volltextsuche (deutscher tsvector) über die Gedächtnis-Einträge einer
Persona — jüngste zuerst, nur laufende Einträge (gilt_bis null), außer
alle=true. Liefert die eigenen Einträge plus sichtbares
Firmen-Gedächtnis (ein Eintrag mit persona_slug=null ist nur sichtbar,
wenn er mindestens ein Tag im Sichtfeld der lesenden Persona trägt, oder
deren Sichtfeld leer ist). Das MCP-Werkzeug ist
memory_search(persona_slug, q, art?, limit=20, lesende_persona?, alle=False)
— der Parameter heißt hier bewusst lesende_persona, nicht ein zweites
Mal persona_slug; persona_slug beantwortet schon „wessen Gedächtnis",
der Sichtbarkeits-Filter braucht einen eigenen Namen.
Lehren — GET /lehren?q=
curl -sS "$COMPASS_URL/lehren?q=timeout" -H "X-Compass-Key: $COMPASS_KEY_RO"
Volltextsuche über titel+was+lehre einer Lehre. Sichtbarkeit folgt
hier einer leicht anderen Regel als beim Gedächtnis: eine Lehre ganz ohne
bereich gilt als allgemein und bleibt für alle sichtbar — eine Lehre ist
per Form eine allgemeine Aussage, eine Gedächtnis-Notiz nicht. Das
MCP-Werkzeug ist lehren_suche(q?, art?, status?, bereich?, lesende_persona?, limit?).
Was nicht zusammen durchsucht wird
Es gibt keinen einzelnen Aufruf, der Aussagen, Gedächtnis und Lehren auf
einmal durchsucht — die Fläche wählen, die zur gesuchten Sache passt. Bei
Unsicherheit, wo etwas liegt, ist GET /suche der breiteste einzelne
Aufruf (Aussagen + Ereignisse mandantenweit), danach gezielt das
Gedächtnis der passenden Persona oder direkt die Lehren prüfen.