Commit Graph

105 Commits

Author SHA1 Message Date
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
Sven (AAMOS AI) 1f746dc822 test(recipe-generation): hårda allergen-tester där härledda allergener överkör AI 2026-08-09 20:09:31 +07:00
Sven (AAMOS AI) f321d53b30 fix(recipe-generation): justera mock-ingredienser mot seed-katalogen så pilotbatch blir granskbar 2026-08-09 19:53:44 +07:00
Sven (AAMOS AI) 4b7dec2759 feat(recipe-generation): Cibello Receptkatalog Fas A – STEG 1
- Nytt paket @app/recipe-generation med pipeline, verifieringsgrind,
  gaprapport och pilotbatch-script.
- Ny AAMOS-task GENERATE_RECIPE_CANDIDATES i @app/ai-contracts.
- GeminiAamosClient utökat med receptgenereringsstöd.
- MockAamosClient uppdaterad med deterministiska kandidater.
- Verifieringspipeline: ingrediensmappning (hård spärr), härledda allergener,
  beräknad näring via nutrition-engine, språk-/kvalitetskontroll, dedup.
- Hermetiska tester: 10/10 gröna.
- typecheck + test + build: gröna för hela workspace.

Refs: docs/32-receptkatalog-buildout.md
2026-08-09 19:47:03 +07:00
Sven (AAMOS AI) 9197d93a92 feat(inventory): naturlig-språklig fritextsökning med FoodTwin-fakta, trust-hedge och i18n ×12
- 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.
2026-08-08 05:53:06 +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) 1d78dbcad0 docs(gdpr): kompletthetsaudit av DELETE /v1 me
- 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.
2026-08-08 05:02:23 +07:00
Sven (AAMOS AI) 28908d5257 fix(gdpr): explicit radering av ai_corrections/scan_jobs + S3-bilder vid DELETE /v1/me
- DELETE /v1/me soft-deletar users, så users-cascade fyrar aldrig.
- Samlar distinkta bildnycklar från ai_corrections, ai_training_bank och
  scan_jobs och raderar dem via storage.deleteObject innan DB-radering.
- S3-fel loggas och avbryter inte raderingen.
- Raderar explicit ai_corrections (ai_training_bank cascadar) och scan_jobs.
- Lägger till deleteObject i StorageService (mock + AWS/DeleteObjectCommand).
- Uppdaterar docs/28-lärande-loop.md med faktisk mekanism och retention.
- Tester: verifierar noll rader kvar och storage.deleteObject-anrop.

Relaterat: skiva-1-fixrunda, blockerande GDPR-hål.
2026-08-08 04:20:03 +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) 7894a1ec06 docs(runbook): standing rule — staging helig under fälttest
- Ingen WIP-kod eller WIP-migrationer mot staging under fälttest.
- Utveckling testas mot cibello_test.
- Staging kör alltid senaste godkända commit.
2026-08-07 18:38:56 +07:00
Sven (AAMOS AI) 7216417413 docs(4): uppdatera FAS4-hushållsaudit efter granskningsjusteringar
- GDPR: tydligt skilj lämna hushåll (åtkomst) från kontoradering.
- Token-säkerhet: sha256-hash i DB, single-use, 7 dagars expiry, max 10
  aktiva länkar, roll adult vid join, ingen owner-transfer.
- Analytics: aldrig token eller invite_code i properties.
- Webbfallback noterad som fas-1-spår utanför Fas 4.
2026-08-07 18:10:03 +07:00
Sven (AAMOS AI) dcaae9f0ba fix(expo): LAN-telefontest via scripts/expo-lan.sh
- Uppdatera .env API_BASE_URL till http://192.168.8.123:4000.
- Lägg till gitignorerad .env.telefontest med REACT_NATIVE_PACKAGER_HOSTNAME
  och API_BASE_URL.
- Lägg till scripts/expo-lan.sh som dödar gammal expo-tmux, sourcar
  .env.telefontest och startar Expo med rätt variabler.
- Uppdatera first-deploy.sh staging-sammanfattning: skriv ut API_BASE_URL
  och påminn om ./scripts/expo-lan.sh.
- Lägg till docs/RUNBOOK-STAGING-EXPO.md.
2026-08-07 18:02:34 +07:00
Sven (AAMOS AI) fadd7692b2 docs(3d): restore FAS3 audit doc from cb49301 + add 3d semantics
- Restore full docs/FAS3-COOKING-SESSIONS-AUDIT.md from cb49301
  (hermetic test rules, REUSE/GAP matrix, anti-duplication rationale,
  step plans 3a-3d). Append section 7 with 3d merge/undo semantics.
- Update 7.6 wrapper reference to c1ab2c8 behaviour.
- Fix migration 0017: cast completed_at/started_at/created_at to UTC
  before extracting DATE. Idempotent (WHERE meal_date IS NULL); already
  backfilled rows unaffected. Runner does not checksum files.
- Clarify meal_date purpose: future UTC statistics/queries; undo uses
  stored mealBoxMutations.

Refs: cb49301, c1ab2c8
2026-08-07 17:24:15 +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) c1ab2c8f37 3c-fix: wrapper passes defaulted portions to core
completeCookingSession now forwards actualPortionsEaten and
leftoverEstimatePortions (after applying wrapper defaults) into
completeCookingSessionCore, so API callers omitting leftovers get
correct 100% deduction when mealBoxPortions is provided instead of
core's fallback to 0. Added regression test with leftovers omitted.
2026-08-07 15:51:02 +07:00
Sven (AAMOS AI) 0078084a2b field-fix: POST/PUT/PATCH without body sends '{}' in mobile api helper
- api() in apps/mobile/src/lib/api.ts now sends JSON.stringify({}) for
  methods with a body slot when no body is provided, instead of sending
  undefined with content-type: application/json.
- Fixes scan start crash (POST /v1/scans/:id/start) and latent
  resend-verification crash (POST /v1/auth/resend-verification).
- Server strictness left intact; uploadImage unchanged.
- Added unit tests for GET/HEAD/POST/PUT body behaviour.
2026-08-07 15:39:46 +07:00
Sven (AAMOS AI) 8637eaa6c3 3c-fix: partial consumption now deducts eaten + leftovers
- consumptionPortions = min(planned, actualPortionsEaten + leftoverEstimatePortions).
  Meal boxes are a subset of leftovers; raw inventory is only retained for
  portions that were never cooked.
- Added validation leftoverEstimatePortions >= mealBoxPortions with localized
  400 error (cooked.leftoverLessThanBox) in server i18n + all 12 locales.
- Removed unused COOKING_SESSION_STATUSES / MEAL_BOX_STATUSES imports from
  apps/api/src/lib/cooking.ts.
- Hardened test cleanup to delete mealBoxes/meals/recipeCooks/cookingSessions
  by household before dropping storageLocations.
- New regression tests: meal-box double-counting, eaten+leftover split, and
  leftover < box rejection.
- Updated FAS3-COOKING-SESSIONS-AUDIT.md with corrected physics semantics.
2026-08-07 15:35:25 +07:00
Sven (AAMOS AI) cb493010d0 3c: partial consumption + undo for cooking sessions
- Append-only undo via correction transactions tied to cookingSessionId.
- POST /v1/cooking-sessions/:id/undo with 24h UTC window (409 + i18n after expiry).
- Complete undo scope: meals removed, meal boxes discarded, recipe_cooks
deleted, cookCount decremented; activation milestones left intact.
- Deterministic assumption-profile rollback via lastSessionAnswers.sessionId;
profile deleted when observationCount reaches 0.
- New status 'undone' as TEXT validated against COOKING_SESSION_STATUSES.
- Analytics event cooking_session_undone + domain events MEAL_BOX_DISCARDED,
MEAL_REMOVED, COOKING_SESSION_UNDONE.
- Partial consumption uses actualPortionsEaten/plannedPortions factor.
- i18n coverage for cooked.undoWindowExpired across all 12 locales + server.
- Invariant tests: computeBalance(transactions) === item.quantity after
complete, undo, and undo + new complete; transaction count increases on undo.
- Migration 0014_expand_event_types.sql adds new enum values.
- Updated FAS3-COOKING-SESSIONS-AUDIT.md with chosen semantics.
2026-08-07 05:47:54 +07:00
Sven (AAMOS AI) bbe7526ef3 fix(3b): delad kompletteringsväg för legacy /cook + deterministiska cooking-assumptions
- cookRecipeInputSchema utökas med actualPortionsEaten, leftoverEstimatePortions, leftoverNote
- completeCookingSession-wrapper i apps/api/src/lib/cooking.ts hanterar summavalidering,
  persistens av svar, profiluppdateringar och analytics (started+completed) för båda vägarna
- Legacy POST /v1/recipes/:id/cook använder wrappern med emitStartedEvent
- GET /v1/recipes/:id/cooking-assumptions väljer deterministiskt bland icke-valfria ingredienser
- i18n: nyckel cooked.portionsSumExceedsPlanned i samtliga 12 lokaler + server-i18n
- Nya tester för legacy /cook och cooking-assumptions med valfri första ingrediens

Refs: steg 3b-fix, granskningsrunda 2026-08-07
2026-08-07 05:13:35 +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) 218bc44d08 Fas 2 steg 4: Quick Reconciliation (motor, API, app + 12-språks i18n) 2026-08-07 01:02:08 +07:00
Sven (AAMOS AI) 4385fe5125 Fas 2 steg 3: Household Trust Score (admin + i18n status i appen) 2026-08-06 23:45:28 +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
Sven (AAMOS AI) 3d1d823583 Server-i18n katalog + backfill for befintliga anvandare utan hushall 2026-08-06 22:33:00 +07:00
Sven (AAMOS AI) 3696aadf98 Hermetiska integrationstester + auto-hushall i onboarding (size, i18n, locations) 2026-08-06 22:06:11 +07:00
Sven (AAMOS AI) dd66ebedbf Bugfix: what-to-eat utan hushall ger forslag; onboarding mal kan valjas multi 2026-08-06 21:32:32 +07:00
Sven (AAMOS AI) 8e6b780480 Lagg till custom Metro-resolver for .js->ts samt react-native-web for SDK 54 2026-08-06 20:51:30 +07:00
Sven (AAMOS AI) a837283a2e Migrera mobilappen fran Expo SDK 57 till SDK 54 2026-08-06 19:54:28 +07:00
Sven (AAMOS AI) e5a9d72197 Lägesmedveten DB-URL: runtime endast DATABASE_URL, tester endast TEST_DATABASE_URL 2026-08-06 17:43:11 +07:00
Sven (AAMOS AI) fd5c828f96 Skärp testdatabas: TEST_DATABASE_URL endast, cibello_test, auto-migrate 2026-08-06 17:01:17 +07:00
Sven (AAMOS AI) 03e30755dc Förberedelse fas 2: testmiljö fix + analytics tracker i mobilappen 2026-08-06 16:46:30 +07:00
Sven (AAMOS AI) 13c6dcacd8 Namnbyte till Cibello (Fas 0): config, vakt, docs, verifiering 2026-08-06 15:24:53 +07:00
Sven (AAMOS AI) bd8df59138 Fas 1b punkt 6: First Scan Coach + aktiveringsmätning 2026-08-06 04:14:49 +07:00
Sven (AAMOS AI) 2f3cdf8016 FAS 1b: Progressive onboarding (3-layer flow)
- Add PROGRESSIVE_ONBOARDING feature flag to KNOWN_FLAGS
- Add onboarding_step column to users table (a/b/c)
- New backend endpoints:
  - GET /v1/onboarding/status – check current step + feature flag
  - POST /v1/onboarding/quick-start – complete Step A (goal + precision)
  - POST /v1/onboarding/complete-b – complete Step B (diet, allergens, household)
  - POST /v1/onboarding/complete-c – complete Step C (health profile)
  - POST /v1/onboarding/skip – GDPR-friendly skip
- Refactor mobile onboarding screen into 3 progressive layers
- Update auth store with onboardingStep state
- Update tab layout to only block on Step A
- Update registration to set onboardingStep='a'
- Add i18n keys for Step B/C titles across all 12 locales
- Add Zod validation schemas (quickStartInputSchema, onboardingStatusSchema)
- Add tests for validation and feature flag
- Preserve existing /v1/me/onboarding for backward compatibility
- Migration: 0004_progressive_onboarding.sql
2026-08-06 00:40:59 +07:00