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:
parent
5b6876093e
commit
945e5a90dc
1 changed files with 145 additions and 68 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue