Nytt CLI-verktøy for å hente og vise en node med alle tilkoblede edges. Støtter rekursiv graf-traversering (--depth) og to output-formater (markdown og JSON). Brukes av Claude og maskinrommet for å inspisere graf-tilstand. Features: - Hent node med alle edges (inn og ut) - Berik edges med peer-tittel og node_kind for lesbarhet - --depth 0: bare noden, --depth 1: + edges (default), --depth 2+: traverser - --format md (default) eller json - Kompakt metadata-visning, forkortet innhold Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.2 KiB
Edges — spesifikasjon
Status: Besluttet.
Edges er relasjoner mellom noder. De er retningsbestemte, typede med freeform strenger, og kan bære metadata. Hva en node "er" bestemmes av dens edges, ikke av noden selv.
Skjema
CREATE TABLE edges (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
source_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
target_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
edge_type TEXT NOT NULL,
metadata JSONB NOT NULL DEFAULT '{}',
system BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
created_by UUID REFERENCES nodes(id),
UNIQUE (source_id, target_id, edge_type)
);
CREATE INDEX idx_edges_source ON edges (source_id);
CREATE INDEX idx_edges_target ON edges (target_id);
CREATE INDEX idx_edges_type ON edges (edge_type);
Retning
Edges er retningsbestemte: source_id → target_id. "Vegard eier
Sidelinja" er en annen edge enn "Sidelinja eier Vegard" (som ikke
gir mening). Retningen leses naturlig:
Vegard ──owner──→ Sidelinja (Vegard eier Sidelinja)
Referat ──belongs_to──→ Møte (referatet tilhører møtet)
Episode ──mentions──→ Jonas Gahr Støre (episoden nevner ham)
Symmetriske relasjoner (f.eks. vennskap) modelleres som to edges eller som en edge-type maskinrommet vet er symmetrisk.
Edge-typer
Freeform strenger med konvensjoner — ikke en hard enum. Nye relasjonstyper krever ingen migrering. Systemkritiske typer valideres i maskinrommet.
Kjente edge-typer
| Type | Betydning | Metadata |
|---|---|---|
owner |
Eier noden | — |
admin |
Administrerer noden | — |
member_of |
Er medlem av | — |
reader |
Kan kun lese | — |
belongs_to |
Tilhører (innhold → samling) | { "slot": "hero"/"featured"/null, "slot_order": 1, "pinned": true, "publish_at": "..." } |
alias |
Identitet (systemedge) | system: true |
mentions |
Refererer til | — |
reply_to |
Svar på | — |
scheduled |
Tidsplanlagt | { "at": "2026-03-20T14:00Z" } |
status |
Tilstand | { "value": "done" } |
tagged |
Merket med | { "tag": "urgent" } |
host_of |
Vert i | — |
has_media |
Har mediefil (innhold → CAS-node) | — |
intended_for |
Ment for publisering i (arbeidsfase) | — |
submitted_to |
Innsendt til redaksjonell vurdering | { "status": "pending", "submitted_at": "ISO8601" } |
title |
Publisert overskrift (presentasjonsnode → innhold) | { "variant": "editorial" } |
subtitle |
Undertittel | { "variant": "editorial" } |
summary |
Ingress / forhåndsvisning | { "variant": "ai" } |
og_image |
Forsidebilde / OpenGraph-bilde (media → innhold) | { "variant": "editorial" } |
show_notes |
Show notes for episode | { "variant": "ai" } |
chapter |
Kapittelmarkør for episode | { "at": "00:05:23" } |
source_material |
Kildemateriale (avledet node → kilde) | { "context": "quoted", "excerpt": "..." } |
assigned_to |
Tildelt (work_item → person/agent) | — |
derived_from |
Prosessert versjon av (f.eks. lydstudio-output → original) | — |
has_studio |
Studio-sesjon (sesjon → medienode) | — |
Listen vokser organisk. Nye typer legges til ved behov uten skjemaendring.
Metadata
JSONB-feltet bærer kontekstspesifikk data om relasjonen:
status-edge:{ "value": "in_progress" }scheduled-edge:{ "at": "2026-03-20T14:00Z" }tagged-edge:{ "tag": "urgent", "color": "#ff0000" }submitted_to-edge:{ "status": "pending", "submitted_at": "2026-03-17T10:00:00Z" }Status-verdier:pending,in_review,revision_requested,rejected,approved. Ved tilbakemelding:feedback,feedback_by,feedback_at.source_material-edge:{ "context": "quoted", "excerpt": "Den aktuelle teksten..." }Context-verdier:quoted(sitert verbatim),summarized(oppsummert/omskrevet),referenced(referert uten sitat). Begge felt er påkrevd og valideres i maskinrommet.
Metadata er fleksibelt og spørrbart uten migrering.
Systemedges
Edges med system: true er usynlige ved traversering. De
eksisterer for systemet, ikke for brukere.
Kjente systemedges:
alias— identitetskobling, aldri eksponert
Unique-constraint
UNIQUE (source_id, target_id, edge_type) betyr: én edge av
hver type mellom to noder. Vegard kan ha owner-edge og
member_of-edge til Sidelinja, men ikke to owner-edges.
Hva edges gjør med noder
Edges definerer hva en node "er" — ikke noden selv:
Node + member_of → kanal = chatmelding
Node + belongs_to → board
+ status → "todo" = kanban-kort
Node + scheduled → tidspunkt = kalenderoppføring
Node + belongs_to → kun bruker = privat notat
Node + mentions → topic = faktoid i kunnskapsgrafen
Node uten edges = løs tanke
Retyping er å endre edges. Ingen datamigrasjon.
Tilgangsmatrise-oppdatering
Når en edge med tilgangsrolle (owner, admin, member_of,
reader) opprettes eller slettes, oppdaterer maskinrommet
node_access-matrisen i samme transaksjon. Se
noder er sentrum
for full spesifikasjon.