Grunnleggende arkitekturbeslutninger tatt og dokumentert: - Alt er noder (brukere, team, innhold, mediefiler, samlings-noder) - Edges definerer hva en node er (freeform typer, metadata i JSONB) - Materialisert tilgangsmatrise (node_access) erstatter workspace-RLS - Visibility (hidden/discoverable/readable/open) på noder - Aliaser via usynlige system-edges - Maskinrommet eier all skriving (SpacetimeDB først, PG asynk) - SpacetimeDB holder hele grafen, PG er persistent backup - Node- og edge-skjema spesifisert (docs/primitiver/) Fjernet workspace-konseptet fra hele dokumentasjonen (~40 filer). Fem retninger besluttet, én åpen (rom, ikke forum). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
186 lines
6.3 KiB
Markdown
186 lines
6.3 KiB
Markdown
# Universell input og mottak
|
|
|
|
**Status: Besluttet.**
|
|
|
|
> Én multimodal input-primitiv. Én personlig mottaksflate. Alt som
|
|
> fanges er en node. Hva det "er" bestemmes av edges. Hvordan det
|
|
> presenteres bestemmes av mottakeren.
|
|
|
|
## Input-primitiven
|
|
|
|
Én overflate som fanger alt:
|
|
|
|
- **Tekst** — skriving, Markdown, kodeblokker
|
|
- **Lyd** — voice memo, diktering → automatisk transkribert
|
|
- **Bilde** — foto, skjermbilde, tegning
|
|
- **AI-støtte** — spør AI, få forslag, la den transformere input
|
|
- **URL** — lim inn lenke, den berikes automatisk
|
|
|
|
Brukeren gjør det samme uansett kontekst — skriver, snakker eller
|
|
tegner i input-feltet. Forskjellen mellom "dagbok", "chatmelding"
|
|
og "kanban-kort" er ikke hva brukeren gjør — det er hvilke edges
|
|
som knyttes til resultatet.
|
|
|
|
### Én pipeline
|
|
|
|
All input går gjennom samme tekniske pipeline:
|
|
maskinrommet → SpacetimeDB (instant) → PG (asynk).
|
|
|
|
Konteksten bestemmer routing, ikke en teknisk modus:
|
|
|
|
- Du er i et møte → inputen streames live til andre deltakere
|
|
- Du er alene på bussen → inputen lander som privat node
|
|
- Du er i en podcast-kanal → inputen går inn i produksjonspipeline
|
|
|
|
Samme pipeline. Ulike edges.
|
|
|
|
### Input-metode og innholdstype er ortogonale
|
|
|
|
Du kan snakke inn et kanban-kort. Du kan tegne en kalenderoppføring.
|
|
Input-primitiven bryr seg ikke om hva det *blir* — den fanger det
|
|
som kommer inn. Alt etterpå er edges.
|
|
|
|
### Én overflate å perfeksjonere
|
|
|
|
All UX-investering konsentreres ett sted. Én perfekt input-opplevelse
|
|
— responsiv, multimodal, med god AI-støtte — i stedet for ti
|
|
middelmådige spesialgrensesnitt.
|
|
|
|
## Edges definerer alt
|
|
|
|
Hva en node "er" bestemmes utelukkende av edges:
|
|
|
|
- Node + `belongs_to` → kanal = chatmelding
|
|
- Node + `belongs_to` → board + `status` = kanban-kort
|
|
- Node + `scheduled` → tidspunkt = kalenderoppføring
|
|
- Node uten edges til andre = privat notat
|
|
- Node + `mentions` → topic = faktoid i kunnskapsgrafen
|
|
- Node uten edges = løs tanke, ennå uorganisert
|
|
|
|
**Retyping er trivielt.** Chatmelding → kanban-kort = legg til
|
|
board-edge og status-edge. Ingen datamigrering, bare edges.
|
|
|
|
**Multitype er naturlig.** En node kan være *både* kanban-kort
|
|
*og* kalenderoppføring *og* faktoid. Det er ikke en edge case —
|
|
det er arkitekturen.
|
|
|
|
### Edge-tildeling
|
|
|
|
Når du "bare sier noe" — hvem bestemmer edges?
|
|
|
|
1. **Kontekst gir det meste.** Du er i en samtale → `belongs_to`-
|
|
edge til samtalen. Du er alene → privat. Dekker 80%.
|
|
2. **Eksplisitt handling.** Du drar en node til kanban-brettet.
|
|
Du tagger noe. Du setter en dato.
|
|
3. **AI-foreslått.** Systemet foreslår `mentions`-edge når du
|
|
nevner en person. Foreslår kanban når noe ligner en oppgave.
|
|
|
|
Detaljer for AI-foreslåtte edges avklares ved implementering.
|
|
|
|
## Mottak-primitiven
|
|
|
|
Der input er "én overflate som fanger alt", er mottak "én overflate
|
|
som presenterer alt tilpasset *deg*."
|
|
|
|
### Mottaker bestemmer format
|
|
|
|
All lyd transkriberes. All tekst kan leses opp (TTS). Noden har
|
|
alltid begge representasjoner. Mottaker setter sin preferanse:
|
|
|
|
- Trond snakker inn en tanke → node med lyd + transkripsjon
|
|
- Peter har tekst-preferanse → ser transkripsjonen
|
|
- Vegard har lyd-preferanse → hører originallyd
|
|
|
|
Modalitet er ikke en egenskap ved meldingen, men ved *lesningen*.
|
|
|
|
### Dimensjoner ved mottak
|
|
|
|
**Format.** Lyd, tekst, visuelt — mottaker bestemmer.
|
|
|
|
**Filtrering.** Mottaksflaten filtrerer basert på dine edges:
|
|
kanaler du følger, personer du samarbeider med, topics du er
|
|
interessert i.
|
|
|
|
**Prioritering.** AI-assistert vekting: ubesvarte meldinger,
|
|
oppgaver med frist, noder endret siden sist. Ikke en
|
|
notifikasjonsliste — en vektet visning av det som er relevant.
|
|
|
|
**Tempo.** Sanntid (ting streamer inn) eller asynkront (digest,
|
|
oppsummering).
|
|
|
|
### Mottaksflaten er en visning av grafen
|
|
|
|
"Noder med edge til *meg*, vektet på relevans og tid." Ikke en
|
|
egen mekanisme — en spørring mot grafen med deg som sentrum.
|
|
|
|
## Kommunikasjonsnoden — den tredje primitiven
|
|
|
|
Input fanger. Mottak presenterer. Kommunikasjonsnoden er *stedet*
|
|
der folk møtes — en node som samler deltakere, definerer
|
|
tilgangsregler, og fungerer som kontekst.
|
|
|
|
### Én node, mange former
|
|
|
|
| Variant | Deltakere | Input | Mottak |
|
|
|---------|-----------|-------|--------|
|
|
| Én-til-én | 2 | Begge | Begge |
|
|
| Gruppechat | N | Alle | Alle |
|
|
| Møte | N | Alle | Alle |
|
|
| Allmøte | 1 + N | Leder | Alle lytter |
|
|
| Podcastinnspilling | 2-4 + N | Verter | Alle lytter |
|
|
| Livesending | 1-4 + ∞ | Verter | Streamet |
|
|
| Asynkron gjest | 1 + 1 | Gjest | Redaksjonen |
|
|
|
|
Forskjellen er edge-konfigurasjoner, ikke ulike systemer:
|
|
- `owner`-edge — kontrollerer noden
|
|
- `member`-edge — kan gi input og motta
|
|
- `reader`-edge — kan kun motta
|
|
|
|
### Kontekst arves automatisk
|
|
|
|
Input i en kommunikasjonsnode arver kontekst-edges. Sier du noe
|
|
i et møte → noden får `belongs_to`-edge til møtet automatisk.
|
|
|
|
### Livssyklus
|
|
|
|
- **Live** — deltakere til stede, input streames
|
|
- **Asynkron** — deltakere gir input i eget tempo
|
|
- **Avsluttet** — arkivert, alt som ble sagt er noder med edges
|
|
- **Gjenåpnet** — reaktivert ("vi tar opp tråden fra forrige møte")
|
|
|
|
### Skalering er edge-endring
|
|
|
|
Samtale → møte = flere deltaker-edges.
|
|
Møte → livesending = offentlige mottak-edges.
|
|
Livesending → podcast = publiserings-edges på arkivert innhold.
|
|
|
|
## Tekniske forutsetninger
|
|
|
|
### STT (tale → tekst): løst
|
|
Faster-whisper kjører lokalt, god norsk kvalitet.
|
|
|
|
### TTS (tekst → tale): løsbart
|
|
Start med ElevenLabs bak AI Gateway, bytt til lokal modell når
|
|
kvaliteten holder. Backend-swap bak gatewayen — brukeren merker
|
|
ingenting.
|
|
|
|
## Visninger er spørringer
|
|
|
|
Chat = noder med kanal-edge, sortert på tid.
|
|
Kanban = noder med board-edge, gruppert på status.
|
|
Kalender = noder med dato-edge, på tidslinje.
|
|
Dagbok = private noder, sortert på tid.
|
|
Mottaksflate = noder med edge til deg, vektet.
|
|
|
|
Alle leser fra samme graf. Ingen har "sin egen" data.
|
|
|
|
## Forhold til andre retninger
|
|
|
|
- [Noder er sentrum](bruker_ikke_workspace.md) — visibility,
|
|
tilgangsmatrise, aliaser
|
|
- [Datalaget](datalaget.md) — SpacetimeDB holder hele grafen,
|
|
PG persisterer asynkront
|
|
- [Maskinrommet](maskinrommet.md) — validering, routing, CAS,
|
|
tunge jobber (Whisper, TTS, AI)
|
|
- [Rom, ikke forum](rom_ikke_forum.md) — kommunikasjonsnoden
|
|
er den konkrete realiseringen av "rommet"
|