Gjør mindmap til et offisielt trait som kan velges ved opprettelse av samlingsnoder. Frontend-komponenten (27.1) og BlockShell-panelet (27.2) var allerede på plass — dette kobler traiten inn i backend- validering og pakke-definisjoner. Endringer: - Lagt til "mindmap" i VALID_TRAITS (intentions.rs) - Validering av konfig: default_depth 1-3, layout radial/tree - Inkludert mindmap i Podcaststudio- og Wiki-pakker (traits.ts) - Oppdatert trait-katalog i docs/primitiver/traits.md
9.8 KiB
Traits — Evner og funksjonalitet for noder
Status: Vedtatt
Konsept
En trait er en navngitt evne som beriker en samlingsnode med spesifikk funksjonalitet. Traits bestemmer hva en samling kan gjøre — hvilke UI-komponenter som vises i frontend og hvilken backend-oppførsel maskinrommet aktiverer.
Traits er mekanismen som gjør at én og samme node-/edge-arkitektur kan fungere som nettmagasin, podcaststudio, diskusjonsklubb, wiki, eller en kombinasjon av flere.
Designprinsipper
-
Komposisjon, ikke typer. En samling er ikke "et magasin" — den har traits som gjør den til et magasin. Legg til eller fjern traits når som helst uten migrasjon.
-
Traits i metadata, ikke edges. Traits er egenskaper ved samlingen, ikke relasjoner mellom entiteter. Edges er for relasjoner (innhold → samling). Metadata er for konfigurasjon (hva samlingen kan gjøre).
-
Lukket katalog, åpen konfigurasjon. Trait-navn er et kjent sett vi eier koden for. Konfigurasjonen innenfor hver trait er fleksibel JSONB.
-
Uavhengige traits. Hver trait fungerer alene. Verdien oppstår i sammensetningen — og det er brukeren som setter sammen, ikke utvikleren.
-
To effekter per trait. Hver trait aktiverer:
- Frontend: UI-komponenter, visninger, interaksjoner
- Backend: Maskinrommet-oppførsel, validering, jobb-triggering
Metadata-struktur
Traits lever i samlingsnodenes metadata.traits-objekt:
{
"node_kind": "collection",
"title": "Sidelinja Magasin",
"metadata": {
"traits": {
"publishing": {
"slug": "sidelinja",
"custom_domain": "magasin.sidelinja.org",
"theme": "editorial",
"open_graph_defaults": { "image": "cas://sha256-abc123" }
},
"editor": {
"preset": "longform",
"allow_collaborators": true
},
"rss": {
"format": "atom",
"title": "Sidelinja Magasin",
"max_items": 50
},
"comments": {
"moderation": "pre-approve",
"anonymous": false
}
}
}
}
Fravær av en trait betyr at funksjonaliteten er deaktivert. Ingen boolean
enabled-flagg — traiten finnes eller finnes ikke.
Trait-katalog
Innhold & redigering
| Trait | Frontend | Backend |
|---|---|---|
editor |
TipTap med presets (longform, note, chat, code) | Validering av dokumentstruktur |
versioning |
Revisjonshistorikk, diff, rollback-knapp | Snapshot ved signifikante endringer |
collaboration |
Samtidig redigering, markører, inline-kommentarer | OT/CRDT via WebSocket |
translation |
Språkvelger, side-ved-side-visning | AI-oversettelse via jobbkø |
templates |
Mal-velger ved ny node | Mal-noder i samlingen |
Publisering & distribusjon
| Trait | Frontend | Backend |
|---|---|---|
publishing |
Publiseringsknapp, forhåndsvisning, URL-visning, SEO-editor | HTML-rendering til CAS, Caddy-ruting, OG-tags |
rss |
Feed-URL synlig i UI | Feed-generering ved publisering |
newsletter |
Abonnentliste, utsendingsknapp, forhåndsvisning | E-postutsending ved publisering |
custom_domain |
Domene-innstilling i admin | Caddy on-demand TLS, DNS-validering |
analytics |
Besøksstatistikk-dashbord | Logg-parsing, IAB-filtrering |
embed |
Kopier embed-kode-knapp | Generer iframe-snippet med riktige dimensjoner |
api |
API-dokumentasjon, nøkkelhåndtering | Offentlig JSON-endepunkt for samlingens innhold |
Lyd & video
| Trait | Frontend | Backend |
|---|---|---|
podcast |
Episodeliste, lydavspiller, RSS-lenke | RSS med enclosures, metadata-håndtering |
recording |
LiveKit-studio, opptak-kontroller | LiveKit-rom, lydkonsolidering |
transcription |
Transkripsjonsvisning, redigerbar SRT | Whisper-pipeline via jobbkø |
tts |
"Les opp"-knapp, lydversjon av artikler | Tekst-til-tale via jobbkø |
clips |
Klipp-editor, segment-markering | Segmentering, CAS-lagring av klipp |
playlist |
Ordnet avspillingsliste, drag-and-drop rekkefølge | Sekvensiell avspilling |
mixer |
Lydmixer: volumslidere, mute, VU-meter, sound pads, stemme-/EQ-effekter | Pad-konfig i metadata (se docs/features/lydmixer.md) |
studio |
Lydstudio-panel: lydfilliste med metadata, drag-ut, drop-aksept for lyd, lenke til fullverdig editor | Validering av lydformat, FFmpeg-pipeline via jobbkø (se docs/features/lydstudio.md) |
Kommunikasjon
| Trait | Frontend | Backend |
|---|---|---|
chat |
Sanntidsmeldinger, tråder, reaksjoner | WebSocket-synk, TTL-håndtering |
forum |
Trådet diskusjon, sortering (nyeste/populære/ubesvarte) | Tråd-indeksering |
comments |
Kommentarfelt under publisert innhold | Moderasjonskø, evt. anonym input |
guest_input |
Gjeste-lenke-generering, svar-oversikt | Token-generering, CAS-upload, rate limiting |
announcements |
Enveis-feed, kun eiere/admins poster | Skrivetilgangsvalidering |
polls |
Avstemnings-UI, resultatvisning | Stemmetelling, duplikatdeteksjon |
qa |
Spørsmål/svar-format, oppstemming, "godkjent svar" | Sortering, markering |
Organisering
| Trait | Frontend | Backend |
|---|---|---|
kanban |
Board med kolonner, drag-and-drop | Statusoverganger, posisjonsberegning |
calendar |
Kalendervisning (måned/uke/dag) | Scheduling-edges, ICS-eksport |
timeline |
Kronologisk visning | Tidsbasert sortering og filtrering |
table |
Strukturert tabellvisning, filtrerbare kolonner | Metadata-indeksering |
gallery |
Rutenett av bilde-/medianoder | Thumbnail-generering |
bookmarks |
Kuratert lenkesamling med forhåndsvisning | URL-enrichment via maskinrommet |
tags |
Tagging, filtrering, tag-sky | Tag-indeksering |
Kunnskap
| Trait | Frontend | Backend |
|---|---|---|
knowledge_graph |
Visuell graf, auto-tagging | NER, embedding-generering |
mindmap |
Radial/tree-layout av noder rundt rot, pan/zoom, dybde 1-3 hopp | Validering av konfig (dybde, layout) |
wiki |
Slug-baserte sider, kryssreferanser, "finnes ikke ennå"-lenker | Slug-unikhet, backlink-indeks |
glossary |
Begrepsliste, hover-definisjoner i annet innhold | Begrep-matching i tekst |
faq |
Spørsmål/svar-par med søk | Søkeindeksering |
bibliography |
Kildehenvisninger, siteringsformat, referanseliste | Sitats-parsing, DOI-oppslag |
Automatisering & AI
| Trait | Frontend | Backend |
|---|---|---|
auto_tag |
Foreslåtte tags ved ny node, godkjenn/avvis | AI-tagging via jobbkø |
auto_summarize |
AI-sammendrag synlig, redigerbart | Sammendrag-generering ved publisering/møteslutt |
digest |
Periodisk oppsummering i UI | AI-sammendrag av aktivitet på intervall |
bridge |
"Også funnet i..."-forslag | pgvector-embedding, krysskontekst-søk |
moderation |
Moderasjonskø, flagging | AI-assistert innholdsvurdering |
ai_tool |
AI-verktøy-panel med prompt-velger, drag-and-drop tekstbehandling | Modellprofil-mapping, AI Gateway, ai_usage_log (se docs/features/ai_verktoy.md) |
Tilgang & fellesskap
| Trait | Frontend | Backend |
|---|---|---|
membership |
Søknads-/innmeldingsknapp | Søknadskø, godkjenningsflyt |
roles |
Rolletildeling i admin | Egendefinerte roller utover owner/admin/member/reader |
invites |
Invitasjonslenker med kopiering | Token-generering, utløp, maks bruk |
paywall |
Betalingsflyt, tilgangskontroll | Stripe/Vipps-integrasjon |
directory |
Medlemsoversikt med profiler | Profilindeksering |
Ekstern integrasjon
| Trait | Frontend | Backend |
|---|---|---|
webhook |
Webhook-konfigurasjon i admin | HTTP-varsling ved hendelser |
import |
Import-veiviser (WordPress, Markdown, RSS) | Parsing, node-opprettelse, mediaimport |
export |
Eksport-knapp (Markdown, EPUB, PDF) | Format-konvertering, CAS-pakking |
ical_sync |
Kalender-URL, synk-status | Toveis ICS-synk |
Pakker
Pakker er forhåndsdefinerte kombinasjoner av traits med fornuftige defaults. En pakke er ikke en type eller en låst konfigurasjon — den er et startpunkt. Brukeren kan legge til eller fjerne traits etterpå.
| Pakke | Traits |
|---|---|
| Nettmagasin | editor(longform), publishing, rss, comments, analytics, custom_domain, newsletter |
| Podcaststudio | podcast, recording, transcription, mixer, editor(shownotes), rss, analytics, clips, knowledge_graph, mindmap |
| Nyhetsbrev | editor(longform), newsletter, analytics, versioning |
| Wiki | wiki, editor(longform), collaboration, versioning, knowledge_graph, mindmap, glossary |
| Diskusjonsklubb | forum, chat, polls, membership, roles, directory |
| Kursplattform | editor(longform), playlist, qa, membership, paywall, templates |
| Møteplass | recording, mixer, chat, kanban, calendar, auto_summarize, guest_input |
| Fotoblogg | gallery, publishing, comments, custom_domain, rss |
| Prosjektstyring | kanban, calendar, chat, table, tags, roles |
| Åpen forskning | editor(longform), versioning, bibliography, publishing, comments, collaboration, api |
| Community radio | recording, mixer, podcast, chat, polls, membership, clips, playlist |
| Bokmerke-vegg | bookmarks, tags, publishing, rss, comments |
| Redaksjon | chat, kanban, calendar, editor(longform), knowledge_graph, guest_input |
Implementeringsstrategi
Traits implementeres én og én, ikke alle samtidig. Prioritering følger brukerbehovene til Sidelinja som første tenant. En trait krever:
- Spesifikasjon — hva traiten gjør, metadata-skjema, UI-mockup
- Backend — maskinrommet-kode som reagerer på traitens tilstedeværelse
- Frontend — Svelte-komponent(er) som rendres når traiten er aktiv
- Dokumentasjon — oppdater denne filen og evt.
docs/features/
Rekkefølge for første bolk (Sidelinja-behov):
editor → chat → publishing → rss → podcast → recording →
transcription → knowledge_graph → kanban → calendar