Kansho/docs/architecture/functional/mvp_stand_und_abgleich.md
2026-08-29 20:28:59 +02:00

640 lines
52 KiB
Markdown
Raw 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ō MVP-Stand und Abgleich gegen Foundation, Slice und Gesamtziel"
status: "Abgleich / Arbeitsstand"
date: "2026-08-25"
product_family: "Jinkendo"
document_role: "Ist-Stand des ersten vertikalen Slices gegen Implementation Foundation, MVP-Spezifikation und Produktziel; Gaps und Ungenauigkeiten"
parent_document: "mvp.md"
---
# Kanshō MVP-Stand und Abgleich
**Stand:** 2026-08-25, gegen den lokalen Code unter `frontend/` und `backend/`, inklusive Architecture-Correction-Pass am selben Tag.
Dieses Dokument **ersetzt** weder `mvp.md` noch `implementation_foundation.md` noch `produktvision_und_produktidentitaet.md`. Es sagt, was gebaut ist, was welche Spezifikation verlangt, und wo Doku, Tests oder UI den Code überzeichnen.
Es ist der **Prüfbericht für eine unabhängige Gegenlesung**: Slice gegen freigegebenen MVP-Text, Foundation gegen teure Sackgassen, Code gegen das langfristige Gesamtziel. Der Slice darf das Gesamtziel nicht erfüllen; er darf es nicht verbauen und nicht als schon erreicht verkaufen.
---
# 0. Für den prüfenden Agenten
## 0.1 Auftrag dieses Dokuments
Ein zweiter Agent soll damit prüfen:
1. ob der gebaute Slice zum **Gesamtziel** (Personal Reflection Companion) noch als Keimzelle passt oder schon als Tagebuch-App driftet,
2. ob die **Implementation Foundation** gehalten wird,
3. ob der **freigegebene MVP-Text** in `mvp.md` eingelöst, untererfüllt oder überzeichnet ist,
4. welche Lücken **Slice-Gaps** sind (jetzt schließen oder Spec korrigieren) und welche **Zielmodell-Lücken** (bewusst später).
Nicht Auftrag: das Target Model nachbauen, den Slice horizontal erweitern, oder offene Fachinterviews als Implementierungsauftrag lesen.
## 0.2 Drei Ebenen, nicht vermischen
| Ebene | Quelle | Frage |
|---|---|---|
| **Gesamtziel** | `produktvision_und_produktidentitaet.md`, Guardrails, Memory/Self/Dialog-Kapitel | Wird Kanshō der dialogische Reflexionsraum der Jinkendo-Familie? |
| **Erster Slice** | `mvp.md` + `implementation_foundation.md` | Ist ein dialoggeführtes Journal auf der Foundation real nutzbar, ohne Sackgassen? |
| **Code** | `frontend/`, `backend/` | Was tut die laufende Anwendung tatsächlich? |
Der MVP-Leitgedanke in `mvp.md` §1 ist bewusst kleiner als die Vision: *dialoggeführtes persönliches Tagebuch, Entwurf aus dem Gespräch*. Die Vision in der Produktidentität ist größer: *Wahrnehmen → Reflektieren → Verstehen → Einordnen*, langfristige Kontinuität, Werte, offene Fäden, vorsichtige Zusammenhänge. **Beides ist wahr.** Der Slice ist die Keimzelle, nicht das Produkt.
## 0.3 Was laden (Context Bundle)
Pflicht:
1. dieses Dokument (Fit-Gap)
2. `mvp.md`
3. `implementation_foundation.md`
4. `produktvision_und_produktidentitaet.md` (Identität, Prinzipien, Nicht-Ziele)
5. `guardrails.md` (Invariante Datenschutz)
6. **technische Umsetzung:** `../technical/mvp_implementation.md`
7. Vertiefung: `../technical/privacy_gateway.md` §9.19.2, `../technical/memory_storage_and_offline.md` §6.2, `../technical/frontend_pwa_shell.md` §6.1, `../technical/backend_and_api.md` §5.1
Nur bei Bedarf, nicht vorsorglich den ganzen Ordner:
- `writing_profile_and_journaling.md` Stil und zweistufige Generierung (Ziel, nicht Slice)
- `dialogue_model.md` Contextual Continuation als Default-IA
- `memory_and_context.md` Schichten Working / Thread / Episodic
- `reflection_outputs.md` Journal vs Memory vs Knowledge vs Action
- `integrations.md` Kairo / mindnet / Obsidian
## 0.4 Was der prüfende Agent nicht tun soll
- Foundation-Regel 24 ignorieren („nicht implementiert ist zulässig“) und fehlendes Self Model, Resurfacing oder mindnet als Slice-Bug werten.
- Recency-Ausschnitte (letzte fünf Entries × 400 Zeichen) als semantisches Gedächtnis oder Space Content Memory lesen.
- Admin-Testspur, Prompt-DB und `/dialog` als produktive Nutzer-IA lesen.
- Acceptance-Tests C/D/E als Beweis für Begleiter-Qualität lesen; sie sind oft Prompt- oder Call-Proxies.
- Detect über OpenRouter als erfüllte Guardrail-Produktivlage lesen; das ist Testphase.
- Empfehlen, das Target Model in diesem Slice vorzubauen.
## 0.5 Statuswörter
| Wort | Bedeutung |
|---|---|
| **Erfüllt** | Anforderung im Code und in der nutzbaren Oberfläche vorhanden |
| **Teilweise** | Kern da, fachliche Schärfe oder UI fehlt |
| **Gap** | Anforderung der jeweiligen Ebene nicht erfüllt |
| **Ungenauigkeit** | Spezifikation, Test oder Kommentar behauptet mehr als der Code leistet |
| **Bewusst offen** | Non-Goal, später, oder Foundation-Regel 24 |
| **Abweichung** | weicht vom technischen Zielrahmen ab, ohne die Foundation zu brechen |
| **Spannung** | Slice und Gesamtziel ziehen auseinander, ohne dass der Slice deshalb falsch ist |
---
# 1. Was der Slice heute ist
Kanshō ist lokal ein dialoggeführtes Journal auf FastAPI + SQLite und einer React/Vite-PWA-Shell.
**Kernablauf, der geht:** Space anlegen → Journal Day öffnen → Dialog führen → Entwurf explizit erzeugen → redigieren, Medien im Text, speichern als neue Version des bestehenden Eintrags (optional eigener Eintrag) → Versionen wiederherstellen oder lokale Edits verwerfen → Quelldialog öffnen. Parallel: lokale Stichpunkte (Checkliste), die Kanshō nicht sieht; Return erzeugt eine neue Zeile und setzt den Cursor dorthin. Ungespeicherte Editoränderungen werden beim Verlassen bestätigt.
**Technische Keimzelle:** Auth-Sessions, Prompt-DB, Platzhalter, Feature-Check, Privacy Gateway, zwei Provider-Rollen (Maskierung / Sprachmodell), Context Builder, Retrieval als SQL-Schnittstelle, Writing Profile ohne Extra-LLM, Pronomenbindung nur im Dialogzug.
**Nicht gebaut und nicht behauptet als gebaut:** Space Content Memory, Threads-UI, semantisches Retrieval, Self Model, Insights, Related Spaces in der Nutzung, PostgreSQL, lokales Detect-Modell, Voice, Offline-Sync, Obsidian/mindnet/Kairo-Handoff, Contextual Continuation als Ziel-IA. Papierkorb-UI, Entry-Liste, `include_existing` in der UI, Startkontinuität und erster Journal-Impuls: siehe §2.7 (seit 2026-08-25 im Code). Zweistufige Journalgenerierung: siehe §2.6.
**Produktidentität im Slice:** der Kern ist *Erzählen → reflektierender Impuls → Journalentwurf*. Das ist eine legitime Keimzelle von „Personal Reflection Companion“, noch kein Begleiter über Monate, keine Wertearbeit, keine offenen Fäden.
---
# 2. Delta seit 2026-08-24
Additiv zum vorigen Abgleich, nicht an seiner Stelle:
| Thema | Änderung im Code | Wirkung auf den Abgleich |
|---|---|---|
| Generate → Entwurf | UI öffnet `?draft=1`, nicht still den gespeicherten Entry | Case J / §11.2 klarer erfüllt |
| Speichern aus Entwurf | Default: neue **Version desselben** Entry (`accepted_draft`); optional eigener Eintrag | Keine stillen Doppel-Entries mehr als Normalpfad |
| Titel | `clean_title` / `entryTitle` entfernen führendes `#` | Editor und Versionen zeigen denselben Titel |
| Versionen-UI | Aktuelle Fassung in der Liste als **Aktuell**, ohne Restore. Bei Dirty: **Alle Änderungen rückgängig machen** (lokal, keine DB-Version) | §11.1 eingelöst |
| Dirty-Flag | Snapshot nach Laden/Speichern; In-App-Navigation, Abmelden, Tab-Schließen fragen nach | Schutz vor stillem Verlust; Browser-Zurück nicht hart blockiert |
| Writing Profile | Finale Entries stärker (mehr/längere Exzerpte); Dialog-Exzerpte entfallen, sobald Entries existieren | §9 Priorität näher am Text |
| Journal-Prompt / Shape | Szenen verbinden, Stimme aus dem Brief; lokale Namensausdünnung nach Demask (`naturalize_person_mentions`) | Qualität modellabhängig, Shape nur lokal |
| Pronomen | Bindung `er`/`sie` nur im **Dialogzug**; Journalentwurf ungebunden, sonst Demask-Klarnamen-Flut | Guardrail-fein, nicht Identity-Mapping |
| Stichpunkte | Return erzeugt leere Folgezeile **und** fokussiert sie; „Punkt hinzufügen“ ebenso | UX von §10.1 |
| `local_hold` | Fallback-Impuls nicht mehr „Ich bin noch da“, sondern Fortsetzungsbitte | Dialogqualität, kein Architekturwechsel |
Historische Doppel-Entries aus der Zeit, als Speichern aus dem Entwurf neue Einträge anlegte, bleiben in der DB getrennt. Das ist Altbestand, kein aktueller Normalpfad.
---
# 2.1 Architecture Correction Pass (2026-08-25)
Additiv zu Abschnitt 2. Kein horizontaler Slice, kein Target-Model-Vorbau. Korrigierter **Ist-Stand** vs. bewusst offene Target-Fähigkeiten:
| Thema | Korrigierter Ist-Stand | Bewusst offen |
|---|---|---|
| Provenance Draft/Version | Relationale `journal_*_source_refs`; JSON-Listen werden verlustfrei migriert. Source unverändert. | Provenance-UI, Re-Grounding |
| Context Selection | Context Builder fordert Specs (`day_messages`, `space_entries`, `space_recent_sources`, `writing_profile`). Recency ist Retrieval-Implementierung, keine fachliche API. | Semantisches Retrieval, Minimum-sufficient nach Relevanz |
| Space-Source im Dialogzug | Begrenzte jüngere Original-Conversations desselben Space; aktuelle Conversation bleibt primär; Geschwister desselben Days werden nicht pauschal voll geladen. | Globales/semantisches Retrieval, Session-Summaries |
| Detect | Externes Klartext-Detect nur Development/Test. Produktiv: Muster oder lokale Detect-URL. | Lokales Detect-Modell (Ollama) |
| Response Validation | Blockiert Klartext-Identität in der Rohantwort vor Demask. | Quasi-Identifikatoren, Platzhalter-Vollständigkeit, Audit |
| Konsolidierung | Lokale Signale `narrative_mode` / `reflection_depth` / `current_focus` aus dem Hauptcall, kein Extra-LLM. Angebot nur bei hinreichender Ähnlichkeit; Nutzer entscheidet. | Narrative Typ-Engine, UI-Feinheiten |
| `/dialog` | Nicht in der Produkt-Nav; Admin-only Dev/Test-Harness. | Start = offener Journal Day (Stub-Home bleibt) |
| Writing vs Interaction | `WritingProfile` nur Journal-Stil. Dialogue Kernel nutzt `register_hint` plus leeren `interaction_hint`-Slot. | Interaction-Profile-Engine, UI, Persistenz |
| Reflection Space | Conversation kann `space_id` ohne `journal_day_id` tragen. Space ist nicht Journal-Container. | Space-Typen, Related Spaces, Intents pro Space |
| Dialogue Kernel | Sechs Operationen bleiben allgemeine Gesprächsoperationen. Konsolidierung und Tages-Coverage liegen in Journal-Policy/Context. | Intent-Engines, Contextual Continuation |
Tests: `backend/tests/test_architecture_correction.py` plus Anpassungen in `test_mvp_journal.py` und `test_privacy_detect.py`.
---
# 2.2 Profile Governance (2026-08-25)
Additiv zu 2.1. Keine neue allgemeine Architekturphase.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Writing Profile | Facets + Governance `learning`/`advising`/`frozen`. Brief abgeleitet. Bootstrap aus gespeicherten Entries. Kein Blind-Overwrite. | Große Profile-UI, zeitliche Versionierung des Fachkapitels |
| Interaction Profile | Persistenz, gelabelte Produktdefaults, Hint-Slot, Default `advising`. Lernen nur explizit/manuell/angenommener Vorschlag. | Volle Feedback-UI, Analytics, Intent-Engine |
| Dialogue State | Bleibt automatisch; zusätzlich `emotional_intensity`, `long_story` | already_covered, known_plan, Intent-Taxonomie |
| JSON-Portabilität | Export/Restore von Writing-, Interaction- oder Sammeldokument (`format_version` 1). Restore ist ausdrücklich und ersetzt Facets/Prefs. | Vollständiger Account-Export, Journal-Portabilität |
Persönliche Längen-/Impulsregeln liegen nicht mehr anonym im Dialog-Prompt, sondern im sichtbaren Interaction-Hint.
Tests: `backend/tests/test_profile_governance.py`.
---
# 2.3 Profile Review Pipeline (2026-08-25)
Additiv zu 2.2. Keine Review-Calls nach jedem Dialog, keine neue große Profil-Engine.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Writing Review | Lokale Drift/Evidence, Queue, gebündelte semantische Review nur explizit. API und Copy/Paste derselben Paket-/Ergebnis-Verträge. Versionen nachvollziehbar. | Periodische Batch-UI, Interaction-AI-Review, zeitliche Facet-Historie im Fachkapitel |
| Governance-Übernahme | `learning` wendet unlocked Review-Änderungen an; `advising` queued; `frozen` nicht, außer explizites Paket ohne Apply | Getrennter Bestätigungsschritt in der UI für `learning` |
| Interaction | Weiter nur explizit/manuell/angenommener Vorschlag. Dialog-Sample ist Writing-Evidence, kein Preference-Lernen. | Beobachtungs-Candidates in der Settings-UI |
Tests: `backend/tests/test_profile_review.py`.
---
# 2.4 Writing-Profile-Hülle und Initial Build (2026-08-25)
Additiv zu 2.2 und 2.3. Das statische Facet-Raster ist nicht die Profilstruktur.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Hülle | Core, optionale Facets, dynamische Traits, Evidence, Exemplare, Governance, Versionen. Seed-Keys nur Ordnungshilfe. | Output-Facets jenseits Journal/Reflexion, zeitliche Trait-Historie im Fachkapitel |
| Initial Build | Historischer Korpus mit Zeitbezug; Existing-before-New; Confirm vor kontinuierlichem Lernen | Batch-Import-UI für Dateiordner, Gewichtung als Nutzersteuerung |
| Quellenarten | Urlaubstagebuch → `autobiographical_journal`; Core nur bei gemischten Arten | Weitere context/output-Facets aus dem Fachkapitel |
| Heuristik | Lokal als Drift-/Triggerhilfe, nicht als persistierte Traits | — |
Tests: `backend/tests/test_profile_governance.py`, `backend/tests/test_profile_review.py`.
---
# 2.5 Profile Analysis Export / Import (2026-08-25)
Additiv zu 2.3 und 2.4. Copy/Paste ist in der Testphase ein vollwertiger Ausführungsweg, nicht nur Debug.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Modi | `initial_build` (vollständiges Proposal) und `review` (inkrementell) | Automatische Periodik, Interaction-Analyse |
| Vertrag | Gemeinsames `kansho.profile_analysis_package` / `kansho.profile_analysis_result` für API und Copy/Paste | Provider-API ohne manuelles Paste |
| Externe Chat-Historie | Semantisch nutzbar als `external_chat_history`; keine erfundenen Kanshō-Source-IDs | Import derselben Texte als echte Kanshō-Quellen |
| Import | Validieren, unbekannte Refs, Proposal, einzelne Übernahme/Ablehnung, erst dann Version. Baseline extra für `initial_build`. Kein Auto-Apply. | Komplexere Diff-UI, Batch über mehrere Reviews |
| Current Brief | Runtime-Artefakt nach Acceptance; Journal Generate nur Task-Ausschnitt | Weitere Task-Compiler jenseits Journal |
Tests: `backend/tests/test_profile_review.py`.
---
# 2.6 Journal-Budget und zweistufige Generierung (2026-08-25)
Additiv zu 2.5. Schließt die frühere Slice-Lücke „zweistufige Journalgenerierung ist nicht gebaut“, ohne das Fachkapitel `writing_profile_and_journaling.md` zu ersetzen. Technische How-to: `../technical/mvp_implementation.md` §16.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Stufen | Stufe 1 Rekonstruktion (`mvp.journal_reconstruct`) lokal validiert; Stufe 2 Narration (`mvp.journal_generate`) ohne vollen Dialog. Beides Privacy Gateway, Klasse B. | Chunk-and-Merge für Tage über dem Fenster |
| Budget | 32K-Mindestfenster, Output-Reserve bis 4096, 15 % Marge, konservative 2-Zeichen/Token-Schätzung. OpenRouter-Metadaten gecacht. | Modellfamilien-Tokenizer |
| Compression | OpenRouter Context Compression für Journal explizit aus. Kein stilles Middle-Out. | — |
| Writing Brief | Task-Compiler feldweise ~34k Zeichen; volle Profile-Quelle unverändert. Anzeige-Dedup ohne Löschen. | Weitere Task-Compiler |
| Fehler | Kontrollierte Codes, kein Modellwechsel, Fail Closed/ZDR unverändert. | Persistente Audit-Tabelle ohne Prompts |
Widerspruch, nicht stillschweigend eingeebnet: `mvp.md` §5.3.2 beschreibt den Journalentwurf als einen maskierten Call im Slice-Schnitt (Dialogzug vs. Entwurf). `writing_profile_and_journaling.md` §16 bevorzugt fachlich zwei Stufen. Die Umsetzung folgt der fachlichen Trennung Inhalt/Stil; Dialogzug bleibt ein Call. Beide Journal-Stufen gehen nur über das Privacy Gateway.
Tests: `backend/tests/test_journal_budget.py`.
**Additiv 2026-08-26:** Ungültiges Stufe-1-JSON bricht Generate nicht mehr ab. Stufe 2 erhält ein lokal erzeugtes `VerifiedArtifact` aus allen ausgewählten Nutzerquellen. Abbruch nur ohne Nutzertext (`no_user_sources`). Das Modell-JSON wird nicht still repariert. Eine Rohantwort mit Klartext-Identität wird nach Retry ebenfalls nicht übernommen; lokal entsteht ein Entwurf aus den Nutzerquellen.
---
# 2.7 Freeze Candidate (2026-08-25)
Additiv zu 2.6. Schließt lokal realisierbare MVP-Lücken für die Urlaubs-Testphase. Kein Target-Model-Vorbau. Abnahmeblatt: `mvp_freeze_candidate.md`.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Lokaler Testeinstieg | `scripts/test-mvp.ps1`: UTF-8, alle `test_*.py`, Dokumenttest, Frontend-Build, isolierte Temp-Daten, keine Live-Keys | Echte Modell-/Browserläufe |
| Backup/Restore | SQLite-Backup-API + Medien + Manifest/Checksummen; Restore prüft, bestätigt, legt Sicherheitsbackup an, überschreibt nicht still | Verschlüsselung, Produktions-Backup |
| Papierkorb | Liste, UI, Undelete, explizites Purge, Isolation | Hard-Delete von Dialogen, Account-Löschen |
| Chronologische Entries | Space-Entry-Liste neben der Tagesliste; gelöschte nur im Papierkorb | Semantische Suche |
| `include_existing` | UI-Auswahl, Default aus, Generate überschreibt nicht | — |
| Start `/` | Kontinuität: Fortsetzen-Aktion zum letzten aktiven Journal Day, sonst Space-Einstieg | Contextual Continuation als Ziel-IA |
| Erster Impuls | Journalspezifischer Adapter, Gateway, gleiche Wächter; ohne Kontext lokal neutral | Intent-Engine, Pattern-Infrastruktur |
| Dialogmedien | Nicht als Dialogquelle | Eigener späterer Slice |
| Generate-Quellen | Day-Conversations + Verified Artifact; Space-Entries nicht als Generate-Fakten | Space Content Memory |
| Browser-Zurück | Unsaved-Warnung + `beforeunload` | Data-Router-Blocker |
Tests: `test_local_backup.py`, `test_journal_trash.py`, `test_journal_opening.py`, Erweiterungen in `test_mvp_journal.py`.
---
# 2.8 Textintegrität, Detect-Diagnose, Richtlinienauswahl (2026-08-28)
Additiv. Kein Commit dieses Schritts in der Fit-Gap-Tabelle oben ersetzen.
| Thema | Ist-Stand | Bewusst offen |
|---|---|---|
| Shape nach Demask | Nur Trim/Titeltrennung. Keine lokale Pronomenheuristik auf akzeptiertem Modelltext. | Namenswiederholung als Modellqualität |
| Detect-Diagnose | Chunk-Coverage ≠ semantische Vollständigkeit. Registry und Request-Treffer getrennt. | Verlässliche Maskierung unbekannter Identitäten |
| Bestätigte Registry | Safety-Net inkl. kurzer Namen und Aliase im ganzen Egress | Detect-Modellqualität |
| Richtlinienauswahl | Request-ID und Revision bis Prompt/Trace/Snapshot; ungültig vor Provider | UI-Wahrnehmung vs. State bei veralteten Optionen war der Bug |
---
# 3. Abgleich gegen das Gesamtziel
Quelle: `produktvision_und_produktidentitaet.md`, ergänzt um Dialog-, Memory- und Output-Kapitel. Das ist **keine** Slice-Checkliste. Ein „Gap“ hier heißt: das Zielmodell ist nicht da — erwartet, solange Foundation-Regel 23/24 gilt. Die spannenden Zeilen sind **Spannung** und **Drift-Risiko**.
## 3.1 Identität und Prinzipien
| Prinzip / Grenze | Slice-Stand | Befund für die Gesamtziel-Prüfung |
|---|---|---|
| Personal Reflection Companion, nicht Tagebuch-App | **Spannung** | Der sichtbare Kern *ist* ein dialoggeführtes Journal. Der Dialog ist Erfassung plus Impuls, nicht langfristige Begleitung. Drift-Risiko: UI und Sprache dürfen nicht als „KI-Tagebuch“ festgeschrieben werden. Der Slice bleibt zulässig, wenn Generate/Editor dem Gespräch nachgeordnet bleiben. |
| Kernkette Wahrnehmen → Reflektieren → Verstehen → Einordnen | **Teilweise** | Wahrnehmen und ein kurzes Reflektieren im Turn. Verstehen/Einordnen über Tage und Werte: nicht gebaut. Journalentwurf verdichtet den Tag, ist aber keine Erkenntnis-Schicht. |
| Dialog vor Formular | **Erfüllt** im Tag | Journal Day ist Chat. Settings-Import und Editor sind nachgelagert. Start `/` ist kein Dialog. |
| Kontext vor generischer Frage | **Teilweise** | Derselbe Day-Transcript geht in den nächsten Zug. Space ist Recency, nicht Relevanz. Kanshō eröffnet nicht. Neutraler Start ist Default, in der Vision Fallback. |
| Erinnerung mit Herkunft | **Teilweise** | Messages bleiben. Draft/Entry-Version tragen relationale Source-Refs (API weiterhin ID-Listen). Nutzer sieht „zum Quelldialog“, keine Provenance-Kette, kein Re-Grounding. |
| Hypothese statt Gewissheit | **Teilweise** | Impulse sind Nachrichten, nicht Fakten. Keine Hypothesen-Objekte, keine Confidence, keine Bestätigung vor Self-Aussagen (kein Self Model). |
| Mensch entscheidet über Identität | **Erfüllt** als Abwesenheit | Kein Self-Model-Schreibpfad. Writing Profile ist als Formhinweis gekennzeichnet. |
| Persönliche Sprache | **Teilweise** | Lokaler Brief + Exzerpte plus kompakter Task-Brief. Journalentwurf trennt Rekonstruktion und Narration (2026-08-25). Langfristige stilistische Entwicklung und Exemplar-Korpus bleiben begrenzt. |
| Reflection before Action | **Bewusst offen** | Keine Action Candidates, keine Kairo-Übergabe. Scratch ist lokale Merkhilfe, kein Aufgabenmanager — Grenze gehalten. |
| Keine Jinkendo-Duplikation | **Erfüllt** im Slice | Kein Tracker, keine Diagnose-UI, kein Kairo-Todo. `/dialog` ist Admin-Harness, kein zweiter produktiver Gesprächsraum. |
| Menschenlesbares Langzeitarchiv (Obsidian) | **Gap** zum Ziel | Entries liegen in SQLite. Kein Export. |
| Langfristige Kontinuität | **Teilweise** | Transcript und versionierte Entries überdauern Sitzungen. Kein Thread Memory, keine offenen Fragen, kein Point-in-Time Self. |
| Einfache UX, differenzierter Kern | **Spannung** | UX ist einfach. Der Kern ist noch nicht differenziert (ein Call, Recency, Regex-Register). Das ist Slice-angemessen; es darf nicht als „der Kern *ist* Recency“ kanonisch werden. |
| Start = Kontinuität des Dialogs, kein Dashboard | **Erfüllt** als MVP-Keim | `/` führt zum fortsetzbaren Journal Day oder zum Space-Einstieg. Kein Dashboard. Contextual Continuation als Ziel-IA bleibt später. |
## 3.2 Dialog-IA (Ziel vs Slice)
Ziel (`dialogue_model.md`): Contextual Continuation als Default, Free Reflection, Explicit Navigation; Intent ≠ Dialogführung; Fäden intern möglich.
Slice: der Mensch schreibt die erste Zeile; Kanshō antwortet mit einem Impuls aus einem Call `{operation, impulse}`. Keine Entry-IA, keine Fortsetzung eines gestern offenen Fadens, keine Saturation, keine Wiedervorlage.
**Prüffrage:** Bleibt der Journal Day ein Gespräch über *diesen* Kalendertag? `/dialog` ist Admin-Testrest, nicht Ziel-IA.
## 3.3 Memory und Context (Ziel vs Slice)
Ziel: Working / Thread / Episodic, Space als Bedeutung, mindnet langfristig, Re-Grounding gegen Verdichtungsdrift.
Slice: Working Context ≈ aktuelle Conversation (Day-Cap) + begrenzte Recency-Ausschnitte finaler Space-Entries + begrenzte Original-Ausschnitte jüngerer Space-Conversations + Formhinweise nur beim Journalentwurf. Generate sieht **keine** Prior-Entries, nur Day-Dialog + Writing Profile. Scratch und Identity-Mapping sind Klasse A, kein Egress.
**Prüffrage:** Ist Recency als *Hilfsstruktur* erkennbar (`retrieval.py` nach `kind`), oder wird sie in Prompts/UI als „Kanshō erinnert sich“ verkauft? Der Code ist austauschbar; die Produktstimme darf das nicht überzeichnen.
## 3.4 Outputs und Integrationen (Ziel vs Slice)
Ziel: Journal Entry (Obsidian), Reflection Memory (mindnet), Knowledge Delta (mindnet), Action Candidate (Kairo). Tagesreflexion muss kein Artefakt erzeugen; Journal-Default im Ziel: bei substanzieller Reflexion dezent anbieten.
Slice: einziges sichtbares Derived-Produkt ist Journal Draft/Entry. Generate nur explizit (Button), nicht automatisch am Gesprächsende. Das weicht vom späteren Journal-Default der Tagesreflexion ab und hält Foundation „model proposes; policy decides“.
**Prüffrage:** Explizites Generate ist für den Slice richtig. Es darf nicht so verbaut werden, dass ein späteres dezenten Angebot am Abschluss den Entry still überschreibt (§11.2).
## 3.5 Privacy (Ziel vs Slice)
Ziel: Identität lokal, minimierter pseudonymisierter Egress, Detect lokal, Response-Validierung, Audit ohne Prompt, ZDR.
Slice: Gateway-Pfad existiert und ist nicht abschaltbar. Maskierung + Generate. Detect: Muster immer; externes Klartext-Detect nur Development/Test, Produktiv fällt auf Muster zurück. Minimale Response Validation vor Demask (Klartext-Identität). Keine inhaltliche Minimierung über Caps hinaus, keine Quasi-Identifikatoren, Mapping unverschlüsselt.
**Das ist der größte Abstand zum Gesamtziel, der schon im Slice operativ relevant ist** — nicht weil das Target Model fehlt, sondern weil Testdaten persönlich sein können.
## 3.6 Nutzungssituationen (Zieltypologie vs Slice)
Von elf Situationen ist nur ein Pfad gebaut: Tagesreflexion als Journal Day plus optionales Festhalten im Entry. „Erleben festhalten“ geht nur als Dialogtext, nicht als Voice. „Früheren Faden fortsetzen“, Tiefe Reflexion, Entscheidung, Revue, Nachschlagen jenseits Space→Tag→Entry: nicht als eigene IA.
Nachschlagen im Slice = Chronologie im Space. Das erfüllt MVP-Case K, nicht Natural-Language-Biografie.
## 3.7 Gesamtziel: Kurzurteil
Der Slice ist eine **zulässige vertikale Keimzelle**: Dialogquelle bleibt kanonisch, Journal ist Derived, Gateway sitzt vor Egress, Space/Day/Assignment sind trennbar, Retrieval ist austauschbar.
Er ist **noch nicht Kanshō im Sinne der Vision**. Die gefährlichen Drifts sind nicht die fehlenden Target-Module, sondern:
1. Journal-Editor und Medien als Produktmitte statt Dialog,
2. Recency und Regex als Ersatz für Context/Memory,
3. `/dialog` als Admin-Harness (geschlossen für die Nutzer-IA; Stub-Home bleibt),
4. Detect-Klartext als Gewohnheit im Produktivmodus (Development/Test bleibt erlaubt),
5. Stub-Home statt Kontinuität.
---
# 4. Abgleich Implementation Foundation
## 4.1 Core-Regeln
| # | Regel | Stand | Befund |
|---|---|---|---|
| 1 | Original Source bleibt kanonisch | **Erfüllt** | `messages` bleiben bei Generate und Entry-Save. Löschen eines Gesprächs ist ausdrücklich und hart (Nachrichten weg). |
| 2 | Derived ersetzt Source nie | **Erfüllt** | Drafts und Entries sind eigene Tabellen. Generate prüft, dass `current_version_id` unangetastet bleibt. |
| 3 | Stabile Identitäten | **Erfüllt** | UUIDs für Profile, Spaces, Days, Conversations, Messages, Drafts, Entries, Versionen, Media. |
| 4 | Zeit und Provenance | **Erfüllt** im Datenmodell | Message-`created` ≠ `journal_days.calendar_date`. Drafts/Entries tragen relationale Source-Refs. **Gap:** keine nutzbare Provenance-Ansicht jenseits „zum Quelldialog“. |
| 5 | Current Validity und History getrennt | **Erfüllt** | `journal_entry_versions`; Restore hängt eine neue Version an. Offene Editor-Edits sind kein History-Write; Verwerfen ist lokal. |
| 6 | User Correction vor Modellinferenz | **Erfüllt** für Journal | Nutzerfassung ist Current. KI-Draft ist nicht Stilquelle. **Teilweise** für Derived-Hülle: `derived_records` werden bei Entry-Korrektur nicht invalidiert (im Slice ungenutzt). |
| 7 | AI Hypothesis ist kein User Fact | **Erfüllt** im Dialogpfad | Impulse sind `assistant:`-Nachrichten, nicht Entries. Generate: Impulse sind Kontext, nicht Erlebtes. |
| 8 | Expressed state ist kein Self Model | **Erfüllt** | Kein Self-Model-Schreibpfad. Writing Profile sind Formhinweise, als „keine Diagnose“ gekennzeichnet. |
| 9 | Model proposes; policy decides; source preserves | **Erfüllt** | Generate nur explizit (`journal_policy.require_explicit_generate`). Speichern nur per Nutzer. Übernehmen aus Entwurf schreibt eine Version, überschreibt History nicht. |
| 10 | Space ist Bedeutungskontext, kein Ordner | **Teilweise** | Space ist nutzbar und Isolationseinheit; Conversation kann dem Space ohne Journal Day zugeordnet werden. Inhaltlich bleibt er eine Liste von Tagen plus Recency-Ausschnitten. Keine Space-Bedeutungsschicht. |
| 11 | Primary und Related Spaces möglich | **Teilweise** | Primary Assignment: `conversations.space_id` / `journal_day_id`. Junction `thread_spaces` existiert. **Gap:** Related Spaces weder Datenmodell für Journal-Spaces noch UI. `conversations.space_id` ohne FK. |
| 12 | Assignment ist nicht Identity | **Erfüllt** | Conversation-ID bleibt; Space/Day sind Assignment-Felder. |
| 13 | Existing before new | **Teilweise** | Denselben Kalendertag im Space wiederzuverwenden öffnet denselben Day. Speichern aus Entwurf versioniert den bestehenden Entry. Recurring Activities erzeugen keinen bestehenden Faden, sondern nichts. |
| 14 | Space first, Long-Term Memory on demand | **Erfüllt** | Kein globales autobiografisches Retrieval. Dialog sieht den Day plus letzte Space-Entries. |
| 15 | Context Builder eigene Verantwortlichkeit | **Erfüllt** | `context_builder.py` + `retrieval.py`. Frontend baut keinen Prompt. |
| 16 | Minimum sufficient context | **Teilweise** | Day-Cap und Space-Ausschnitte sind Recency-Implementierung hinter Selection-Specs. **Ungenauigkeit:** das ist keine Relevanz. |
| 17 | Retrieval ist Hilfsstruktur | **Erfüllt** | SQL-Funktionen nach `kind`, keine Embeddings als Wahrheit. |
| 18 | Provider State ist nicht Memory | **Erfüllt** | Kontinuität in SQLite. Provider sieht maskierten Prompt. |
| 19 | Ein generativer Hauptcall pro Turn | **Erfüllt** | Ein Dialogzug-Call; optional ein lokaler Repair-Call. Detect ist Maskierung, nicht Operation. Journalentwurf getrennt und explizit. |
| 20 | Write Evaluation signal-driven | **Erfüllt** | Kein exhaustives Memory-/Pattern-Write nach jeder Message. `remember_dialogue_style` ist lokal und schmal. |
| 21 | Variable Policies nicht quer hardcoden | **Teilweise** | `journal_policy.py` ist die Journal-Grenze inkl. Konsolidierungsangebot aus lokalen Signalen. Register, Guards, UNMASKABLE liegen als Heuristiken im Code. Für den MVP laut Foundation keine Policy-Engine nötig. **Ungenauigkeit:** „Policy“ im Dialog ist Prompt + Regex, keine zentrale Decision-Tabelle. |
| 22 | Interne Reichhaltigkeit, einfache UI | **Teilweise** | Journal-UI ist schmal. `/dialog` ist Admin-Harness, nicht Produkt-Nav. Admin-Bereich (Prompts, Provider, Nutzer, Diagnose) bleibt Mitai-Rahmen. |
| 23 | Neue Abstraktionen brauchen Nutzen | **Erfüllt** | Threads/Derived/Handoffs sind Hüllen, ohne Nutzer-IA. |
| 24 | Nicht implementiert ist zulässig | **Erfüllt** | Space Memory, Related Spaces, semantisches Retrieval bewusst offen. |
## 4.2 Foundation Cut: muss vorhanden sein
| Muss | Stand | Befund |
|---|---|---|
| Persistente Session- und Message-Quellen | **Erfüllt** | `usage_sessions`, `conversations`, `messages`; Auth-`sessions` getrennt |
| Stabile IDs | **Erfüllt** | |
| Zeitbezug und grundlegende Provenance | **Erfüllt** | siehe Regel 4 |
| Trennung Source / Derived | **Erfüllt** | |
| Reflection-Space-Grundmodell | **Erfüllt** | `spaces.visibility='user'` |
| Primary-Space-Zuordnung | **Erfüllt** | Assignment-Felder; Journal-Day erzwingt Space |
| Datenmodell darf Related später zulassen | **Teilweise** | `thread_spaces` ja; Journal-Space-Related fehlt |
| Current-State-/History für verwendete Objekte | **Erfüllt** | Entries + Versionen; Dirty-State ist Session-UI, nicht History |
| Nutzerkorrektur beeinflusst Current Validity | **Erfüllt** | |
| Context-Builder-Schnittstelle | **Erfüllt** | |
| Austauschbare Retrieval-Schnittstelle | **Erfüllt** | |
| Provider-Abstraktion | **Erfüllt** | `providers.py`, Rollen generate/detect |
| Kleine Write-/Decision-Policy-Grenze | **Erfüllt** | `journal_policy.py` |
## 4.3 Foundation: nur bauen wenn der Slice es braucht
| Gegenstand | Im Code | Bewertung |
|---|---|---|
| Thread | Tabelle + Junction, visibility internal | Hülle, keine UI. **Kein Gap**, solange nicht als Produkt verkauft. |
| Open Question / Insight / Experience | Derived-Kind-Registry, keine Nutzung | **Bewusst offen** |
| Sichtbare Related Spaces | nein | **Bewusst offen** |
| Automatische Space-Erkennung | nein | **Bewusst offen** |
| Semantisches Retrieval | nein | **Bewusst offen** |
| Session Summary | nein | **Bewusst offen** |
| Zusätzliche Enrichment-Calls | Detect in Development/Test optional remote | **Abweichung** gegenüber Produktivziel „Detect lokal“; Produktivmodus lässt externes Klartext-Detect nicht als normalen Pfad zu |
## 4.4 Foundation Non-Goals
Nicht vorsorglich gebaut: Reflection Graph, Graph-DB, Pattern-Engine, Self Model, Landmark-Engine, Policy-Learning, Space-Merges, mindnet-Sync, Resurfacing, Persönlichkeitsanalyse, Intent-Engines, Graph-UI, Dashboards.
**Spannung, kein Slice-Gap:** Es gibt eine Admin-Oberfläche (Nutzer, Prompts, Platzhalter, Features, Provider, Dialogdiagnose). Das MVP-Non-Goal „komplexe Admin-/Governance-Oberfläche“ meint die Produkt-IA. Der Mitai-Produktrahmen sieht Operator-Admin vor. Die Testspur am Dialog ist bewusst Testphase, nicht Default-UX.
Foundation-Verletzungen, die ein Refactor erzwingen würden, sind **nicht** gefunden: Source/Derived, IDs, Space-Assignment, Context Builder, Gateway vor Egress, explizites Generate, Versionierung ohne History-Overwrite.
---
# 5. Abgleich MVP-Spezifikation
## 5.1 Produktversprechen (`mvp.md` §12)
| Anforderung | Stand | Befund |
|---|---|---|
| Dialoggeführtes Journal, Entwurf aus dem Gespräch | **Erfüllt** | Explizites Generate, Öffnen als Entwurf |
| Redigieren, Medien, chronologisch wiederfinden | **Erfüllt** im Slice-Schnitt | Editor mit Absätzen, Listen, Inline-Bild/Video. Navigation über Entry-Liste und Tage. |
| Dialog berücksichtigt Tagesverlauf, Space, frühere Aussagen, Erzählweise | **Teilweise** | Tagesverlauf: voller Day-Dialog. Erzählweise: Formhinweise. Space/Früheres: Recency-Ausschnitte gespeicherter Entries, 5×400 Zeichen. **Ungenauigkeit** von §1 gegenüber der Umsetzung in §5.1 letzter Absatz und §8.2 |
## 5.2 Sichtbare Einheiten
| Einheit | Stand | Befund |
|---|---|---|
| Space anlegen, umbenennen, auswählen | **Erfüllt** | |
| Chronologische Entries des Spaces | **Erfüllt** | Space-Seite zeigt Einträge (Datum, Titel, Versionshinweis) und weiterhin Tage. Gelöschte nur im Papierkorb. |
| Journal Day ≠ Dialogzeit | **Erfüllt** | |
| Originaldialog erhalten | **Erfüllt** | |
| Gespräch aus dem Tag entfernen | **Erfüllt** | Hartes Löschen der Conversation. **Ungenauigkeit:** härter als Entry-Soft-Delete; kein Papierkorb für Dialoge |
| Draft Derived, erneut generierbar, überschreibt Entry nicht | **Erfüllt** | UI öffnet den neuen Entwurf; Übernehmen ist explizit und versioniert den bestehenden Entry. |
| Entry mit Versionen, Space, Day, Quellen | **Erfüllt** | Medien am Entry; Position und Unterschrift im Body-Token |
## 5.3 Mehrere Dialoge (`mvp.md` §4)
| Anforderung | Stand | Befund |
|---|---|---|
| Mehrere Conversations pro Day | **Erfüllt** | |
| Konsolidierung anbieten, nicht erzwingen | **Erfüllt** im Slice-Schnitt | Angebot nur bei hinreichend ähnlichen lokalen Signalen (`narrative_mode`, `reflection_depth`, `current_focus`). UI: dieses Gespräch / alle des Tages. Nutzer entscheidet über `conversation_ids`. |
| Getrennte Tiefen nicht automatisch mergen | **Erfüllt** | Ohne Auswahl nur die letzte Conversation |
| Gleicher Kalendertag, verschiedene Spaces getrennt | **Erfüllt** | Unique `(space_id, calendar_date)` |
## 5.4 Dialogführung (`mvp.md` §57)
| Anforderung | Stand | Befund |
|---|---|---|
| Kein Fragebogen; Reflexionspartner | **Teilweise** | Prompt und Stimme zielen darauf. Qualität ist modellabhängig. Lokale Wächter gegen Recap, erfundenen Vollzug, erfundene Empfindung, Systemfloskeln, Schluss-Wiederöffnung. `local_hold` bittet um Fortsetzung statt Floskel. |
| Sechs Operationen, keine Intent-Engines | **Erfüllt** | Ein Call, JSON `{operation, impulse}`; sichtbar ist `impulse` |
| Register lokal, kein zweites Modell | **Erfüllt** | `infer_register` |
| Bekannter Tagesplan (Cres-Beispiel) | **Teilweise / Ungenauigkeit** | Plan kann aus begrenzten Recency-Ausschnitten **gespeicherter Entries** oder **jüngerer Original-Conversations** desselben Space kommen. Kein Plan-Objekt, keine zeitliche Vor/Nach-Logik, kein semantisches Retrieval. |
| Wiederkehrende Aktivität (Japanisch-Beispiel) | **Gap** | Keine Zählung über Morgenbeschreibungen. Recency kann den Treffer zufällig enthalten oder nicht. |
| Keine triviale Gefühlsfrage nach selbst benannter Emotion | **Teilweise** | Prompt + `is_unearned_stance`. Kein Dialogzustand „bereits beantwortet“. |
| Kontextsensitiver Einstieg statt „Erzähl von deinem Tag“ | **Erfüllt** als begrenzte Keimzelle | Erster Impuls aus belegtem Plan oder offenem Tagesfaden; sonst neutral. Keine Pattern-Engine. |
| Unterbrechen und Fortsetzen am selben Day | **Erfüllt** | Transcript bleibt. **Teilweise:** keine lokale Karte „welche Tagesabschnitte schon da sind“. |
| Folgetag-Fortsetzung dem ursprünglichen Day zuordnen | **Erfüllt** | Nutzer öffnet den Day; Message-Zeit ist unabhängig. |
## 5.5 Generierung (`mvp.md` §8)
| Anforderung | Stand | Befund |
|---|---|---|
| Nur explizit | **Erfüllt** | |
| Quellen: Day-Dialog inkl. Impulse als Kontext | **Erfüllt** | `user:` Erlebtes, `assistant:` Anschluss |
| Space-Kontext soweit nötig | **Teilweise** | Generate bekommt **keinen** Prior-Entry-Block; nur Writing Profile + Day-Dialog. Dialogzug sieht Prior-Entries. |
| Writing Profile | **Erfüllt** | Lokal, ohne Extra-LLM |
| Bestehenden Text einbeziehen | **Erfüllt** | API und UI. Default nicht einbeziehen; Flag nur nach ausdrücklicher Auswahl. Nutzerfassung unangetastet. |
| Verbinden, nicht durchreichen | **Teilweise** | Prompt: Szenen verbinden und Stimme aus dem Writing Profile; kurze Passagen ausformulieren ohne neue Fakten. `journal_shape` formt 1:1-Kopien und dünnt Namenswiederholungen. Qualität modellabhängig. Zweistufige Generierung (Rekonstruktion, dann Narration) ist im Code (2026-08-25). Stufe 1 ist untrusted Auswahl/Annotation, nicht autoritative Semantik. |
| Nicht erfinden | **Teilweise** | Prompt; keine lokale Faktenprüfung gegen den Dialog |
## 5.6 Writing Profile (`mvp.md` §9)
| Anforderung | Stand | Befund |
|---|---|---|
| Priorität Entries > Import > Dialog | **Erfüllt** | Finale Entries: mehr/längere Exzerpte; Dialog-Exzerpte entfallen, sobald Entries existieren. |
| KI-Draft keine Stilquelle | **Erfüllt** | |
| Import optional | **Erfüllt** | Settings |
| Formhinweise ohne Self Model | **Erfüllt** | Heuristik |
| Semantische Review | **Erfüllt** als expliziter Pfad | Gebündelt, API oder Copy/Paste, nicht nach jedem Dialog. Siehe 2.3. |
| Profilhülle / dynamische Traits | **Erfüllt** als Keim | Core + Facets + datengetriebene Traits. Kein festes Raster. Siehe 2.4. |
| Initial Profile Build | **Erfüllt** als expliziter Pfad | Historischer Korpus, Confirm vor Continuous Learning. |
| Lernsignale §9.3 vollständig | **Teilweise** | Satzlänge, Chronologie vs. Thema, Uhrzeiten, Reflexionsanteil, Humor. **Gap:** Umgang mit Namen, typische Übergänge, Wortwahl als eigene Signale. |
| Dialogzug ohne Stil-Exzerpte des offenen Turns | **Erfüllt** | |
**Additiv 2026-08-29:** Die Stilanwendung filtert Writing-Profile-Core, Facet, Traits und Style Examples je benannter Voice-Ausprägung. `Ohne persönliches Profil` ist eine profilfreie Kontrollgruppe. Space-Kontext und faktisches Langzeitgedächtnis bleiben keine Stilquellen.
**Additiv 2026-08-29:** Vergleichsausprägungen `Legacy vor Stilkontextsteuerung` rekonstruiert die frühere volle Stilkontextsemantik unter neuen IDs. Vorhandene Voice-IDs bleiben unverändert.
## 5.7 Editor, Versionen, Nachschlagen, Screens
| Anforderung | Stand | Befund |
|---|---|---|
| Text ändern, Absätze, Überschrift | **Erfüllt** | Fließtext; Absatz/Überschrift/Liste; Fett/Kursiv/Unterstrichen auf der Markierung |
| Bilder ergänzen, anordnen | **Erfüllt** | Fließtext, Einfügen an der Schreibmarke, Ziehen im Text, Unterschrift. Alte Galerie-Dateien ohne Referenz: „Noch nicht im Text“. |
| Videos im Eintrag darstellen | **Erfüllt** | MP4/WebM/MOV, lokal, direkt abspielen. Keine Videobibliothek. Metadaten in Video-Containern werden **nicht** gestrippt (**Gap** / bewusst dünn). |
| Zeichnungen als Bilddatei | **Erfüllt** | als Upload |
| Soft Delete / Papierkorb | **Erfüllt** | Soft Delete, Papierkorb-UI, Wiederherstellen, explizites endgültiges Löschen. Isolation geprüft. |
| Version History sichtbar, Restore | **Erfüllt** | Aktuelle Fassung ohne Restore auf sich selbst; offene Edits lokal verwerfen. Navigation mit Dirty-Flag bestätigt (Links, Abmelden, `beforeunload`). Browser-Zurück nicht hart blockiert. |
| Generate überschreibt Nutzerfassung nicht | **Erfüllt** | |
| Chronologische Liste, Space, Datum, Entry, Quelldialog | **Erfüllt** | Space → Einträge und Tage → Editor/Source. |
| Screen Journal/Spaces | **Erfüllt** | |
| Screen Journal Day / Dialog | **Teilweise** | Chat + Generate + lokale Stichpunkte + `include_existing`. **Bewusst begrenzt:** keine Medienoption am Dialog (siehe `mvp.md` §10.2). |
| Screen Editor | **Erfüllt** | Fließtexteditor, Markdown, Inline-Medien, Restore, Dirty-Schutz |
| Screen Source Dialog | **Erfüllt** | |
| Start = Kontinuität des Dialogs | **Erfüllt** als MVP-Keim | `/` Fortsetzen oder Journal/Space. `/dialog` bleibt Admin-Harness. |
| Tagesstichpunkte §10.1 | **Erfüllt** als lokale Liste | Klasse A, kein Egress (Test). Kein Aufgabenmanager. Offen bleibt eine spätere bewusste, maskierte Nutzung als Kontext. |
## 5.8 Acceptance Cases
| Case | Stand | Was der Code prüft vs. was die Spezifikation meint |
|---|---|---|
| **A** Einfacher Day | **Erfüllt** | Dialog, Generate, Save, Space-Chronologie. Lesbarkeit/Quelltreue des Entwurfs ist modellabhängig, Shape nur bei 1:1-Paste. |
| **B** Mehrphasiger Tag | **Erfüllt** | Gleicher Day, spätere Messages, Kalenderdatum stabil. |
| **C** Kontextsensitiver Dialog | **Teilweise / Ungenauigkeit** | Test prüft, dass „Hafen“ im Prompt steht und die Regel „nicht geschehen“ im Template ist. Er prüft nicht, dass Kanshō den Plan als Impuls aufgreift. Wiederkehrende Aktivität: **Gap**. |
| **D** Ausführliche Erzählung | **Teilweise** | Ein Call, dichtes Register. Ob der Impuls nicht interviewt, ist modell- + wächterabhängig. Tests erzwingen keine inhaltsleere Fragefreiheit. |
| **E** Emotionaler Abschnitt | **Teilweise** | Prompt + Stance-Wächter. Test sucht die Phrase „Motivationen erfinden“ im Prompt, nicht das Dialogverhalten. |
| **F** Unterschiedliche Dialogtypen | **Erfüllt** im Schnitt | Zwei Conversations möglich, kein Zwangsmerge. Lokale Signale trennen Chronik und tiefe Reflexion; Angebot bleibt aus. |
| **G** Ähnliche Dialoge, Angebot | **Erfüllt** im Schnitt | Angebot nur bei ähnlichen Signalen. Nutzer entscheidet über `conversation_ids`. |
| **H** Zwei Spaces, gleicher Tag | **Erfüllt** | |
| **I** Persönlicher Stil | **Teilweise** | Import und Entries im Brief; Formhinweise. „Nicht in KI-Stil driftet“ ist Promptziel, nicht messbar erfüllt. |
| **J** Versionsschutz | **Erfüllt** | Restore hängt Version an; Generate ändert Entry nicht; Entwurf öffnet separat; Übernehmen versioniert. |
| **K** Nachschlagen | **Erfüllt** | Space → Entry-Liste und Datum → Entry → Source. |
---
# 6. Ungenauigkeiten (Doku, Tests, UI)
1. **`mvp.md` §1 und §5.1** versprechen „relevante frühere Aussagen“ und „wiederkehrende Aktivitäten“. Der Code liefert Recency-Ausschnitte finaler Entries plus begrenzte Original-Ausschnitte jüngerer Space-Conversations. Der klarstellende Absatz in §5.1 und §8.2 ist der gültige Implementierungsstand; die Beispiele §5.45.5 und Case C bleiben **schärfer als der Code** (kein Plan-Objekt, keine Wiederholungszählung).
2. **`mvp.md` §17** sprach vom „nächsten Schritt: technischen Plan ableiten“. Der Slice ist gebaut. Dieses Dokument ist der Abgleich; die Formulierung in §17 bleibt historisch.
3. **`mvp.md` §4.1 Konsolidierung** beschreibt narrative Kriterien. Der Slice nutzt lokale Signale derselben Dimensionen, keine LLM-Typklassifikation.
4. **`mvp.md` §6 Einstieg** verlangt einen kontextsensitiven ersten Impuls. Seit 2026-08-25: journalspezifischer Opening-Adapter; ohne belegten Plan oder offenen Tagesfaden lokal neutral.
5. **`mvp.md` §8.2 Punkt 2** Space-Kontext bei der Generierung: Generate sieht Prior-Entries nicht. Für diesen Freeze bewusst so begrenzt (`mvp.md` §8.2.1).
6. **`mvp.md` §9.3** listet Lernsignale, von denen nur ein Teil heuristisch existiert.
7. **`mvp.md` §11.3 / §13.113.2** Papierkorb-UI und Entry-Liste sind vorhanden. Dialog-Medien bleiben bewusst aus (`mvp.md` §10.2).
8. **Acceptance-Tests C/D/E** sind oft Prompt- oder Call-Zähl-Proxies, keine fachlichen Verhaltensbeweise.
9. **`backend_and_api.md`** beschreibt PostgreSQL als Rahmen; der Slice läuft auf **SQLite**. **Abweichung** vom technischen Ziel, lokal zulässig.
10. **Fehlerformat:** Rahmen will `{detail: string}`. Viele Router liefern `{detail: {code, message}}`.
11. **Nav `/dialog`** ist aus der Produkt-IA entfernt (Admin-Harness). Home ist Kontinuität, kein Dashboard.
12. **Detect über OpenRouter** darf Klartext nur in Development/Test sehen. Produktivmodus fällt auf Muster oder lokale Detect-URL zurück. Guardrail-Abstand zum lokalen Detect-Modell bleibt.
13. **Home `/`** führt zum fortsetzbaren Journal Day oder zum Space-Einstieg. Contextual Continuation als Ziel-IA bleibt später.
14. **`handover.md`** ist Konzept-Bootstrap (Interviewstand 2026-08-19) und **kein** Code-Stand. Code-Stand ist dieses Dokument.
15. **Zweistufige Journalgenerierung** ist im Slice umgesetzt. Stufe 1 ist untrusted Auswahl/Annotation; lokale Source Registry und Verified Artifact sind autoritativ. Stufe 2 erhält vollständige lokal rehydrierte Nutzquellen. Ungültiges Modell-JSON der Stufe 1 führt seit 2026-08-26 nicht mehr zum Generate-Abbruch, sondern zum lokalen Artefakt. Qualitative Modellfälle bleiben nicht automatisch bewiesen.
16. **Tagesreflexion-Journal-Default** (Hintergrund-Entwurf am Abschluss, dezent anbieten) ist Fachstand der Nutzungssituation, nicht MVP-Text. Der Slice verlangt den Button. Kein Widerspruch, solange später kein stilles Überschreiben entsteht.
---
# 7. Bewusst offen (kein Gap des Slices)
Zielmodell und Non-Goals, nicht „vergessen im MVP“:
- Space Content Memory, Threads-UI, Open Questions, Insights, Experiences
- Semantisches Retrieval, Session-Summaries, Related Spaces
- Self Model, Pattern-Ansicht, Resurfacing, mindnet, Obsidian-Ablage, Kairo-Handoff
- Voice, Videobibliothek, Dokumentarchive, Karten
- Video-Metadaten (GPS im Container) strippen
- Tagesstichpunkte als Dialogkontext (bewusst lokal, siehe `mvp.md` §10.1)
- Encryption at rest, DSFA, Multi-Gerät-Sync, PWA-Offline-Ausprägung
- Lokales Detect-Modell (Ollama) als Ablösung der Testphase
- Contextual Continuation als Ziel-IA (der Freeze hat nur eine journalspezifische Startkeimzelle)
- Browser-Zurück als harter Unsaved-Blocker (Data-Router)
- Dialogmedien als direkte Dialogquelle
---
# 8. Zwei Listen: Slice schließen vs. Gesamtziel später
Keine neue Horizontal-Konzeption. Getrennt halten, sonst baut ein Agent das Target Model in den Slice.
## 8.1 Distanz zum **freigegebenen MVP-Text** (`mvp.md`)
1. **Case C Wiederholung** wiederkehrende Aktivität bleibt Recency, keine Zählung. Der erste Impuls greift nur belegte Pläne oder offene Tagesfäden auf.
2. **Generate und Space-Ausschnitte** für diesen Freeze entschieden: Day-Conversations plus Verified Artifact, keine Prior-Entries als Generate-Fakten (`mvp.md` §8.2.1).
3. **Dialog-Medien** bewusst gestrichen für den Slice (`mvp.md` §10.2); Editor-Medien bleiben.
4. **Lokales Detect-Modell** Klartext an externe Detect-Provider ist in Production blockiert; Ollama als Ablösung der Dev/Test-Phase bleibt offen.
5. **Qualitative Modellfälle** C/D/E/I bleiben modellabhängig, nicht durch Tests vollständig bewiesen.
## 8.2 Distanz zum **Gesamtziel** (nicht jetzt bauen)
1. Memory-Schichten und Space als Bedeutung, nicht Recency-Liste.
2. Contextual Continuation, Saturation, Wiedervorlage, Fäden.
3. Outputs jenseits Journal (Memory, Knowledge, Action) und Integrationen.
4. Self Model mit Bestätigung; Point-in-Time Self.
5. Re-Grounding und Provenance-UI.
6. Privacy Security Layer (Minimierung, lokales Detect, Response-Validierung, Audit, Encryption).
7. Voice, Offline, Obsidian.
Ein Agent, der 8.2 in diesem Slice „schließt“, verletzt Foundation-Regeln 2224.
---
# 9. Dateikarte für die Gegenprüfung
## 9.1 Fachlich führend
| Datei | Rolle in der Prüfung |
|---|---|
| `produktvision_und_produktidentitaet.md` | Gesamtziel, Prinzipien, Nicht-Ziele |
| `mvp.md` | Freigegebener Slice |
| `implementation_foundation.md` | Sackgassen-Verbot |
| dieses Dokument | Ist-Stand |
| `guardrails.md` | Datenschutz-Invariante |
| `writing_profile_and_journaling.md` | Stilziel; Zweistufenmodell ist Ziel, nicht Slice |
## 9.2 Code, der den Slice trägt
| Pfad | Verantwortung |
|---|---|
| `backend/privacy_gateway.py`, `entity_detect.py`, `pronoun_bind.py`, `identity_store.py` | Egress, Maskierung, Dialog-Pronomen |
| `backend/context_builder.py`, `retrieval.py`, `conversation_signals.py` | Interner Kontext, Selection-Specs, lokale Dialogsignale |
| `backend/dialogue_turn.py` | Ein Call, Operation/Impuls, lokale Wächter; kein Writing-Profile-Kernel |
| `backend/journal_generate.py`, `journal_shape.py`, `journal_body.py` | Entwurf, Shape, Titel/Markdown |
| `backend/journal_store.py`, `journal_policy.py` | Entries, Versionen, Scratch, explizites Generate |
| `backend/writing_profile_store.py` | Lokaler Brief |
| `backend/media_store.py` | Lokale Medien, Token im Body |
| `frontend/src/pages/JournalDayPage.jsx` | Dialog + Generate + Scratch |
| `frontend/src/pages/JournalEditorPage.jsx` | Editor, Versionen, Dirty |
| `frontend/src/context/UnsavedChanges.jsx` | Navigationsschutz |
| `frontend/src/components/DayScratch.jsx` | Lokale Checkliste |
| `frontend/src/journal/document.js` | Markdown ↔ TipTap |
## 9.3 Tests und ihre Grenze
| Suite | Was sie trägt | Was sie nicht trägt |
|---|---|---|
| `backend/tests/test_mvp_journal.py` | Day, Generate ändert Entry nicht, Scratch nicht im Egress, Spaces isoliert, Konsolidierung nach Signalen | Dialogqualität, Stil, Case C Verhalten |
| `backend/tests/test_architecture_correction.py` | Provenance-Migration, Space ohne Day, Space-Source-Plan, Detect-Env, Kernel-Grenzen | — |
| `backend/tests/test_privacy_detect.py` | Maskierung, Pronomen Dialog vs Journal, Response Validation, Production-Detect | Quasi-Identifikatoren, Provider-ZDR |
| `backend/tests/test_journal_shape.py` | Keine Pronomenersetzung nach Demask; akzeptierter Wortlaut bleibt | Modellqualität, Stil |
| `backend/tests/test_writing_profile.py` | Quellenpriorität | „klingt wie die Person“ |
| `backend/tests/test_frame.py` | Auth, Prompts, Rahmen | Journal-IA |
| `frontend/src/journal/document.test.js` | Markdown-Runde | Editor-UX, Dirty-Flag |
Laufzeit lokal: Frontend Port **5188**, Backend **8018**, SQLite `backend/data/kansho.sqlite`. Prompt-Templates in der DB werden bei unangetasteten Seeds durch `init_db` aktualisiert; nach Prompt-Änderungen Backend neu starten.
---
# 10. Empfohlene Prüffragen (für den zweiten Agenten)
Nicht als Implementierungsbacklog, sondern als Gegenlesung:
1. Wird im Code oder in der UI etwas als Erinnerung, Verständnis oder Identität verkauft, das nur Recency, Regex oder ein Writing-Brief ist?
2. Bleibt der Dialog die Primärquelle, oder zieht der Editor (Medien, Versionen) die Produktmitte auf das Journal?
3. Ist das Gateway vor jedem persönlichen Generate-Call, und ist Detect-Klartext als Testphase kenntlich — in Admin-UI und Doku?
4. Kann ein späteres Thread Memory / Related Space / Re-Grounding an IDs, Assignment und Retrieval andocken, ohne Messages oder Entries umzuschlüsseln?
5. Welche der Lücken in Abschnitt 8.1 sind echte Spec-Schulden, welche sollten in `mvp.md` auf den Code zurückgeschrieben werden, damit Vision und Slice nicht weiter auseinanderlaufen?
6. Drift-Risiko Stub-Home: bleibt die Startlogik gegen „Kontinuität des Dialogs“ dünn, obwohl `/dialog` nicht mehr in der Nutzer-IA liegt?
7. Scratch: bleibt die Grenze „kein Aufgabenmanager, kein Egress“ in Copy und Tests klar?
Wenn diese sieben Punkte tragfähig beantwortet sind, ist der Slice gegen das Gesamtziel **als Keimzelle** prüfbar — ohne das Target Model einzufordern.