Commit graph

414 commits

Author SHA1 Message Date
4630820876 Starter oppgave 16.2 2026-03-18 04:50:19 +00:00
a838e0e1c2 Fullfører oppgave 16.1: LiveKit-klient i frontend
Installerer livekit-client og bygger grunnlaget for sanntidslyd:
- $lib/livekit.ts: LiveKit-wrapper med romtilkobling, deltakersporing,
  og Web Audio-ruting. Auto-attach av <audio> er deaktivert — all lyd
  rutes gjennom AudioContext med GainNode per deltaker (klar for mixer).
- api.ts: joinCommunication/leaveCommunication API-funksjoner
- RecordingTrait.svelte: UI for tilkobling, mikrofon-toggle og deltakerliste
  med live speaking-indikator

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:49:02 +00:00
7555038106 Starter oppgave 16.1 2026-03-18 04:44:03 +00:00
5771d1eed6 Fullfører oppgave 15.9: Brukersynlig forbruk
Legger til to nye API-endepunkter for brukersynlig ressursforbruk:
- GET /my/usage — brukerens eget forbruk (filtrert på triggered_by)
- GET /query/node_usage — forbruk for én node (kun eier/admin)

Frontend:
- /profile — profilside med grafstatistikk og forbruksoversikt
- NodeUsage-komponent integrert i samlings-detaljsiden
- Brukernavn i header lenker nå til profilsiden

Tilgangssjekk: nodeforbruk krever created_by eller owner/admin-edge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:42:47 +00:00
49b9afb64e Starter oppgave 15.9 2026-03-18 04:35:28 +00:00
d7dffa06e6 Fullfører oppgave 15.8: Forbruksoversikt i admin
Aggregert ressursforbruk-dashboard som spør mot resource_usage_log
(oppgave 15.7). Tre visninger: totaler per ressurstype, per samling,
og daglig tidsserie. AI drill-down viser forbruk per jobbtype og
modellnivå (fast/smart/deep).

Backend: GET /admin/usage med days- og collection_id-filtre.
Frontend: /admin/usage med filterbare tabeller og fargekodede kort.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:34:08 +00:00
973ccece35 Starter oppgave 15.8 2026-03-18 04:26:15 +00:00
eb81055ef4 Fullfører oppgave 15.7: Ressursforbruk-logging
Sentralisert logging av alle ressurskrevende operasjoner til
resource_usage_log-tabellen (opprettet i migrasjon 009).

Ny kode:
- resource_usage.rs: hjelpemodul med log() og find_collection_for_node()
- bandwidth.rs: Caddy JSON-logg-parser med nattlig batch-jobb (kl 03:00)

Logging lagt til i handlere:
- AI: summarize, ai_edges (token-telling via LiteLLM usage-felt),
  agent (placeholder — claude CLI gir ikke token-info)
- Whisper: duration_seconds, model, language, mode
- TTS: refaktorert til sentralisert modul, lagt til collection_id
- CAS: logger nye filer ved upload (ikke dedup)
- LiveKit: logger join-hendelser (faktisk deltaker-minutter
  krever webhook-integrasjon i fremtiden)

Caddy-config: JSON access logging aktivert for sidelinja.org og
synops.no i /srv/synops/config/caddy/Caddyfile (utenfor repo).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:24:54 +00:00
9a5d24c850 Starter oppgave 15.7 2026-03-18 04:14:15 +00:00
56b7df8bf8 Fullfører oppgave 15.6: Serverhelse-dashboard
Nytt admin-dashboard for sanntids serverhelse med fire hoveddeler:

1. Tjeneste-status: Parallelle helsesjekker for alle 7 tjenester
   (PG, STDB, Caddy, Authentik, LiteLLM, Whisper, LiveKit) med
   latens-måling og statusrapportering (up/down/degraded).

2. System-metrikker: CPU-load via /proc/loadavg, minne via
   /proc/meminfo, disk via statvfs, oppetid via /proc/uptime.
   Vises med progress-bars og fargekodede terskler.

3. PG-statistikk: Aktive tilkoblinger, maks-tilkoblinger,
   databasestørrelse og aktive spørringer.

4. Logg-tilgang: Filtrerbar visning av logger fra alle tjenester.
   Bruker journalctl for systemd-tjenester og docker logs for
   containere. Konfigurerbart antall linjer per tjeneste.

Backend: health.rs med tokio::join! for parallelle sjekker.
Frontend: /admin/health med auto-polling hvert 10. sekund.
Backup-sjekk rapporterer ok/stale/missing (ingen backup satt opp ennå).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:12:54 +00:00
9d4902ec48 Starter oppgave 15.6 2026-03-18 04:03:32 +00:00
b64f217637 Fullfører oppgave 15.5: Ressursstyring for jobbkø
Implementerer prioritetsregler, ressursgrenser og LiveKit-bevisst
resource governor for jobbkø-workeren, pluss disk-overvåking med varsling.

Hovedkomponenter:

1. Prioritetsregler (job_priority_rules-tabell):
   - Konfigurerbar base_priority, cpu_weight, max_concurrent per jobbtype
   - LiveKit-justering: livekit_priority_adj og block_during_livekit
   - Timeout per jobbtype
   - Admin-API for å endre regler uten restart

2. Ressurs-governor i worker-loopen:
   - Semaphore: maks 3 samtidige jobber
   - CPU-vektgrense: total vekt maks 8 (Whisper=5, render=1, etc.)
   - Per-type concurrency-grense
   - LiveKit-status sjekkes med 10s cache-TTL
   - Jobber utsettes/nedprioriteres ved aktive LiveKit-rom
   - Individuell timeout per jobb (default 600s)
   - Jobber kjøres i egne tokio-tasks (parallell dispatch)

3. Disk-overvåking:
   - Sjekker diskbruk hvert 60. sekund via statvfs
   - Terskler: 85% warning, 90% critical, 95% emergency
   - Logger til disk_status_log (siste 1000 målinger beholdes)
   - Admin-API: GET /admin/resources/disk med historikk

4. Admin-API:
   - GET /admin/resources — samlet ressursstatus
   - GET /admin/resources/disk — diskstatus med historikk
   - POST /admin/resources/update_rule — oppdater prioritetsregel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:02:11 +00:00
d57f3d1324 Starter oppgave 15.5 2026-03-18 03:53:01 +00:00
3fbe42f207 Fullfører oppgave 15.4: AI Gateway admin-UI
Implementerer /admin/ai med fire faner:
- Modeller & fallback: oversikt over aliaser med fallback-kjeder,
  toggle aktiv/inaktiv, legg til/fjern modeller, endre prioritet
- Ruting: jobbtype → modellalias mapping med dropdown-endring
- Forbruk: aggregert tokenforbruk per samling/alias/jobbtype
- API-nøkler: viser hvilke env-variabler som er satt (aldri verdier)

Backend (maskinrommet/src/ai_admin.rs):
- GET /admin/ai — full oversikt med aliaser, providers, ruting, forbruk
- GET /admin/ai/usage — forbruk med filtre (dager, samling)
- POST-endepunkter for CRUD på aliaser, providers og ruting-regler

PG er single source of truth. API-nøkler lagres kun som env-variabler,
admin-panelet viser bare om de er satt eller mangler.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 03:51:45 +00:00
6accce99e6 Starter oppgave 15.4 2026-03-18 03:42:23 +00:00
07fa10620b Fullfører oppgave 15.3: Jobbkø-oversikt med admin-UI
Admin kan nå se, filtrere, retrye og avbryte jobber via /admin/jobs.

Backend:
- jobs.rs: list_jobs(), count_by_status(), distinct_job_types(),
  retry_job(), cancel_job() for admin-spørringer
- intentions.rs: GET /admin/jobs, POST retry_job/cancel_job handlers
- main.rs: tre nye ruter

Frontend:
- /admin/jobs: statusoppsummering med antall per status, filter på
  type/status, paginert tabell med retry/avbryt-knapper, 5s polling
- /admin: navigasjonslenke til jobbkø

Migrasjon:
- 013_job_queue.sql: formaliserer job_queue-tabellen med admin-indekser

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 03:40:56 +00:00
8242dd8360 Starter oppgave 15.3 2026-03-18 03:32:52 +00:00
d8e44fe57e Fullfører oppgave 15.2: Graceful shutdown med vedlikeholdsmodus
Implementerer koordinert nedstenging der admin setter et
vedlikeholdstidspunkt, brukere ser nedtelling, og systemet
stenger ned trygt etter at aktive jobber er ferdige.

Nye filer:
- maskinrommet/src/maintenance.rs — MaintenanceState med atomiske
  flagg, shutdown-koordinator (vent på scheduled_at → blokker
  nye jobber/LiveKit → vent på kjørende jobber → exit)
- frontend/src/routes/admin/+page.svelte — admin-panel for
  vedlikehold med statusvisning og aktive sesjoner

Endringer:
- jobs.rs: sjekker maintenance.is_active() før dequeue
- intentions.rs: nye endepunkter (initiate/cancel/status), blokkerer
  join_communication under vedlikehold
- main.rs: MaintenanceState i AppState, nye ruter
- api.ts: klientfunksjoner for maintenance-API
- adminpanelet.md: dokumenterer implementerte endepunkter

Flyt: admin → GET /admin/maintenance_status (se aktive sesjoner)
→ POST /intentions/initiate_maintenance → varsel broadcast via STDB
→ frontend nedtelling → scheduled_at nådd → active=true → jobbkø
pauset + LiveKit blokkert → vent maks 5 min → process::exit(0)
→ systemd restarter maskinrommet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 03:31:32 +00:00
9d405f90e3 Starter oppgave 15.2 2026-03-18 03:22:34 +00:00
831666012a Fullfører oppgave 15.1: Systemvarsler via STDB
Implementerer systemvarsler (system_announcement-noder) som vises som
banner/toast for alle aktive klienter i sanntid via SpacetimeDB.

Backend (maskinrommet):
- POST /intentions/create_announcement: oppretter varslingsnode med
  validering av announcement_type (info/warning/critical), datoer
  (scheduled_at, expires_at) og blocks_new_sessions. Visibility
  settes automatisk til 'open' for broadcast til alle klienter.
- POST /intentions/expire_announcement: fjerner varslingsnode med
  tilgangskontroll (kun eier kan slette).

Frontend:
- SystemAnnouncements.svelte: filtrerer nodeStore for aktive
  system_announcement-noder, skjuler utløpte (expires_at), viser
  nedtelling for planlagte hendelser (scheduled_at). Fargekoding:
  rød (critical), gul (warning), blå (info). Critical kan ikke
  dismisses. Oppdaterer nedtelling hvert sekund.
- Komponent lagt til i +layout.svelte for global synlighet.
- API-funksjoner (createAnnouncement, expireAnnouncement) i api.ts.

Ref: docs/concepts/adminpanelet.md § "Systemvarsler og vedlikeholdsmodus"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 03:21:18 +00:00
1c313f3857 Starter oppgave 15.1 2026-03-18 03:15:06 +00:00
1425a82cdd Fullfører oppgave 14.17: A/B-testing for presentasjonselementer
Implementerer automatisk A/B-testing for forside-varianter:

- PG-migrasjon 012: ab_events-tabell for impression/klikk-logging
  med hour_of_week (0-167) for tidspunkt-normalisering
- Variant-rotasjon: ab_select() velger tilfeldig blant testing-varianter
  ved forside-rendering, winner prioriteres, retired filtreres bort
- Impression-logging: asynkron fire-and-forget ved forside-serve
  (både cache-hit og -miss), lagres i ab_events
- Klikk-attribusjon: artikkelbesøk sjekker forside-cache for aktive
  AB-varianter og logger klikk. Eksplisitt tracking via
  GET /pub/{slug}/t/{article_id}?v={edge_id}
- Periodisk evaluator (300s intervall): z-test for proporsjoner
  (p < 0.05), minimum 100 impressions per variant, oppdaterer
  edge-metadata (ab_status, impressions, clicks, ctr)
- Redaktør-overstyring: POST /intentions/ab_override markerer
  valgt variant som winner, andre som retired (krever owner/admin)
- Auto-initialisering: maybe_start_ab_test() setter ab_status=testing
  automatisk når >1 variant av samme type opprettes

Alle 42 tester passerer inkludert 3 nye z-test-tester.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 03:13:39 +00:00
a10de64686 Starter oppgave 14.17 2026-03-18 02:56:45 +00:00
63630eb55a Fullfører oppgave 14.16: Presentasjonselementer som noder
Publisert tittel, ingress, OG-bilde og undertittel er nå egne noder
koblet til artikler via title/subtitle/summary/og_image-edges.
Rendering bruker presentasjonselementer med fallback til artikkelfelt.

Backend:
- Ny query: GET /query/presentation_elements?article_id=...
- render_article_to_cas henter presentasjonselementer via edges
- fetch_article + fetch_index_articles bruker pres.elementer
- Batch-henting for forsideartikler (én SQL-spørring)
- ArticleData utvides med subtitle + og_image
- Alle fire temaer viser subtitle og OG-bilde
- SEO og_image-tag fylles fra presentasjonselement

Frontend:
- PresentationEditor.svelte: opprett/rediger tittel, undertittel,
  ingress, OG-bilde med variantvelger (editorial/ai/social/rss)
- Integrert i PublishDialog via <details>-seksjon
- API-klient: fetchPresentationElements(), deleteNode()

Grunnlag for A/B-testing (oppgave 14.17): edge-metadata støtter
ab_status/impressions/clicks/ctr, best_of() prioriterer winner > testing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:55:23 +00:00
18642d5e79 Starter oppgave 14.16 2026-03-18 02:42:54 +00:00
bf67ad1b96 Fullfører oppgave 14.15: nav-lenker, docs, tasks.md
- Navigasjonslenker (Arkiv, Søk) i base.html header
- Dokumentasjon av implementerte sidetyper i publisering.md
- Markerer oppgave 14.15 som ferdig i tasks.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:41:34 +00:00
26c6a3b8d9 Dynamiske sider (oppgave 14.15): kategori, arkiv, søk, om-side
Implementerer fire nye dynamiske sidetyper for publiseringssamlinger:

- Kategori-sider: filtrert på tag-edges, paginert med cache
- Arkiv: kronologisk med månedsgruppering, paginert med cache
- Søk: PG fulltekst med tsvector/ts_rank, paginert med cache
- Om-side: statisk CAS-node (page_role: "about"), immutable cache

Teknisk:
- Ny migrasjon (011): tsvector-kolonne + GIN-indeks + trigger for søk
- Nye Tera-templates: category.html, archive.html, search.html, about.html
- DynamicPageCache for in-memory caching av dynamiske sider
- Ruter for /pub/{slug}/kategori/{tag}, arkiv, sok, om
- Custom domain-varianter for alle nye sidetyper

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:39:06 +00:00
dda68594d7 Starter oppgave 14.15 2026-03-18 02:29:32 +00:00
cf38721459 Bulk re-rendering ved temaendring (oppgave 14.14): paginert batch-jobb via jobbkø
Når theme eller theme_config endres på en samling, trigges paginert
bulk re-rendering av alle artikler (100 om gangen). Artikler serveres
med gammelt tema til de er re-rendret — renderer_version identifiserer
hvilke som gjenstår. Duplikatsjekk mot eksisterende pending/running jobber.

- publishing.rs: trigger_bulk_rerender() med paginert SQL-query
- intentions.rs: theme/theme_config endring detekteres i update_node
- RENDERER_VERSION bumped til 2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:28:07 +00:00
8155783fc4 Starter oppgave 14.14 2026-03-18 02:23:35 +00:00
6125302bcb Redaksjonell samtale (oppgave 14.13): kommunikasjonsnode knyttet til artikkel
Redaktør kan nå opprette en diskusjonstråd direkte fra den redaksjonelle
arbeidsflaten, knyttet til en innsendt artikkel og dens forfatter.

Backend:
- create_communication utvides med context_id som oppretter belongs_to-edge
  fra kommunikasjonsnoden til kontekstnoden (artikkelen)
- editorial_board-spørringen returnerer discussion_ids per kort (kommunikasjonsnoder
  med belongs_to til artikkelen)

Frontend:
- "Start samtale"-knapp på hvert redaksjonelt kort oppretter kommunikasjonsnode
  med redaktør som owner og forfatter som member, og navigerer til chatten
- Eksisterende samtaler vises som lenker på kortet

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:22:17 +00:00
7bdcdafa24 Starter oppgave 14.13 2026-03-18 02:15:18 +00:00
eea66744d8 Planlagt publisering (oppgave 14.12): periodisk scheduler i maskinrommet
Legger til en bakgrunns-scheduler som hvert 60. sekund sjekker for
belongs_to-edges med publish_at i fortiden der artikkelen ikke er rendret.
Ved treff: oppretter render_article-jobb (og render_index for berørte
samlinger) i jobbkøen. RSS-feeden oppdateres automatisk siden den
genereres dynamisk fra DB.

Detaljer:
- find_due_articles(): SQL-spørring med deduplisering mot eksisterende jobber
- run_publish_scheduler(): orkestrerer én runde med publisering
- start_publish_scheduler(): tokio::spawn med 60s poll-intervall
- Hooks inn i main.rs ved oppstart, parallelt med jobbkø og pruning

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:14:04 +00:00
1d2741a18a Starter oppgave 14.12 2026-03-18 02:10:20 +00:00
f1752e73f5 Redaktørens arbeidsflate (oppgave 14.11): Kanban-brett for innsendinger
Redaktøren ser alle artikler med submitted_to-edge til samlingen,
gruppert i fire kolonner etter status. Drag-and-drop mellom kolonner
endrer status via update_edge. Siste kolonne ("Planlagt") åpner en
dialog for å sette publish_at i edge-metadata — klar for oppgave 14.12
(planlagt publisering).

Backend: GET /query/editorial_board med forfatterinfo og edge-metadata.
Frontend: /editorial/[id] med sanntidsoppdateringer via SpacetimeDB.
Lenke fra PublishingTrait når require_approval er aktivt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:09:03 +00:00
05b5c9e9b7 CLI-verktøy: lag det du trenger, gjør det generisk nok for orkestratoren 2026-03-18 02:02:52 +00:00
ffc0201103 Starter oppgave 14.11 2026-03-18 02:02:23 +00:00
bc982497f4 Stram opp CLI-verktøy-instruksjon: produksjonskode, ikke ad-hoc 2026-03-18 02:01:23 +00:00
f593b1e320 Redaksjonell innsending (oppgave 14.10): submitted_to-edge med rollevalidering
Maskinrommet håndhever nå publiseringsregler for samlinger med
require_approval: true i publishing-traiten:

- submitted_to-edge: kun roller i submission_roles (+ owner/admin) kan
  opprette. Metadata settes automatisk: status=pending, submitted_at=now.
- belongs_to-edge til require_approval-samling: kun owner/admin.
- Status-endring på submitted_to: kun owner/admin av samlingen.

PublishingConfig utvidet med require_approval (default false) og
submission_roles (default ["member"]).

Nye hjelpefunksjoner: get_publishing_config, get_user_role_for_node,
user_is_owner_or_admin. EdgeRow utvidet med source_id/target_id.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 02:01:11 +00:00
be1b6caa29 Oppdater CLAUDE.md og arkitektur med nye prinsipper
- Maskinrommet orkestrerer, CLI-verktøy gjør jobben
- Spatial canvas med drag-and-drop som primær interaksjon
- To retninger: dra ut = ny node, dra inn = transformer
- Arbeidsflaten er en node (rekursivt)
- Caddy flyttet til native i teknologitabellen
- CLI-verktøy lagt til i lagmodell og teknologivalg

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:56:51 +00:00
1a94c36713 Fase 21: CLI-verktøy — unix-filosofi (16 oppgaver)
Bryt ut all prosessering fra maskinrommet til standalone CLI-verktøy:
- 9 prosesseringsverktøy (transcribe, audio, render, rss, tts,
  summarize, suggest-edges, respond, prune)
- 5 oppslagsverktøy for Claude (context, search, tasks,
  feature-status, node)
- Jobbkø-dispatcher + felles lib

Maskinrommet og Claude deler samme verktøykasse.
Ref: docs/retninger/unix_filosofi.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:53:09 +00:00
a40a23447a Starter oppgave 14.10 2026-03-18 01:53:02 +00:00
66ebe58ff8 Custom domains (oppgave 14.9): DNS-validering, Caddy on-demand TLS, re-rendering
Tre hovedkomponenter:

1. custom_domain.rs — ny modul i maskinrommet:
   - GET /internal/verify-domain?domain= — Caddy on-demand TLS callback.
     Returnerer 200 hvis domenet er registrert i en publishing-trait, 404 ellers.
   - DNS-validering (validate_dns): sjekker at domenet peker til serverens IP
     via system DNS resolver. Kalles ved oppdatering av publishing-trait.
   - Domene-basert serving: /custom-domain/index, /custom-domain/{article_id},
     /custom-domain/feed.xml — Caddy rewriter custom domain-forespørsler hit,
     Host-header brukes til å finne samlingen.
   - Re-rendering: rerender_collection_articles() enqueuer render-jobber
     for alle artikler + forside når custom_domain endres.

2. Caddy on-demand TLS (Caddyfile):
   - Catch-all :443-blokk med on_demand ask-callback til maskinrommet.
   - Rewrite-regler: / → /custom-domain/index, /feed.xml → /custom-domain/feed.xml,
     /* → /custom-domain/{uri}. Host-header bevares for domene-oppslag.

3. intentions.rs — utvidet update_node:
   - DNS-validering ved setting av custom_domain i publishing-trait.
   - Detekterer endring i custom_domain og trigger re-rendering av
     alle artikler (canonical URL endres).

Eksisterende kode (publishing.rs, rss.rs) bruker allerede custom_domain
for base_url/canonical_url — ingen endringer nødvendig der.

Ref: docs/concepts/publisering.md § "Custom domain-mekanisme"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:51:35 +00:00
9486480ebe Retning: Unix-filosofi — maskinrommet orkestrerer, verktøy gjør jobben
Maskinrommet og Claude deler samme CLI-verktøykasse. Maskinrommet
kaller dem fra jobbkøen, Claude fra terminalen. Alt maskinrommet
gjør kan Claude simulere — nyttig for debugging, testing og utvikling.

Nye features bygges som CLI-verktøy fra start. Eksisterende kode
brytes ut gradvis.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:49:48 +00:00
54c8d411e8 Legg til tools/ for Claude CLI-verktøy, dokumenter i CLAUDE.md 2026-03-18 01:44:57 +00:00
8c7c0bfff9 Starter oppgave 14.9 2026-03-18 01:43:30 +00:00
86eb54f7ee Spec: Agent API — Claude sitt strukturerte grensesnitt mot maskinrommet 2026-03-18 01:42:22 +00:00
265adea0b3 RSS/Atom-feed (oppgave 14.8): feed-discovery + betinget RSS-lenke
Feeden i rss.rs var allerede implementert med full RSS 2.0 og Atom 1.0
støtte, inkl. podcast-enclosures. Det som manglet var integrasjon med
publiseringstemplates:

- base.html: <link rel="alternate"> for feed auto-discovery (kun når
  samlingen har rss-trait)
- base.html: RSS-lenke i nav vises kun for samlinger med rss-trait
- publishing.rs: has_rss propageres fra CollectionRow gjennom alle
  render-funksjoner til Tera-kontekst
- CAS-rendering (render_article_to_cas, render_index_to_cas) sjekker
  også rss-trait for korrekt template-kontekst

Verifisert: kompilerer, alle 36 tester passerer, feed.xml returnerer
gyldig RSS/Atom, 404 for ukjente slugs, discovery-link i HTML.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 01:42:16 +00:00
71f7264100 Agent leser spec-node via discusses-edge for kontekstuell feedback 2026-03-18 01:40:12 +00:00
88f51dc487 Spec: feature feedback — levende spesifikasjoner med brukertilbakemelding 2026-03-18 01:38:11 +00:00