diff --git a/docs/infra/oppgaver.md b/docs/infra/oppgaver.md index 2c5bb0a..2e176f8 100644 --- a/docs/infra/oppgaver.md +++ b/docs/infra/oppgaver.md @@ -1,58 +1,113 @@ -# Oppgaver som noder +# Oppgaver, oppdrag og proposals som noder -Oppgaver er noder i grafen. Ingen separat tabell, ingen filer. -Samme primitiver som alt annet i Synops. +Alt er noder. Tre typer arbeid med ulik modenhet: -## Node-type +## Tre node-typer + +### Proposal (`node_kind: 'proposal'`) + +Halvtenkte konsepter, ideer, ønsker. Ikke klare for implementering. ``` -node_kind: 'task' -title: "Fiks resize på mobil" -content: "Beskrivelse, akseptkriterier, kontekst..." -visibility: 'hidden' metadata: { - priority: 100, // lavere = viktigere - status: "open", // open | active | done | blocked | question - category: "ui", // ui | platform | infra | feature | bug - agent_id: null, // node_id til agenten som jobber på den - started_at: null, // timestamp - completed_at: null, // timestamp - result: null, // "success" | "failed" | "escalated" - refs: ["docs/proposals/mine_ting.md"] // referanser + status: "draft" | "discussed" | "approved" | "rejected" | "parked", + category: "ui" | "platform" | "infra" | "feature" | "content", } ``` -## Edges +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. ``` -task --[created_by]--> person (hvem opprettet) -task --[assigned_to]--> agent/person (hvem jobber på den) -task --[belongs_to]--> collection (tilhører et prosjekt, valgfritt) -task --[related_to]--> task (avhengigheter mellom oppgaver) +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 +} ``` -## Prioriteter +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 -| Verdi | Kategori | -|-------|----------| -| 100 | UI-forbedringer (pågående arbeid) | -| 200 | Høy prioritet (grunnleggende plattform) | -| 300 | Middels prioritet (produksjon og samarbeid) | -| 400 | Infrastruktur | -| 500 | Lavthengende frukt | -| 600 | Fremtidige features | +### Task (`node_kind: 'task'`) -## Arbeidsflyt +Konkret, avgrenset steg. En agent kan plukke og fullføre dette +i én sesjon. -### Opprette oppgaver +``` +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" +} +``` -- Vegard i vaktmester-chat: `/task Fiks resize på mobil` -- Admin-panel: oppgaveliste med "ny oppgave"-knapp -- Epost: `vaktmester@synops.no` med `/task ...` -- Programmatisk: `synops-agent` eller maskinrommet +## Hierarki -### Agent plukker oppgave +``` +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' @@ -62,49 +117,71 @@ LIMIT 1 FOR UPDATE SKIP LOCKED ``` -`FOR UPDATE SKIP LOCKED` gir atomisk plukking — flere agenter -kan kjøre parallelt uten konflikter. +## Tilbakemelding og spørsmål -### Agent jobber +Hvert oppdrag og proposal har en tilknyttet kommunikasjonsnode +(chat). Agenten stiller spørsmål der. Vegard svarer der. -1. Sett `status: "active"`, `agent_id`, `started_at` -2. Les `content` og `refs` for kontekst -3. Utfør oppgaven (implementer, skriv, commit) -4. Sett `status: "done"`, `completed_at`, `result` - -### Krasj-deteksjon - -```sql -SELECT * FROM nodes -WHERE node_kind = 'task' -AND metadata->>'status' = 'active' -AND (metadata->>'started_at')::timestamptz < now() - interval '60 minutes' +``` +assignment --[has_discussion]--> communication ``` -Oppgaver som har stått "active" i >60 min uten oppdatering -→ sett tilbake til `status: "open"`, nullstill `agent_id`. +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 - -Oppgaveliste med: +### Admin-panel (Vegard) +- Alle oppgaver gruppert: proposals | oppdrag | tasks - Filtrer på status, kategori, prioritet - Drag-and-drop for prioritetsendring -- Klikk for å åpne/redigere -- Vis hvem som jobber på hva +- Klikk → se detaljer + chat +- "Godkjenn proposal" → opprett oppdrag +- "Pause" / "Gjenoppta" knapper -### Mine ting - -Oppgaver du er tildelt vises under "Mine oppgaver". +### 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 kan spørre: "Hva jobbes det med nå?" → agent lister -aktive oppgaver med status. +Vegard: Pause LaTeX, ta fargevelger-buggen først +Agent: Pauset oppdrag #3. Plukker bug #7 "Fargevelger..." -## Migrering fra tasks.md +Vegard: /proposal Kanskje vi bør ha dark/light toggle +Agent: Opprettet proposal "Dark/light toggle". Diskuter videre? +``` -Eksisterende oppgaver fra den gamle tasks.md-listen bør -opprettes som task-noder. Kan gjøres manuelt (admin-panel) -eller via et migreringsscript. +## 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.