Commit Graph

93 Commits

Author SHA1 Message Date
Sven (AAMOS AI) cc948c258a infra: add aws providers and default tags 2026-08-11 21:31:02 +07:00
Sven (AAMOS AI) d3d485ffe8 test(eoc-push): rätta sökväg till brand.config.json 2026-08-11 19:20:52 +07:00
Sven (AAMOS AI) cb53784ec3 test(eoc-push): använd BRAND.name istället för hårdkodat Cibello 2026-08-11 19:19:55 +07:00
Sven (AAMOS AI) c60158801d gapfill: jordnötssmör-cellen fylld (4 recept) 2026-08-11 19:19:23 +07:00
Sven (AAMOS AI) a7b53c7ba3 gapfill(peanut): rikare middagsrätter som target 2026-08-11 19:16:39 +07:00
Sven (AAMOS AI) ac919e9425 harden(eoc-push): fånga mappningsfel så pushen aldrig kastar 2026-08-11 18:44:01 +07:00
Sven (AAMOS AI) 4adde4faff chore(ops): feedback.senaste upp till 10 for EOC-panelen 2026-08-11 18:22:07 +07:00
Sven (AAMOS AI) 90b23fcd7f fix(eoc-push): interpolera {brand} + EOC-tone i pushad wall 2026-08-11 18:21:58 +07:00
Sven (AAMOS AI) 8586ed3411 fix(compose): mappa admin-porten mot 8080 (non-root nginx) 2026-08-11 17:52:23 +07:00
Sven (AAMOS AI) c4fddf0eeb fix(docker): skriv nginx-pid till /tmp sa admin kor non-root 2026-08-11 17:52:19 +07:00
Sven (AAMOS AI) c29ab778a0 harden(docker): non-root USER i Dockerfile.admin 2026-08-11 17:29:00 +07:00
Sven (AAMOS AI) 125192f24a fix(eoc-push): mappa feedback-tidsstämpel till "skapad" per EOC-kontraktet 2026-08-11 17:27:53 +07:00
Sven (AAMOS AI) af05f084b8 feat(worker): EOC push-agent for ops summary
- Add EOC_URL + EOC_PUSH_TOKEN config
- Add pushOpsSummaryToEoc processor
- Schedule PUSH_OPS_SUMMARY_TO_EOC every 2 minutes
- Add unit tests
2026-08-11 17:03:53 +07:00
Sven (AAMOS AI) 4eddcfbefe docs: pre-launch readiness report 2026-08-11 07:40:00 +07:00
Sven (AAMOS AI) 63d83e0d7c ops(api): lägg till /ops/v1/health för EOC 2026-08-11 07:37:51 +07:00
Sven (AAMOS AI) 714d0a2e5b docs(security): genomgång av hardening-checklist inför prod 2026-08-11 07:30:50 +07:00
Sven (AAMOS AI) 8627331cc9 docs(status): uppdatera till nuläge (S1–S6, 254 recept, ops+wall, EOC) 2026-08-11 07:28:59 +07:00
Sven (AAMOS AI) 4a63c5cb67 cleanup(memory): impact läser bara egen userPreferences-rad 2026-08-11 07:28:25 +07:00
Sven (AAMOS AI) 989c242d2c gapfill: importera nollcells-recept i seed 2026-08-11 06:42:09 +07:00
Sven (AAMOS AI) a00f0a59ab gapfill: generera+verifiera nollceller (export) 2026-08-11 06:39:58 +07:00
Sven (AAMOS AI) 95c934cbec fix: robustisera cooking-sessions-analytics-test + rätta eventName-alias 2026-08-11 05:47:56 +07:00
Sven (AAMOS AI) 4116653b51 S6: i18n-paritet, provenans + eval, copy-skanning, fabricerade-minnes-eval 2026-08-11 05:20:27 +07:00
Sven (AAMOS AI) f86a37dd33 S5: onboarding → minne + smaksignaler (user_stated) 2026-08-11 04:43:43 +07:00
Sven (AAMOS AI) 1e18146665 fix(recommendation-engine): S4-FIX — opersonliga vyer fungerar utan samtycke via depersonalize(weights) 2026-08-11 04:02:46 +07:00
Sven (AAMOS AI) 05bba93b90 feat(worker): S3 3b härda UPDATE_USER_MEMORY — budget, kostnad, anti-påhitt, GDPR-regression 2026-08-11 03:23:09 +07:00
Sven (AAMOS AI) 33b0a8267b fix(ops): interpolera varumärke i wall board från brand.config.json 2026-08-11 02:47:25 +07:00
Sven (AAMOS AI) 335cfe0bf6 feat(memory): S3 3a minnes-yta + impact-endpoint 2026-08-11 02:41:39 +07:00
Sven (AAMOS AI) 4296a64aef feat(ops): wall board härlett ur summary-värden 2026-08-11 02:36:08 +07:00
Sven (AAMOS AI) b1b6eb994c feat(seed): import 246 verified recipes as committed seed catalog
- 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
2026-08-11 00:47:08 +07:00
Sven (AAMOS AI) 4687f46384 Phase 1 ops core: base blocks, feedback, canary fixes
- Add app/ekonomi/anvandare/prenumerationer/butik/feedback blocks to computeOpsSummary.
- New feedback table, POST /api/feedback, GDPR erasure wiring.
- Canary: only count unverified/rejected published recipes; treat verified/editorial as safe.
- Add 'rejected' recipe verification status enum value.
- Fix food-safety lint baseline: remove egg/cured fish from raw-protein list, relax
  genomstekt regex, add safe-cooking phrases to seed recipes.
- Seed recipes now get verificationStatus=editorial.
- Tests: ops summary blocks, feedback route, me.residual cleanup.
2026-08-10 06:35:51 +07:00
Sven (AAMOS AI) 8f20b2ef1b feat(ops): /ops/v1/summary med ai/aktivering/engagemang/betalning/jobb/sakerhet + 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.
2026-08-10 05:47:43 +07:00
Sven (AAMOS AI) f4a603e977 fix(recipe-generation): BRAND.name-interpolation för creatorDisplayName + rubriker/filnamn
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).
2026-08-10 05:17:43 +07:00
Sven (AAMOS AI) 881c5bb1e3 fix(worker): S2 proactive tips logic, i18n parity, hardened test DB reset
- 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.
2026-08-10 04:35:22 +07:00
Sven (AAMOS AI) 1de1c68485 docs(34): S2 commit-hash 2026-08-10 03:52:13 +07:00
Sven (AAMOS AI) f494b1810e feat(worker): S2 proaktiva puffar (expiring-ingredient)
- 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.
2026-08-10 03:51:57 +07:00
Sven (AAMOS AI) e2cc24eee2 docs(34): markera S1 som implementerad och testad 2026-08-10 03:24:01 +07:00
Sven (AAMOS AI) 0885f5bceb feat(recommendation-engine): S1 personalisering för 'Vad ska vi äta?'
- 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.
2026-08-10 03:23:31 +07:00
Sven (AAMOS AI) 16a7849e71 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.
2026-08-10 02:43:13 +07:00
Sven (AAMOS AI) f8e00c5060 docs: personalisering Spår 1 – implementationsplan (Del 34)
- Yt-inventering av AI-nära ytor.
- Motor-mappning mot befintliga data/motorer (anti-dubblett).
- Charter-regler R1–R6 inbyggda.
- Skivindelning S0–S6 med testplaner.
- Risker + test av särskilt fabricering, användarstyrt minne, samtycke.
- Inväntar godkännande innan skiva 1 kodas.
2026-08-10 02:32:44 +07:00
Sven (AAMOS AI) b40e1f9d90 fix(recipe-generation, database): allergen-blocker åtgärdad
- 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.
2026-08-10 01:52:57 +07:00
Sven (AAMOS AI) 9c5adaa921 fix(recipe-generation): allergen-säkerhet + re-derive + dedup
- Lägger regressionstester: optional allergen-ingrediens deklareras,
  optional rå fågel kräver genomstekningssteg, optional mjölk deklareras.
- Re-derive allergener för alla seedade recept (18 uppdaterade).
- Raderar 4 recept med saknade ingredienser/steg.
- Raderar 1 ordningsdubblett: Ugnsbakad lax med dill och citron.
- 246 godkända recept kvar, 0 dublett-slugs.
2026-08-10 01:29:31 +07:00
Sven (AAMOS AI) 2fda1a5785 feat(recipe-generation): final export script med coverage + dedup + kostnad
- 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
2026-08-10 00:40:01 +07:00
Sven (AAMOS AI) fc3d9daac8 fix(recipe-generation): städning inför final export
- 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
2026-08-10 00:35:39 +07:00
Sven (AAMOS AI) 576c451cfe feat(recipe-generation): STEG 2 RUNDA 2 prep
- Food-safety prompt + lint: doneness krävs, gyllenbrun räcker inte
- DensityGPerMl för ginger, örter, mushroom, salsa, corn, olives, peas
- RUNDA_2_TARGETS fokuserade på gap-celler (paprika, blandfärs, räkor, torsk, svarta bönor)
- Export-verified script + scale-smoke-test
- Temp-skript borttagna; inga nycklar kvar i kod
2026-08-10 00:22:36 +07:00
Sven (AAMOS AI) 344ec8ee3a fix(ai-contracts): customNodeFetch för att kringgå IPv6-häng i WSL
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.
2026-08-09 22:10:36 +07:00
Sven (AAMOS AI) 84f8ff3c45 feat(recipe-generation): scale-batch.ts för Fas A Steg 2 (~200 verified)
- 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
2026-08-09 22:03:55 +07:00
Sven (AAMOS AI) 0ae42a15b2 fix(database): applicera compound-allergen-rättningar + vegansk currypasta 2026-08-09 21:15:41 +07:00
Sven (AAMOS AI) dee39e5708 docs: compound-allergen-audit för sammansatta canonical-ingredienser 2026-08-09 21:08:41 +07:00
Sven (AAMOS AI) c6b9b0278d feat(recipe-generation): matsäkerhetslint för rå fågel/fläsk/ägg/fisk 2026-08-09 20:57:58 +07:00
Sven (AAMOS AI) e4efb150aa fix(recipe-generation): robustare Gemini-enheter, butter-densitet, utökad pilot-output 2026-08-09 20:45:59 +07:00