# 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` |