evOo-local/docs/PRODUCT.md
Claude 4875753d9c
feat(memory): remember appends dated notes instead of replacing memory
The remember tool rewrote the bot's whole MEMORY.md with each call, so every
new fact erased the earlier ones unless the model re-sent the full document.

- MemoryCommitRequest gains mode "append" (the store joins the note onto the
  current content inside the same serializable transaction and still writes a
  revision row) and every commit is capped at 16 KB per document.
- remember appends a dated bullet ("- YYYY-MM-DD: ...", the user's local date)
  by default and rewrites only with mode "replace"; a full document returns an
  error that tells the bot to condense it. Retries of the same tool call stay
  single appends through the existing effect record.
- Scripted runtime memory entries can append too; the scripted "remember"
  script now appends instead of overwriting the bot's memory.
- When memory does not fit the run's 32 KB budget, the prompt keeps a
  document's newest lines instead of its oldest.
- memory.update maps an oversized save to BAD_REQUEST.
- docs/PRODUCT.md records that UserFact is the cross-space user model and the
  space MEMORY.md stays space notes (no migration).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
2026-10-03 13:10:25 +00:00

170 lines
8.3 KiB
Markdown

# evOo — Product rules (Gesamterfahrung)
## Design mantra (apply ruthlessly)
**EINFACHHEIT und Durchgängigkeit. Dennoch super flexibel. Weniger ist Mehr.**
| Rule | Product |
|------|---------|
| **One model** | Unterhaltungen (1:1 / Gruppe), Ordner/Projekte, specialist Oos |
| **One language** | Same stage, sound, and transcript grammar everywhere — no one-off chrome |
| **Hide power** | Depth in specialists and settings — not every control on first screen |
| **Cut clutter** | Fewer, stronger affordances; stub/TODO lists stay in docs, not UI |
When a slice gets feature-heavy: prune to the simplest coherent path that still delivers Stage + sound + calm onboarding.
## Conversations, not agent rows
The product is organized as **Unterhaltungen** (see `VOICE.md`). **Team** lists your Oos; opening one starts a **conversation**, not “the agent app”.
| Type | Who |
|------|-----|
| 1:1 Unterhaltung | One Oo |
| Gruppenunterhaltung | Multiple Oos (+ humans later) — **fun factor essential** (see `docs/GROUP-CONVERSATIONS.md`) |
| Projekte | Group conversations in **Ordner** (`BotSection` folders) |
## Deepest personalization
evOo must adapt to each user **more individually than any other app**. Persona/crew fit is **lifestyle-agnostic** — office worker, club/scene person, hardcore nerd: same mechanism, simplest path to what *they* want.
| Companion tone | When |
|----------------|------|
| **Geek-peer / Fachsimpeln** | User wants depth — match enthusiasm, stay in lane |
| **Quiet-doer** | User wants outcomes — never act like we know better |
Onboarding harvest infers **help & vibe** (`user-help-vibe.ts` → `MEMORY.md`), then spawn/select specialist Oos and Unterhaltungen — **not one personality for everyone**. See `docs/PERSONA-SELECTION.md`.
## Accessibility of ambition
Power-user literacy must **not** be required. Same product, radically different crews/Unterhaltungen — **domain excellence** in each case.
| User | Gets |
|------|------|
| Mom, Thermomix | That — simply, excellently |
| Hard math | Specialist Oo at **very high** level |
| Software development | Specialist Oo at **very high** level |
| Axis | Rule |
|------|------|
| **Skill floor** | Grandma-simple entry — no jargon gate, no setup maze |
| **Skill ceiling** | Expert-grade **per specialty** — depth when wanted |
| **Anti-pattern** | Wunderwuzzi mediocre at everything |
Simple entry, deep ceiling. UI and onboarding copy stay calm and plain; specialist lanes carry the depth.
## Emergent ensemble
**Das Ganze ist mehr als die Summe seiner Teile.**
Power comes from **more individualists and differences** — a crew of distinct specialists with chemistry — not from one mega-agent. Capability **emerges** when diverse Oos meet in Unterhaltungen and Gruppen.
| Pillar | Why |
|--------|-----|
| **No Wunderwuzzi** | Depth per lane beats one mediocre generalist |
| **Specialty ceiling** | Each Oo expert-grade in its domain |
| **Fun friction** | Banter and pushback between personalities — useful spark |
| **Ensemble > solo** | Group stage + handoffs make the *crew* feel stronger than any single Oo |
Chief coordinates; **the crew delivers**. Product, prompts, and stage should never imply one bot could replace the group.
## No Wunderwuzzi
Every Oo has a **clear specialty**. There is no do-everything generalist personality.
- Persona archetypes map to templates (CTO, Fixer, quant, engineer, …).
- Unmatched bots fall back to **`specialist`**, not “companion/helper”.
- **Chief** (first onboarding bot) is seeded as **Chief of Staff** — coordinates the crew, does not replace specialists.
- Group encounters show **active speaker + ensemble**; collaboration is the model — **banter & chemistry**, not corporate-dull committee.
When adding templates or copy: narrow scope, explicit role line, defer out-of-lane work to other Oos.
## First-run emotional north star
The app **sets itself up**. It discovers what it can (profile, tools, crew) and shows the user:
> *Don't stress. We're here now. Trust us — there are many of us. We've got this.*
| Principle | Product |
|-----------|---------|
| **Calm collective crew** | Reassurance copy + discovery progress (`OnboardingDiscoveryShell`), not a long wizard |
| **Honest discovery** | Progress bar + one active step in onboarding — future sources stay in docs, not UI laundry lists |
| **Specialists** | Chief of Staff + crew framing; no Wunderwuzzi |
Surfaces: `Welcome.tsx` (spirit), `Onboarding.tsx` (progress + minimal model/tools steps).
## Onboarding → user profile
During onboarding, harvest **respectful local signals** into the existing **user-scoped `MEMORY.md`** (space memory — not a parallel brain):
| Signal | Source |
|--------|--------|
| Name, email | `rpc.me()` |
| Timezone | `Intl` / `localTimezone()` |
| Locale, UI locale | `navigator.language`, saved UI pref |
| Languages, platform | `navigator` |
| Default model, computer host | bootstrap `Me` |
Implementation:
| Layer | Path |
|-------|------|
| Profile harvest | `apps/web/src/lib/user-profile-harvest.ts` |
| Help & vibe inference | `apps/web/src/lib/user-help-vibe.ts` |
| Persona/crew selection notes | `docs/PERSONA-SELECTION.md` |
| Discovery plan + progress | `apps/web/src/lib/onboarding-discovery.ts` |
| Reassurance UI | `apps/web/src/components/onboarding/OnboardingDiscoveryShell.tsx` |
Called from `Onboarding.tsx` after first bot ensure.
## Oo relationship over time
| Principle | Meaning |
|-----------|---------|
| **Always on** | Presence when needed — 24/7 feeling without theater |
| **Compounding** | Stronger/more attuned the more the user works with their Oos (memory + threads) |
| **Never creepy** | Warm competence; no surveillance vibes |
| **Not yes-men** | Respectful pushback — don't just echo |
Seeded in user `MEMORY.md` (`user-relationship-contract.ts`). Persona copy and prompts follow. Details: `docs/OO-RELATIONSHIP.md`.
## Memory and the user model
| Store | Holds | Written by |
|-------|-------|------------|
| `UserProfile` + `UserFact` (Settings → About you) | The user model: who the user is, across spaces; a fact can be limited to chosen spaces | `update_user_profile`, onboarding, chat consolidation, the user |
| User-scoped `MEMORY.md` (Settings → Memory) | Space notes shared by the bots of one space | The user, onboarding harvest |
| Bot-scoped `MEMORY.md` (bot → Knowledge) | One bot's notes in one space | `remember` appends dated notes; `mode: "replace"` rewrites |
Space notes are not migrated into facts: facts are short, consented statements about the user,
space notes are free-form context for one space. A memory document holds at most 16 KB, so a
bot's notes and the space notes both reach the prompt; when it is full, `remember` asks the bot
to condense it.
## Capability vision — ambient & video (future roadmap)
**This PR does not build surveillance.** Current Gesamterfahrung stays **Stage + sound + calm onboarding** (`VOICE.md`). The following is Ingo's long-term direction — optional layers only.
| Capability | Rule |
|------------|------|
| **Video calls** | Optional — user-initiated; audio-only remains the simpler default |
| **Ambient help** | Oo handles practical presence in the background; user need not sit in front of the app |
| **"It's just an Oo"** | Presence without performative attention-seeking — compounding via use, not constant face time |
| **Home metaphors (far future)** | Could replace alarm system or surveillance camera **only** with strict opt-in — never creepy, never default-on |
### Consent & anti-creep gates
- No always-on camera/mic without **explicit, revocable consent UX**
- Any sensing feature must pass *earned or creepy?* (`docs/OO-RELATIONSHIP.md`)
- Specialist lanes for home/security — not one mega-agent watching everything
- Respectful pushback when a setup would be over-broad or unsafe
Details and encounter grammar: `VOICE.md` § Ambient & video presence.
### TODO (future passes)
- Merge focus choice from `onboarding.chooseFocus` into help/vibe (`mergeHelpVibeHints` — mapping exists, wire on answer)
- Merge connector authorizations into profile
- Wire **projects-on-disk** / **habits-routines** / **pain-points** discovery sources (currently shown as planned stubs)
- Suggested Unterhaltungen + specialist Oos + project folders from discovery results
- Optional explicit name confirmation step in onboarding UI