--- 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. Das Artefakt ist geprüftes Quellenmaterial, kein ungeprüfter Rohdialog mit Assistentenzeilen. ## 4. Aktuelle MVP-Nutzung Zwei Gateway-Calls Klasse B, request-scoped Trace, Budget unverändert (`mvp_implementation.md` §16, `privacy_gateway.md` §9.3). 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`