openvibers/openvibe.contracts Commits

ADR-010: Chat owns conversation, Live keeps the channel product, Community keeps threads (executed 2026-09-23)

OP OpenVibers committed 23 Sept 2026 · 67bc7e9184 · 2 files, +57 −1


Changes

ddiff --git a/docs/adr/ADR-010-chat-boundary.md b/docs/adr/ADR-010-chat-boundary.md
nnew file mode 100644
iindex 00000000..ea76761f
---- /dev/null
++++ b/docs/adr/ADR-010-chat-boundary.md
@@@ -0,0 +1,55 @@
++# ADR-010: Chat versus Live/Community boundary
++
++**Status:** Accepted and executed 2026-09-23 (cutover 02:03 UTC). Governs Wave 6.
++
++## Context and current evidence
++
++Before the cutover, Live's chat was one of its largest subsystems, all in-process: the `/ws/chat` WebSocket server, DMs, history, TTS, soundboard, moderation, the word filter and the deploy-notice card, plus about 20 tables. It was used every day by the most active streamer. Community already owned pastes and discussion (ADR-011).
++
++## Decision
++
++- **OpenVibe.Chat owns conversation.** That covers:
++ - the chat socket protocol, messages, DMs and DM blocks;
++ - TTS voice overrides and channel sounds;
++ - relay users, the IP-approval queue and first chats;
++ - the chat moderation log.
++
++ These twelve tables are Chat's. Chat stores the Network subject next to Live's legacy ids.
++- **Live keeps the channel product:**
++ - channel moderators and settings, emotes, user tags and chat-AI tables. Chat stages copies and reads the live values; they move when their writers move.
++ - the media-request queue (every writer is Live's queue).
++ - stream presence and discovery.
++- **Community keeps threaded discussion.** Comments on entities, the forum and Pulse stay in Community (ADR-011). Chat is real-time conversation, not threads.
++- **Interfaces:**
++ - Chat reads Live's chat context through `/internal/chat-context/*` (`live.chat_context.read`).
++ - Chat asks Live for effects through `/internal/chat-effects/*` (`live.chat_effects.write`), and Live re-checks every effect it performs for a person.
++ - Chat mirrors its rows back to Live's read copy (`live.chat_mirror.write`).
++ - Live's remaining chat writers forward to Chat (`chat.live_bridge.write`).
++ - All of these are service tokens, and all refuse traffic that came through nginx.
++- **Browsers are unchanged.** nginx routes the chat paths of `openvibe.live` to Chat, so no client change was needed.
++- **Events:** `chat.message.created` (public), `chat.dm.created` (the subject only, never the text) and `chat.moderation.action` (internal).
++
++## Alternatives considered
++
++- Rewriting chat as a new service with a new protocol: rejected, because it would break every open client and the overlays.
++- Moving the channel tables in the same wave: rejected, because their writers (the dashboard and emote uploads) have not moved.
++
++## Migration consequences
++
++- Live's chat tables stay a read mirror, so home stats, recaps, AI context and `/api/mod` keep working. The mirror retires in a later wave.
++- Side effects that used to be in-process now reach Live over HTTP, so they arrive after the broadcast. These are coin replies, AI-viewer reactions, translations, and arena and media replies.
++
++## Rollback
++
++1. Remove the nginx include.
++2. Drain Chat's mirror to Live.
++3. Remove `CHAT_AUTHORITY` and restart Live.
++
++Live's tables are complete through the mirror. The steps are in OpenVibe.Chat's `docs/cutover.md`.
++
++## Acceptance tests
++
++- Read parity was checked at the cutover: 15 of 15 paths identical, and the second import pass held nothing.
++- The chat socket joins through the public URL.
++- A Live restart does not end chat sessions; Chat keeps serving from its cache.
++- A DM event never carries the message text.
ddiff --git a/docs/adr/README.md b/docs/adr/README.md
iindex cfc74169..5dafae43 100644
---- a/docs/adr/README.md
++++ b/docs/adr/README.md
@@@ -13,6 +13,7 @@ Platform-wide decisions from the OpenVibe development roadmap (section 10). Each
| [ADR-007](ADR-007-data-ownership.md) | Logical data ownership and database technology | Accepted 2026-09-22 |
| [ADR-008](ADR-008-shared-packages.md) | Shared package publication and release manifests | Accepted 2026-09-22; implementation in progress (OpenVibe.Shared) |
| [ADR-009](ADR-009-live-openre-boundary.md) | Live versus OpenRe boundary | Accepted 2026-09-23; gates Wave 7 |
++| [ADR-010](ADR-010-chat-boundary.md) | Chat versus Live/Community boundary | Accepted and executed 2026-09-23 (Chat serves Live's chat) |
| [ADR-011](ADR-011-community-pastes.md) | Community paste and comment ownership migration | Accepted and executed 2026-09-22 |
| [ADR-012](ADR-012-economic-classification.md) | Billing vs loyalty, credits and currency classification | Accepted 2026-09-22; gates Waves 8-10 |
| [ADR-013](ADR-013-mod-manifest.md) | Mod manifest, trust and sandbox/resource model | Accepted 2026-09-23; gates Waves 12 and 21C |
@@@ -28,4 +29,4 @@ Platform-wide decisions from the OpenVibe development roadmap (section 10). Each
| [ADR-024](ADR-024-theme-authority.md) | Theme authority between Network and Shared | Accepted 2026-09-23 |
| [ADR-025](ADR-025-marketplace-scope.md) | Marketplace and commerce scope | Accepted 2026-09-23: Trade stays informational |
--ADR-010 (Chat boundary) and ADR-015 (AI workflow and publication ownership) are written with the Wave 6 and Wave 13 extractions.
++ADR-015 (AI workflow and publication ownership) is written with the Wave 13 extraction.