Orkestrering: AI kun ved oppretting, eventually-modus for Claude Code

Fundamentalt restrukturert:
- AI genererer script ved oppretting, ikke ved kjøring
- Vaktmesteren validerer script før lagring (verktøy finnes? variabler ok?)
- Systemprompt bygges automatisk fra cli_tool-noder i PG
- Kjøring er alltid deterministisk script, ingen AI
- Feil → work_item, ikke AI-eskalering
- "Eventually"-modus: forespørsel lagres, Claude Code (betalt)
  genererer script i neste sesjon med Opus — ingen API-kostnad,
  bedre kvalitet, ingen hastverk

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-18 16:40:34 +00:00
parent 6543c1fedd
commit 77e3d59b46

View file

@ -79,57 +79,124 @@ Enkelt nok til å parse med en liten Rust-parser i vaktmesteren.
Deterministisk, gratis, raskt. **De fleste produksjons-
orkestreringer vil være på dette nivået.**
### Nivå 2: Fritekst med AI-tolkning
### Nivå 2: AI-assistert oppretting
Naturlig språk som boten tolker og utfører steg for steg
med function calling. For orkestreringer der stegene ikke
er helt forutsigbare.
Brukeren beskriver hva de vil i naturlig språk. AI genererer
et deklarativt script (nivå 1) som vaktmesteren validerer.
**AI brukes ved oppretting, ikke ved kjøring.**
```
Når en innspilling i en samling med podcast-trait avsluttes:
Bruker: "Gjør episoden klar for publisering"
1. Transkriber lydfilen med stor modell
2. Generer oppsummering
3. Foreslå kapitler basert på transkripsjonen
4. Generer show notes
5. Oppdater RSS-feed
→ synops-ai genererer script-forslag:
Hvis transkribering feiler, prøv igjen med medium modell.
Hvis RSS feiler, opprett en oppgave.
NÅR innspilling.avsluttet
HVIS samling.har_trait("podcast")
1. synops-transcribe --cas-hash {event.cas_hash} --model large
VED_FEIL: synops-transcribe --cas-hash {event.cas_hash} --model medium
2. synops-summarize --communication-id {event.communication_id}
3. synops-rss --collection-id {event.collection_id}
VED_FEIL: work_item "Pipeline feilet" --tag bug
→ Vaktmesteren validerer:
✓ Alle verktøy finnes
✓ Alle variabler er gyldige
✓ Syntaks er korrekt
→ Bruker godkjenner eller justerer
→ Lagres som orchestration-node (nivå 1)
```
Boten mapper "transkriber lydfilen" → `synops-transcribe`,
"oppsummer" → `synops-summarize`, osv. Krever LLM-kall
per kjøring (Haiku er nok for de fleste).
Etter oppretting kjører scriptet uten AI — deterministisk,
gratis, raskt. AI-kostnaden er én gang, ved oppretting.
### Nivå 3: Drømmemodus
Brukeren skriver hva de *ønsker*, uten å vite hvilke verktøy
som finnes. Boten prøver, og mangler som oppdages blir
feature requests.
som finnes. AI prøver å generere et script, og mangler
som oppdages blir feature requests.
```
Gjør episoden klar for publisering. Lag en lydfil med
sammendrag og send den til alle deltakere.
Bruker: "Lag en lydfil med sammendrag og send til deltakerne"
→ synops-ai genererer:
1. synops-summarize --communication-id {event.communication_id}
2. synops-tts ??? ← finnes ikke
→ Vaktmesteren validerer:
✗ synops-tts finnes ikke
→ Tilbake til bruker:
"Scriptet refererer til synops-tts som ikke finnes.
Jeg oppretter en forespørsel om TTS-verktøy."
→ work_item "TTS for møteoppsummeringer" --tag feature
→ Delvis script lagres med synops-tts markert som manglende
```
Boten sjekker tilgjengelige verktøy, gjør det den kan,
og oppretter work_items for det som mangler.
### Systemprompt for script-generering
AI-modellen trenger kontekst for å generere gode scripts.
`synops-orchestrate --generate-system-prompt` bygger dette
automatisk fra PG:
```
Du er en orkestreringsplanlegger for Synops.
TILGJENGELIGE VERKTØY:
- synops-transcribe: Whisper-transkribering
Bruk: --cas-hash <hash> --model <model>
- synops-summarize: AI-oppsummering
Bruk: --communication-id <uuid>
- synops-rss: RSS-generering
Bruk: --collection-id <uuid>
[... hentet fra cli_tool-noder i PG]
SCRIPT-GRAMMATIKK:
NÅR <event> [HVIS <betingelse>]
<N>. <tool> <args...>
VED_FEIL: <tool> <args...> | work_item <title> [--tag <tag>]
Variabler: {event.<felt>}, {input.<felt>}
EKSEMPLER:
[... hentet fra eksisterende orchestration-noder]
Svar KUN med et gyldig orkestreringscript.
```
Systemprompt oppdateres automatisk når nye verktøy legges til.
Fungerer med alle modeller — Claude, Llama, Mixtral, Grok.
### Tre-stegs flyten
```
1. OPPRETTING (AI, én gang)
Bruker beskriver → synops-ai genererer script
→ vaktmester validerer → bruker godkjenner → lagres
2. KJØRING (ingen AI, hver gang)
Trigger → vaktmester parser script → utfører CLI-kall
→ logger resultat
3. FEILHÅNDTERING (AI, sjelden)
VED_FEIL feiler → eskalér til synops-ai
→ foreslå fix eller opprett work_item
```
AI-kostnad er nesten null i drift.
### Naturlig progresjon
```
Drømmemodus → Bruker beskriver ønsket resultat
↓ AI foreslår
Fritekst → Bruker justerer steg i naturlig språk
↓ AI foreslår kompilering etter N kjøringer
Script → Deklarative CLI-kall, ingen AI
↓ manuelt
↓ AI genererer script-forslag
Script → Vaktmester validerer, bruker godkjenner
Kjører uten AI
Produksjon → Deterministisk, gratis, raskt
Hvis mønster gjentas
Kode → Eget CLI-verktøy (synops-<verb>)
```
Hvert nivå kan fryses til nivået under. AI foreslår
kompilering, bruker godkjenner. Scriptet kan alltid
AI ved oppretting. Ingen AI ved kjøring. Script kan alltid
redigeres manuelt.
## 5. Strukturert trigger
@ -185,38 +252,50 @@ Trigger aktiveres
Ingen LLM. Deterministisk. Raskt.
### Bot-modus (nivå 2)
### Feilhåndtering ved kjøring
```
Trigger aktiveres
→ Vaktmesteren finner matchende orchestration-node
→ Sender til bot med function calling:
- Trigger-kontekst (hvilken node, hvilken event)
- Instruksjonene fra orchestration.content
- Tilgjengelige verktøy (cli_tool-noder)
→ Boten utfører steg for steg
→ Logger hvert steg i orchestration_log
→ Ved feil: resonnerer og prøver alternativ
```
### Drømmemodus (nivå 3)
Som bot-modus, men med høyere intelligens (Sonnet+) og
instruks om å opprette work_items for manglende verktøy.
### Auto-eskalering
Script-modus faller tilbake til bot-modus ved uventet feil:
Alle orkestreringer kjører som script (nivå 1). Ved feil:
```
Script kjører steg 2
→ synops-summarize returnerer exit 1
→ VED_FEIL er definert → prøv alternativ
→ Alternativ feiler også
→ Eskalér til bot-modus for dette steget
→ Boten resonnerer om feilen og prøver å løse det
→ VED_FEIL definert? → kjør alternativ
→ Alternativ feiler også?
→ Opprett work_item med feilbeskrivelse
→ Logger i orchestration_log
→ Stopp orkestreringen
```
Ingen AI-eskalering ved kjøring. Feil håndteres av scriptet
(VED_FEIL) eller blir work_items for manuell/AI-assistert
oppfølging.
### Asynkron modus: "eventually"
Brukeren kan godta at et svar eller script-generering kommer
*etterhvert* i stedet for umiddelbart:
```
Bruker: "Lag en orkestrering for podcast-pipeline"
→ [Nå] [Eventually]
"Eventually":
→ Forespørselen lagres som work_item med tag "script_request"
→ Neste Claude Code-sesjon (task runner) plukker den opp
→ Genererer script med Opus (full verktøy-tilgang, fillesing)
→ Scriptet valideres og lagres
→ Bruker varsles: "Orkestreringen din er klar"
```
Fordeler:
- **Ingen API-kostnad** — Claude Code (betalt) gjør jobben
- **Bedre kvalitet** — Opus med full kontekst, ikke en lettvekts API-modell
- **Ingen hastverk** — script-generering trenger ikke skje i sanntid
Dette gjelder også feilhåndtering: et feilet VED_FEIL-steg
blir en work_item som Claude Code løser i neste sesjon —
reparerer scriptet, legger til manglende verktøy, osv.
## 7. Koblinger mellom orkestreringer
Orkestreringer er noder med edges: