Doku: Anforderungen + ADRs (Symfony, htmx, SQLite, HA-Consumer)

This commit is contained in:
2026-09-13 10:25:53 +02:00
parent 4049becb4b
commit f1515d301c
8 changed files with 270 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# 006 – Inspiration-Algorithmus: gewichteter Mix (offene Gewichtung)
**Status:** proposed (Gewichtung offen, Algorithmus fix)
**Kontext.** „Inspiration" schlägt **jeweils 5** Gerichte aus dem Archiv vor,
neue 5 auf Button. Der Betreiber möchte einen **Mix aus drei Kriterien**:
lange nicht gekocht, seltene (wenige Auftritte) und beliebte (häufig gekocht).
Genauere Gewichtung und die Definition von „seltene" / „beliebte" werden bei
der Implementierung festgelegt.
**Entscheidung (Prinzip).** Score-Funktion `score(g)` mit drei Termen:
1. **Staleness**: `now - max(gegessen_am)` (normiert an die älteste
`gegessen_am`) → gewichtet mit `w_slow` (>0, primär, z. B. 0.5).
2. **Rarity**: `1 / (auftritt_count + 1)` (auftritt = Anzahl aller Einträge
mit gleichem `name`) → gewichtet mit `w_rare` (sekundär, z. B. 0.3).
3. **Popularity**: `auftritt_count / max(auftritt_count)` → gewichtet mit
`w_hot` (tertiär, z. B. 0.2).
`score = w_slow*stale + w_rare*rare + w_hot*hot`, Sortierung absteigend.
`w_slow + w_rare + w_hot = 1.0`; konkrete Werte in `config/inspirations.yaml`
und per ADR-006-Bis (Patch) fixieren, wenn die App läuft.
**Konsequenzen.**
- + Alle drei Nutzerintentionen (Alte, Seltene, Beliebte) sind vertreten.
- + Gewichte prozentual änderbar, ohne Code.
- − „Beliebte" ist kontraintuitiv, wenn der Nutzer genau das **nicht**
möchte (z. B. „mööchte etwas Neues"). Dann `w_hot=0`.
- Offene Fragen:
- [ ] Gewichte `w_slow/w_rare/w_hot` (Default: 0.5/0.3/0.2?)
- [ ] „Auftritt" zählt **Alle Zeit** oder **letzte N Tage**? (Vorschlag: alle Zeit)
- [ ] Deduping gegen die letzte 5er-Ladung? (Vorschlag: ja, Session-basiert)