149 lines
8.9 KiB
Markdown
149 lines
8.9 KiB
Markdown
# Ändringslogg
|
||
|
||
## 2026-08-06 – namnbyte till Cibello
|
||
|
||
- **Varumärke beslutat**: projektet heter från och med nu **Cibello**.
|
||
- `brand.config.json` uppdaterad med namn, slug, bundle-ID, domäner och
|
||
supportmejl.
|
||
- `scripts/brand-guard.sh` uppdaterad: tidigare arbets-/platshållarnamn är
|
||
förbjudna överallt utanför konfigurationen; `Cibello` tillåtet endast i
|
||
`brand.config.json`.
|
||
- Stale platshållare rensade ur docs och loggar.
|
||
- `pnpm typecheck`, `pnpm test`, `pnpm build` samt varumärkesvakt gröna.
|
||
- Staging deployad om med nya namnet; healthz rapporterar `cibello-api`.
|
||
|
||
## 2026-08-05 – fältfynd åtgärdade + mjölkprincipen + i18n-svep
|
||
|
||
Svar på första skarpa OpenClaw-deployen (WSL, alla grindar gröna) samt
|
||
Johans princip om bäst före-datum:
|
||
|
||
- **Tidszonsoberoende tester (D-033)**: de två TZ-känsliga testerna ur
|
||
deployrapporten är fixade i grunden – inventory-engine (expiry) och
|
||
recommendation-engine (season: påsk/midsommar/advent/årstider) räknar nu
|
||
helt i UTC, liksom API:ts vecko-/månadsbudget och ålder/veckodag. Hela
|
||
sviten verifierad under Europe/Stockholm, Pacific/Auckland och
|
||
America/Los_Angeles (30/30 tasks utan cache i alla tre). TZ=UTC-workaround
|
||
behövs inte längre.
|
||
- **Docker valfritt (D-034)**: Grind 0 kräver inte längre docker – den noterar
|
||
bara. Grind 2 avgör på faktisk nåbarhet och testar nu även Redis (rå
|
||
TCP-PING) utöver Postgres; Docker används enbart som reservstart i staging.
|
||
WSL/native-tjänster är en förstklassig väg (inga shims). Prompt uppdaterad.
|
||
- **Mjölkprincipen (D-035)**: "gick ut igår ≠ dålig". Motorn hade grunden
|
||
(bäst före → expiring + pastBestBefore, aldrig auto-expired; endast sista
|
||
förbrukningsdag → expired). Nu förstärkt hela vägen: skanningsgranskningen
|
||
låter användaren välja datumtyp (bäst före/sista förbrukningsdag → rätt
|
||
kolumn), kontextnot förklarar kvalitet vs säkerhet, Hemma-fliken visar
|
||
"lukta och smaka"-legend när något passerat bäst före, och nya tester låser
|
||
beteendet: FEFO räddar passerade varor FÖRST (aldrig utesluter), täckningen
|
||
räknar dem som tillgängliga, ingen automatisk kassering existerar.
|
||
- **i18n-svep (D-036)**: ~130 hårdkodade svenska UI-strängar i 15 skärmar
|
||
(onboarding-mål/dieter/allergener, butikssektioner, måltidstyper,
|
||
samtyckesetiketter, roller, dialoger m.m.) flyttade till i18n-katalogen och
|
||
översatta till alla 12 språk (1 564 nya strängar, paritetstestat, polska
|
||
pluraler). "Byt språk → hela appen byter" gäller nu bokstavligen.
|
||
|
||
## 2026-08-04 – inga mockar i drift: riktig S3 + riktig SMTP + äkthetsgrind
|
||
|
||
- Riktig S3-lagring (@aws-sdk/client-s3 + presigner): presignade upp-/
|
||
nedladdnings-URL:er mot AWS S3 eller S3-kompatibel lagring (S3_ENDPOINT för
|
||
MinIO/R2). Bucket-hälsokontroll vid uppstart; produktion vägrar starta mot
|
||
onåbar bucket. VERIFIERAD med äkta rundtur (presign→PUT→läs-URL→GET,
|
||
byte-identiskt) och fullstack via API:t (fysisk fil i bucket).
|
||
- Riktig SMTP (nodemailer): leverantörsoberoende (SES/Postmark/Resend/egen);
|
||
okonfigurerad SMTP vägrar högljutt. VERIFIERAD med äkta nätverksrundtur och
|
||
fullstack (välkomst- + återställningsmejl levererade till SMTP-server).
|
||
Rättade även SMTP_SECURE-tolkningen ("false" blev true med z.coerce).
|
||
- first-deploy.sh: INTEGRATIONSSTATUS i slututskriften + REQUIRE_REAL=1-grind
|
||
som underkänner deployen om någon integration kör mock; riktiga värden kan
|
||
ges som miljövariabler vid första körningen och skrivs in i .env.
|
||
- OpenClaw-prompten: "PÅ RIKTIGT FRÅN START"-sektion med ifyllnadstabell +
|
||
innehållsförteckning över vad zipen innehåller.
|
||
|
||
## 2026-08-04 – tolv språk (D-032) + deploy-paket för agentkörning
|
||
|
||
- 6 nya språk: danska, norska (bokmål, no/nn mappas), finska, nederländska,
|
||
polska (fullständiga one/few/many-pluraler), portugisiska → totalt 12.
|
||
- 1111 ingrediensöversättningar (101 × 11 språk), 216 enhetsetiketter (12 språk),
|
||
mejlmallar + minnesrubriker på alla 12, regiondefaults NL/PL/PT.
|
||
- first-deploy.sh: idempotent helautomatisk uppsättning med 8 grindar
|
||
(staging: genererade hemligheter + Docker-DB + seed; produktion: vägrar
|
||
dev-värden, kräver AAMOS http, backup före migration, seedar aldrig).
|
||
Körd skarpt i staging – alla grindar gröna.
|
||
- OPENCLAW-DEPLOY-PROMPT.md: komplett agent-prompt med hårda regler,
|
||
grindtabell, egen-verifiering, rapportformat, felsökningslista och rollback.
|
||
|
||
## 2026-08-04 – sex språk + automatisk språkdetektering (D-031)
|
||
|
||
- UI på 6 språk: sv/en/es/it/de/fr – 200 nycklar per språk, paritetstestade,
|
||
pluralformer per språk via Intl.PluralRules.
|
||
- Automatik: enhetens språk vid första start (stött → det, ostött → engelska);
|
||
registreringen bär enhetens locale → välkomstmejl OCH locale-preferenser
|
||
(region, valuta, tidszon, måttsystem) rätt från första sekunden.
|
||
- Manuellt språkval i profilen (6 språk, dynamisk väljare) vinner alltid och
|
||
synkas till backend – mejl, notiser, innehåll och sök följer valet.
|
||
- Innehåll: 505 ingrediensöversättningar (101 × 5 språk), 108 enhetsetiketter
|
||
(18 × 6), mejlmallar och minnesrubriker på alla språk, regiondefaults ES/IT.
|
||
- Receptöversättning till nya språk sker via M3-flödet (AAMOS-utkast →
|
||
deterministisk verifiering → mänsklig publicering) – skalar utan kodändring.
|
||
|
||
## 2026-08-04 – "allt som kan göras klart är klart"
|
||
|
||
- AAMOS-utvärderingssvit (spec §40): `pnpm eval:aamos`, 6 golden cases med 30
|
||
semantiska kontroller, resultat till ai_eval_runs, exitkod för CI-grind.
|
||
- Admin-2FA: TOTP enligt RFC 6238 utan externa beroenden (testvektorer gröna),
|
||
step-up-inloggning med preauth-token, MFA-tvång på admin-API, UI i panelen.
|
||
- E-postverifiering: icke-blockerande, mallar sv/en, resend, deep link-skärm.
|
||
- Retentionsjobb (GDPR): dagligt, konservativa fönster; larmwebhook för 5xx och
|
||
fallerade jobb; backup-restore-övning skriptad och GENOMFÖRD (protokoll arkiverat).
|
||
- Lasttest med trösklar: GODKÄND (recept 754 req/s p99 74 ms; rekommendationer
|
||
135 req/s p99 290 ms; 0 fel).
|
||
- Lanseringsrunbook (docs/21), butiksmetadata-utkast sv/en (docs/22),
|
||
juridiska utkast med juristkrav (docs/23), lasttestreferens (docs/24).
|
||
|
||
## 2026-08-04 – deploy-förberedelser
|
||
|
||
- **Lösenordsåterställning**: komplett flöde (forgot → mejl → engångstoken →
|
||
nytt lösenord) med anti-enumeration, hashade tokens, familjeåterkallelse,
|
||
mejlmallar sv/en via utbytbar mailer, mobilskärmar + app-länk. E2E-verifierat
|
||
inklusive säkerhetsegenskaperna (återanvänd token 401, gamla sessioner 401).
|
||
- **CI-hårdning**: varumärkesvakt (scripts/brand-guard.sh), migrate+seed mot
|
||
riktig Postgres 16 med sök-extensions, API-röktest i pipelinen.
|
||
- **EAS**: byggprofiler (development/preview/production) förberedda –
|
||
butiksfält fylls i när konto + namn finns.
|
||
|
||
## 2026-08-04 – i18n M1–M7 + M10 komplett, varumärkesneutralt
|
||
|
||
- **M1 Pengar**: alla `*_sek`-kolumner → `*_minor` (integer, minor units);
|
||
`households.currency_code` (ISO 4217); Money-typ + Intl-formattering i mobilen;
|
||
planpriser och seed-priser i minor. Validering kräver heltal.
|
||
- **M2 Översättningsdata**: `ingredient_translations` (en seedad ur nameEn),
|
||
`unit_translations` (sv+en) + `GET /v1/i18n/units`; ingredienssök matchar
|
||
och visar användarens språk.
|
||
- **M3 Receptöversättning**: `recipe_translations` + `recipe_step_translations`;
|
||
AAMOS-uppgift TRANSLATE_RECIPE; worker-verifiering (stegantal, bevarade tal,
|
||
konfidens); adminflöde beställ → granska → publicera (med redaktionell
|
||
rättning); API serverar publicerat språk med sv-fallback.
|
||
- **M4 i18next**: locales/{sv,en}/common.json (175 nycklar, paritetstestade),
|
||
Intl-plural, {brand}-injektion, språkbyte utan omstart, språkval i profilen
|
||
synkat med backend-preferenser.
|
||
- **M5 Måttvisning**: `displayQuantity` (METRIC/US_CUSTOMARY/MIXED) med
|
||
kvartsavrundning och ≈-märkning; mobilen visar per användarens måttsystem.
|
||
- **M6 Marknadsprofiler**: `nutrition_display_profiles` + `allergen_market_rules`
|
||
(EU/SE/GB 14, US 9, CA 12) + `GET /v1/i18n/nutrition-profile` (EU-fallback);
|
||
kJ- och natrium↔salt-hjälpare.
|
||
- **M7 Sök**: unaccent + pg_trgm + trigramindex; accentokänslig och
|
||
stavfelstolerant ingredienssök på alla språk.
|
||
- **M10 Minne**: minnesvyn renderas på användarens språk (rubriker + deterministisk
|
||
summary ur strukturerad value, sv-fallback).
|
||
- **Varumärke**: namnet lever endast i `brand.config.json` (neutrala platshållare
|
||
tills namnbeslut); historik tillplattad; runbook i `namnbyte.md`.
|
||
- **Verifiering**: typecheck 17/17, 103 tester, build 3/3, migrate+seed,
|
||
E2E på hela språk-/valuta-/måttflödet.
|
||
|
||
## Tidigare
|
||
|
||
- Grundplattform: mobilapp, Food API (~70 endpoints), worker, admin,
|
||
deterministiska motorer, AAMOS-kontrakt, subscriptions, GDPR, infrastruktur.
|
||
- i18n steg 1: språkneutrala enhetskoder, locale-preferenser,
|
||
AAMOS-localeContext, notismallar, Money-typ.
|