Commit Graph

60 Commits

Author SHA1 Message Date
Sven (AAMOS AI) 305b6d1886 feat(seed): add aliases for milk, yoghurt, crème fraiche and carrot 2026-08-16 21:23:07 +07:00
Sven (AAMOS AI) 5ad6bf6f60 feat(seed): make sourdough bread and cardamom computable (gramsPerPiece/density) 2026-08-16 21:11:48 +07:00
Sven (AAMOS AI) 70021ebdf2 feat(seed): add pantry ingredients (balsamic, strawberry jam, fish/lobster stock, cornichons) + gramsPerPiece for dill/parsley 2026-08-16 21:01:08 +07:00
Sven (AAMOS AI) c0a15bb1b5 feat: kitchen screen, scan dedup, gemini-3.5-flash-lite, seed grapes/beetroot/pea shoots 2026-08-16 20:13:49 +07:00
Sven (AAMOS AI) 3b313135d4 feat(db): firebaseUid-kolumn på users för Firebase-kundidentitet (AUTH-1) 2026-08-15 19:32:03 +07:00
Sven (AAMOS AI) 92b1ee54c6 content(seed): 5 svenska högtidsrecept (gravlax, toast skagen, julskinka, lussekatter, saffransbullar) (MIKRO INNEHÅLL-3) 2026-08-15 18:36:31 +07:00
Sven (AAMOS AI) 06891522d9 content(seed): kanoniska högtidsingredienser (saffran/jäst/skinka/kräftor m.fl.) (MIKRO INNEHÅLL-2)
CI / Typecheck, test & build (push) Failing after 48s
2026-08-14 23:21:37 +07:00
Sven (AAMOS AI) 14a4fd85aa content(seed): tagga köttbullar (jul) + sill (jul/påsk) för högtidssök (MIKRO INNEHÅLL-1)
CI / Typecheck, test & build (push) Failing after 49s
2026-08-14 23:11:37 +07:00
Sven (AAMOS AI) a11267edac feat(seed): GB/US/CA-högtider inkl. Thanksgiving-datum (MIKRO C4)
CI / Typecheck, test & build (push) Failing after 43s
2026-08-14 22:34:31 +07:00
Sven (AAMOS AI) fe71bd0db6 feat(seed): ES/IT/PT/PL-högtider (MIKRO C3)
CI / Typecheck, test & build (push) Failing after 43s
2026-08-14 22:26:35 +07:00
Sven (AAMOS AI) f0488eefd6 feat(seed): DE/FR/NL-högtider (MIKRO C2)
CI / Typecheck, test & build (push) Failing after 42s
2026-08-14 22:19:04 +07:00
Sven (AAMOS AI) cb40170171 feat(seed): nordiska högtider (NO/DK/FI/IS) + nameLocalized (MIKRO C1)
CI / Typecheck, test & build (push) Failing after 43s
2026-08-14 22:04:15 +07:00
Sven (AAMOS AI) 61b9198d51 feat(season): nameLocalized-kolumn för högtidsnamn per marknad (MIKRO B)
CI / Typecheck, test & build (push) Failing after 44s
2026-08-14 21:56:03 +07:00
Sven (AAMOS AI) 19af7e0720 feat(season): easter-offset + nth-weekday datumregler för marknads-högtider (MIKRO A)
CI / Typecheck, test & build (push) Failing after 42s
2026-08-14 21:46:17 +07:00
Sven (AAMOS AI) 0d1cc727ae fix(gdpr): radera user_terms_consents vid kontoradering + klassa i residual-testet
CI / Typecheck, test & build (push) Successful in 11m6s
2026-08-14 00:45:42 +07:00
Sven (AAMOS AI) c32a7e33c7 ci: trigga på master + formatfix inför Gitea Actions
CI / Typecheck, test & build (push) Failing after 2s
2026-08-13 17:25:14 +07:00
Sven (AAMOS AI) 61c3193f17 feat(consent): user_terms_consents + /v1/me/consent 2026-08-13 02:06:44 +07:00
Sven (AAMOS AI) 10ba64e4ba fix(ops): gemini-block i summary-byggaren, inte routen 2026-08-12 22:41:11 +07:00
Sven (AAMOS AI) 602405d56d feat(ops): logga gemini_usage per scan (best-effort) 2026-08-12 21:08:03 +07:00
Sven (AAMOS AI) 14a5243bb2 feat(db): gemini_usage-tabell för token-telemetri 2026-08-12 20:51:50 +07:00
Sven (AAMOS AI) 7dda0fad00 fix(gemini): budget-check före bildhämtning så spärr triggars tidigt 2026-08-12 16:30:49 +07:00
Sven (AAMOS AI) 6c581bec1a feat(cost-guard): global Gemini daily budget + EOC alarm; trial requires verified email 2026-08-12 06:43:32 +07:00
Sven (AAMOS AI) 81927b6cdc fix(db): RDS-CA i poolen (app+migrator delar TLS) 2026-08-12 06:07:07 +07:00
Sven (AAMOS AI) 983f3fb2aa fix(database): explicit RDS SSL via NODE_EXTRA_CA_CERTS 2026-08-12 04:48:42 +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) 4adde4faff chore(ops): feedback.senaste upp till 10 for EOC-panelen 2026-08-11 18:22:07 +07:00
Sven (AAMOS AI) 989c242d2c gapfill: importera nollcells-recept i seed 2026-08-11 06:42:09 +07:00
Sven (AAMOS AI) f86a37dd33 S5: onboarding → minne + smaksignaler (user_stated) 2026-08-11 04:43:43 +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) 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) 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) 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) 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) 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) e4efb150aa fix(recipe-generation): robustare Gemini-enheter, butter-densitet, utökad pilot-output 2026-08-09 20:45:59 +07:00
Sven (AAMOS AI) ddd6b736ba feat(gdpr): fullständig raderingsflöde med pseudonym-retention, residual-test och hushållshantering
- 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.
2026-08-08 05:45:49 +07:00
Sven (AAMOS AI) c2cc3878dd fix(skiva-1): spara accept, bildref, lokal träningsbank, lärande-loop-dok
- confirm-loop sparar nu även action=accept som positivt exempel i ai_corrections
- imageS3Key sparas vid image_training-samtycke, annars null
- ai_corrections.proposal lagrar det specifika AI-förslaget per item
- BUILD_TRAINING_SAMPLE bankar lokalt till ai_training_bank (ej externt runTask)
- Jobbet kastar aldrig i AAMOS_MODE=gemini
- Migration 0020: ai_corrections.image_s3_key/proposal + ai_training_bank
- docs/28-lärande-loop.md: datakontrakt, samtycke, retention, GDPR-radering
- Tester: accept + bildref (ja/nej) + lokal bank i gemini-läge
- REQUIRE_REAL=1 är AI-fokuserat i gemini-läge; staging mail/S3 får vara mock
2026-08-08 04:00:49 +07:00
Sven (AAMOS AI) 050c958285 feat(gemini): Skiva 1 – Gemini 2.5 Flash som lärar-tier för kylskåpsskanning
- Gemini-adapter bakom AamosClient-interface (AAMOS_MODE=gemini)
- Serversida/worker: hämtar bild, anropar Gemini, mappar mot canonical_ingredients
- Kostnad/tokens bokförs i ai_usage_counters; global dagsbudget via BudgetStore
- Redis-backed budget i worker, in-memory i tester
- Migration 0019: ai_cost_usd_microcents
- Hermetiska tester med inspelad fixture; separat pnpm eval:scan
- docs/09 uppdaterad ärligt: AAMOS-status, Gemini-flöde, säkerhet/kostnad
- REQUIRE_REAL=1 stödjer AAMOS_MODE=gemini; deploy-grind uppdaterad
2026-08-08 03:30:59 +07:00
Sven (AAMOS AI) 74f95daab2 feat(3d): meal-box merge, stored mutations, undo, mobile undo UI + i18n ×12
- Merge leftovers into existing meal_box when same recipeId + cookedAt date + frozen + available.
- Store mealBoxMutations JSONB on cooking_sessions for deterministic undo.
- Undo decrements portions/remaining, discards box at zero, appends correction ledger rows.
- Mobile: undo button in cooking/[id].tsx after-flow and meal-boxes.tsx within 24h window.
- i18n undo strings across all 12 locales; parity test green.
- 6 new integration tests: merge, no cross-date merge, frozen split, undo restore, undo discard, ledger invariant.
- Update FAS3 audit doc with 3d semantics.

Closes Fas 3d
2026-08-07 17:04:42 +07:00
Sven (AAMOS AI) e46281b9b5 Fas 3 steg 3b: minimala efterfrågor + hushållsantagandeprofiler per ingrediens 2026-08-07 03:56:41 +07:00
Sven (AAMOS AI) 44f6385dce Fas 3 steg 3a-fix: hermetisk test-setup + analytics-event regler för cooking sessions 2026-08-07 03:36:54 +07:00
Sven (AAMOS AI) e9fb4a17d4 Fas 3 steg 3a: cooking_sessions-tabell + lifecycle-endpoints + timeout-jobb, gamla /cook kvar som kortkommando 2026-08-07 03:14:13 +07:00
Sven (AAMOS AI) 4a4f448e1c Fas 2 steg 5: Scan-to-scan-diff + konfliktlösning, samt buggfix depleted-transaktion i reconciliation 2026-08-07 01:30:31 +07:00
Sven (AAMOS AI) bcf932d2ff Fas 2 steg 2: Inventory Trust Engine - decay-profiler och cache-jobb 2026-08-06 23:25:32 +07:00
Sven (AAMOS AI) 8ae4bf6ec3 Fas 2 steg 1: Inventory Trust Engine - trust states pa inventory_items 2026-08-06 23:01:43 +07:00