synops/docs/proposals/chat_forum_dualitet.md
vegard 1a63ad4e7e Proposal: Chat/forum-dualitet + lest/ulest
Samme kommunikasjonsnode vises som chat (kronologisk) eller forum
(trådet). Bytt fritt mellom visninger. Lest/ulest er én last_seen
timestamp per bruker per samtale — transitiv mellom alle visninger.
Forum-egenskaper (tråd, kategori, pinning) er metadata på noder.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:45:38 +00:00

7.1 KiB

Proposal: Chat/forum-dualitet + lest/ulest

Konsept

En kommunikasjonsnode kan vises som chat (kronologisk) eller forum (trådet). Samme data, to visninger. Brukeren bytter fritt mellom dem. Lest/ulest er én status per bruker per samtale — transitiv mellom alle visninger.

Problemstilling

Chatter er gode for rask diskusjon, dårlige for å finne igjen beslutninger. Forum er bra for struktur, dårlige for spontanitet. I praksis trenger en redaksjon begge — og de snakker om de samme tingene. To separate systemer betyr duplisering og informasjonstap.

Datamodell

Meldinger er noder med belongs_to-edge til kommunikasjonsnoden. Forum-egenskaper er metadata på meldingsnoden:

{
  "node_kind": "content",
  "metadata": {
    "forum_thread": "Episodetema S02E05",
    "reply_to": "melding-uuid-her",
    "forum_category": "Planlegging"
  }
}
  • forum_thread: tildeles når meldingen opprettes i forum-visning, eller når noen i chat-visningen "tråder" en melding
  • reply_to: svar på en spesifikk melding (trådstruktur)
  • forum_category: valgfri gruppering i forumet

Meldinger uten forum_thread vises i forumet under "Generelt" eller "Utrådede".

To visninger, én datakilde

Chat-visning

┌─ Redaksjonen (chat) ──────────────┐
│                                    │
│ Vegard 10:03                       │
│   Vi bør ta klimatilpasning        │
│                                    │
│ Trond 10:15                        │
│   Fant en god kilde om flom        │
│                                    │
│ Arne 10:22                         │
│   Enig, passer med forrige ep      │
│                                    │
│ Vegard 10:30                       │
│   Teknisk: mic-nivåene var lave    │
│                                    │
│ [skriv melding...]                 │
│                     [Bytt til 📋] │
└────────────────────────────────────┘
  • Alle meldinger kronologisk
  • Ingen gruppering — strøm
  • Forum-metadata (tråd, kategori) er usynlig som default
  • Valgfritt: vis tråd-markør som subtil tag på meldinger som tilhører en tråd

Forum-visning

┌─ Redaksjonen (forum) ─────────────┐
│                                    │
│ Planlegging                        │
│   📌 Episodetema S02E05    (3) ●  │
│       Vegard: Vi bør ta klima...   │
│       └ Trond: Fant en god kild... │
│       └ Arne: Enig, passer med...  │
│                                    │
│ Teknisk                            │
│   Mic-nivåer               (1)    │
│       Vegard: mic-nivåene var...   │
│                                    │
│ [ny tråd...]                       │
│                     [Bytt til 💬] │
└────────────────────────────────────┘
  • Gruppert etter forum_category, deretter forum_thread
  • Trådstruktur via reply_to
  • Uleste tråder markert med ● (se lest/ulest under)
  • Innleggsteller per tråd

Bytte mellom visninger

En knapp i panelet: "Bytt til 📋" / "Bytt til 💬"

Byttet er øyeblikkelig — ingen data lastes på nytt, bare renderingen endres. Samme WebSocket-abonnement, samme noder.

Kan også være to separate paneler i arbeidsflaten som viser samme kommunikasjonsnode — ett som chat, ett som forum.

Tråding fra chat

I chat-visningen kan brukeren tråde en melding:

  1. Høyreklikk / lang-trykk på en melding
  2. "Opprett tråd" → sett forum_thread på meldingen
  3. Fremtidige svar i tråden får samme forum_thread
  4. I chatten vises de fortsatt kronologisk
  5. I forumet vises de som en tråd

Skrive fra forum

Når du skriver i forumet:

  1. Velg tråd (eksisterende eller ny)
  2. Skriv innlegg
  3. Noden opprettes med forum_thread og evt reply_to
  4. Dukker opp i chatten kronologisk (med subtil trådmarkør)

Lest/ulest

Modell

Én verdi per bruker per kommunikasjonsnode: last_seen timestamp.

Vegard --[member_of {
  role: "owner",
  last_seen: "2026-03-19T08:30:00Z"
}]--> Redaksjonen

Alle meldinger med created_at > last_seen er uleste.

Oppdatering

  • Chat: last_seen oppdateres når brukeren scroller til bunnen av chatten (eller ser nyeste melding)
  • Forum: last_seen oppdateres når brukeren åpner en tråd med uleste meldinger
  • Mine ting: viser ulest-badge basert på last_seen

Begge visninger skriver til samme last_seen. Lest i chat = lest i forum. Ingen doble varsler.

Ulest-indikatorer

Chat:

  • Uleste meldinger under en separator-linje: "3 nye meldinger"
  • Bold / blå prikk på samtalen i Mine ting
  • Badge-teller i kontekst-velger

Forum:

  • Uleste tråder markert med ● (prikk)
  • Ulest-teller per tråd: "(3)" der noen er uleste
  • Bold tråd-tittel for uleste tråder
  • Ulest-teller per kategori

Mine ting:

  • Badge-teller per samtale
  • Kan gruppere uleste øverst

Transitiv

Lest/ulest er knyttet til noden (meldingen), ikke visningen. Har du sett noden — uansett gjennom chat, forum, søk, eller Mine ting — er den lest.

Effektivitet

Ikke én edge per melding per bruker. Bare ett timestamp i edge-metadata. Sjekken er enkel:

SELECT count(*) FROM nodes n
JOIN edges e ON e.target_id = $communication_id
  AND e.source_id = n.id
  AND e.edge_type = 'belongs_to'
WHERE n.created_at > $last_seen

Forum-egenskaper

Kategorier

Valgfri gruppering. Lagres i kommunikasjonsnodens metadata:

{
  "forum_categories": ["Planlegging", "Teknisk", "Generelt"]
}

Eier/admin kan opprette og rekkefølge-sortere kategorier. Meldinger uten kategori havner i "Generelt".

Pinning

Meldinger kan pinnes til toppen av en tråd eller kategori:

{ "pinned": true }

Synlig som 📌 i forum-visningen. Usynlig i chat (eller subtil markør).

Lukking

Tråder kan lukkes (ingen nye svar):

{ "forum_thread_closed": true }

Synlig i forum. I chat kan du fortsatt se meldingene men ikke svare i tråden.

Implementering

Fase 1: Grunnleggende dualitet

  • Legg til forum_thread, reply_to, forum_category i meldings-metadata (ingen skjemaendring, bare metadata)
  • Ny ForumTrait-komponent som viser kommunikasjonsnode som forum
  • "Bytt visning"-knapp i ChatTrait og ForumTrait
  • Registrer forum i TRAIT_PANEL_INFO

Fase 2: Tråding fra chat

  • Høyreklikk-meny på meldinger i chat: "Opprett tråd"
  • Chat viser subtil trådmarkør på trådede meldinger

Fase 3: Lest/ulest

  • last_seen i member_of edge-metadata
  • Oppdateres ved scroll (chat) og åpning (forum)
  • Ulest-indikatorer i chat, forum og Mine ting

Fase 4: Forum-egenskaper

  • Kategorier, pinning, lukking
  • Kategori-admin i innstillinger

Hva som eksisterer allerede

  • Kommunikasjonsnoder med meldinger (✓)
  • ChatTrait med WebSocket-abonnement (✓)
  • member_of-edges med metadata (✓)
  • BlockShell-paneler og trait-system (✓)
  • Drag-and-drop (✓)

Hovedsakelig ny ForumTrait-komponent + metadata-konvensjoner. Ingen ny infrastruktur.