# Feature: Nodereferanser (`n:`-konvensjonen) ## Konsept Enhver node i Synops kan refereres fra enhver annen node via `n:`-syntaksen. Det er systemets interne lenkeformat β€” som URL-er for webben, men for grafen. Referanser oppretter `mentions`-edges og er traverserbare for bot og brukere med tilgang. ## Syntaks ``` n:d3eebc99 β†’ UUID-prefix (8 tegn, unikt nok) n:synops-transcribe β†’ slug/title-match #Skolepolitikk β†’ eksisterende mention (topic-noder) ``` `n:` er den universelle varianten. `#` forblir en snarvei for topics. Begge oppretter `mentions`-edges. ## To veier inn ### 1. Kopier-lim (πŸ”—-knappen) Hver node har en lenke-knapp (πŸ”—) i header/hover β€” universelt, overalt (kanban-kort, chat, kalender, work items, dagbok, alt). ``` Klikk πŸ”— β†’ clipboard: "n:d3eebc99" β†’ Lim inn i chat/editor/anywhere β†’ Systemet gjenkjenner, oppretter mentions-edge ``` ### 2. Autocomplete ``` Skriv "n:" i editor/chat β†’ Dropdown med nylige/relevante noder β†’ SΓΈkbart (som #-mentions, bare for alle noder) β†’ Velg β†’ settes inn som n:d3eebc99 ``` ## Rendering ``` Raw: "Se n:d3eebc99 for detaljer" Rendered: "Se [Forbedre lydkvalitet] for detaljer" ↑ klikkbar, hover viser node-kort ``` Hvis brukeren ikke har tilgang til noden: ``` Rendered: "Se [Privat node πŸ”’] for detaljer" ``` ## Edge-opprettelse Ved parsing av `n:` i content: - SlΓ₯ opp noden i PG - Opprett `mentions`-edge fra denne noden β†’ referert node - Edge er ikke `system` β€” synlig i grafvisning ## Tilgangskontroll ved linking NΓ₯r en bruker limer inn en referanse til en privat node i en delt kontekst, mΓ₯ systemet hΓ₯ndtere tilgangsgapet. ### Prompt ved privat node i delt kontekst ``` A limer inn n:d3eebc99 (sin private dagboknotis) i en samtale β†’ Systemet sjekker: synlig for alle i konteksten? β†’ Nei β€” noden er privat β†’ A ser prompt: β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Denne noden er privat. β”‚ β”‚ β”‚ β”‚ [Del som lesbar] β”‚ β”‚ β†’ Deltakerne fΓ₯r lesetilgang β”‚ β”‚ β”‚ β”‚ [Behold privat] β”‚ β”‚ β†’ Andre ser "Privat node πŸ”’" β”‚ β”‚ β”‚ β”‚ [Del utdrag] β”‚ β”‚ β†’ Velg tekst som siteres inline β”‚ β”‚ β†’ Originalen forblir privat β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Tre valg | Valg | Hva skjer | Edge | |------|-----------|------| | **Del som lesbar** | Deltakerne fΓ₯r `reader`-edge til noden | `reader` per deltaker | | **Behold privat** | Lenken vises, andre ser "Privat node πŸ”’" | Ingen ny edge | | **Del utdrag** | Sitat inline, originalen privat | `source_material` med excerpt | "Del utdrag" er universell overfΓΈring β€” innhold dras *ut* av en privat node som et sitat, ikke som originalen. ### Trekk tilbake Deling kan alltid angres: fjern `reader`-edges, noden gΓ₯r tilbake til privat. Lenker i andres kontekst viser igjen "Privat node πŸ”’". ## Privacy-signalering Private noder markeres visuelt. Delte noder er *rene* β€” fravΓ¦r av markering betyr "dette er ikke privat." ### Visuell konvensjon | Tilstand | Signal | Betydning | |----------|--------|-----------| | **Privat** (ingen delte edges) | πŸ”’ + subtil bakgrunnsfarge | "Bare du ser dette" | | **Delt** (har reader/member-edges) | Ren, ingen markering | Normal tilstand | | **Delt + lenket** (aktivt referert fra annen kontekst) | πŸ‘ + "Delt med: ..." | "Andre ser dette via en lenke" | ### Eksempel i dagbok ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ”’ Tanker om episoden i dag β”‚ ← privat β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Notater fra mΓΈtet med Trond β”‚ ← delt β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ”’ Personlig refleksjon β”‚ ← privat β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ πŸ‘ Lydkvalitet-problemet β”‚ ← delt + lenket β”‚ "Delt med: #Redaksjonen" β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Designprinsipp De fleste systemer markerer det *delte* ("denne er offentlig!"). Synops markerer det *private* β€” slik at fravΓ¦r av markering er den normale, trygge tilstanden. Du ser umiddelbart hva som er bare ditt, og du glemmer ikke at noe er delt. ### Teknisk Ingen ny datamodell. Ren frontend-logikk basert pΓ₯ eksisterende data: - `visibility: hidden` + ingen delte edges β†’ πŸ”’ - Har `reader`/`member_of`-edges fra andre β†’ ren - Har edges + er `source_material`-target fra annen node β†’ πŸ‘ ## Bot-oppfΓΈrsel Boten fΓΈlger samme tilgangsregler: - Kan bare se noder den har tilgang til - Kan traversere `mentions`-edges fra `n:`-referanser - Hvis noen linker en node boten ikke kan se: "Jeg har ikke tilgang til den noden" ## Bygger pΓ₯ - `docs/primitiver/edges.md` β€” `mentions`-edge - `docs/retninger/bruker_ikke_workspace.md` β€” visibility + tilgangsmatrise - `docs/features/universell_overfoering.md` β€” "del utdrag" er innholdstransfer - `docs/proposals/editor.md` β€” `#`-mentions og autocomplete