AI memory drawer
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.
Spec — AI memory drawer
Backend:
services/ai/memory/. Patterns referenced: Claude memory tool (Anthropic), ChatGPT custom memory (OpenAI). Companion impl tickets em servicesaiai: #111 (auto-curated memory nudges) +112 (semantic memory search). Compliance: LGPD art. 18 right
toerasure.
Princípios
- *ot a black box*— user vê cada memory item editable + deletable.
- *I attribution per item*— distinguir "added by AI" vs "added by user".
- * semantic categories*— espelha Claude Code memory system (userprojectfeedback/reference).
- *ight
toerasure cascade*— delete user → cascata em memory; peridentity-data-retention.kmdR5. - *arkdown 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 |
|---|---|
| *ser* | About the user — role, preferences, knowledge, goals |
| *roject* | Project state — ongoing work, decisions, deadlines |
| *eedback* | Behavioral guidance — corrections, preferences for AI |
| *eference* | Pointers to external systems / docs |
AI classifies on add; user can re-classify.
R3 — Search
Two modes:
- *iteral* substring search on item content.
- *emantic*(via
services/ai/ai#112): embedding similarity; threshold default 0.7; ranked.
Toggle between modes; default literal (faster). Indicator shows mode.
R4 — Edit + delete
- *dit* inline editor with markdown support; save → version bumped.
- *elete* confirm modal; reason logged (optional textarea); item soft
deleted (recoverable 24h per `identitydata-retention.kmd` R5). - *elete 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:15Full 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 — Righttoerasure (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>.mdCross-tenant access 404.
Workspaceshared memory (rare; admincontrolled): 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
- *1*Mount: render drawer com lists per category populated from backend.
- *2*Add item: tap add (or AI nudge save) → item appears in correct category.
- *3*Edit: tap edit → inline editor; save → content + last edited timestamp updated.
- *4*Delete: tap delete → confirm → soft-deleted (24h grace).
- *5*Search literal: type substring → filters list.
- *6*Search semantic: toggle semantic → query backend; results ranked.
- *7*Export: tap export → .md downloaded with all 4 category sections.
- *8*Import preview: drop .md → preview dialog; merge → items integrated.
- *9*Audit log: item shows "Added by AI/user on date".
- *10*Right
toerasure: trigger DELETE v1me → memory cascade after 24h. - *11*Auto-curation nudge: AI emits memory candidate → toast appears.
- *12*Multi-tenant: workspace switch → only that workspace's memory loaded.
- *13*A11y: screen reader announces tabs, list, actions.
- *1*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