- Convert C:\Users\Public\cibello-verified-final-result.json to
packages/database/src/seed/data/verified-recipes.ts (committed, hermetic).
- Replace/extend the 23 placeholder SEED_RECIPES via re-export.
- Upsert on slug with onConflictDoUpdate of ALL recipe fields.
- Hard-reject recipes with unmapped canonical ingredients (0 rejected this batch).
- Derive allergens and compute nutrition per portion from ingredients at seed time.
- Run food-safety lint; auto-patch 8 legacy raw-protein recipes with safe-cooking phrase.
- Resolve 4 suspected title duplicates via variantOfSlug.
- Guard brand name: creatorDisplayName uses BRAND.name, never JSON placeholder.
- Preserve verificationStatus (editorial/verified) and source-registry FKs.
- Extend allergen-invariant test to cover full 246-recipe catalog.
- Stabilise API tests by disabling file parallelism (flakiness from shared DB state).
Refs: seed pipeline, brand-guard, safety canary
- Nya toppnivåblock i /ops/v1/summary: ai_scan, aktivering, engagemang,
betalning, jobb, sakerhet. Alla värden läses från DB/cache; null där data
saknas, inga påhittade värden.
- AI-kostnad i USD mikrocent (native); intäkter fortsatt SEK-öre.
- product_analytics_events är källa för volym, latens, lyckandegrad,
felfrekvens, aktivering, retention och engagemang.
- Nya händelser: scan_started (API) och scan_failed/scan_completed med
latencyMs + felkod (worker). latencyMs flödar nu in i scan_completed.
- Safety canary-jobb varje timme: re-härleder allergener för alla recept,
räknar överifierade publika recept och food-safety-lint; skriver EN rad till
ops_safety_canary. Endpointen läser endast sista raden.
- Cache-refresh-jobb var 60 s skriver hela summariet till Redis; endpointen
serverar cachen med 503 vid cache-miss.
- Bearer-token-skydd med OPS_TOKEN; HTTPS-tvång i produktion; ingen PII.
- Tester för endpoint, auth, cache-miss och safety canary.
feat(recommendation-engine,api): S4 Smak/Hälsa/Lager-vyer för 'Vad ska vi äta?'
- Ersätter hårdkodat 'Cibello' i scale-batch, scale-smoke-test och export-verified.
- DB-backfill: 224 recept hade 'Cibello AI' i creator_display_name (värdena
motsvarar nuvarande BRAND.name, ingen rad ändrades men kontrollen är gjord).
- Lägger till view-query-param (default|taste|health|pantry) med fördefinierade
ScoringWeights och samtyckesgrind.
- Unit-tester för vyer; integrationstester för vy-param, validering och
fallback utan personalization-samtycke.
- brand-guard grön; pnpm typecheck 19/19; pnpm test --force x2 grönt (34 tasks,
275 tester).
- processProactiveTips now iterates all expiring items sorted by urgency and
emits the first candidate with a recipe that clears 7-day dedup.
- Add pt-PT proactive-tip templates; remove en-GB duplicate; parity test
asserts against shared-types SUPPORTED_LANGUAGE_TAGS.
- Serialize DB test setup via turbo dependencies; seed truncates only *_test
DBs, guarded by both --test flag and DB name suffix.
- Ny notification_type 'proactive_tip' och consent_kind 'notifications'.
- Dubbelgrind: personalization + notifications samtycke måste vara granted.
- Mallbaserade pufftexter i 12 språk; ingen fri AI-text.
- Led med nyttan ('gurkan börjar bli slapp — recept du brukar gilla').
- Max 1 puff/hushåll/dag; ingen upprepning av samma vara+recept inom 7 dagar.
- UTC för all datummatte; createdAt sätts explicit från processorns now.
- Ny worker-jobbtyp SEND_PROACTIVE_TIPS.
- Integrationstester för dubbelgrind, revoke, frekvens, duplicate, UTC.
- Migration 0022 + worker test script kör db:test-setup.
- Mallbaserad proveniens i 12 språk (inga fria AI-texter i rekommendationer).
- memoryFit, tasteFit, cookingAssumptionFit endast vid personalization-samtycke.
- Hård grind i API:et: läser memory_items/taste_signals/cooking_assumption_profiles
endast när userConsents.personalization = granted.
- NON_PERSONALIZED_WEIGHTS bevarar existerande beteende vid avsaknad av samtycke.
- Positiv, icke-restriktiv näringscopy (R7).
- Deterministisk scoring + enhetstester för S1.
- Integrationstest som verifierar provenans-gate med/utan samtycke.
- seed/run.ts uppdaterar nu ALLA canonical-ingrediensfält vid re-seed,
inklusive allergens (tidigare uppdaterades bara nameSv/nutritionPer100).
- seed/run.ts härleder allergener för seed-recept från ALLA ingredienser,
inte bara obligatoriska.
- verification.ts hård-avvisar inkompletta kandidater (saknar titel,
ingredienser, steg, portioner eller tider) som rejected.
- Lägger allergen-invariant-test i @app/recipe-generation som verifierar
att seed-receptens lagrade allergens matchar färsk derivering.
- Allergener omräknade för alla 246 recept; 0 mismatch återstår.
- Raderade 4 trasiga recept + 1 ordningsdubblett tidigare.
- export-verified.ts exporterar nu även editorial (status=editorial)
- Lägger till coverage-matrix, dedup-stats och summary.md
- Inkluderar total kostnad för runda 1 + runda 2
- Ta bort felaktig /\bfiber\w*\b/ från SAFE_COOKING_KEYWORDS_SV
- densityGPerMl för kidney_beans_canned, black_beans_canned, chickpeas_canned
- Re-seed DB; typecheck + test gröna
Node.js fetch() hänger på POST till Gemini via IPv6 i WSL.
Ersätter default fetch med customNodeFetch som använder node:https
och därmed kör över IPv4. Signifikant hastighetsförbättring
(~1 sek vs timeout).
Relaterat till scale-batch.ts i Fas A Steg 2.
- 8 batchar om ~27 recept = ~216 mål
- Budgetguard med pause vid 90 %
- DB-dedup mot recipes.titleSv + session-dedup
- Seed verified till staging DB (recipes, recipeIngredients, recipeSteps)
- Stickprov ~15 % per batch med flaggning
- scale-batch.sh wrapper för Node IPv4-workaround
- Lade till ./client export i @app/database
- Lade till dotenv i @app/recipe-generation deps
Relaterat till docs/32-receptkatalog-buildout.md
- Nytt endpoint GET /v1/inventory/natural-search.
- Robust matchning med unaccent + pg_trgm similarity mot display_name,
brand och kanoniska ingrediensnamn (sv/en).
- Svar byggs deterministiskt från faktisk data: lagringsplats + sublocation
om registrerad, trust-state-hedge från befintlig trust-motor.
- Server-sidan i18n-katalog för 12 språk.
- Tester för svensk träff och noll-träff på flera språk.
- Design-dokument docs/30-sökrobusthet-matvaror.md.
- Implementerar eraseUser() i packages/database/src/gdpr-erasure.ts som
raderar/anonymiserar/pseudonymiserar alla personliga tabeller.
- DELETE /v1/me orkestrerar nu plan + transaktion + lagringsrensning.
- Enpersonshushåll raderas automatiskt; publika recept anonymiseras;
draft/private-recept raderas.
- Finansiella poster (subscriptions/store_transactions/subscription_events)
behålls under retention med slumpmässig pseudonym från
gdpr_retention_pseudonyms.
- audit_logs/domain_events anonymiseras; kvitton i kvarvarande hushåll
strippas på bild och OCR-text.
- Lägger till permanent residual-test (me.residual.test.ts) med
schema-diff-assertion mot information_schema.
- Uppdaterar docs/23 och docs/29 med implementerad mekanism.
- Migration 0021 för gdpr_retention_pseudonyms och nullable
cooking_sessions.started_by_user_id.
- Enumererar alla user_id-/PII-tabeller.
- Klassar varje tabell: RADERA / ANONYMISERA / BEHÅLL MED LAGLIG GRUND.
- Identifierar 31 tabell-förekomster som hanteras ej idag.
- Designar permanent residual-test med schema-diff-assertion.
- Öppna beslut för godkännande innan implementation.