623 lines
50 KiB
Markdown
623 lines
50 KiB
Markdown
---
|
||
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.1–9.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 ~3–4k 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`.
|
||
|
||
---
|
||
|
||
# 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` §1–2)
|
||
|
||
| 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` §5–7)
|
||
|
||
| 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** | |
|
||
|
||
## 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.4–5.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.1–13.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 22–24.
|
||
|
||
---
|
||
|
||
# 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` | Namensausdünnung | Quelltreue des Modells |
|
||
| `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.
|