Kansho/docs/architecture/technical/provenance_verification.md

118 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Kanshō Provenienz und lokale Verifikation untrusted Modellausgabe"
version: "0.1"
status: "Arbeitsstand"
date: "2026-08-25"
product_family: "Jinkendo"
document_role: "Technical Chapter / Provenance / Verification Contract"
parent_document: "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`