AI memory drawer
ai-ui specs/ai-ui/memory-drawer.kmd
Drawer to edit AI persistent memory: list/search/edit/delete items; audit log per item ("added by AI/user on X"); 4 categories matching Claude memory model (user/project/feedback/reference); export/import as markdown bundle. Right-to-erasure compliant. Required for any product with memory-aware AI.
When this spec applies
Primary triggers
- Display persistent AI memory items to user
All triggers
- Build memory-aware AI surface (Kortex, Talk)
- Audit AI for transparency around persistent context
- Implement right-to-erasure for AI memory
Specification body
Spec — AI memory drawer
Backend:
services/ai/memory/. Patterns referenced: Claude memory tool (Anthropic), ChatGPT custom memory (OpenAI). Companion impl tickets em services/ai/ai: #111 (auto-curated memory nudges) + #112 (semantic memory search). Compliance: LGPD art. 18 right-to-erasure.
Princípios
- Not a black box — user vê cada memory item editable + deletable.
- AI attribution per item — distinguir "added by AI" vs "added by user".
- 4 semantic categories — espelha Claude Code memory system (user/project/feedback/reference).
- Right-to-erasure cascade — delete user → cascata em memory; per
identity-data-retention.kmdR5. - Markdown round-trip — export/import como files; user fica owner.
R1 — Anatomia
Drawer lateral (right-side desktop / fullscreen mobile):
┌─────────────────────────────────────────┐
│ Memory [✕] │
│ [🔍 Search] │
├─────────────────────────────────────────┤
│ Categories │
│ [User] [Project] [Feedback] [Reference] │
├─────────────────────────────────────────┤
│ ▼ User memories (12) │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ • Prefers TypeScript over Python │
│ Added by AI · 2026-05-13 │
│ [Edit] [Delete] │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ • Lives in São Paulo │
│ Added by user · 2026-05-10 │
│ [Edit] [Delete] │
│ ▼ Project memories (5) │
│ ... │
├─────────────────────────────────────────┤
│ [Export markdown] [Import] [Delete all] │
└─────────────────────────────────────────┘
R2 — 4 categories
Espelha Claude Code memory system (/home/koder/.claude-rpm32510943/projects/.../memory/):
| Category | Definition |
|---|---|
| user | About the user — role, preferences, knowledge, goals |
| project | Project state — ongoing work, decisions, deadlines |
| feedback | Behavioral guidance — corrections, preferences for AI |
| reference | Pointers to external systems / docs |
AI classifies on add; user can re-classify.
R3 — Search
Two modes:
- Literal: substring search on item content.
- Semantic (via
services/ai/ai#112): embedding similarity; threshold default 0.7; ranked.
Toggle between modes; default literal (faster). Indicator shows mode.
R4 — Edit + delete
- Edit: inline editor with markdown support; save → version bumped.
- Delete: confirm modal; reason logged (optional textarea); item soft-deleted (recoverable 24h per
identity-data-retention.kmdR5). - Delete all: nuclear option; double confirmation; emits audit event.
R5 — Audit log per item
Each item carries metadata visible in UI:
Added by: AI · 2026-05-13 12:34 · model: claude-opus-4-7 · session: <uuid>
Last edited: user · 2026-05-14 09:15
Full audit trail accessible via "View history" expand.
R6 — Export / import
Export
Generates markdown bundle:
# Koder AI Memory Export
## User memories
### Prefers TypeScript over Python
- Added by AI on 2026-05-13
- ...content...
### Lives in São Paulo
...
## Project memories
...
Download .md file OR open share dialog.
Import
Parse markdown bundle (same format):
- Validate structure.
- Show preview of items to be imported.
- Merge mode (default) vs Replace mode.
- Conflict resolution: keep both / overwrite / skip per item.
R7 — Right-to-erasure (LGPD compliance)
Per policies/identity-data-retention.kmd R5:
DELETE /v1/mecascata em memory.- Soft-delete 24h grace.
- Hard-delete permanently after grace.
- Audit log retained (anonymized) per R6 of retention policy.
R8 — Surface bindings
| Surface | API |
|---|---|
| Flutter | KoderMemoryPanel({onItemEdit, onItemDelete, onExport}) em koder_kit/lib/src/ai/memory_panel.dart |
| Web | <koder-memory-panel> |
| Compose Android | KoderMemoryPanel (futuro) |
| SwiftUI iOS | idem (futuro) |
| CLI / TUI | koder memory list/edit/delete/export/import commands |
R9 — Acessibilidade
- Drawer:
role="dialog" aria-label="AI memory". - Category tabs:
role="tablist". - Memory list:
<ul>semantically. - Edit/delete buttons:
aria-labelper item. - Live region announce save/delete events.
- Keyboard nav full (arrows, Enter, Esc, Tab).
R10 — Auto-curation nudge
When AI proposes a new memory item (via services/ai/ai#111):
┌─────────────────────────────────────────────┐
│ 💭 Remember this? │
│ │
│ "User prefers TypeScript over Python." │
│ Category: User │
│ │
│ [Discard] [Save to memory] │
└─────────────────────────────────────────────┘
Inline toast/banner in chat surface; doesn't open full drawer.
R11 — Multi-tenant
Storage path:
koder://workspaces/<workspace_id>/users/<koder_user_id>/memory/<item_id>.md
Cross-tenant access 404.
Workspace-shared memory (rare; admin-controlled): separate namespace workspaces/<workspace_id>/shared_memory/.
R12 — i18n
| Key | en-US | pt-BR |
|---|---|---|
ai.memory.title | "Memory" | "Memória" |
ai.memory.search | "Search" | "Buscar" |
ai.memory.search.semantic | "Semantic search" | "Busca semântica" |
ai.memory.category.user | "User" | "Usuário" |
ai.memory.category.project | "Project" | "Projeto" |
ai.memory.category.feedback | "Feedback" | "Feedback" |
ai.memory.category.reference | "Reference" | "Referência" |
ai.memory.added_by.ai | "Added by AI" | "Adicionado pela IA" |
ai.memory.added_by.user | "Added by you" | "Adicionado por você" |
ai.memory.action.edit | "Edit" | "Editar" |
ai.memory.action.delete | "Delete" | "Excluir" |
ai.memory.action.export | "Export markdown" | "Exportar markdown" |
ai.memory.action.import | "Import" | "Importar" |
ai.memory.action.delete_all | "Delete all" | "Excluir tudo" |
ai.memory.nudge.title | "Remember this?" | "Lembrar disso?" |
ai.memory.nudge.save | "Save to memory" | "Salvar na memória" |
ai.memory.nudge.discard | "Discard" | "Descartar" |
R13 — Per-preset variation
Cosmetic only.
T-suite
- T1 Mount: render drawer com lists per category populated from backend.
- T2 Add item: tap add (or AI nudge save) → item appears in correct category.
- T3 Edit: tap edit → inline editor; save → content + last edited timestamp updated.
- T4 Delete: tap delete → confirm → soft-deleted (24h grace).
- T5 Search literal: type substring → filters list.
- T6 Search semantic: toggle semantic → query backend; results ranked.
- T7 Export: tap export → .md downloaded with all 4 category sections.
- T8 Import preview: drop .md → preview dialog; merge → items integrated.
- T9 Audit log: item shows "Added by AI/user on date".
- T10 Right-to-erasure: trigger DELETE /v1/me → memory cascade after 24h.
- T11 Auto-curation nudge: AI emits memory candidate → toast appears.
- T12 Multi-tenant: workspace switch → only that workspace's memory loaded.
- T13 A11y: screen reader announces tabs, list, actions.
- N1 Cross-tenant access: workspace B trying to load workspace A item → 404.
Cross-link
- Companion:
conversation-history.kmd(#115 — sibling drawer) - Impl tickets:
services/ai/ai/backlog/pending/{111-gateway-auto-curated-memory-nudges,112-web-semantic-memory-search}.md - Policies:
multi-tenant-by-default.kmd,identity-data-retention.kmd - Backend:
services/ai/memory/ - Refs: Claude memory tool, ChatGPT custom memory, MemoryPlugin patterns
References
meta/docs/stack/specs/ai-ui/conversation-history.kmdmeta/docs/stack/policies/identity-data-retention.kmdmeta/docs/stack/policies/multi-tenant-by-default.kmd