112 lines
6.7 KiB
Markdown
112 lines
6.7 KiB
Markdown
---
|
||
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`
|