118 lines
7.2 KiB
Markdown
118 lines
7.2 KiB
Markdown
# Begrenzte Formatrettung in der Hypothesenuntersuchung
|
|
|
|
Die versionierte Untersuchungspolicy `response_recovery_version = 1` aktiviert
|
|
zwei Mechanismen. Das schlanke Testprofil aktiviert diese Version ausdrücklich;
|
|
der Standardwert 0 und alte gespeicherte Policies behalten das bisherige Verhalten.
|
|
Andere Analysephasen werden nicht umgestellt. `docs/architecture.md` bleibt
|
|
unverändert: Es wird weiterhin ausschließlich eine vollständig validierte Antwort
|
|
atomar verarbeitet, niemals ein herausgelöster gültiger Rechercheauftrag neben
|
|
ungültigen Zustandsänderungen.
|
|
|
|
## Deterministische Normalisierung
|
|
|
|
Die Anfrage trägt den Schema-Marker `x-viano-response-recovery: 1`. Nur markierte
|
|
Investigation-Aufrufe erhalten die folgenden Regeln:
|
|
|
|
- Ein einzelner äußerer Markdown-Codeblock ohne Sprachangabe oder mit `json`
|
|
wird entfernt. Zusätzliche Prosa und beliebige JSON-Syntaxfehler werden nicht
|
|
repariert. Doppelte Schlüssel bleiben ungültig.
|
|
- Ein einmal JSON-kodiertes Objekt wird streng dekodiert: als gesamte Antwort
|
|
oder an bekannten Objektstellen wie `next.arguments` und einem Belegobjekt.
|
|
Freie Texte werden nicht in fachliche Objekte umgedeutet.
|
|
- Primitive DB-Filter `["id","eq",1]` oder
|
|
`["column","id","operator","eq","value",1]` werden bei eindeutig gültigem
|
|
Spaltennamen und bekanntem Operator zu
|
|
`[{"column":"id","operator":"eq","value":1}]` normalisiert. Die Werte
|
|
bleiben unverändert; Tabellen, Spalten, Operatoren und Grenzen werden danach
|
|
weiterhin durch den vollständigen Werkzeugvertrag geprüft.
|
|
|
|
Originaldarstellung, normalisierte Antwort und angewandte Regeln werden im
|
|
append-only LLM-Aufruf gespeichert. Rohtexte befinden sich ausschließlich im
|
|
Paket-Audit, nicht in Fehlerdiagnosen oder Logs. Erst nach vollständiger Schema-,
|
|
Beleg-, Budget- und Toolprüfung wird eine Aktion ausgeführt. Ein kurzer Hinweis
|
|
auf die Normalisierung wird im nächsten regulären Aufruf mitgegeben, ohne einen
|
|
zusätzlichen Korrekturaufruf zu erzeugen.
|
|
|
|
## Kleiner LLM-Reparaturaufruf
|
|
|
|
Verbleibende, ausdrücklich zugelassene Container-Typfehler können einen
|
|
`investigation_format_repair_v1`-Aufruf erzeugen. Er enthält die bereits generierte
|
|
Antwort, den Fehlerpfad, den betroffenen Schemaausschnitt und wenige Bindungsdaten
|
|
(Hypothese, vorheriges Ergebnis und sichtbare E-IDs). Er enthält keine erneute
|
|
Fallinterpretation, Codehistorie, Rohbelege oder allgemeinen Rechercheanweisungen.
|
|
|
|
Die LLM gibt ausschließlich `replacement` für genau diesen Strukturpfad zurück.
|
|
Das Programm setzt die Antwort selbst zusammen. Alle skalaren Werte müssen samt
|
|
Typ und Häufigkeit erhalten bleiben; vorhandene benannte skalare Zuordnungen
|
|
dürfen nicht verschwinden. Bei erkennbaren Filtertripeln bleiben außerdem die
|
|
Positionen von Spalte, Operator und Wert verbindlich; ein Tausch gleichartiger
|
|
Strings zwischen Spalte und Wert wird abgelehnt. Außerhalb des Pfads bleibt die Antwort exakt gleich.
|
|
Die vollständige rekonstruierte Antwort wird anschließend erneut gegen den
|
|
ursprünglichen fachlichen Vertrag geprüft. Quelle, Hash, Patch und rekonstruierte
|
|
Antwort bleiben über Checkpoints auch nach Paketwiederaufnahme nachvollziehbar.
|
|
|
|
Erfundene Belege, unbekannte Aktionen, Confidence-Änderungen und nicht eindeutig
|
|
strukturbezogene Fehler werden damit nicht legitimiert. Ein bloßer Prosasatz
|
|
anstelle eines Belegobjekts lässt sich beispielsweise nicht ohne erfundene
|
|
ID-/Rollen-/Referenzangaben vervollständigen und erhält keine solche Reparatur.
|
|
Ein Änderungsvorschlag mit anderen Abfragewerten wird abgelehnt. Bestehende
|
|
Invalid-Response-Limits gelten auch für Reparaturversuche. Transportfehler behalten
|
|
die vorhandenen Failover-/Retry-Regeln. Nicht unterstützte Fehler bleiben im
|
|
bisherigen kontrollierten Ablehnungspfad.
|
|
|
|
## Grenzen und Aktivierung
|
|
|
|
Die Formatrettung ist auf 65.536 UTF-8-Bytes Antwort-/Reparaturdaten sowie 16
|
|
Normalisierungen begrenzt. Das sind Sicherheitsgrenzen dieses versionierten
|
|
Mechanismus, keine Grenzen des Case-Paketformats. Größere Antworten werden nicht
|
|
für einen Reparaturaufruf dupliziert. Zu große oder nicht reparierbare Antworten
|
|
werden nicht abgeschnitten oder teilweise ausgeführt.
|
|
|
|
Neue Untersuchungen müssen die Policy initialisieren. Eine laufende Untersuchung
|
|
wird nicht still auf eine andere Policy umgestellt. Historische Kontexte ohne
|
|
Marker, Audit oder Reparaturdescriptor ergeben unveränderte Prompts.
|
|
|
|
Lokale Tests decken Originalerhaltung, einmalige Ausführung, Hinweise ohne
|
|
Extraaufruf, Wiederaufnahme und die Ablehnung geänderter Abfragewerte sowie
|
|
unbekannter Aktionen/Belege ab. Ein gezielter Reparaturprompt bleibt im geprüften
|
|
Fixture bei 2.199 statt 10.353 Zeichen des normalen Untersuchungsaufrufs. Das ist keine
|
|
allgemeine Kosten- oder Qualitätsgarantie; bezahlte Tests erfolgen separat.
|
|
|
|
## Zulassung und Ablehnungs-Audit nach dem ersten echten Lauf
|
|
|
|
Der erste echte Lauf normalisierte einen `name/contains/Wolpertinger`-Filter
|
|
erfolgreich. Ein weiterer Filter enthielt dagegen
|
|
`["LogTitle","like","%Wolpertinger%"]`. Das ist nicht rein strukturell: `like`
|
|
gehört nicht zum Werkzeugvertrag. Die damalige Reparatur zielte zusätzlich
|
|
fälschlich auf den einzelnen String `filters[0]`. Ein vollständiges Objekt mit
|
|
Spalte, Operator und Wert kann daraus nicht werterhaltend erzeugt werden.
|
|
|
|
Die Zulassung berücksichtigt jetzt die vollständige Filtereinheit und löst den
|
|
zugehörigen Schemaausschnitt über die passende Aktions-/Query-Alternative auf.
|
|
Ein Fehlerpfad innerhalb einer flachen Liste wird, soweit überhaupt reparierbar,
|
|
auf deren vollständigen Filterbereich angehoben. Skalare Ziele, unvollständige
|
|
Filter, fehlende Werte und unbekannte Operatoren erhalten keinen Format-Reparaturaufruf.
|
|
Es wird weder SQL `LIKE` in `contains` übersetzt noch werden Prozentzeichen entfernt.
|
|
Stattdessen bekommt der normale Ablehnungspfad einen kurzen, ausdrücklichen
|
|
Operator-Vertragshinweis. Eine neue fachliche Entscheidung bleibt Sache der LLM.
|
|
|
|
Vor der Zulassung wird mit den bereits vorhandenen Filterwerten eine rein
|
|
strukturelle Prüffassung gebildet. Sie muss die gesamte ursprüngliche Ausgabestruktur
|
|
erfüllen und die Erhaltungsregeln einhalten. Weitere unveränderte Strukturfehler
|
|
verhindern so ebenfalls einen aussichtslosen Reparaturaufruf. Diese Prüffassung
|
|
wird nicht ausgeführt; eine tatsächliche Modellreparatur muss später nochmals
|
|
alle Kontrollen einschließlich fachlicher Beleg- und Budgetprüfung bestehen.
|
|
Alte gespeicherte Reparaturpläne werden vor einem erneuten Anbieteraufruf ebenfalls
|
|
auf ungeeignete Zieltypen und Operatoren geprüft, ohne ihre historischen Prompts
|
|
umzuschreiben.
|
|
|
|
Abgelehnte Reparaturantworten stehen separat in `outcome.rejected_repair`, mit
|
|
Version, Ablehnungsgrund und SHA-256 über die kanonische JSON-Darstellung des
|
|
gespeicherten Inhalts. Ein geparster Vorschlag wird als `patch`, kaputtes JSON
|
|
als `original_text` gespeichert. Die Grenze liegt bei höchstens 65.536 UTF-8-Bytes
|
|
und zusätzlich innerhalb des konfigurierten Response-Limits. Größere Vorschläge
|
|
werden nicht gekürzt oder teilweise übernommen. HTTP-Fehlerkörper und Header
|
|
werden dadurch nicht aufbewahrt. Logs und bereinigte Diagnosen enthalten weiterhin
|
|
keinen Antworttext. Das Aufrufprotokoll erlaubt die zusätzlichen sicheren
|
|
JSON-Parserdiagnosen, damit deren Speicherung selbst nicht mit `INPUT_SCHEMA` scheitert.
|