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>
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 meldingreply_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, deretterforum_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:
- Høyreklikk / lang-trykk på en melding
- "Opprett tråd" → sett
forum_threadpå meldingen - Fremtidige svar i tråden får samme
forum_thread - I chatten vises de fortsatt kronologisk
- I forumet vises de som en tråd
Skrive fra forum
Når du skriver i forumet:
- Velg tråd (eksisterende eller ny)
- Skriv innlegg
- Noden opprettes med
forum_threadog evtreply_to - 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_seenoppdateres når brukeren scroller til bunnen av chatten (eller ser nyeste melding) - Forum:
last_seenoppdateres 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_categoryi meldings-metadata (ingen skjemaendring, bare metadata) - Ny ForumTrait-komponent som viser kommunikasjonsnode som forum
- "Bytt visning"-knapp i ChatTrait og ForumTrait
- Registrer
forumi 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_seeni 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.