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>
Ny intention `POST /intentions/set_slot` for redaksjonell
kontroll over forside-slots i publiseringssamlinger.
Håndhever:
- Maks 1 hero: gammel ikke-pinned hero flyttes til strøm
- featured_max: eldste ikke-pinned featured FIFO til strøm
- pinned-flagg beskytter mot automatisk fjerning
- Krever owner/admin-tilgang til samlingen
- Trigger forside-rerendering etter slot-endring
Returnerer liste over displaced edges slik at frontend
kan vise hva som ble flyttet.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
serve_index støtter nå index_mode fra publishing-trait:
- "static": render_index-jobb rendrer forsiden til CAS ved publisering,
samlingens metadata.rendered_index.index_hash peker til CAS-fil,
serveres med Cache-Control: immutable
- "dynamic" (default): in-memory cache med konfigurerbar TTL
(index_cache_ttl, default 300s), invalidert ved belongs_to-endringer
Tre separate indekserte PG-spørringer erstatter den gamle
alt-i-ett-spørringen — filtrerer på slot i edge-metadata
(hero/featured/strøm) med LIMIT, bruker GIN-indeks.
Trigger-logikk utvidet: belongs_to-edge-opprettelse legger
render_index-jobb i kø (statisk) eller invaliderer cache (dynamisk).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implementerer rendering-pipeline: metadata.document (TipTap JSON) → HTML
via Tera-templates → CAS-lagring → metadata.rendered oppdateres.
Nye moduler:
- tiptap.rs: Konverterer TipTap/ProseMirror JSON til HTML. Støtter
paragraph, heading, blockquote, lister, code_block, image, hr,
og marks (bold, italic, strike, code, link, underline).
XSS-sikker med HTML-escaping.
- render_article jobb i jobbkøen: Henter node + samling, konverterer
document → HTML, rendrer med Tera + tema, lagrer i CAS, oppdaterer
nodens metadata.rendered med html_hash og renderer_version.
Endringer:
- publishing.rs: SeoData-struct med OG-tags, canonical URL, JSON-LD.
render_article_to_cas() for full pipeline. serve_article() serverer
fra CAS (immutable cache) hvis pre-rendret, fallback til on-the-fly.
RENDERER_VERSION=1 for fremtidig bulk re-rendering.
- intentions.rs: Trigger render_article-jobb automatisk når belongs_to
edge opprettes til samling med publishing-trait.
- Alle 4 artikkel-templates: SEO-block med meta description, OG-tags
(type, title, description, url, site_name, image, published_time),
canonical URL, RSS-link, og JSON-LD structured data.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Oppretter transcription_segments-tabellen i PostgreSQL som master-kopi
for alle transkripsjoner. transcribe.rs er oppdatert fra verbose_json
til SRT-format med full parse → segment-innsetting pipeline.
Endringer:
- Migration 005: transcription_segments med GIN fulltekstsøk (norsk)
- transcribe.rs: SRT-parser, segment-innsetting, node-oppdatering
- Miljøvariabler: WHISPER_MODEL (default "medium"), WHISPER_INITIAL_PROMPT
- Docker-compose: nye env vars for maskinrommet-containeren
- Docs: oppdatert podcastfabrikken, arkitektur, primitiver, CLAUDE.md
Tabellen kjørt på server, maskinrommet restartet med nye env vars.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>