5 Commits

5 changed files with 897 additions and 9 deletions

View File

@ -13,3 +13,7 @@
under `docs/`. under `docs/`.
- En feature ska uppdatera berörda dokument så att repositoryt förblir projektets - En feature ska uppdatera berörda dokument så att repositoryt förblir projektets
facit även efter att feature-branchen har raderats. facit även efter att feature-branchen har raderats.
- Nästa feature ska väljas från `docs/roadmap.md`.
- Roadmapen ska uppdateras innan en feature delas, flyttas, ersätts eller läggs
till. En enskild dialog får inte etablera en alternativ featureplan utan att
repositoryts roadmap uppdateras.

View File

@ -56,6 +56,7 @@ Projektets aktuella arkitektur, utvecklingsprocess, övergripande beslut och
featurehistorik finns i [`docs/`](docs/): featurehistorik finns i [`docs/`](docs/):
- [arkitektur](docs/architecture.md) - [arkitektur](docs/architecture.md)
- [roadmap och planerad featureordning](docs/roadmap.md)
- [utvecklingsprocess](docs/development.md) - [utvecklingsprocess](docs/development.md)
- [arkitekturbeslut](docs/decisions/) - [arkitekturbeslut](docs/decisions/)
- [implementerade features](docs/features/) - [implementerade features](docs/features/)

View File

@ -10,6 +10,9 @@ projektets läge begripligt utan tidigare dialoger eller raderade branches.
- Skapa branchen från en uppdaterad `main`. - Skapa branchen från en uppdaterad `main`.
- En feature per ChatGPT-dialog är en praktisk arbetsform, inte en - En feature per ChatGPT-dialog är en praktisk arbetsform, inte en
dokumentationskälla. dokumentationskälla.
- Välj nästa feature från [`roadmap.md`](roadmap.md).
- Uppdatera roadmapen innan en feature delas, flyttas, ersätts eller läggs till.
En dialog får inte skapa en parallell featureplan som saknas i repositoryt.
- Skapa eller uppdatera feature-dokumentet inom samma feature. - Skapa eller uppdatera feature-dokumentet inom samma feature.
- Ge Codex en tydligt avgränsad specifikation. - Ge Codex en tydligt avgränsad specifikation.
- Implementera endast uttryckliga krav och undvik spekulativ funktionalitet. - Implementera endast uttryckliga krav och undvik spekulativ funktionalitet.
@ -25,15 +28,17 @@ kunna raderas utan att projektkunskap går förlorad.
## Rekommenderad featureprocess ## Rekommenderad featureprocess
1. Uppdatera `main`. 1. Uppdatera `main`.
2. Skapa en avgränsad branch. 2. Välj nästa feature från roadmapen och dokumentera först eventuell ändring av
3. Skapa eller uppdatera feature-dokumentet. planen.
4. Implementera specifikationen. 3. Skapa en avgränsad branch.
5. Kör relevanta automatiska tester och bygge. 4. Skapa eller uppdatera feature-dokumentet.
6. Gör manuell verifiering där det är relevant. 5. Implementera specifikationen.
7. Uppdatera dokumentationen så att den beskriver den faktiska lösningen. 6. Kör relevanta automatiska tester och bygge.
8. Commit och push efter uttrycklig instruktion. 7. Gör manuell verifiering där det är relevant.
9. Merge efter verifiering. 8. Uppdatera dokumentationen så att den beskriver den faktiska lösningen.
10. Radera den mergade branchen. 9. Commit och push efter uttrycklig instruktion.
10. Merge efter verifiering.
11. Radera den mergade branchen.
## Verifiering före merge ## Verifiering före merge

View File

@ -0,0 +1,439 @@
# Feature 3 Uppgiftspoäng
## Status
Planerad.
## Bakgrund
HemHub ska på sikt kunna använda spelifiering för att uppmuntra
familjemedlemmar att utföra uppgifter. Exempel på framtida funktioner kan vara
mål, achievements och belöningar baserade på hur många poäng en användare
samlar under en viss period.
Feature 3 inför den grundläggande poänginformationen på uppgiften. Funktionen
registrerar endast uppgiftens poängvärde. Intjäning av poäng och övrig
spelifiering införs i senare features.
## Mål
Feature 3 ska:
- lägga till ett obligatoriskt poängvärde på varje uppgift;
- låta användaren ange poäng när en uppgift skapas;
- visa poängen på uppgiftskortet;
- validera poängen konsekvent i frontend och backend;
- dokumentera hur lokal utvecklingsdata hanteras.
## Betydelsen av poäng
Poängen uttrycker uppgiftens samlade värde utifrån hur:
- tidskrävande uppgiften är;
- besvärlig uppgiften är;
- viktig uppgiften är.
När poängintjäning införs i en senare feature ska samma värde motsvara hur många
poäng användaren får när uppgiften slutförs.
Poängen är inte en exakt tidsuppskattning. En snabb men viktig uppgift kan
därför ha ett högre poängvärde än en längre men mindre betydelsefull uppgift.
Feature 3 registrerar endast poängvärdet. Den ska inte registrera:
- vem som har tjänat poängen;
- om poängen har delats ut;
- när poängen har tjänats in;
- någon historik över poäng.
## Poängskala
Poäng ska vara ett heltal mellan 1 och 99, inklusive gränsvärdena.
Alla heltal i intervallet är tillåtna. Feature 3 inför inte någon fast skala med
fördefinierade steg.
Giltiga exempel:
- 1
- 7
- 25
- 99
Ogiltiga exempel:
- inget värde;
- `null`;
- 0;
- negativa tal;
- 100 eller högre;
- decimaltal;
- text som inte kan tolkas som ett heltal.
En fast poängskala kan införas senare om erfarenhet från användningen visar att
det är lämpligt.
## Avgränsning
Feature 3 omfattar endast:
- uppgiftens titel;
- uppgiftens valfria beskrivning;
- uppgiftens obligatoriska poängvärde;
- visning av poäng på uppgiftskortet.
Feature 3 ska inte införa:
- tilldelning av uppgifter;
- ändring av uppgiftsstatus;
- drag-and-drop;
- redigering av befintliga uppgifter;
- radering av uppgifter;
- deadlines;
- återkommande uppgifter;
- poänghistorik;
- användares poängsaldo;
- topplistor;
- statistik;
- mål;
- achievements;
- belöningar;
- automatisk utdelning av poäng när en uppgift slutförs.
Dessa funktioner hanteras i senare features enligt roadmapen.
## Användarflöde
När användaren öppnar dialogen för att skapa en uppgift ska formuläret
innehålla:
- titel;
- beskrivning;
- poäng.
Poängfältet ska initialt innehålla värdet `1`.
Användaren kan behålla standardvärdet eller ange ett annat heltal mellan 1 och
99.
När uppgiften skapas ska frontend alltid skicka poängvärdet uttryckligen till
backend. Backend ska inte själv fylla i ett saknat värde.
Efter att en uppgift har skapats framgångsrikt ska formuläret återställas.
Poängfältet ska då återgå till `1`.
Om dialogen stängs och senare öppnas igen ska poängfältet också börja på `1`.
## Skapandedialog
Poäng ska anges med ett vanligt numeriskt inmatningsfält.
Fältet ska ha:
- etiketten `Poäng`;
- initialt värde `1`;
- minsta värde `1`;
- högsta värde `99`;
- heltalssteg.
En kort hjälptext kan visas:
> 199 poäng beroende på hur tidskrävande, besvärlig eller viktig uppgiften är.
Fältet får tillfälligt vara tomt medan användaren redigerar värdet. Frontend ska
inte automatiskt återställa värdet till `1` medan användaren skriver.
Validering ska främst ske när användaren försöker skicka formuläret. Avancerad
validering vid varje tangenttryckning ingår inte i denna feature.
## Frontendvalidering
Frontend ska blockera skapandeanropet om poängen inte är ett heltal mellan 1 och
99.
Vid ett ogiltigt värde ska följande meddelande visas:
> Poäng måste vara ett heltal mellan 1 och 99.
Samma meddelande kan användas för:
- tomt värde;
- värde under 1;
- värde över 99;
- decimaltal;
- annat ogiltigt innehåll.
HTML-fältets attribut för minsta värde, högsta värde och heltalssteg får användas
som stöd, men formulärlogiken ska också kontrollera värdet explicit.
Backend är alltid den slutliga garanten för valideringsreglerna.
## Visning på uppgiftskortet
Uppgiftens poäng ska visas på uppgiftskortet som en kompakt och dynamisk badge.
Badgen ska:
- renderas som en vanlig React- och HTML-komponent;
- använda text och CSS;
- läsa värdet från uppgiftens `points`;
- visa värdet i formatet `{points} p`.
Exempel:
- `1 p`
- `7 p`
- `99 p`
Ingen genererad bild eller statisk grafik ska användas för själva poängvärdet.
Placering och visuell utformning ska följa projektets befintliga skärmbilder och
nuvarande kortdesign. Poängindikatorn ska ligga i kortets metadataområde på
motsvarande plats som poängindikatorn i designreferensen.
Mindre justeringar får göras för att passa den faktiska kortimplementationen.
Feature 3 ska däremot inte införa en ny övergripande design för uppgiftskortet.
## API
Fältnamnet ska vara `points` genomgående i API, backend och frontend.
### Skapa uppgift
Requesten för att skapa en uppgift ska innehålla:
```json
{
"title": "Töm diskmaskinen",
"description": "Ställ in allt i rätt skåp",
"points": 3
}
```
`points` är obligatoriskt.
Backend ska inte tolka ett saknat värde som `1`.
### Uppgiftssvar
API-svar som innehåller en uppgift ska också innehålla `points`.
Exempel:
```json
{
"id": "00000000-0000-0000-0000-000000000000",
"title": "Töm diskmaskinen",
"description": "Ställ in allt i rätt skåp",
"status": "WAITING",
"points": 3,
"createdAt": "2026-07-26T12:00:00Z"
}
```
Det gäller både:
- svaret efter att en uppgift skapats;
- listning av uppgifter.
Det exakta API-formatet ska i övrigt följa den befintliga implementationen.
## Backendregler
En uppgift får aldrig existera med ett poängvärde utanför intervallet 199.
Regeln ska skyddas genom hela backend, inte bara i HTTP-lagret.
Beroende på repositoryts befintliga struktur ska valideringen tillämpas på
relevanta nivåer, exempelvis:
- requestvalidering;
- applikations- eller domänlogik;
- entitetsmodell;
- databasens schema.
Implementation ska följa projektets etablerade kodstruktur och inte introducera
ett nytt arkitekturmönster enbart för denna feature.
## Felhantering
Ett ogiltigt eller saknat `points` ska ge:
```text
400 Bad Request
```
Backend ska använda projektets befintliga felformat och befintliga
felhantering.
Feature 3 ska inte introducera en separat felmodell endast för poäng.
Backend får ge mer precisa valideringsdetaljer för exempelvis:
- saknat värde;
- `null`;
- värde under 1;
- värde över 99.
Frontend behöver inte återge varje backenddetalj separat, utan kan visa det
gemensamma användarmeddelandet:
> Poäng måste vara ett heltal mellan 1 och 99.
Vid andra eller oväntade backendfel ska frontend fortsätta använda projektets
befintliga generella felhantering.
## Databas
Databasschemat ska innehålla ett obligatoriskt heltalsfält för uppgiftens poäng.
Det logiska slutläget är:
```text
points INTEGER NOT NULL
```
Databasen ska, om den befintliga schemahanteringen stödjer det, även skydda
intervallet 199 med en motsvarande constraint.
Databasen ska inte ha ett permanent defaultvärde för nya uppgifter. Nya
uppgifter ska alltid få ett uttryckligt poängvärde från applikationen.
Det förvalda värdet `1` är ett frontendbeteende och inte ett sätt för backend
eller databasen att tyst komplettera ofullständiga anrop.
## Lokal utvecklingsdatabas
Den lokala utvecklingsdatabasen ska vara en in-memory H2-databas.
Databasen och dess innehåll ska återställas när backend startas om.
Lokal utvecklingsdata betraktas därför som tillfällig. Användare och uppgifter
som skapats manuellt under utveckling behöver inte bevaras mellan starter.
Detta innebär att Feature 3 inte behöver migrera verkliga befintliga
utvecklingsposter. En ny databas skapas direkt med det obligatoriska
poängfältet.
Codex ska kontrollera repositoryts faktiska konfiguration. Om H2 för närvarande
är filbaserad ska den ändras till in-memory och relevant
utvecklingsdokumentation ska uppdateras.
## Schemahantering och framtida migrering
Att lokal utvecklingsdata inte bevaras innebär inte att framtida
produktionsdata kan återställas vid varje release.
När HemHub börjar använda en beständig Postgres-databas med data som ska bevaras
måste schemaändringar hanteras med kontrollerade migreringar.
Feature 3 behöver inte införa eller färdigställa hela den framtida
produktionsstrategin om den ännu inte finns i repositoryt.
Projektet använder redan Flyway och versionshanterade migreringar. Feature 3 ska
därför lägga till en ny Flyway-migrering för poängfältet och inte ändra tidigare
migreringar. Hibernate ska fortsatt validera schemat i stället för att skapa
det.
Bytet till in-memory H2 innebär att befintliga lokala utvecklingsposter inte
behöver bevaras eller fyllas på med poäng. Själva schemaändringen ska ändå
hanteras som en kontrollerad migrering så att migrationshistoriken förblir
sammanhängande inför framtida beständig data.
Repositoryts faktiska arkitektur och dokumentation har företräde.
## Backendtester
Feature 3 ska minst verifiera att:
- en uppgift kan skapas med ett giltigt `points`;
- det skapade API-svaret innehåller samma `points`;
- listning av uppgifter innehåller `points`;
- gränsvärdet `1` accepteras;
- gränsvärdet `99` accepteras;
- saknat `points` ger `400 Bad Request`;
- `points: null` ger `400 Bad Request`;
- `points: 0` ger `400 Bad Request`;
- negativa värden ger `400 Bad Request`;
- `points: 100` ger `400 Bad Request`.
Testerna ska följa befintlig teststil och utöka nuvarande tester där det är
lämpligt.
## Frontendtester
Feature 3 ska minst verifiera att:
- skapandedialogen öppnas med poängvärdet `1`;
- ett giltigt poängvärde skickas i create-anropet;
- tomt poängfält blockerar submit;
- ett värde under 1 blockerar submit;
- ett värde över 99 blockerar submit;
- ett ogiltigt värde visar felmeddelandet;
- formuläret återställs till poängvärdet `1` efter lyckad skapning;
- ett uppgiftskort visar uppgiftens dynamiska poängbadge;
- badgen visar värdet från uppgiftsdata, exempelvis `7 p`.
Testerna ska inte vara beroende av en viss pixelplacering eller detaljerad CSS.
## Manuell verifiering
Följande ska verifieras manuellt:
1. Starta frontend och backend enligt projektets utvecklingsinstruktioner.
2. Skapa en uppgift utan att ändra poängfältet.
3. Verifiera att uppgiften får `1 p`.
4. Skapa en uppgift med ett mellanvärde, exempelvis `7`.
5. Verifiera att uppgiften får `7 p`.
6. Skapa en uppgift med `99`.
7. Verifiera att uppgiften får `99 p`.
8. Försök skapa en uppgift med tomt poängfält.
9. Verifiera att anropet blockeras och att rätt felmeddelande visas.
10. Försök använda värdena `0` och `100`.
11. Verifiera att båda avvisas.
12. Kontrollera att poängbadgen följer projektets designreferens och fungerar
med ett- och tvåsiffriga värden.
13. Starta om backend.
14. Verifiera att den lokala utvecklingsdatan inte finns kvar.
## Acceptanskriterier
Feature 3 är klar när:
- varje ny uppgift har ett obligatoriskt `points`;
- `points` är ett heltal mellan 1 och 99;
- frontendens standardvärde är `1`;
- frontend alltid skickar `points` uttryckligen;
- backend avvisar saknat eller ogiltigt `points`;
- backend fyller inte automatiskt i ett saknat värde;
- uppgiftens poäng returneras av API:t;
- uppgiftens poäng visas dynamiskt på uppgiftskortet;
- frontend- och backendtester täcker centrala giltiga och ogiltiga fall;
- lokal H2 körs som in-memory och återställs vid omstart;
- relevant dokumentation är uppdaterad;
- Feature 3 inte inför funktionalitet som hör till senare features.
## Implementationsprinciper
När Feature 3 senare implementeras ska Codex först läsa:
```text
AGENTS.md
README.md
docs/architecture.md
docs/development.md
docs/roadmap.md
docs/decisions/
docs/features/
```
Codex ska även läsa relevant backendkod, frontendkod och befintliga tester innan
ändringar görs.
Repositoryts faktiska kod och dokumentation har företräde framför antaganden i
denna featurebeskrivning.
Dokumentation, implementation och tester ska uppdateras tillsammans.
Codex ska inte committa, pusha, skapa pull request eller merga utan uttrycklig
instruktion.

439
docs/roadmap.md Normal file
View File

@ -0,0 +1,439 @@
# HemHub roadmap
## Syfte
Roadmapen är HemHubs styrande plan för val och ordning av kommande features. Den
utgår från den faktiska implementationen efter Feature 2 och från beslut som
dokumenterats i arkitektur- och beslutsdokumenten.
Planen är ändringsbar. Ordningen uttrycker nuvarande prioritering och beroenden,
inte ett löfte om att alla features måste genomföras oförändrade.
## Regler för användning
- Nästa feature ska väljas från denna roadmap.
- Feature 02 behåller sina nummer och sin historiska betydelse.
- Ändra roadmapen innan en feature delas, flyttas, ersätts eller läggs till.
- Dokumentera motiv och beroendeförändringar innan utveckling påbörjas.
- En ChatGPT- eller Codex-dialog får inte skapa en alternativ featureplan utan
att roadmapen först uppdateras i repositoryt.
- Håll varje feature tillräckligt liten för separat implementation och
verifiering.
- Beskriv mål och affärsregler här; bindande implementationsdetaljer hör till
feature-specifikationen och relevanta beslutsdokument.
- En designfeature producerar dokument och beslut, inte produktionskod, om inget
annat uttryckligen beslutas.
Följande statusvärden används:
- **Klar** implementerad, verifierad och mergad.
- **Planerad** ingår i nuvarande ordning men har inte påbörjats.
- **Pågående** utveckling pågår i en aktiv feature.
- **Villkorad** genomförs endast om det angivna villkoret uppfylls.
- **Ersatt** har ersatts av en dokumenterad annan feature eller plan.
## Nuvarande läge
Feature 02 är klara. Den aktuella applikationen har:
- ett monorepo med separat React/Vite-frontend och Spring Boot-backend;
- centralt lagrade användare och ett lokalt browserval av aktiv användare;
- gemensamma uppgifter med titel, valfri beskrivning och status;
- skapande och listning av uppgifter;
- en bräda med Väntande, Pågående och Klart;
- nya uppgifter som alltid skapas med status `WAITING`.
Det finns ännu inga poäng, uppgiftstilldelningar, statusändringar,
drag-and-drop, redigeringar, raderingar, deadlines eller återkommande uppgifter.
Nuvarande användarval är inte autentisering.
**Feature 3 Uppgiftspoäng är nästa planerade produktfeature.**
## Featureöversikt
| Feature och namn | Status | Beroenden | Huvudsakligt resultat |
| --- | --- | --- | --- |
| 0 Projektgrund | Klar | | Körbar frontend, backend och lokal API-koppling |
| 1 Användarval | Klar | 0 | Centrala användare och lokalt aktivt användar-id |
| 2 Skapa uppgifter | Klar | 01 | Gemensamma uppgifter och trekolumnsbräda |
| 3 Uppgiftspoäng | Planerad | 2 | Poäng på uppgifter |
| 4 Tilldelning | Planerad | 12 | Valfri ansvarig användare |
| 5 Statusändring | Planerad | 4 | Backendstyrda statusövergångar |
| 6 Drag-and-drop | Planerad | 5 | Kortflytt via status-API |
| 7 Radera uppgift | Planerad | 2 | Bekräftad radering |
| 8 Redigera uppgift | Planerad | 3 | Titel, beskrivning och poäng |
| 9 Deadline | Planerad | 2 | Valfri deadline och förseningsmarkering |
| 10 Sökning och filtrering | Planerad | 2; 4 för ansvarig; 9 för deadline | Sökning och filter på brädan |
| 11 Design av återkommande uppgifter | Planerad | 35, 9 | Beslut och plan, ingen produktionskod |
| 12 Återkommande uppgifter | Planerad | 5, 9, 11 | Implementerad återkommandemodell |
| 13 Poänghistorik och summering | Planerad | 35, 12 | Slutförandehistorik och summering |
| 14 PostgreSQL | Planerad | 013 | Verifierad produktionsdatabas |
| 15 Dockerpaketering | Planerad | 14 | Images och produktionslik lokal körning |
| 16 Pipeline och deployment | Planerad | 15 | Bygge, publicering och drift på Biff |
| 17 Autentisering | Villkorad | 16, extern åtkomst | Säker internetexponering |
## Genomförda features
### Feature 0 Projektgrund
**Status:** Klar
Feature 0 etablerade monorepot, React/Vite-frontend, Spring Boot-backend,
health-endpoint, lokal Vite-proxy och grundtester. Den faktiska lösningen
beskrivs i
[`000-project-foundation.md`](features/000-project-foundation.md).
### Feature 1 Användarval
**Status:** Klar
Feature 1 införde skapande och listning av användare, val av aktiv användare och
lokal lagring av användarens id. Lösningen är ett browserlokalt användarval,
inte riktig autentisering. Den faktiska lösningen beskrivs i
[`001-user-selection.md`](features/001-user-selection.md).
### Feature 2 Skapa uppgifter
**Status:** Klar
Feature 2 införde en grundläggande uppgiftsmodell, API för att lista och skapa
uppgifter samt en bräda med tre statuskolumner. Uppgifter har titel, valfri
beskrivning och status; nya uppgifter skapas som `WAITING`. Den faktiska
lösningen beskrivs i
[`002-task-creation.md`](features/002-task-creation.md).
## Fas 1 Komplettera den centrala uppgiftsmodellen
Fasen lägger till den domändata och de backendregler som behövs innan mer
interaktiv brädhantering införs.
### Feature 3 Uppgiftspoäng
**Status:** Planerad
**Beroenden:** Feature 2
**Mål:**
- lägga till obligatoriska poäng på uppgifter;
- välja och dokumentera poängskala;
- ange poäng vid skapande;
- visa poäng på uppgiftskort;
- migrera befintliga uppgifter kontrollerat.
Feature 3 ligger först eftersom poäng blir ett centralt uppgiftsfält som senare
ska kunna redigeras och historikföras.
**Öppna frågor:**
- exakt poängskala;
- standardvärde för befintliga uppgifter.
### Feature 4 Tilldelning av uppgifter
**Status:** Planerad
**Beroenden:** Feature 1 och Feature 2
**Mål:**
- lägga till en valfri ansvarig användare;
- tillåta ansvarig vid skapande;
- visa ansvarig på uppgiftskort;
- kunna ändra ansvarig på en befintlig uppgift.
En väntande uppgift får vara tilldelad eller otilldelad. Tilldelning införs före
statusändring eftersom en pågående uppgift senare måste ha en ansvarig.
**Öppna frågor:**
- om en uppgift ska ha endast en ansvarig;
- hur borttagna användare ska hanteras när användarradering införs.
### Feature 5 Statusändring och statusregler
**Status:** Planerad
**Beroenden:** Feature 4
**Mål:**
- införa backend-API för statusändring;
- stödja `WAITING`, `IN_PROGRESS` och `COMPLETED`;
- säkerställa statusregler i backend;
- ge ett enkelt UI för statusändring före drag-and-drop.
`IN_PROGRESS` kräver en ansvarig användare. Statusflödet införs före
drag-and-drop så att affärsregeln och API:t kan verifieras utan att samtidigt
bygga en komplex interaktion.
**Öppna frågor:**
- vad som sker när en otilldelad uppgift sätts till `IN_PROGRESS`;
- om aktiv användare ska föreslås automatiskt;
- vad som sker om ansvarig tas bort från en pågående uppgift.
### Feature 6 Drag-and-drop
**Status:** Planerad
**Beroenden:** Feature 5
**Mål:**
- flytta uppgiftskort mellan statuskolumner;
- använda status-API:t från Feature 5;
- hantera serverfel och återställning av UI;
- hantera en otilldelad uppgift som flyttas till Pågående.
Drag-and-drop kommer efter det enklare statusflödet för att återanvända
verifierade backendregler.
**Öppna frågor:**
- optimistisk eller serverbekräftad uppdatering;
- exakt tilldelningsflöde vid flytt till Pågående.
## Fas 2 Hantering av uppgifter
Fasen kompletterar livscykeln för enskilda uppgifter efter att den centrala
modellen och statusreglerna finns.
### Feature 7 Radera uppgift
**Status:** Planerad
**Beroenden:** Feature 2
**Mål:**
- införa backend-API för radering;
- radera en uppgift från brädan;
- kräva bekräftelse före radering.
Radering hålls separat från redigering så att databorttagning och dess
konsekvenser kan verifieras isolerat.
**Öppen fråga:**
- permanent radering eller mjuk radering.
### Feature 8 Redigera uppgift
**Status:** Planerad
**Beroenden:** Feature 3
**Mål:**
- ändra titel;
- ändra beskrivning;
- ändra poäng.
Featuren ligger efter poäng för att redigeringsflödet ska omfatta den då
aktuella uppgiftsmodellen. Ansvarig ska fortsatt ändras genom
tilldelningsflödet från Feature 4 och status genom statusflödet från Feature 5.
### Feature 9 Deadline
**Status:** Planerad
**Beroenden:** Feature 2
**Mål:**
- lägga till en valfri deadline;
- stödja beslutad representation av datum och eventuell tid;
- visa deadline på uppgiftskort;
- markera försenade uppgifter.
Deadline införs före återkommande uppgifter eftersom framtida förekomster måste
kunna ärva eller beräkna deadlines.
**Öppna frågor:**
- datum utan tid eller datum och tid;
- tidszonshantering;
- definition av en försenad uppgift.
### Feature 10 Sökning och filtrering
**Status:** Planerad
**Beroenden:** Feature 2; Feature 4 för ansvarigfilter; Feature 9 om
deadlinefilter ska ingå
**Mål:**
- söka på titel och beskrivning;
- filtrera på ansvarig och status;
- eventuellt filtrera på deadline.
Datamängden i ett familjehushåll är sannolikt liten. Klientbaserad sökning kan
därför vara tillräcklig initialt, men valet ska göras i feature-specifikationen.
Sökning på titel och beskrivning samt statusfiltrering kan byggas från Feature
2. Filtrering på ansvarig kräver Feature 4, och deadlinefilter kräver Feature 9
om det ska ingå.
**Öppen fråga:**
- klientbaserad eller serverbaserad sökning.
## Fas 3 Återkommande arbete och historik
Fasen kräver först ett uttryckligt modellbeslut, eftersom återkommande arbete
påverkar status, deadline, ansvarig och poäng.
### Feature 11 Design av återkommande uppgifter
**Status:** Planerad
**Typ:** Designfeature
**Beroenden:** Beslutade modeller från Feature 35 och Feature 9
**Ingen produktionskod ska implementeras i denna feature.**
**Mål:**
- besluta skillnaden mellan uppgiftsmall och konkret förekomst;
- definiera hur nästa förekomst skapas;
- definiera vad slutförande betyder;
- definiera hur en förekomst hoppas över;
- definiera hur ändringar påverkar framtida förekomster;
- definiera hur ansvarig, poäng och deadline ärvs.
Resultatet ska vara ett beslutsdokument och en avgränsad implementationsplan för
Feature 12. Designsteget ligger före implementationen för att undvika att
domänbeslut byggs in implicit.
### Feature 12 Implementera återkommande uppgifter
**Status:** Planerad
**Beroenden:** Feature 5, Feature 9 och Feature 11
**Mål:**
- implementera modellen som beslutades i Feature 11.
### Feature 13 Poänghistorik och summering
**Status:** Planerad
**Beroenden:** Feature 3, Feature 4, Feature 5 och Feature 12
**Mål:**
- registrera vem som slutförde en uppgift;
- registrera när uppgiften slutfördes;
- summera poäng per användare och period;
- visa enkel historik.
Historik ligger efter status, poäng och återkommande uppgifter eftersom
slutförandet måste vara en backendvaliderad händelse med ett definierat
poängvärde och en definierad konkret förekomst.
**Öppna frågor:**
- om tilldelad och slutförande användare kan vara olika;
- om poäng delas ut vid varje återkommande förekomst;
- hur återöppnade uppgifter påverkar historik.
## Fas 4 Produktion
Produktionsfasen realiserar den beslutade riktningen i
[`005-production-deployment-direction.md`](decisions/005-production-deployment-direction.md).
Inget i denna fas är implementerat i nuläget.
### Feature 14 PostgreSQL och produktionsdatabas
**Status:** Planerad
**Beroenden:** Föregående produktfeatures vars persistens ska produktionssättas
**Mål:**
- lägga till produktionskonfiguration för PostgreSQL;
- verifiera Flyway-migreringar mot PostgreSQL;
- införa PostgreSQL-baserade integrationstester, exempelvis med Testcontainers;
- behålla en enkel lokal utvecklingsupplevelse.
PostgreSQL införs före paketering för att databasdrivrutin, migreringar och
konfiguration ska vara verifierade innan en produktionslik stack byggs.
**Öppen fråga:**
- om lokal utveckling fortsatt ska kunna använda H2.
### Feature 15 Dockerpaketering
**Status:** Planerad
**Beroenden:** Feature 14
**Mål:**
- skapa en backend-image;
- skapa en frontend-image;
- stödja produktionslik lokal körning;
- ge same-origin `/api` via Nginx.
Paketeringen kommer före pipelinearbetet så att images kan byggas och verifieras
lokalt.
### Feature 16 Pipeline och deployment
**Status:** Planerad
**Beroenden:** Feature 15
**Mål:**
- skapa en Drone-pipeline;
- publicera images till ett privat registry;
- driftsätta på Ubuntu-servern Biff;
- uppdatera tjänster med Watchtower;
- införa nödvändig Nginx-konfiguration;
- hantera secrets utanför Git.
Exakta miljödetaljer ska beslutas inom featuren och känsliga värden ska inte
committas.
## Fas 5 Eventuell extern åtkomst
### Feature 17 Autentisering och internetexponering
**Status:** Villkorad
**Beroenden:** Beslut att exponera HemHub mot internet och en säker
produktionsgrund, normalt Feature 16
Featuren ska endast genomföras om HemHub ska göras åtkomlig från internet.
Nuvarande aktiva användarval är uttryckligen inte autentisering.
**Mål:**
- införa riktig autentisering;
- införa behörighetsregler;
- använda säker sessions- eller tokenhantering;
- konfigurera TLS och extern exponering;
- säkerhetsgranska API och deployment.
## Öppna tvärgående frågor
- Vilken poängskala ska användas och vilket standardvärde får befintliga
uppgifter?
- Ska uppgifter raderas permanent eller mjukt?
- Hur ska datum, tider och tidszoner representeras?
- Ska H2 behållas för lokal utveckling efter PostgreSQL-införandet?
- Hur ska användare senare kunna redigeras eller raderas, särskilt när de är
ansvariga för eller har slutfört uppgifter?
- Vid vilken typ av extern åtkomst krävs riktig autentisering?
- Hur ska UI-designen från befintliga skisser införas inkrementellt utan att
blanda in framtida funktionalitet?
## Ändringshistorik
- 2026-07-26: Roadmapen etablerades. Feature 02 markerades som klara, Feature
316 planerades och Feature 17 markerades som villkorad.