AI memory drawer

mandatory

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 righttoerasure.

Princípios

  1. *ot a black box*— user vê cada memory item editable + deletable.
  2. *I attribution per item*— distinguir "added by AI" vs "added by user".
  3. * semantic categories*— espelha Claude Code memory system (userprojectfeedback/reference).
  4. *ighttoerasure cascade*— delete user → cascata em memory; per identity-data-retention.kmd R5.
  5. *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.

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 softdeleted (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: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 — Righttoerasure (LGPD compliance)

Per policies/identity-data-retention.kmd R5:

  • DELETE /v1/me cascata 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-label per 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.

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*Righttoerasure: 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.
  • 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

Source: ../home/koder/dev/koder/meta/docs/stack/specs/ai-ui/memory-drawer.kmd