flowchart LR V[Verweis: URL, doc:page, Satz-ID, Phrase] --> K[kontext] K --> U[untersuchung: DTD-Auszeichnung] U --> I[identitaet: Register, Bestand] I --> G[integration: Fakten, Prüfungen, Widersprüche] G --> D[(Dossier XML + Projektion)] D --> E[Explikation · Erkundung · Probe-Labor] O[Owner-Verdikt] --> D O --> L[(Lernspeicher: Episoden, Diagnosen)]
Sidecar-Integration
Ein Verweis wird Teil eines Dossiers, mit Beleg
Worum es geht
Ein Lebenslauf, den eine Person selbst geschrieben hat, liegt als Seite im Nachlass (http://127.0.0.1:5725/?doc=1-2_ackeret_jacob_1935_1958&p=2: Jakob Ackeret, geboren 17. März 1898, Diplom ETH 1920, Assistent bei Stodola, Göttingen bei Prandtl, Habilitation 1928, o. Prof. seit 1934, ausgewählte Arbeiten nach Gebieten). Was so eine Quelle über die Person sagt, gehört in ihr Dossier, und zwar so, dass jede Aussage nachweist, auf welcher Seite, in welchem Absatz und mit welchem Wortlaut sie steht, wer dafür bürgt und wer sie bestätigt hat. Dann kann jede spätere Begründung, die eine Person betrifft, auf diese Evidenz zeigen.
Die Integration ist eine Funktion mit vier Stufen, als Partitur famulus-integration registriert, und so geschrieben, dass sie für andere Sidecars (Chronologie, Terminologie, LWgrammar-Regeln) dieselbe ist: was sich je Sidecar unterscheidet, steht in einer Karte (integration/karten/<sidecar>.yaml), nicht im Code.
Die vier Stufen
Der Verweis wird zur Seite einer Sammlung: der Ordner, der die doc_id hält, wird gesucht, nie geraten. Dazu der Rahmen aus den Registern der Sammlung: die Ordnerzeile (documents), die Briefregistersätze, die die Seiten decken (letters: Art, Datum, Parteien, Regest), die Nachbarn, die Fortsetzung (Seiten desselben Satzes, die nicht übergeben wurden, laufen als fortsetzung mit), die Kandidaten für das Subjekt (Korrespondent des Ordners, Parteien und Personen der Sätze), die Datierung (Datum des Satzes; sonst das späteste genannte Jahr als terminus post quem; sonst die Ordnerjahre) und offene Verweise („s. Beilage“). Jeder Posten nennt Tabelle und Schlüssel.
Das Dokument wird gegen die Dokument-DTD des Sidecars ausgezeichnet, für einen Lebenslauf lebenslauf.dtd: Stationen (Geburt, Ausbildung, Stellung, Erfindung …), Werklisten nach Gebiet, Bemerkungen (Beziehungen, Verweise). Das Modell (gemini-3.8-flash, Instruktion pdai/skills/integration/untersuchung-lebenslauf) schlägt die Auszeichnung als JSON vor; gebaut, DTD-validiert und geprüft wird hier: jedes Element ist an einem Absatz verankert (pidx, p) und zitiert ihn wörtlich, jede Zeit ist EDTF. Was die Prüfung nicht besteht, wird verworfen und genannt; nicht erfasste Absätze stehen als rest. Eine Karte ohne Dokument-DTD für die erklärte Art bricht hier mit nicht_pruefbar ab.
Das Subjekt: die vom Owner genannte Person (im Register geprüft), sonst der Korrespondent des Ordners. Jeder Name des Dokuments wird gebunden: zuerst über die Personen, die das Briefregister für diese Seite schon aufgelöst hat (gleicher Nachname, verträgliche Initialen), sonst über das Verfahren des Registers (ai_lemma_index.register.binden). Was nicht bindet, bleibt unaufgeloest mit seinen Kandidaten. Keine ID wird erfunden. Dann wird der Bestand geladen: Registerkarte, Briefe des Subjekts in der Sammlung, das Dossier, wie es steht.
Ein Fakt je Station, Werk und Beziehung: eine Aussage, ihr typisierter Inhalt, ihre Zeit, ihr Beleg (P:<doc>#<pidx>/p<n>, die Satz-IDs des Stanza-Korpus in diesem Absatz, die Passage) und ihre Quelle (Art, Zeugnis selbst|fremd|amtlich, Urheber, Seiten, URL des Viewers, Datierung, Instruktionsstempel, offene Verweise). Status vorgeschlagen. Dann die Prüfungen der Karte; jeder Befund ist ein widerspruch mit Status offen, seiner Regel und beiden Adressen. Das Dossier wird gegen dossier.dtd validiert, atomar mit neuer Version geschrieben und nach dossier.duckdb projiziert; der Lauf ist eine Episode des Lernspeichers.
Die Prüfungen
| Regel | Befund |
|---|---|
innerer_widerspruch |
ein Fakt vor der Geburt oder nach dem Tod; eine vom Modell als unklar markierte Zahl (etwa „No. 101946“) |
bestand_widerspruch |
Geburt oder Tod mit anderem Datum als im Dossier; Stellung oder Abschluss bei derselben Institution mit anderen Jahren |
register_widerspruch |
Briefe des Subjekts vor der Geburt oder nach dem Tod |
rahmen_widerspruch |
das Dokument nennt ein Jahr jenseits der Ordnerjahre |
verweis_offen |
Beilagen und Folgeseiten, die das Dokument nennt und die Übergabe nicht enthält (als offen an der Quelle) |
Lebenszyklus und Lernen
Ein Fakt ist vorgeschlagen, bestaetigt, verworfen oder revidiert; eine Korrektur schreibt einen neuen Fakt mit ersetzt. Ein Owner-Verdikt (bestaetigen, verwerfen, korrigieren, widerspruch) steht über dem Modell, wird am Element vermerkt und von keinem Neuaufbau rückgängig gemacht (die Projektion spiegelt die XML, sie entscheidet nichts). Jedes Verdikt ist eine Episode des Lernspeichers (lernen/store.py); ein Verdikt gegen das Modell ist eine Diagnose der Untersuchungsinstruktion, die eine Lektion patchen kann. Gemessen wird eine Lektion durch Replay (famulus-integration replay): die Stufen 2 bis 4 laufen auf den gespeicherten Seiten noch einmal, ohne zu schreiben, und die Fakten werden verglichen, nie zwei Live-Läufe.
Wo das Dossier gelesen wird
- Das Evidenzpaket der Explikation (
Packs.dossier) führt die Fakten mittable: dossierund dem Schlüssel<ind_id>/<fakt_id>; die Instruktionexplicate(v1.2) zitiert einen Fakt nur mit diesem Schlüssel und nennt einen vorgeschlagenen als vorgeschlagen. - Die Erkundung (
satzrecord/ausdruck/erkundung.py) hat die Quelledossier: ein stützender Treffer ist ein tragender Grund der Artbelegmit der Seite, auf der der Fakt steht. - Das Probe-Labor (
scripts/satz_viewer.py,/api/dossier) und der Kármán-Viewer (/api/dossier/{ind_id}, Knopf „Ins Dossier“) zeigen Fakten, Status und Widersprüche mit Sprung auf die Seite.
Aufruf
uv run famulus-integration aufnehmen 'http://127.0.0.1:5725/?doc=1-2_ackeret_jacob_1935_1958&p=2' \
--sidecar dossier --person P002043 --art lebenslauf --zeugnis selbst [--dry]
uv run famulus-integration zeigen dossier P002043
uv run famulus-integration bestaetigen P002043 f001
uv run famulus-integration pruefen P002043Ablage, in der PDAI-Sammlung selbst: <collections_root>/<collection>/dossier/<ind_id>.xml (universelle DTD dossier.dtd, Kopie neben den Daten, sha-verglichen), die ausgezeichnete Quelle unter dossier/quellen/<quelle_id>.xml, die Projektion <collection>_dossier.duckdb neben den anderen DuckDBs der Sammlung (in der Schemakarte als datenbanken.dossier). Der Schlüssel ist die globale Register-ID, deshalb trägt eine Person je Sammlung ein Dossier, und fakten(ind_id) ohne Sammlung liest sie alle zusammen (jeder Fakt nennt seine Sammlung) — so konsultiert eine andere Sammlung dasselbe Dossier. Ein Verdikt geht an die Sammlung, die das Element hält. Andere Sidecars: karten/terminologie.yaml (Bindung über lwgrammar_reference.dictionary.lookup_term, Adapter über submit_senses), karten/chronologie.yaml, karten/lwgrammar.yaml — deklariert; ihre Lücken (Dokument-DTD, Ablage) meldet jeder Lauf, bis sie gefüllt sind.