COMPASS-Doku

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.