Oppgaver: tre nivåer (proposal → oppdrag → task) med chat

Proposals = halvtenkte ideer, diskuteres i tilknyttet chat.
Oppdrag = godkjente konsepter, splittes til tasks av agent.
Tasks = konkrete steg, plukkes atomisk.
Prioritering, pause, blokkering, eskalering.
Tilbakemelding og spørsmål direkte i oppdragets chat.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-19 17:31:25 +00:00
parent 5b6876093e
commit 945e5a90dc

View file

@ -1,58 +1,113 @@
# Oppgaver som noder # Oppgaver, oppdrag og proposals som noder
Oppgaver er noder i grafen. Ingen separat tabell, ingen filer. Alt er noder. Tre typer arbeid med ulik modenhet:
Samme primitiver som alt annet i Synops.
## 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: { metadata: {
priority: 100, // lavere = viktigere status: "draft" | "discussed" | "approved" | "rejected" | "parked",
status: "open", // open | active | done | blocked | question category: "ui" | "platform" | "infra" | "feature" | "content",
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
} }
``` ```
## 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) metadata: {
task --[assigned_to]--> agent/person (hvem jobber på den) status: "open" | "planning" | "active" | "paused" | "done" | "blocked",
task --[belongs_to]--> collection (tilhører et prosjekt, valgfritt) priority: 100, // lavere = viktigere
task --[related_to]--> task (avhengigheter mellom oppgaver) 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 | ### Task (`node_kind: 'task'`)
|-------|----------|
| 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 |
## 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` ## Hierarki
- Admin-panel: oppgaveliste med "ny oppgave"-knapp
- Epost: `vaktmester@synops.no` med `/task ...`
- Programmatisk: `synops-agent` eller maskinrommet
### 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 ```sql
SELECT * FROM nodes SELECT * FROM nodes
WHERE node_kind = 'task' WHERE node_kind = 'task'
@ -62,49 +117,71 @@ LIMIT 1
FOR UPDATE SKIP LOCKED FOR UPDATE SKIP LOCKED
``` ```
`FOR UPDATE SKIP LOCKED` gir atomisk plukking — flere agenter ## Tilbakemelding og spørsmål
kan kjøre parallelt uten konflikter.
### 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 assignment --[has_discussion]--> communication
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'
``` ```
Oppgaver som har stått "active" i >60 min uten oppdatering Flyten:
→ sett tilbake til `status: "open"`, nullstill `agent_id`. 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 ## Visning
### Admin-panel ### Admin-panel (Vegard)
- Alle oppgaver gruppert: proposals | oppdrag | tasks
Oppgaveliste med:
- Filtrer på status, kategori, prioritet - Filtrer på status, kategori, prioritet
- Drag-and-drop for prioritetsendring - Drag-and-drop for prioritetsendring
- Klikk for å åpne/redigere - Klikk → se detaljer + chat
- Vis hvem som jobber på hva - "Godkjenn proposal" → opprett oppdrag
- "Pause" / "Gjenoppta" knapper
### Mine ting ### Mine ting (alle brukere)
- Tasks tildelt deg
Oppgaver du er tildelt vises under "Mine oppgaver". - Oppdrag du eier
### Vaktmester-chat ### 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 Vegard: Pause LaTeX, ta fargevelger-buggen først
aktive oppgaver med status. 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 ## Krasj-deteksjon
opprettes som task-noder. Kan gjøres manuelt (admin-panel)
eller via et migreringsscript. ```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.