benchmark-models.sh: sekvensielt 3×3×2 matrise (model × effort × fil)
Foreløpig rapport med Haiku/Sonnet/Opus medium-effort resultater.
Full matrise kjøres kl 04 når serveren er rolig.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Systematisk gjennomgang av PG-skjema, auth-middleware, intensjoner,
skrivestien og WebSocket-laget. Alle kjernetabeller matcher docs.
Auth fungerer korrekt (401 for ugyldig/manglende token). Skrivestien
er konsistent: direkte PG-skriving → NOTIFY → WebSocket.
Fikser:
- Fjern død kode: pg_writes enqueue-funksjoner (aldri kalt etter STDB-migrering)
- Fjern ubrukt truncate() i tts.rs
- Legg til #[allow(dead_code)] for sqlx-structs med ubrukte felt
- Rett feilaktig doc-påstand i api_grensesnitt.md om jobbkø
- Fjern utdatert STDB-referanse i agent_api.md
- Kompilerer uten warnings
Se logs/validering-23.1.md for fullstendig rapport.
Validering krever grundig gjennomgang — bruker Opus i stedet
for default-modell. Case-basert modellvalg klar for utvidelse
til andre faser.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SpacetimeDB ble fjernet i 22.4. Denne oppryddingen:
- Arkiverer spacetimedb_integrasjon.md og adapter_moenster.md til docs/erfaringer/arkiv/
- Fjerner SpacetimeDB reverse proxy-blokk fra Caddyfile
- Fjerner SpacetimeDB-loven fra Claude feedback-memories (ikke lenger relevant)
- Oppdaterer docs-referanser i CLAUDE.md, erfaringer/README.md,
selvdokumenterende_system.md og tasks.md
- Markerer fase 22 som fullført i avhengighetsgrafen
Ny retning som formaliserer Synops sin interaksjonsfilosofi:
- Inn=transformer, ut=skap nytt (to retninger)
- Body=engang, header=vedvarende (to mål)
- Konsistent overalt: AI, orkestrering, tema, lyd, kalender
- Visuell feedback med to drop-soner (grønn=engang, blå=vedvarende)
- Fire prinsipper: reversibilitet, konsistens, synlighet, gradvis dybde
Også: observes-edge i orkestrering og edges.md for eksplisitt
kobling mellom orkestrering og observerte noder.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
synops-clip returnerer paywall: true ved avkuttet innhold.
@bot varsler brukeren og ber om manuell innliming.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4 oppgaver: Readability-parser CLI, node-opprettelse med
AI-beriking, @bot-integrasjon (URL i chat → oppsummering),
og orkestrering-støtte.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Brukeren begrenses ikke til kjente verktøy. Boten prøver,
og manglende funksjonalitet fanges opp som work_items med
source_material-edge tilbake til orkestreringen. Systemet
lærer hva brukerne vil ha fra det som ikke lykkes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
8 oppgaver: node-type, trigger-evaluering, bot-utførelse,
auto-eskalering (Flash→Sonnet→Opus), UI, kaskade, kompilering
av velprøvde mønstre, og seed av standard-orkestreringer.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nytt konseptdokument for orchestration-noder (⚡):
- Fritekst-instruksjoner som boten tolker og utfører
- Strukturerte triggere (portvokteren evaluerer uten LLM)
- Naturlig progresjon: fritekst → observér → kompilér → DSL
- Kompilerte pipelines med bot-fallback ved feil
- Kaskade mellom orkestreringer via triggers-edges
- Visuell editor med tekstbokser per steg og test-kjøring
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SpacetimeDB var brukt som «instant feedback»-lag mellom portvokteren
og frontend. Nå som PG NOTIFY-triggere og WebSocket er på plass
(oppgave 22.1–22.2), er STDB-skrivestien overflødig.
Endringer:
- intentions.rs: Alle CRUD-operasjoner (create/update/delete node/edge)
skriver nå synkront til PG i stedet for STDB-først + async PG-jobbkø.
PG NOTIFY-triggere gir umiddelbar sanntidsoppdatering til klienter.
Tilgangsgivende edges (owner/admin/member_of/reader) bruker transaksjon
med recompute_access direkte i handleren.
- maintenance.rs: Fjernet StdbClient fra alle funksjoner. Varsler
opprettes/oppdateres/slettes direkte i PG.
- agent.rs, audio.rs, tts.rs, ai_process.rs: Fjernet STDB-synk etter
CLI-verktøy-kjøring. PG NOTIFY dekker sanntidsvisning.
- pg_writes.rs: Fjernet sync_node_access_to_stdb. access_changed
NOTIFY-trigger håndterer dette.
- workspace.rs: Synkrone PG-skrivinger med recompute_access.
- summarize.rs, ai_edges.rs: Fjernet StdbClient fra signaturer.
- jobs.rs: Fjernet StdbClient fra dispatch og start_worker.
- main.rs: Fjernet STDB-initialisering, warmup, stdb_monitor.
StdbClient fjernet fra AppState. stdb.rs beholdt som død kode
(fjernes i oppgave 22.4).
- health.rs: Fjernet STDB-helsesjekk fra dashboard.
- Slettet warmup.rs og stdb_monitor.rs (PG→STDB-synk ikke lenger
relevant).
- docs/retninger/datalaget.md: Markert fase M3 som fullført.
Ny feature-spec for selvgenererende systemmanual:
- Genereres fra faktisk tilstand (PG-skjema, systemd, Docker, CLI)
- 9 seksjoner: infra, DB, tjenester, CLI, Caddy, app-logikk,
konvensjoner, arkitekturprinsipper, gjenoppbyggingssteg
- Selvforsynt: gitt ren server + manual = kjørende system
- Diff-modus for å se hva som har endret seg
- Secrets redacted, brukerdata ekskludert
- Daglig regenerering + ved deploy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Frontend bruker nå kun portvokterens WebSocket for sanntidsdata.
SpacetimeDB-klienten er erstattet med en enkel WebSocket-klient
som kobler til /ws-endepunktet og oppdaterer reactive stores direkte.
Frontend-endringer:
- Nye lokale typer (types.ts) erstatter STDB module_bindings
- connection.svelte.ts: WebSocket til portvokteren med auto-reconnect
- stores.svelte.ts: Prosesserer WS-meldinger (initial_sync + events)
- MixerTrait: STDB-reducers erstattet med HTTP API-kall
- api.ts: Nye mixer-endepunkter (create, gain, mute, effect, role)
- +layout.svelte: Fjernet dual-tilkobling, kun portvokterens WS
- pg-ws.svelte.ts: Slettet (erstattet av connection.svelte.ts)
Dokumentasjon:
- datalaget.md: Fase M1+M2 markert som fullført
- api_grensesnitt.md: Oppdatert arkitekturdiagram, nye mixer-endepunkter
Ny feature-spec for synlig kvalitetsstyring av bot-svar:
- Tre nivåer intelligens (Haiku/Sonnet/Opus) og innsats (low/med/high)
- Diskret indikator (🧠●●○ 💪●○○) i svar-header
- Én ↑-knapp for "gi bedre svar" — bumper begge nivåer
- Automatisk nivåvalg fra heuristikker, bruker overstyrer med ↑
- retry_of-edge mellom erstattet og nytt svar
- Default-nivå konfigurerbart per cli_tool-node i PG
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fase M2 (oppgave 22.2): Portvokteren sender nå full raddata i
WebSocket-events (ikke bare ID), slik at frontend kan oppdatere
stores direkte uten ekstra API-kall.
Endringer:
- ws.rs: Berik node/edge/access-events med full PG-data etter NOTIFY
- ws.rs: Ny mixer_channel_changed event-type + initial_sync inkluderer mixer
- ws.rs: Resync ved lag (broadcast overflow)
- mixer.rs: Nye HTTP-endepunkter som erstatter STDB-reducers
(create_mixer_channel, set_gain, set_mute, toggle_effect, set_mixer_role)
- 019_mixer_channels.sql: PG-tabell + NOTIFY-trigger for mixer-tilstand
Ny fase med 11 oppgaver som spinner opp friske sesjoner for å
teste og validere implementeringen fra hver fase. Ved funn:
fiks direkte (småting) eller opprett nye tasks med spesifikasjon
for dedikert sesjon. Dekker alle faser fra infra til STDB-migrering.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Backend:
- ws.rs: Fikset WS auth via query-param (browser kan ikke sende headers ved WS upgrade)
- auth.rs: Gjort decoding_key pub for gjenbruk i ws-modulen
Frontend:
- pg-ws.svelte.ts: Ny PG WebSocket-klient med auto-reconnect og event-logging
- index.ts: Eksporterer pgWsConnect/pgWsDisconnect/pgWsState
- +layout.svelte: Kobler til PG WS i parallell med STDB for verifisering
Docs:
- api_grensesnitt.md: Dokumentert /ws endepunkt og sanntidsarkitektur
- tasks.md: Merket 22.1 som ferdig
Deploy: Krever restart av maskinrommet + rebuild av frontend.
Implementerer Fase M1 av SpacetimeDB-migrasjonen:
- SQL-migrasjon 018: Triggers for notify_node_change, notify_edge_change
og notify_access_change på nodes, edges og node_access-tabellene
- Ny ws.rs-modul i maskinrommet med:
- PG LISTEN bakgrunnsoppgave som lytter på tre kanaler
- Broadcast-kanal for å videresende events til alle WS-klienter
- WebSocket-endepunkt (/ws) med JWT-autentisering
- Initiell snapshot (initial_sync) ved tilkobling
- Tilgangskontrollfiltrering per klient via node_access-matrisen
- Oppdatert AppState med WsBroadcast og /ws-rute
Frontend dual-tilkobling (STDB + nytt WS) kommer i neste commit.
- Caddy: auth.synops.no som alias for auth.sidelinja.org
- Authentik OIDC: synops.no lagt til som redirect URI
- CLAUDE.md: oppdatert domeneliste med auth.synops.no
- Landingsside: login peker til sidelinja.org (der appen kjører)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Profilert alle kritiske PG-spørringer med EXPLAIN ANALYZE.
Identifiserte at recompute_access brukte single-column index
(idx_edges_type) med lav selektivitet, og RLS-policyer manglet
composite indexes for effektive oppslag.
Endringer:
Migrasjon 017_query_performance.sql:
- 6 nye composite indexes:
- idx_edges_target_type (target_id, edge_type) — recompute_access + belongs_to
- idx_edges_source_type (source_id, edge_type) — alias-oppslag
- idx_edges_target_memberof (partial, member_of) — team-propagering
- idx_nodes_created_at_desc — ORDER BY created_at DESC
- idx_nodes_kind_created — filtrer på kind + sorter
- idx_na_subject_covering INCLUDE (object_id) — RLS without heap lookup
- Optimalisert recompute_access(): steg 3 og 4 kjøres nå bare
når det er relevant (EXISTS-sjekk først). For vanlige brukere
(ikke team) unngår dette to fulle INSERT-SELECT-operasjoner.
- via_edge oppdateres nå korrekt ved access-nivå-endring.
Slow query logging (maskinrommet):
- Forespørsler >200ms logges som WARN med tag slow_request
- PG-spørringer >100ms logges som WARN med tag slow_query
- recompute_access-kall logges med varighet for overvåking
- Nytt pg_stats-felt i /metrics med tabell- og index-statistikk,
cache hit ratio, og node_access-telling
Dokumentasjon oppdatert i docs/infra/observerbarhet.md.
Erstatter fire-and-forget tokio::spawn() i skrivestien med jobbkø-basert
persistering. Alle PG-skriveoperasjoner (insert/update/delete for noder
og edges) går nå gjennom den eksisterende jobbkøen som allerede har:
- Eksponentiell backoff (30s × 2^n) ved feil
- Dead letter queue (status='error' etter max_attempts=3)
- Admin-API for overvåking, manuell retry og avbryt
- Ressursstyring og prioritetsregler
Ny modul pg_writes.rs med:
- 5 enqueue-funksjoner (erstatter spawn_pg_*)
- 5 job-handlere for dispatch i worker-loopen
- Full paritet med gammel logikk: tilgangsgivende edges kjører
recompute_access i transaksjon, synker til STDB, trigger rendering
Før: PG-skrivefeil logget og glemt → data kun i STDB, tapt fra PG.
Nå: automatisk retry → admin-synlig dead letter → manuell recovery.
SpacetimeDB var et godt eksperiment, men gir synk-kompleksitet,
dobbelt vedlikehold og en ekstra SPOF for minimal latensgevinst
på denne skalaen. PG LISTEN/NOTIFY + WebSocket i portvokteren
erstatter sanntidslaget.
- datalaget.md: revidert med ny lagmodell, PG-triggers, migrasjonsplan
- retninger/README.md: oppdatert status til «Revidert»
- tasks.md: ny fase 22 (STDB-migrering) med 5 oppgaver (M1–M5)
- 12.4 oppdatert fra «profiler STDB» til «profiler PG»
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nytt infra-dokument for robusthet og fallback:
- LLM fallback-kjede via LiteLLM (Claude → GPT-4 → lokal modell)
- Automatisk nedetid-melding til brukere ved bot-feil
- Function calling: ekstern API-bot dispatcher CLI-verktøy via
portvokteren (structured output → generisk dispatch)
- Tilgangskontroll for bot-actions per brukerrolle
- Onboarding som statisk dispatch (null LLM-kostnad)
- PG som eneste reelle SPOF, mitigering via backup+snapshot
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Legger til observerbarhetslaget i maskinrommet:
- Strukturert JSON-logging via LOG_FORMAT=json (maskinlesbart for
log-aggregering). Default er human-readable for utvikling.
- Ny metrics-modul med in-memory request latency tracking per rute
(count, avg, min, max, p50/p95/p99 fra siste 1000 forespørsler).
- Custom axum-middleware erstatter tower_http::TraceLayer — logger
method, path, status og duration_ms per request, og mater
metrikk-samleren.
- GET /metrics-endepunkt som returnerer:
- request_latency: per-rute statistikk
- queue_depth: pending/running/error/retry fra job_queue
- ai_cost: aggregert fra ai_usage_log (siste time/24h/30d)
- Default loggnivå endret fra debug til info for mindre støy.
Nytt konseptdokument: systemdokumentasjon (arkitektur, features,
CLI-verktøy, retninger) lever som noder i grafen — ikke bare
markdown-filer. Én offentlig Synops-rotnode med undersamlinger.
- Claude traverserer via synops-context, ikke fillesing
- Nye utviklere navigerer fra én rotnode i webgrensesnittet
- CLAUDE.md krymper til bootstrap-peker + fallback
- docs/-filer migreres i faser: seed → dobbeltliv → noder er kilden
- synops-snapshot genererer docs fra noder (ikke omvendt)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ny crate `tools/synops-common` samler duplisert kode som var
spredt over 13 CLI-verktøy:
- db::connect() — PG-pool fra DATABASE_URL (erstatter 10+ identiske blokker)
- cas::path() — CAS-stioppslag med to-nivå hash-katalog
- cas::root() — CAS_ROOT env med default
- cas::hash_bytes() / hash_file() / store() — SHA-256 hashing og lagring
- cas::mime_to_extension() — MIME → filendelse
- logging::init() — tracing til stderr med env-filter
- types::{NodeRow, EdgeRow, NodeSummary} — delte FromRow-structs
Alle verktøy (unntatt synops-tasks som ikke bruker DB) er refaktorert
til å bruke synops-common. Alle kompilerer og tester passerer.
Ny feature-spec for universelle nodereferanser i Synops:
- n:<id> syntaks for å linke til enhver node fra enhver kontekst
- 🔗-knapp på alle noder for kopier-lim, n:-autocomplete i editor
- Tilgangsprompt ved linking av privat node i delt kontekst
(del som lesbar / behold privat / del utdrag)
- Privacy-signalering: privat=🔒, delt=ren, delt+lenket=👁
- Inversert markering: privathet signaliseres, fravær=trygt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Portvokteren dispatcher via konvensjon (synops-{job_type}) med
--payload-json. Verktøyet parser payload selv. Nytt verktøy krever
ingen rekompilering — bare binary i PATH og riktig job_type.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bot er først og fremst en samtalepartner som svarer på alt.
I tillegg fanger den opp actionable innhold og oppretter noder
i bakgrunnen (bugs, ideer, features, tech-debt) med riktige
tags og mentions-edges. Brukeren ser bare chat-svaret.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>