docs: persona-charter + personaliseringsplan godkänd med justeringar
- Checkar in docs/31-persona-personalisering.md (nordstjärna). - Uppdaterar docs/34-personalisering-implementation.md: - R7: välmående / icke-restriktiv hälsa-framing. - Personaliseringstexter = mallar med grundade fakta, inte fri AI-text. - ai_inferred-minnen: låg konfidens, användarbekräftelse, aldrig säkerhetsbeslut. - UPDATE_USER_MEMORY: budgettak + mock-mönster som skanning. - S0 får starta; S1 inväntar godkännande. - Staging helig, prod orörd.
This commit is contained in:
@@ -2,9 +2,7 @@
|
||||
|
||||
> Status: **plan för granskning**. Ingen funktionskod får skrivas förrän planen är godkänd.
|
||||
> Omfattning: Staging endast. Prod/AAMOS förblir orörd.
|
||||
> Mål: mappa persona-chartern (se `docs/31-persona-nordstjärnan.md`)* till konkreta, granskningsbara skivor som återanvänder befintliga motorer.
|
||||
|
||||
\* *Dokumentet `docs/31-persona-nordstjärnan.md` saknas för närvarande i repot. Planen nedan bygger på de principer och datamodeller som redan finns i Del 3–12, Del 29, FAS3/4-audits och minnesarkitekturen i `packages/memory-client`. Om en separat persona-charter checkas in bör den refereras explicit här innan skiva 1 påbörjas.*
|
||||
> Mål: mappa persona-chartern (`docs/31-persona-personalisering.md`) till konkreta, granskningsbara skivor som återanvänder befintliga motorer.
|
||||
|
||||
---
|
||||
|
||||
@@ -13,7 +11,7 @@
|
||||
| Yta | Nuvarande läge | Persona-effekt efter Spår 1 | Varför denna yta? |
|
||||
| --- | --- | --- | --- |
|
||||
| **A. "Vad ska vi äta?" / `GET /v1/recommendations/what-to-eat`** | ✅ Byggd. Rankar recept efter täckning, utgångsdatum, näringsfit, smak, betyg, säsong, högtid, tid, budget, variation, väder, craving. | Recept rangordnas med tydlig proveniens som inkluderar *användarens egna minnen* ("Du lagade kycklinggryta tre tisdagar i rad — här är en annan variant"), *hushållsförbrukningsmönster* och *utgångs-varor*. | Appens viktigaste surface; här märks personliga förslag mest. |
|
||||
| **B. Grupperade sök-svar / recept-sök** | 🔧 Delvis byggd (`/v1/recipes/search` finns troligen; söksvar är grundade i katalogen). | Sökresultat tonas av användarens smakprofil, hushållsbegränsningar och lager. Proaktivt utesluter allergener/undvikanden. | Sök är en aktiv användarintent; personlig rangordning måste vara förklarlig. |
|
||||
| **B. Grupperade sök-svar / recept-sök** | 🔧 Delvis byggd (`/v1/recipes/search` finns troligen; söksvar är grundade i katalogen). | Sökresultat tonas av användarens smakprofil, hushållsbegränsningar och lager. Proaktivt utesluter allergener/undvikanden. **Bygger PÅ befintligt grundat svar (lager + plats + trust-hedge); no-fabrication-grundningen bevaras.** | Sök är en aktiv användarintent; personlig rangordning måste vara förklarlig. |
|
||||
| **C. Proaktiva puffar** | 🔧 `SEND_EXPIRY_NOTIFICATION` körs dagligen kl 07. Matlådepåminnelser finns. | Nya puffar: "Gurkan börjar se trött ut — tre recept du brukar gilla med gurka", "Ni har ätit risotto ofta på söndagar; vill du planera en?" | Hög användarnytta, låg frekvens, kräver explicit opt-in. |
|
||||
| **D. Receptrangordning efter smak/hälsa/lager** | ✅ Motor finns (`packages/recommendation-engine/src/scoring.ts`). | Skapa tre fördefinierade vyer: **Smak** (favoritkök + taste_signals), **Hälsa** (näring mot dagsmål + health_profile), **Lager** (täckning + utgår-snart). Användaren växlar; ingen hemlig viktning. | Ger användaren kontroll och transparens. |
|
||||
| **E. Onboarding-relationen** | ✅ Onboarding med mål, allergier, favoritkök. | Onboarding-klassifikationer skrivs som `user_stated`-minnen och `taste_signals`; de synkroniseras tillbaka till "Vad plattformen vet om mig". | Tidigt förtroende: användaren ser att svaren används. |
|
||||
@@ -64,11 +62,15 @@ Persona-chartern översätts till följande tekniska regler. Varje regel ska gå
|
||||
|
||||
### R1. Grundat, aldrig påhittat
|
||||
- Alla personliga påståenden måste ha ett spårbart ursprung i `memory_items.origin` (`user_stated`, `observed`, `ai_inferred`).
|
||||
- `ai_inferred`-poster visas aldrig utan att användaren kan se att det är ett "mönster vi har observerat" och kan pausa/radera.
|
||||
- `ai_inferred`-poster:
|
||||
- Har **låg startkonfidens** (t.ex. 0.5).
|
||||
- Formuleras som "ett mönster vi sett", aldrig "du gillar".
|
||||
- Kräver **användarbekräftelse eller avfärdande** innan de påverkar rekommendationer som säkerhetsbeslut.
|
||||
- Driver **aldrig** säkerhetsbeslut (allergen/diet/exkludering).
|
||||
- Ingen AI får fabricera recept, ingredienser eller påståenden om användaren.
|
||||
|
||||
### R2. Samtycke + synligt/redigerbart minne
|
||||
- `personalization`-samtycke krävs för alla personliga ytor (redan i `userConsents`).
|
||||
- `personalization`-samtycke krävs för alla personliga ytor (redan i `userConsents`). **Enkeltflaggat samtycke är OK för Spår 1**; granulär uppdelning skjuts till senare spår om behov uppstår.
|
||||
- "Vad plattformen vet om mig" (`GET /v1/me/memory`) visar alla minnen, inklusive ursprung och konfidens.
|
||||
- Användaren kan rätta (`PATCH /v1/me/memory/:id`), pausa (`POST /v1/me/memory/pause-all`) och radera (`DELETE /v1/me/memory/:id` samt `DELETE /v1/me/memory`).
|
||||
- Användarkorrigering ändrar `origin` till `user_stated` och `confidence` till `1`.
|
||||
@@ -91,13 +93,23 @@ Persona-chartern översätts till följande tekniska regler. Varje regel ska gå
|
||||
|
||||
### R6. Proveniens
|
||||
- Varje personaliserat förslag ska kunna förklara *varför* det valdes.
|
||||
- Exempel på provenienssträngar:
|
||||
- "För att du har berättat att du gillar italienskt kök."
|
||||
- "För att ni har tre ägg som bör användas inom två dagar."
|
||||
- "För att du lagat kycklinggryta tre gånger den senaste månaden."
|
||||
- "För att det passar ditt återstående proteinbehov i dag."
|
||||
- **Personaliseringstexter (proveniens, why, puffar) genereras från mallar med grundade fakta**, inte fri AI-text. Mallarna är översatta, skam- och fabriceringsfria per konstruktion.
|
||||
- Exempel på mallar (svenska):
|
||||
- `"För att du har berättat att du gillar {{cuisine}}."`
|
||||
- `"För att ni har {{count}} {{ingredient}} som bör användas inom {{days}} dagar."`
|
||||
- `"För att du lagat {{recipe}} {{count}} gånger den senaste månaden."`
|
||||
- `"För att det passar ditt återstående proteinbehov i dag."`
|
||||
- Förbudslistan (R3) behålls som skyddsnät för mall-renderade strängar.
|
||||
- **Fri AI-text får endast användas för `ai_inferred`-minnesförslag** (events-only + Zod + användarbekräftelse).
|
||||
- Proveniens lagras/transporteras i `ScoredRecommendation.parts` + en ny valfri `provenance` array.
|
||||
|
||||
### R7. Välmående — icke-restriktiv hälsa-framing
|
||||
- Hälso-vyn och all näringsmåls-framing ska vara **stödjande och icke-restriktiv**.
|
||||
- Tillåten copy: `"Passar ditt proteinmål"`, `"Bidrar till dina grönsaker i dag"`.
|
||||
- **Förbjuden copy:** `"Du har överskridit ditt kalorimål"`, `"Bara X kcal kvar"`, `"Begränsa dig"`, `"Undvik …"` eller annan negativ/restriktiv framing.
|
||||
- Näringsmål visas endast för användare som själva har satt dem i `userHealthProfiles`/`userPreferences`.
|
||||
- Copy-granskning + eval-fall ska täcka välmående-framing.
|
||||
|
||||
---
|
||||
|
||||
## 4. SKIVINDELNING — små reviewbara skivor med testplan
|
||||
@@ -106,14 +118,16 @@ Ingen skiva får påbörjas förrän föregående är godkänd. Varje skiva leve
|
||||
|
||||
### Skiva S0 — förberedelse (inga användarfunktioner)
|
||||
**Innehåll:**
|
||||
- Checka in `docs/31-persona-nordstjärnan.md` om den finns separat; annars lyft in charter-reglerna ovan i Del 34.
|
||||
- Säkerställ att `userConsents` för `personalization` läses korrekt överallt.
|
||||
- Checka in `docs/31-persona-nordstjärnan.md` och förankra R1–R7 explicit mot varje avsnitt i chartern.
|
||||
- Säkerställ att `userConsents` för `personalization` läses korrekt överallt. **Enkeltflaggat `personalization`-samtycke är OK för Spår 1** (ingen granulär uppdelning av personalisering ännu).
|
||||
- Uppdatera `packages/recommendation-engine/src/types.ts` med `provenance` och `memorySignalIds` på `ScoredRecommendation`.
|
||||
- Skriv test-fixtur för `taste_signals`, `memory_items`, `cooking_assumption_profiles`.
|
||||
- Sätt upp budgettak + mock-testmönster för `UPDATE_USER_MEMORY` (samma mönster som skanning: `GEMINI_DAILY_BUDGET_USD`, `MockAamosClient`, hermetiska tester).
|
||||
|
||||
**Testplan:**
|
||||
- Typecheck och enhetstester gröna.
|
||||
- Fixturen kan skapa en användare med samtycken, minnen, smaksignaler och matlagningshistorik.
|
||||
- `UPDATE_USER_MEMORY`-anrop kan mockas och kostnadsräknas utan att träffa AAMOS.
|
||||
|
||||
**Estimat:** 1 dag.
|
||||
|
||||
@@ -168,6 +182,8 @@ Ingen skiva får påbörjas förrän föregående är godkänd. Varje skiva leve
|
||||
- Koppla minnen till reella ytor: t.ex. "Du gillar italienskt kök" → visar vilka recept som påverkas.
|
||||
- Lägg till `GET /v1/me/memory/impact` som returnerar vilka rekommendationer som påverkas av ett specifikt minne (utan att exponera andras data).
|
||||
- Förbättra `UPDATE_USER_MEMORY`-jobbet:
|
||||
- Använd samma budgettak + kostnadsräkning som skanning (`packages/ai-contracts/src/gemini.ts`, `GEMINI_DAILY_BUDGET_USD`).
|
||||
- Hermetiska tester med `MockAamosClient` (inga API-nycklar i tester, inga subagents).
|
||||
- Be AAMOS om nya minnesförslag med explicit prompt som förbjuder påhitt.
|
||||
- Validera output mot Zod-kontraktet.
|
||||
- Avvisa förslag som saknar stöd i events.
|
||||
@@ -257,13 +273,17 @@ Ingen skiva får påbörjas förrän föregående är godkänd. Varje skiva leve
|
||||
|
||||
## Godkännande-checklista för planen
|
||||
|
||||
- [ ] Persona-charter (`docs/31-persona-nordstjärnan.md`) checkas in eller refereras korrekt.
|
||||
- [ ] Yt-inventeringen täcker alla AI-nära ytor som ska personaliseras i Spår 1.
|
||||
- [ ] Motor-mappningen anger befintliga motorer/data för varje yta; inga parallella motorer.
|
||||
- [ ] Charter-reglerna (R1–R6) är tydliga och testbara.
|
||||
- [ ] Skivindelningen är tillräckligt liten; varje skiva har testplan.
|
||||
- [ ] Risker och testmetoder accepteras.
|
||||
- [ ] Ingen kod skrivs förrän denna plan är godkänd.
|
||||
- [x] Persona-charter (`docs/31-persona-personalisering.md`) checkas in och förankras.
|
||||
- [x] Yt-inventeringen täcker alla AI-nära ytor som ska personaliseras i Spår 1.
|
||||
- [x] Motor-mappningen anger befintliga motorer/data för varje yta; inga parallella motorer.
|
||||
- [x] Charter-reglerna (R1–R7) är tydliga och testbara.
|
||||
- [x] Personaliseringstexter = mallar med grundade fakta, inte fri AI-text.
|
||||
- [x] `ai_inferred`-minnen: låg konfidens, användarbekräftelse, driver inte säkerhetsbeslut.
|
||||
- [x] `UPDATE_USER_MEMORY`: budgettak + mock-mönster som skanning.
|
||||
- [x] Skivindelningen är tillräckligt liten; varje skiva har testplan.
|
||||
- [x] Risker och testmetoder accepteras.
|
||||
- [x] Ingen kod skrivs förrän denna plan är godkänd.
|
||||
- [x] S0 får starta; S1 påbörjas efter godkännande.
|
||||
|
||||
---
|
||||
|
||||
@@ -272,3 +292,4 @@ Ingen skiva får påbörjas förrän föregående är godkänd. Varje skiva leve
|
||||
| Datum | Revision | Författare |
|
||||
| --- | --- | --- |
|
||||
| 2026-08-10 | Initial plan för granskning | Sven |
|
||||
| 2026-08-10 | Godkänd med justeringar: R7 välmående, mall-baserade texter, ai_inferred-konfidens, UPDATE_USER_MEMORY-budget, docs/31 incheckad | Sven / Johan |
|
||||
|
||||
Reference in New Issue
Block a user