REST-Referenz
Basis-URL: $COMPASS_URL (Vertrags-Standard http://<host>:8080/api/v1).
Jede Anfrage außer GET /version braucht eine X-Compass-Key-Kopfzeile.
Alle Zeiten ISO-8601 UTC. Diese Referenz enthält keinen
DELETE-Endpunkt — Aussagen, Prozesse, Lehren und jeder andere Datensatz
werden abgelöst oder beendet, nie gelöscht (im Code existieren einige
wenige, schmale und geprüfte Ausnahmen; siehe den Abweichungs-Hinweis am
Ende dieser Seite).
Fehler sehen immer so aus: {"detail": "<Satz in Klartext>", ...Felder}.
Ein 409 nennt den kollidierenden Datensatz; ein 422 nennt das
betroffene Feld. Unbekannte Felder in einem Schreib-Body werden mit 422
abgewiesen (jedes Eingabe-Modell erbt extra="forbid").
Diese Seite listet nur Endpunkte, die sowohl im Vertrag als auch im
laufenden Code existieren, gruppiert wie der Vertrag selbst gruppiert.
Spalte Auth: ro = Lese-Schlüssel reicht, rw =
Schreib-Schlüssel nötig, bruecke = auch mit einem bruecke-Schlüssel
erreichbar.
Subjekte
| Methode & Pfad |
Auth |
Was es tut |
GET /subjekte |
ro |
Subjekte auflisten ({id, typ, ref_id, titel}). |
POST /subjekte |
rw |
Subjekt anlegen; idempotent auf (typ, ref_id). |
Sachen
| Methode & Pfad |
Auth |
Was es tut |
GET /sachen |
ro |
Sachen auflisten. Filter: bereich, stufe, suche, persona (Eigentum), sichtfeld (Sichtbarkeit), alle, limit. sichtfeld und persona beantworten bewusst verschiedene Fragen — siehe Konzepte. Je Eintrag anzahl_geltend (geltende Aussagen, alle Arten). |
GET /sachen/{slug} |
ro |
Eine Sache plus ihre Aussagen, aufgeteilt in gilt / abgeloest / offen / hypothesen. Jede Aussage trägt ihren Prüfstand mit (pruefstand, pruefweg_letzter_lauf): ungeprueft heißt kein Prüfweg oder nie gelaufen. |
POST /sachen |
rw |
Sache anlegen; idempotent auf slug (200, wenn sie schon existiert). persona_slug macht daraus eine Persona-Regel statt einer Firmenregel. |
Regelbuch
| Methode & Pfad |
Auth |
Was es tut |
GET /regeln/wirkung |
ro |
Wirkt die Regel? Je Regel, die aus einer Lehre entstanden ist, wie oft derselbe Fehler nach „gilt seit" wieder auftrat, verglichen mit einem gleich langen Zeitraum davor (wiederholt_lehre_id, transitiv gezählt). Vier Gruppen: wirkt (mindestens halbiert), haeufiger, zu_frueh (gilt noch keine 14 Tage — keine Zahl, nicht 0), nicht_messbar. alle=true nimmt Regeln ohne Lehre dazu; sie bekommen grund='ohne_lehre' und ebenfalls keine Zahl. Kein Modell, keine Schätzung. |
GET /regelbuch |
ro |
Lesende „gedruckte" Ansicht jeder Sache mit aktuell geltender Regel, nach Bereich gruppiert. bereich= filtert das angezeigte Kapitel; bereiche/gesamt in der Antwort sind immer die vollständige, ungefilterte Zusammenfassung. Das ist Etappe A einer dreistufigen Migration von CLAUDE.md §0 in den Kern — siehe die Anleitung. |
Aussagen
| Methode & Pfad |
Auth |
Was es tut |
POST /aussagen |
rw |
Neue Aussage schreiben. 409 mit der geltenden Aussage, wenn bereits eine regel gilt und ersetzt fehlt; 422 bei unbekannter Sache, einer Hypothese ohne frist+pruefweg_slug, oder Stufenverstoß. |
GET /aussagen/{id} |
ro |
Eine Aussage plus ersetzt_von/ersetzt (die Ablösekette). |
POST /aussagen/{id}/status |
rw |
Status ändern (widerlegt|offen|vorlaeufig|gilt) — nur Hypothesen und offen/vorläufig. |
POST /aussagen/{id}/beenden |
rw |
Eine geltende Aussage ohne Nachfolger beenden (status=abgeloest, gilt_bis=now()). 409, wenn sie gerade nicht gilt ist. |
GET /gilt/{sache} |
ro |
Die eine geltende Regel, oder 404 mit {detail, offen}. persona= filtert nach Sichtbarkeit (403, wenn die Sache außerhalb liegt, außer alle=true). |
GET /gilt-am/{sache} |
ro |
Was an einem Datum galt, mit Status. Gleiches Sichtbarkeits-Verhalten wie GET /gilt/{sache}. |
GET /warum/{sache} |
ro |
Die Regel, ihr Entscheidungstext, ihre Historie, das letzte Prüfweg-Ergebnis. |
GET /konflikte |
ro |
Sachen, bei denen etwas nicht zusammenpasst. Jeder Eintrag trägt art: mehrere_geltende_aussagen (mehrere geltende Aussagen derselben Art zur selben Sache, mit unterschiedlichem Text, von denen keine die andere ablöst — dazu anzahl_aussagen und anzahl_subjekte), stufenverstoss, ungepruefte_stufe oder widerspricht (eine gesetzte WIDERSPRICHT-Kante, mit grund, quelle und gesetzt_von). Zweimal derselbe Wortlaut zählt nicht, eine abgelöste Aussage auch nicht, eine beendete Kante auch nicht. Und seit dem 29.09.2026 auch nicht: eine Sache, die lauter Antworten auf verschiedene Fragen gesammelt hat — jede Aussage der Gruppe trägt quelle = frage:<n>, und alle zeigen auf verschiedene Fragen. Gemeldet bleibt, wo eine Aussage keine Quelle hat, eine fremde Quelle trägt, oder wo zwei Antworten auf dieselbe Frage nebeneinanderstehen. |
POST /widersprueche |
rw |
Zwei Aussagen widersprechen sich — mit Grund, und ohne Konfidenzwert. Setzt ein Mensch (quelle=mensch) oder eine beantwortete Klickfrage (quelle=frage mit frage_id); kein Automat schreibt hier. 422 ohne Grund oder bei einer Aussage gegen sich selbst, 404 bei unbekannter Aussage, 409 wenn dieses Paar schon eine geltende Kante hat. |
POST /widersprueche/{id}/beenden |
rw |
Den Widerspruch zurücknehmen: beendet_am/beendet_von werden gesetzt, gelöscht wird nichts. Danach fällt die Kante aus GET /graph und GET /konflikte, bleibt aber lesbar. 409, wenn sie schon beendet ist. |
GET /aussagen/{id}/nachweise |
ro |
Welche Dokumente diese Aussage belegen. Je Eintrag Slug, Titel und Fassung des Dokuments, dazu bestaetigt_am/bestaetigt_von — leer heißt: noch niemand hat hingesehen. Zurückgenommene Kanten kommen erst mit ?beendet=true. |
POST /aussagen/{id}/nachweise |
rw |
Ein Dokument als Beleg anhängen ({dokument_slug, bemerkung?}), unbestätigt. Anhängen und Bestätigen sind zwei Schritte. 409, wenn dasselbe Dokument die Aussage schon belegt oder wenn das Dokument beendet ist. |
POST /nachweise/{id}/bestaetigen |
rw |
Festhalten, dass jemand diesen Beleg angesehen hat. Setzt Zeitpunkt und Namen — und sonst nichts: der Status der Aussage bleibt, wie er ist. 409 beim zweiten Mal. |
POST /nachweise/{id}/beenden |
rw |
Die Kante zurücknehmen: beendet_am wird gesetzt, gelöscht wird nichts. Sie fällt aus der Liste und aus GET /warum/{sache}, bleibt lesbar, und dasselbe Dokument darf danach erneut angehängt werden. |
Stufen
Welche Stufen es gibt und in welcher Ordnung, sagt der Mandant — Vorgabe leer. COMPASS bringt kein eigenes Stufen-Vokabular mit.
| Route |
Recht |
Was sie tut |
GET /sachen-stufen |
ro |
Die aktiven Stufen dieses Mandanten, allgemeinste zuerst: [{slug, rang, titel, erstellt_am}]. Leere Liste = keine Stufen konfiguriert, und das heißt: jede an einer Sache gesetzte Stufe gilt als ungeprüft, nicht als in Ordnung. |
PUT /sachen-stufen |
rw |
Setzt die ganze Ordnung: {stufen: [{slug, titel?}]}. Die Reihenfolge ist der Rang, allgemeinste zuerst — kein rang-Feld, das der Aufrufer selbst vergeben könnte. Was nicht mehr vorkommt, bekommt entfernt_am und bleibt stehen (gelöscht wird nicht). 422 bei unerlaubtem Slug oder doppeltem Eintrag. |
Hypothesen
| Methode & Pfad |
Auth |
Was es tut |
POST /hypothesen |
rw |
Hypothese anlegen (art=hypothese, status=vorlaeufig). frist und pruefweg_slug sind Pflicht. |
POST /hypothesen/{id}/bewerten |
rw |
Auflösen: bestaetigt|widerlegt|verlaengert (mit neue_frist). |
GET /hypothesen |
ro |
Auflisten, optional faellig=true für fällige. |
Prüfwege
| Methode & Pfad |
Auth |
Was es tut |
POST /pruefwege |
rw |
Prüfweg anlegen oder upserten. 422, wenn befehl nicht auf der Allowlist steht oder ein schreibendes Muster enthält (>, rm, DELETE, git push, …). |
GET /pruefwege |
ro |
Prüfwege auflisten, inklusive der rohen Ursachen-Spalten (erfuellt, werkzeug_fehlt_serie, reparatur_noetig, …). |
POST /pruefwege/{slug}/run |
rw |
Ausführen (30 s Timeout), Ergebnis speichern, Fakt schreiben. Ein sauberer Lauf löst einen offenen Abweichungs-Zustand dieses Prüfwegs auf. |
POST /pruefwege/{slug}/beenden |
rw |
Prüfweg beenden — grund und von sind Pflicht. Er läuft nicht mehr im Nachtlauf, erscheint nicht mehr als Abweichung und zählt im Rundgang nicht mehr mit; /run antwortet danach 409. Die Zeile bleibt lesbar, samt letztem Lauf. Gelöscht wird nicht. |
Abweichungen
Eine Abweichung heißt: das Ergebnis eines Prüfwegs passte nicht zur
Erwartung seiner Regel. Die Ursache ist immer eine von drei, nie geraten:
verstoss (Verstoß), werkzeug_fehlt (ein bekanntes
Werkzeug-fehlt-Muster gewinnt immer gegen jede andere Lesart), oder
unklar (die Erwartung selbst ließ sich nicht auswerten).
| Methode & Pfad |
Auth |
Was es tut |
GET /abweichungen |
ro |
Abweichungen auflisten, mit ursache, stumm (true ab 3 aufeinanderfolgenden werkzeug-fehlt-Läufen) und fertigem ticket_text. Optional seit=. |
POST /abweichungen/{pruefweg_slug}/verfolgen |
rw |
Als verfolgt markieren, optional ticket anhängen. 409, wenn der Prüfweg gerade nicht abweicht. |
POST /abweichungen/{pruefweg_slug}/regel-ueberholt |
rw |
Aus einer Abweichung eine Schaltzentrale-Frage stellen („Regel behalten oder ablösen"). 422 ohne geltende Regel auf dem Prüfweg. |
POST /abweichungen/{pruefweg_slug}/pruefweg-kaputt |
rw |
Den Prüfweg selbst als kaputt markieren — nimmt ihn aus der GET /offen-Ampel, nicht aus GET /abweichungen. |
Prozesse
| Methode & Pfad |
Auth |
Was es tut |
POST /prozesse |
rw |
Prozess anlegen, oder neue Version, wenn der slug existiert (alte Version bekommt gilt_bis). |
GET /prozesse |
ro |
Die höchste Version je Slug. alle=true zeigt auch abgelöste/beendete. Je Eintrag anzahl_schritte und anzahl_luecken. |
GET /prozesse/{slug} |
ro |
Die höchste Version, ihre Schritte, Regeln je Schritt, luecken (Schritte ohne Regel und ohne frei=true). ueberholt: true, wenn beendet. Dazu versionen: jeder Stand dieses Prozesses mit gilt_seit und gilt_bis. |
GET /prozesse/{slug}?version= |
ro |
Genau diesen Stand, mit seinen Schritten. Damit ist nachlesbar, was vor einer Änderung galt: ein Schritt, der aus der Liste genommen wurde, steht im vorherigen Stand vollständig da — gelöscht wird nichts. Ein Stand, den es nicht gibt, ist 404, und die Antwort nennt die vorhandenen. |
GET /prozesse/{slug}/bild/{key} |
ro |
302 auf das Bild des Schritts, oder 404. |
POST /prozesse/{slug}/beenden |
rw |
Einen Prozess ohne Nachfolgeversion beenden. 409, wenn bereits beendet. |
Schaltzentrale
| Methode & Pfad |
Auth |
Was es tut |
POST /fragen |
rw |
Eine Frage mit mindestens zwei Optionen stellen, jede mit folge (Konsequenz). Sonst 422. |
GET /offen |
ro |
Alles, was einen Klick braucht, je Quelle mit Zustand ruhig|unbekannt|achtung. Sieben Quellen, darunter postfach (Nachrichten und Aufträge der Agenten an den Menschen). Fragen-Einträge tragen bereich, gestellt_von und je Aktion folge. Jeder Eintrag trägt herkunft_art (mensch|agent|rundgang|null) aus der vom Kern belegten Herkunft — null, wo keine Spur existiert. |
GET /fragen/seit |
ro |
Beantwortete Fragen seit einem Zeitpunkt — Frage, Antwort, Sache, wer geantwortet hat. (Noch nicht im Vertrag; siehe den Abweichungs-Hinweis.) |
POST /fragen/{id}/antwort |
rw, bruecke |
Eine Frage beantworten; schreibt eine Entscheidung, löst die geltende Regel ab, wenn die gewählte Option das vorsieht. |
POST /offen/hinweis/{id}/erledigt |
rw |
Einen Hall-of-Lessons-Hinweis als gelesen markieren (dieselbe Wirkung wie POST /lehren/{id}/gelesen). |
POST /offen/{typ}/{id}/erledigt |
rw |
Jeden anderen offenen Eintrag erledigen (Frage, Freigabe, Design-Übergabe, Konflikt). |
Kern, Graph & Gedächtnis
| Methode & Pfad |
Auth |
Was es tut |
GET /kern/{subjekt_id} |
ro |
Die geltenden Regeln als Markdown, nach Bereich gruppiert, plus hash. |
GET /graph |
ro |
Knoten und Kanten rund um eine Sache, bis tiefe. Tatsächlich heute erzeugte Kantentypen: GEHOERT_ZU, ERSETZT, GILT_AN, GEPRUEFT_DURCH, BETRIFFT — siehe den Abweichungs-Hinweis für Kantentypen, die der Vertrag beschreibt, die der Graph-Endpunkt aber noch nicht erzeugt. Mit tage= ein Zeitfenster auf gilt_seit; weggelassen heißt alles. |
GET /graph/ansichten |
ro |
Gespeicherte Graph-Ansichten dieses Mandanten, jüngste zuerst (alle=true auch die beendeten). Eine Ansicht ist eine gemerkte GET /graph-Anfrage: Ausgangsknoten, tiefe, tage, Name — der Kern rechnet sie nicht nach. |
POST /graph/ansichten |
rw |
Ansicht anlegen. 422 bei unbekannter Sache, leerem Namen, tiefe außerhalb 1..5 oder tage <= 0 (hier wird abgewiesen, nicht geklemmt wie in GET /graph); 409, wenn unter den offenen Ansichten schon eine mit diesem Namen steht. |
POST /graph/ansichten/{id}/beenden |
rw |
Ansicht beenden — sie verschwindet aus der Liste und bleibt stehen (kein DELETE). 409, wenn sie schon beendet ist. |
POST /ereignisse |
rw, bruecke |
Ereignis erfassen (chat|klick|messung|pr|lauf|vorlage). Idempotent auf quelle_ref. |
GET /ereignisse |
ro |
Ereignisse eines Subjekts auflisten, optional seit=. |
GET /suche |
ro |
Volltextsuche über Aussagen und Ereignisse. Antwort {treffer, gesamt, abgeschnitten, weiter} — gesamt zählt nach dem Sichtfeld-Filter, weiter ist der offset der nächsten Seite oder null. persona= filtert Aussage-Treffer nach Sichtbarkeit; Ereignis-Treffer werden nie gefiltert (Ereignisse tragen kein bereich). |
GET /regelwerk/abdeckung |
ro |
{entscheidungen_gesamt, mit_aussage, ohne_aussage, quote} — wie viel des Entscheidungs-Logs eine passende Aussage trägt. quote ist null, nie 0, bei leerem Universum. |
Import / Export
| Methode & Pfad |
Auth |
Was es tut |
POST /import/claude-md |
ro |
Vorschau: ein deterministischer Scan ohne Sprachmodell (art=claude-md|agents-md|cursor-rules, für alle drei derselbe Scan) nach Überschriften mit einem Anweisungssatz darunter, oder Stichpunkten/Nummerierungen mit einem Imperativ-Marker am Anfang. Jeder Vorschlag trägt regel_text im Originalwortlaut. Schreibt nichts. Der Datei-Weg (file) prüft vorher Größe (max. 1 MB) und ob die Datei überhaupt Text ist — beides 422 mit feld: "file" und byte; im Fehlerfall wird nichts gelesen und nichts geraten. |
POST /import/claude-md/apply |
rw |
Den geprüften Vorschlag schreiben — Sache und Aussage in einem Aufruf (regel bei art=claude-md, fakt bei agents-md/cursor-rules). Idempotent über quelle_ref; eine bestehende geltende Regel im Widerspruch oder ein abweichender Inhalt auf derselben Quellzeile werden gemeldet (konflikt/quelle_ref_widerspruch), nie still überschrieben. |
POST /import/decisions |
rw, bruecke |
Entscheidungen im Bulk importieren, über eine Z-Nummer verankert. Idempotent auf quelle=Z.<n>; ein Widerspruch im Inhalt unter demselben Schlüssel, oder eine zweite gilt-Regel ohne auflösbares ersetzt_z, landet in widerspruch — der Aufruf bleibt trotzdem 200. |
GET /export/claude-md-section0 |
ro |
Das Regelwerk als Markdown-Text. |
GET /export/agents-md |
ro |
Derselbe Inhalt, für AGENTS.md geformt. |
GET /export/cursor-rules |
ro |
Ein ZIP mit Cursor-Regeldateien. |
Kundendaten-Export ("Eure Daten gehören euch")
Der ganze Bestand eines Kunden zum Mitnehmen — anders als die Werkzeug-Formate oben (die nur die
geltenden Regeln in ein fremdes Konfigurationsformat gießen), umfasst dieser Export jede Aussage
mit ihrer Geschichte, Lehren (auch beendete), Gedächtnis, Prozesse (alle Versionen), Prüfwege,
Fragen und Entscheidungen, Personas und Firmengedächtnis.
| Methode & Pfad |
Auth |
Was es tut |
GET /export/kopf |
ro |
Nur {format_version, stand, kunde, zaehlung} — ohne Datensätze, schnell. |
GET /export |
ro |
?format=json (NDJSON: eine Kopfzeile, dann eine Zeile je Datensatz mit teil) oder ?format=markdown (lesbares Regelwerk: je Bereich/Sache die geltende Regel, „Frühere Fassungen", Entscheidungen chronologisch, Lehren kurz — kein LLM, nichts erfunden). Beide StreamingResponse. |
Nie enthalten: Schlüssel/Hashes, Sitzungen/Anwesenheit. Zeilenschutz wie überall — ein anderer
Kunde sieht mit seinem eigenen Schlüssel nur seinen eigenen (leeren) Export.
Personas
| Methode & Pfad |
Auth |
Was es tut |
GET /personas |
ro |
Personas mit Kennzahlen (anzahl_regeln, anzahl_gedaechtnis), vorlage_name, slack. slack ist eine Markierung, die ihr setzt und hier wieder abruft: COMPASS sendet selbst nichts an Slack. Ein Dienst, den ihr anschließt, kann sie auslesen und danach handeln — ohne einen solchen Dienst bleibt sie folgenlos. Für Ereignisse, die COMPASS von sich aus nach außen meldet, nimm die ausgehenden Aufrufe weiter unten. |
GET /personas/{slug} |
ro |
Vollständiger Datensatz plus sichtfeld, regeln, gedaechtnis_letzte (10 jüngste). 404 bei unbekanntem Slug. |
PUT /personas/{slug} |
rw |
Vollständiger Upsert — jedes nicht mitgeschickte Feld wird auf den Standard zurückgesetzt, kein Teil-Update. |
GET /personas/{slug}/brief |
ro |
Der deterministische Markdown-Brief. ?max_gedaechtnis=&budget=&max_lehren=. |
GET /personas/{slug}/brief/stats |
ro |
Dieselben Zahlen, aus denen der Brief gebaut wird, als strukturierte Daten. |
GET /personas/{slug}/gedaechtnis |
ro |
Volltextsuche im Gedächtnis einer Persona (eigenes plus sichtbares Firmen-Gedächtnis). |
POST /personas/{slug}/gedaechtnis |
rw |
Gedächtnis-Eintrag hinzufügen (fakt|feedback|ereignis). |
PATCH /personas/{slug}/gedaechtnis/{id} |
rw |
Einen Gedächtnis-Eintrag beenden (gilt_bis). |
POST /personas/gedaechtnis/import |
rw |
Gedächtnis im Bulk importieren, idempotent auf quelle_ref. persona_slug=null schreibt Firmen-Gedächtnis. |
GET /persona-vorlagen |
ro |
Der Vorlagen-Katalog. |
GET /persona-vorlagen/{slug} |
ro |
Eine Vorlage. |
POST /persona-vorlagen/vorschlag |
ro |
Bis zu 3 Vorlagen gegen einen Freitext-Bedarf ranken (Stichwort-Treffer, deterministisch). |
POST /personas/from-vorlage |
rw |
Eine Vorlage in eine neue Persona kopieren. 409 bei Slug-Konflikt. |
GET /personas/{slug}/beurteilung |
ro |
Personalakten-Ansicht: offene Rollen-Vorschläge, Gelungenes, selbst gemeldete Fehler, Rückfälle, Rückmeldungen des Menschen. |
POST /personas/{slug}/rollen-vorschlag |
rw |
Eine Änderung an aufgabe|koennen|stil|grenzen vorschlagen, mit mindestens einer Lehre belegt; stellt eine Schaltzentrale-Frage. |
Bereiche
| Methode & Pfad |
Auth |
Was es tut |
GET /bereiche |
ro |
Die Bereiche-Registry, alphabetisch. |
POST /bereiche |
rw |
Einen Bereich hinzufügen. 409, wenn er existiert, 422, wenn der Name kein kebab-Slug ist. |
Agents: Anwesenheit und Postfach
| Methode & Pfad |
Auth |
Was es tut |
POST /agents/herzschlag |
ro |
Lebenszeichen einer Sitzung (persona_slug, sitzung, client, status?). Upsert; eine Sitzung gilt 15 Minuten nach ihrem letzten Herzschlag als online. |
POST /agents/offline |
ro |
Eine Sitzung ausdrücklich abmelden. |
GET /agents |
ro |
Jede aktive Persona mit Anwesenheit, Sitzungen, Postfach-Zählern, live berechneter Gehirn-Last. |
POST /agents/{persona}/nachrichten |
rw (oder ro mit von_persona) |
Nachricht senden. Genau eines von von_persona/von_mensch=true ist Pflicht. art=auftrag prüft zusätzlich leitung/nimmt_auftraege_von. |
GET /agents/{persona}/nachrichten |
ro |
Postfach einer Persona; sitzung= markiert unzugestellte Nachrichten als Nebenwirkung als zugestellt. |
POST /agents/nachrichten/an-mensch |
rw (oder ro mit von_persona) |
Nachricht/Auftrag einer Persona AN den Menschen (von_persona/von_sitzung Pflicht, an_persona=NULL, an_mensch=true). Erscheint in GET /offen als Quelle postfach. |
GET /agents/nachrichten |
ro |
Alle Nachrichten des Mandanten. Ohne Zeiger: neueste zuerst. an_mensch=true\|false grenzt auf das Postfach des Menschen bzw. auf Persona-Nachrichten ein. seit_id=<id> liest fortlaufend: nur Nachrichten nach dieser id, aufsteigend — der nächste Zeigerwert ist die id des letzten Eintrags der Antwort, eine leere Antwort heißt „nichts Neues". seit=<zeitpunkt> filtert nach Sendezeit (einschließend) und taugt nicht als Zeiger: gleiche Sendezeiten sind nicht unterscheidbar, und der eigene letzte Eintrag käme jedes Mal wieder. |
POST /agents/nachrichten/{id}/gelesen |
ro |
Eine Nachricht als gelesen markieren. |
POST /agents/nachrichten/{id}/status |
rw |
Status eines Auftrags setzen (offen|angenommen|erledigt|abgelehnt). |
Hall of Lessons
| Methode & Pfad |
Auth |
Was es tut |
POST /lehren |
rw |
Eine Lehre schreiben (fehler|gelungen|hinweis). ursache ist Pflicht bei fehler; bereich ist bei allen Pflicht (unsortiert, solange die Zuordnung offen ist). Idempotent auf quelle_ref. |
PATCH /lehren/{id} |
rw |
Bereich oder Wortlaut einer bestehenden Lehre korrigieren. Nur der Ersteller; eine beendete Lehre bleibt stehen (409). Ein korrigiertes Feld wird ersetzt, nicht ergänzt — wer nur einen Teil des Textes sendet, verliert den Rest. Die Ursache ist auch hier nicht änderbar; muss sie anders lauten, löst eine neue Lehre die alte ab. |
GET /lehren |
ro |
Auflisten, filterbar nach art, status, bereich, persona (Eigentum), sichtfeld (Sichtbarkeit), q (Volltext), offen_hinweise. |
GET /lehren/{id} |
ro |
Eine Lehre plus ihre verknüpfte Frage und, falls zur Regel geworden, ihre Regel. |
POST /lehren/{id}/aufnehmen |
rw |
Als gesehen und für richtig befunden markieren (status=aufgenommen). 409, außer sie war offen. |
POST /lehren/{id}/regel-vorschlagen |
rw |
Eine Schaltzentrale-Frage stellen, um daraus eine Regel zu machen — schreibt die Regel nie direkt. |
POST /lehren/{id}/beenden |
rw |
Beenden (gilt_bis=now()). |
POST /lehren/{id}/gelesen |
rw |
Einen hinweis als gelesen markieren. |
POST /lehren/{id}/antwort |
rw |
Auf einen hinweis antworten; schreibt zusätzlich einen Gedächtnis-Eintrag für dessen Persona. |
GET /lehren/stats |
ro |
Zahlen nach Status und Art, diese Woche insgesamt, ungelesene Hinweise. |
POST /lehren/import-gedaechtnis |
rw |
Einmaliger Import der dateibasierten Feedback-Gedächtnis-Einträge als fehler-Lehren. Unterstützt trocken=true (Trockenlauf). |
Hall of Fame + Daumen
| Methode & Pfad |
Auth |
Was es tut |
GET /hall-of-fame |
ro |
Wochen-Rangliste inklusive Abzeichen. |
GET /hall-of-fame/abzeichen |
ro |
Alle Abzeichen, jüngste Woche zuerst. |
GET /hall-of-fame/quellen |
ro |
Welche Punktequellen aktuell feuern gegenüber nur in der Registry stehen. |
POST /daumen |
rw |
Ein Daumen hoch, nur von einem Menschen — eine Persona als von bekommt 403. 409 bei einem zweiten Daumen derselben Person auf dasselbe Objekt. |
POST /daumen/{id}/zuruecknehmen |
rw |
Einen Daumen mit einer Gegenbuchung zurücknehmen (409, wenn bereits zurückgenommen). |
GET /daumen |
ro |
Daumen auflisten. |
GET /personas/{slug}/daumen |
ro |
Daumen-Gesamtzahl einer Persona, diese Woche, 10 jüngste. |
Statistik
| Methode & Pfad |
Auth |
Was es tut |
GET /statistik |
ro |
Sechs Blöcke (gehirn, koepfe, anwesenheit, arbeit, qualitaet, system), deterministisch in einer Transaktion berechnet, einmalig als stand zeitgestempelt. |
Der Rundgang
(hieß früher „Der Verbesserer" — englisch „the rounds".)
| Methode & Pfad |
Auth |
Was es tut |
GET /rundgang |
ro |
Ergebnis von 23 festen Prüfungen über 6 Kategorien — Zahl, Schwelle, betroffene Datensätze je Prüfung; nie geraten. Antwort trägt zusätzlich modus (aus/rechnend/rechnend_lesend). |
POST /rundgang/melden |
rw |
Steht der Modus auf aus: schreibt nichts. Sonst je Kategorie über der Schwelle einen hinweis einreichen. trocken=true wertet aus, ohne zu schreiben. |
GET /rundgang/einstellungen |
ro |
Aktueller Modus des Mandanten + Ein-Satz-Erläuterung + die drei Stufen (aus/rechnend/rechnend_lesend) mit Titel/Beschreibung. |
PUT /rundgang/einstellungen |
rw |
Setzt den Modus ({modus, von}). Standard nach Anlage eines Kunden: rechnend. |
POST /rundgang/versenden |
rw |
Der Morgen-Bericht: ein Bündel-Mail je aktivem Mitglied über alle noch offenen Zustellungen, respektiert sofort/taeglich/nie. |
GET /kunden/{slug}/mitgliedschaft/rundgang-einstellungen |
Sitzung |
Die eigene Zustellungs-Präferenz (sofort/taeglich/nie) für den Rundgang dieses Kunden. |
PUT /kunden/{slug}/mitgliedschaft/rundgang-einstellungen |
Sitzung |
Setzt die eigene Präferenz ({zustellung}). Jedes Mitglied für sich selbst, keine Eigentümer/Verwalter-Schranke. |
Webhooks — Ereignisse nach außen
COMPASS ruft raus, euer System nimmt an. Vollständige Anleitung samt
Signaturprüfung und Beispiel: Ereignisse nach außen.
| Methode & Pfad |
Auth |
Was es tut |
POST /webhooks |
rw |
Webhook anlegen: {url, ereignisse}. Die Antwort enthält das geheimnis — nur dieses eine Mal. 422, wenn ausgehende Aufrufe auf dieser Installation nicht eingerichtet sind, ereignisse leer ist oder einen unbekannten Namen enthält, oder die Adresse nicht https:// ist bzw. ins private Netz zeigt. |
GET /webhooks |
ro |
Die eigenen Webhooks, ohne Geheimnis. |
POST /webhooks/{id}/test |
rw |
Eine Zustellung mit dem Ereignis ping einreihen, unabhängig von den abonnierten Ereignissen. 409, wenn der Webhook deaktiviert ist. |
GET /webhooks/{id}/zustellungen?limit=50 |
ro |
Zustellungen, neueste zuerst — Versuch, Status, letzter HTTP-Code, letzter Fehler. Hier seht ihr nach, wenn etwas nicht ankommt. |
POST /webhooks/{id}/deaktivieren |
rw |
Der Webhook hört auf zu senden und bleibt lesbar. 409, wenn er es schon ist. Gelöscht wird nichts. |
Die fünf Ereignisnamen: regel.gesetzt, regel.abgeloest, abweichung.neu,
abweichung.behoben, frage.beantwortet.
Firma
| Methode & Pfad |
Auth |
Was es tut |
GET /firma |
ro |
Die sechs Firmengedächtnis-Felder. |
PUT /firma |
rw + Mensch |
Benannte Felder aktualisieren. Nur mit angemeldeter Person: ein Schlüssel allein bekommt 403. Ein Agent, der in der angemeldeten Sitzung einer Person arbeitet, darf es. Wer die Felder gesetzt hat, nimmt COMPASS aus der Anmeldung — ein mitgeschicktes von wird nicht übernommen. |
GET /firma/stats |
ro |
Wie viele der sechs Felder gefüllt sind. |
Mandanten & Version
| Methode & Pfad |
Auth |
Was es tut |
GET /kunde |
ro |
Der Mandant, dem der vorgelegte Schlüssel gehört ({slug, stufe, menschen, menschen_limit, name}). |
GET /version |
keine |
{git_sha, gebaut_am, dienst, grund} — bewusst ohne Schlüssel erreichbar. |
Beim Schreiben dieser Seite gefundene Abweichungen vom Vertrag
GET /graph erzeugt GEHOERT_ZU, ERSETZT, GILT_AN, GEPRUEFT_DURCH,
BETRIFFT — und seit dem 28.09.2026 WIDERSPRICHT. Hier stand bis dahin,
WIDERSPRICHT tauche „im laufenden Code nicht auf" und sei „als abgeleitet,
nicht gespeichert, vermerkt": das erste stimmt nicht mehr, das zweite war
schon damals die falsche Auskunft — sie ist die einzige gespeicherte
Kante, und zwar mit Absicht (sie fällt aus einem Urteil, nicht aus einem
Fremdschlüssel). Offen bleiben aus dem Vertrag ZEIGT und WIRKT_IN;
keiner der beiden taucht heute im laufenden Code auf.
GET /fragen/seit (und sein MCP-Werkzeug seit_wann_neu) existiert im
laufenden Code, ist aber noch nicht im Vertrag beschrieben. Hier dennoch
dokumentiert, weil es ein stabiler, funktionierender Lese-Endpunkt ist —
als dem Vertrag voraus markiert.
GET /api/v1/health existiert im laufenden Code, wird aber im Vertrag
nicht erwähnt (dort steht nur GET /version) — deshalb hier
ausgelassen.
- Eine Reihe Endpunkte existiert im laufenden Code ohne jede Beschreibung
im Vertrag:
GET /aussagen/nachfolgerlos,
POST /aussagen/ersetzt-nachziehen, GET /sachen/aufraeum,
POST /sachen/{slug}/verabschieden, POST /sachen/{slug}/widerrufen,
GET /personas/organigramm, POST /personal-vorschlaege,
POST /personas/{slug}/verabschieden, DELETE /personas/{slug} (eine
schmale, geprüfte Ausnahme — verweigert mit 409, außer die Persona hat
keinerlei Spuren), sowie GET/POST /gedaechtnis,
GET /gedaechtnis/stats, POST /gedaechtnis/backfill-bereiche. Keiner
davon ist hier dokumentiert.