Pular para o conteúdo

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.

Quando esta spec se aplica

Triggers primários

Todos os triggers

Corpo da especificação

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

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

CategoryDefinition
userAbout the user — role, preferences, knowledge, goals
projectProject state — ongoing work, decisions, deadlines
feedbackBehavioral guidance — corrections, preferences for AI
referencePointers to external systems / docs

AI classifies on add; user can re-classify.

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.kmd R5).
  • 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/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

SurfaceAPI
FlutterKoderMemoryPanel({onItemEdit, onItemDelete, onExport}) em koder_kit/lib/src/ai/memory_panel.dart
Web<koder-memory-panel>
Compose AndroidKoderMemoryPanel (futuro)
SwiftUI iOSidem (futuro)
CLI / TUIkoder 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.

Workspace-shared memory (rare; admin-controlled): separate namespace workspaces/<workspace_id>/shared_memory/.

R12 — i18n

Keyen-USpt-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.
  • 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

Referências