evOo-local/docs/GROUP-CONVERSATIONS.md
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

59 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Gruppenunterhaltungen — fun factor & chemistry
**Das Ganze ist mehr als die Summe seiner Teile.** The product must make the **ensemble** feel stronger than any single Oo — emergent capability from distinct specialists, not a mega-agent wearing many hats.
When strong Oo personalities meet, it should get **funny** sometimes. **Fun factor is essential.** Group chats must spark — character friction, banter, chemistry — not a sterile multi-bot committee.
## Product bar
| Do | Don't |
|----|-------|
| Playful disagreement when useful | Corporate-dull consensus voice |
| Distinct personas riffing in-lane | Same tone from every bot |
| Useful outcomes after the spark | Chaos for its own sake |
| Grandma-simple entry (see PERSONA-SELECTION) | Jargon gate or “meeting mode” UI |
**Useful + lively.** Banter serves the user; it is not performative noise.
## Persona prompts & group dynamics
Group roster context (`renderGroupMembersContext` in `packages/core/src/bot-messages.ts`) tells each Oo:
- Strong personalities may **disagree playfully** — humor and chemistry welcome when it helps.
- Never **sterile committee** tone; never condescending Wunderwuzzi.
- One bot owns each stage; handoffs are baton passes, not ping-pong reports.
When writing specialist instructions: allow **geek-peer depth** and **respectful pushback** between specialists; defer out-of-lane work, don’t flatten voice.
## Stage & ensemble (`OoGroupStage`)
| Signal | Stage |
|--------|-------|
| **Active speaker** | Full hero — who has the floor |
| **Peer reply / riff** | `extractGroupSpark` → **Riffing** phase label + spark subtitle (same stage grammar as 1:1) |
| **Multi-working** | Higher bloom energy; subtitle names count on the floor |
| **Handoff** | Awareness strip + handoff sound — baton pass, not boardroom |
Ensemble row: **working pulse only** — no extra chrome (mantra: weniger ist mehr). Chemistry lives in copy + sound, not one-off UI.
## Sound & motion
| Cue | When |
|-----|------|
| `group-spark` | Peer Oo reply in group thread — lighter, playful staccato |
| `handoff` | Stage ownership transfer |
| `work-complete` | Run settles — calm exhale |
Respects `prefers-reduced-motion: reduce`. Lively ≠ loud; energy caps stay procedural.
## Implementation map
| Layer | Path |
|-------|------|
| Spark detection | `apps/web/src/lib/group-stage.ts` — `extractGroupSpark`, `resolveRiffingBotId` |
| Group narration | `apps/web/src/lib/bot-persona.ts` — `narrateGroupSpark` |
| Stage UI | `apps/web/src/components/stage/OoStage.tsx` — `OoGroupStage`, `StageEnsemble` |
| Sound | `apps/web/src/lib/oo-sound.ts` — `group-spark` |
| Shell wiring | `apps/web/src/pages/Shell.tsx` — play spark on `bot_message_received` in groups |
| Bot prompts | `packages/core/src/bot-messages.ts` |