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>
This commit is contained in:
vegard 2026-03-19 16:45:38 +00:00
parent b3a55af660
commit 1a63ad4e7e

View file

@ -0,0 +1,256 @@
# 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:
```json
{
"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:
```sql
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:
```json
{
"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:
```json
{ "pinned": true }
```
Synlig som 📌 i forum-visningen. Usynlig i chat (eller
subtil markør).
### Lukking
Tråder kan lukkes (ingen nye svar):
```json
{ "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.