# Oppgaver, oppdrag og proposals som noder Alt er noder. Tre typer arbeid med ulik modenhet: ## Tre node-typer ### Proposal (`node_kind: 'proposal'`) Halvtenkte konsepter, ideer, ønsker. Ikke klare for implementering. ``` metadata: { status: "draft" | "discussed" | "approved" | "rejected" | "parked", category: "ui" | "platform" | "infra" | "feature" | "content", } ``` Opprettet via: vaktmester-chat (`/proposal ...`), admin-panel, epost. Kan diskuteres i en tilknyttet chat (kommunikasjonsnode med `belongs_to`-edge). Når den er moden nok → godkjennes → blir oppdrag. ### Oppdrag (`node_kind: 'assignment'`) Konkret arbeid som skal gjøres. Kan splittes i tasks av agenten. ``` metadata: { status: "open" | "planning" | "active" | "paused" | "done" | "blocked", priority: 100, // lavere = viktigere category: "ui" | "platform" | "infra" | "feature" | "bug", assigned_to: null, // agent eller person node_id source_proposal: null, // proposal-node som dette kom fra } ``` Når en agent mottar et oppdrag: 1. Leser beskrivelse og kontekst 2. Splitter til tasks om nødvendig 3. Jobber gjennom tasks sekvensielt 4. Rapporterer tilbake i oppdragets chat ### Task (`node_kind: 'task'`) Konkret, avgrenset steg. En agent kan plukke og fullføre dette i én sesjon. ``` metadata: { status: "open" | "active" | "done" | "failed" | "skipped", priority: 100, agent_id: null, // hvem jobber på den started_at: null, completed_at: null, result: null, // "success" | "failed" | "escalated" } ``` ## Hierarki ``` Proposal ("Støtte for LaTeX i editoren") └── approved → Oppdrag ("Implementer LaTeX-støtte") ├── Task: "Legg til KaTeX-avhengighet" ├── Task: "Utvid TipTap med LaTeX-node" ├── Task: "Legg til markup-toggle i UniversalInput" └── Task: "Test med matematiske formler" ``` Edges: ``` proposal --[promoted_to]--> assignment assignment --[split_into]--> task assignment --[split_into]--> task task --[depends_on]--> task (rekkefølge) ``` ## Statuser og overganger ### Proposal ``` draft → discussed → approved → (oppdrag opprettes) → rejected → parked (god idé, ikke nå) ``` ### Oppdrag ``` open → planning (agent planlegger, splitter til tasks) → active (under arbeid) → paused (satt på vent av Vegard) → done → blocked (trenger avklaring) ``` ### Task ``` open → active (agent jobber) → done → failed (agent klarte ikke) → skipped (ikke lenger relevant) ``` ## Prioritering Vegard kan omprioritere når som helst: - Endre `priority`-verdi (lavere = viktigere) - Sette `status: "paused"` for å fryse et oppdrag - Flytte tasks mellom oppdrag Agenten respekterer prioritet ved plukking: ```sql SELECT * FROM nodes WHERE node_kind = 'task' AND metadata->>'status' = 'open' ORDER BY (metadata->>'priority')::int ASC LIMIT 1 FOR UPDATE SKIP LOCKED ``` ## Tilbakemelding og spørsmål Hvert oppdrag og proposal har en tilknyttet kommunikasjonsnode (chat). Agenten stiller spørsmål der. Vegard svarer der. ``` assignment --[has_discussion]--> communication ``` Flyten: 1. Agent starter på oppdrag 2. Støter på uklarhet 3. Skriver spørsmål i oppdragets chat 4. Setter oppdrag `status: "blocked"` 5. Vegard får varsel (toast + evt. epost) 6. Vegard svarer i chatten 7. Agent leser svaret, fortsetter, setter `status: "active"` Samme chat brukes for fremdriftsrapportering: - "Task 1/4 fullført. Commitet: abc123" - "Støtte på problem med X, eskalerer til Claude Code" - "Ferdig. 4/4 tasks fullført. Se diff: ..." ## Visning ### Admin-panel (Vegard) - Alle oppgaver gruppert: proposals | oppdrag | tasks - Filtrer på status, kategori, prioritet - Drag-and-drop for prioritetsendring - Klikk → se detaljer + chat - "Godkjenn proposal" → opprett oppdrag - "Pause" / "Gjenoppta" knapper ### Mine ting (alle brukere) - Tasks tildelt deg - Oppdrag du eier ### Vaktmester-chat ``` Vegard: Hva jobbes det med? Agent: Oppdrag #3 "LaTeX-støtte" — task 2/4 aktiv (TipTap-node) Vegard: Pause LaTeX, ta fargevelger-buggen først Agent: Pauset oppdrag #3. Plukker bug #7 "Fargevelger..." Vegard: /proposal Kanskje vi bør ha dark/light toggle Agent: Opprettet proposal "Dark/light toggle". Diskuter videre? ``` ## Krasj-deteksjon ```sql -- Tasks som har stått active >60 min uten oppdatering UPDATE nodes SET metadata = jsonb_set( jsonb_set(metadata, '{status}', '"open"'), '{agent_id}', 'null' ) WHERE node_kind = 'task' AND metadata->>'status' = 'active' AND (metadata->>'started_at')::timestamptz < now() - interval '60 minutes'; ``` ## Migrering Eksisterende proposals i `docs/proposals/*.md` kan opprettes som proposal-noder. Innholdet i markdown-filene flyttes til `content`- feltet. Filene beholdes som referanse men er ikke lenger den autoritative kilden.