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
8.3 KiB
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.chooseFocusinto 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