Kansho/docs/architecture/technical/provenance_verification.md

7.9 KiB
Raw Permalink Blame History

title version status date product_family document_role parent_document
Kanshō Provenienz und lokale Verifikation untrusted Modellausgabe 0.1 Arbeitsstand 2026-08-25 Jinkendo Technical Chapter / Provenance / Verification Contract technische_zielarchitektur.md

Kanshō Provenienz und lokale Verifikation

Kanonisches Home für den allgemeinen technischen Vertrag: externe Modellantworten sind untrusted input; kanonischer Inhalt kommt nur aus einer lokalen Quellenregistry; Downstream-Stufen konsumieren ein lokal erzeugtes VerifiedArtifact.

Journalregeln, Writing Profile, Chronologie und Tagebuchstil gehören nicht in diese Schicht. Journal-Adapter und MVP-Nutzung: mvp_implementation.md §16.7. Privacy-Egress bleibt privacy_gateway.md. Fachliche Quellenbindung und Re-Grounding bleiben ../functional/context_fidelity_and_regrounding.md.

1. Decision Record (2026-08-25)

Entscheidung: Persönliche KI-Folgestufen dürfen freie Modellantworten nicht als Inhaltsautorität behandeln. Es gibt eine kleine, intent-neutrale Provenienz- und Verifikationsschicht (backend/provenance.py). Fachgrenzen mappen Domainfehler erst dort auf Nutzertexte und Fehlercodes.

Thema Stand Status
Modellantworten sind untrusted input ja Entschieden (technisch, 2026-08-25)
Lokale Quellenregistry ist Autorität für Originaltext ja Entschieden (technisch, 2026-08-25)
Evidence lokal gegen Registry prüfen ja Entschieden (technisch, 2026-08-25)
Downstream nur VerifiedArtifact ja Entschieden (technisch, 2026-08-25)
Semantische Modell-Labels standardmäßig unverifiziert ja Entschieden (technisch, 2026-08-25)
Vollständigkeit über explizite Policy (coverage) ja Entschieden (technisch, 2026-08-25)
Fail Closed, keine stillen Kürzungen in dieser Schicht ja Entschieden (technisch, 2026-08-25)
Konkrete spätere Intent-Policies (Reflexion, Synthese, …) nicht gebaut Offen / später prüfen
Selektiver Evidence-Modus als Produktfunktion nur Schnittstelle selected_evidence Nicht als Produkt entschieden

Keine Vorwegnahme von Agentengraph, Workflow-Framework oder Pluginarchitektur. ai_architecture.md: Multi-Agent-Zerlegung bleibt offen.

2. Allgemeiner Vertrag

Die Schicht kennt Quellen, Rollen, Evidence-Referenzen, Coverage-Modi und ein geprüftes Artefakt. Sie kennt keine Tagebuch-, Space- oder Writing-Profile-Begriffe.

2.1 Quellenregistry

Eine Quelle hat mindestens source_id, role, kanonischen Originaltext und optionale lokale Metadaten. IDs und Texte entstehen lokal. Das Modell darf sie referenzieren, nicht ersetzen. Ein abweichender proposed_texts-Eintrag ist canonical_overwrite.

2.2 Evidence

Untrusted Input: {source_id, excerpt}. Lokal:

  • Source existiert.
  • Rolle ist laut Policy erlaubt.
  • Excerpt kommt exakt in genau dieser Source vor.
  • Excerpt nur in einer anderen Source: wrong_source.
  • Excerpt in einer unzulässigen Rolle: role_not_allowed.
  • Erfundener Text: unverified_excerpt.

Spans (start/end) werden lokal aus dem bestätigten Zitat materialisiert. Modell-Offsets auf maskiertem Text werden nicht verwendet. Mehrdeutige gleiche Ausschnitte: erstes Vorkommen in der kanonischen Source.

Maskierung/Demaskierung: Verifikation läuft auf dem lokalen Klartext der Registry, nicht auf Egress-Platzhaltern. Schlägt die Demaskierung fehl, findet der Excerpt nicht, die Anfrage bleibt fail-closed.

2.3 Verification Policy

Ausdrücklich zu setzen:

Feld Bedeutung
allowed_roles welche Registry-Rollen Inhaltsquelle sein dürfen
coverage Vollständigkeitsmodus
selected_ids welche Quellen in welcher Materialisierungsreihenfolge
source_order optionale Begegnungsreihenfolge, unabhängig von selected_ids
include_unverified_annotations ob Modell-Labels separat gehalten werden

Aktuell implementierte Coverage-Modi:

  • all_selected_sources: der vollständige kanonische Text jeder ausgewählten zulässigen Quelle wird lokal rehydriert. Ein kurzer Evidence-Teilstring entfernt den Rest nicht.
  • selected_evidence: Schnittstelle für spätere selektive Intents; materialisiert nur geprüfte Excerpts. Keine Produktfunktion, kein Journal-Default.

2.4 Verified Artifact

Mindestens: kind=verified_artifact, coverage, source_order, order, sources[] (source_id, role, text), geprüfte evidence[]. Unverified Annotations nur wenn die Policy das ausdrücklich verlangt, und dann unter annotations_unverified, niemals als sources[].text.

Invariante:

Verifizierter Wortlaut und modellgelieferte Interpretation sind unterschiedliche Dinge.

3. Journalspezifische Policy

Nur im Adapter journal_reconstruct.py und in den Journal-Prompts:

  • zulässige Inhaltsrolle: user
  • Assistent darf Stufe 1 als Dialogkontext sehen, nicht ins Artefakt
  • Coverage: all_selected_sources für alle ausgewählten nichtleeren Nutzerquellen
  • source_order = Begegnungsreihenfolge; Umordnung der Materialisierung nur mit source-lokal bestätigten Uhrzeiten
  • Modell-kind und Top-Level-Kategorien (contradictions, …) nicht autoritativ; Stufe 2 erhält sie nicht
  • Domainfehler des Modell-JSON → reconstruction_invalid plus diagnostics.reason
  • Stufe 2 formuliert Ich-Form, Titel, Absätze, Writing Profile

Additiv 2026-08-26: Generate reicht ungültiges Stufe-1-JSON nicht an Stufe 2 weiter und repariert es nicht. Der Adapter materialisiert stattdessen lokal alle ausgewählten Nutzerquellen (local_verified_artifact). Generate-Abbruch nur, wenn es keine Nutzerquelle gibt (no_user_sources). Eine Rohantwort mit Klartext-Identität wird nach Retry ebenfalls nicht übernommen.

Additiv 2026-08-26 (Runtime ohne Rekonstruktionsmodell): Der Journal-Adapter erzeugt Stufe 1 lokal als vollständiges VerifiedArtifact (purpose=local_source_artifact). Der Runtime-Pfad ruft mvp.journal_reconstruct nicht mehr auf. Parser und Validator bleiben für Tests und Abgrenzung erhalten, sind aber nicht der aktive Modellpfad. Stufe 2 bleibt der einzige externe Narrations-Call und konsumiert ausschließlich das lokale Artefakt plus Writing Profile plus optionalen Bestand.

Additiv 2026-08-26 (Faktentreue, nicht Wortlaut): Das Artefakt autorisiert Informationen, nicht die Ausgabeformulierung. Stufe 2 darf Orthografie und Satzbau ändern, solange Ereignisse, Unsicherheit, Plan versus Vollzug und einmalige Details erhalten bleiben. Ein inaktiver historischer Name in der Narration ist kein Privacy-Leak, aber journalspezifisch unbelegter Inhalt und kein gültiger Entwurf.

Additiv 2026-08-26 (Editorial, Adapter): Journalform, Editorial Modes, Journal-Facet und historische Stilreferenzen bleiben im Adapter. Die Provenienzschicht kennt sie nicht. Stufe 2 präsentiert dem Modell CURRENT_DAY_SOURCES als Tatsachen und STYLE_EXAMPLES nur als Ton.

Das Artefakt ist geprüftes Quellenmaterial, kein ungeprüfter Rohdialog mit Assistentenzeilen.

4. Aktuelle MVP-Nutzung

Ein Gateway-Call Klasse B für die Narration, plus optionales Detect auf dem versendeten Stufe-2-Kontext. Request-scoped Trace, Budget nur für Stufe 2 (mvp_implementation.md §16, privacy_gateway.md §9.39.4). Stufe 2 konsumiert reconstruction = serialisiertes VerifiedArtifact. Passt der vollständige Nutzerinhalt nicht ins Budget: prompt_budget_exceeded, nichts still kürzen, kein Chunk-and-Merge.

Tests: backend/tests/test_provenance.py, backend/tests/test_journal_budget.py.

5. Bewusst nicht implementiert

Zukünftige Intent-Policies, selektive Evidence als Produktweg, Chunk-and-Merge, persistente Audit-Tabelle, semantische Klassifikation über wachsende RegEx-Listen.

6. Querverweise

  • Technisch: mvp_implementation.md §16, privacy_gateway.md, ai_architecture.md
  • Fachlich: ../functional/guardrails.md, ../functional/context_fidelity_and_regrounding.md, ../functional/writing_profile_and_journaling.md