# ALVA — fullständig systembeskrivning **ALVA-DOC-0004 · Underlag för fortsatt resonemang · 2026-08-06 · `ae5acbe`** > Syftet med den här filen är att någon ska kunna resonera vidare om ALVA utan > att ha varit med när det byggdes. Den beskriver vad som **finns**, inte vad > som är tänkt. Där något är ofärdigt står det i klartext, och där ett påstående > vilar på en mätning står mätningen. > > Siffrorna är räknade ur källkoden det datum som står ovan, inte uppskattade. --- ## 1. Vad ALVA är ALVA är en **metod** för felsökning av fordon, och en plattform som håller metoden. Skillnaden är inte semantisk och den bär hela produkten: > **ALVA is not an assistant. ALVA is a method.** > Man säger *"följ ALVA"* på samma sätt som man säger *"följ ISO 9001"*. Namnet är stegen: | | | |---|---| | **A**nalysis | Vad är symptomet, och vad säger underlaget? | | **L**ocalization | Var sitter det? | | **V**erification | Är det bevisat, eller bara troligt? | | **A**ction | Vad gjordes, och höll det? | ### Problemet den finns för En verkstadsjournal i dag är fritext. *"Bytt vattenpump, provkörd, ok."* Den går inte att granska, inte att jämföra, och den håller inte när någon ett år senare frågar varför just den delen byttes. Konsekvensen betalas av tre parter: kunden som inte vet vad den betalat för, verkstaden som inte kan visa att den gjorde rätt, och försäkringsbolaget eller tillverkaren som inte kan avgöra ett anspråk. ALVA producerar i stället ett **underlag**: en append-only-logg där varje påstående bär sin evidens, sin härkomst och sin tidpunkt, och där ett ärende inte går att stänga utan att en människa skrivit *varför slutsatsen följer av evidensen*. ### Den regel som är produktens kärna **ALVA-RULE-200 — avslutssatsen.** Ett ärende kan inte stängas utan fyra fält: vad som konstaterades, vilken evidens som bär det, vilka hypoteser som avfärdades och varför, och vad som återstår som osäkert. Det finns en katalog över icke-svar (*"åtgärdat"*, *"ok efter provkörning"*) som avvisas, och varje uppställd hypotes måste vara besvarad. Det är den rad som saknas i varje verkstadsjournal i drift i dag, och den enda en granskare faktiskt behöver. ### Vad ALVA aldrig gör - **Påstår inte att något är avgjort.** Försäkringsmodulen har inget fält som liknar ett utfall; garantimodulen svarar *oklart* när underlaget inte räcker. - **Hittar inte på leverantörs-API:er.** Integrationer som inte finns är märkta som obyggda. - **Sätter inte härkomst från anroparen.** Tid, användare, evidensgrad och kalibrering härleds av systemet. --- ## 2. Vad som är byggt ### Omfattning, räknad | Del | Rader | |---|---| | Domänlogik, klient (`app/src/felsokning`) | 8 649 | | Felsökningsgränssnitt (`app/src/pages/felsokning`) | 4 312 | | ALVA-yta: webbplats och portal (`app/src/pages/alva`) | 2 455 | | Delade moduler (`services/gemensam`) | 3 881 | | Plattformstjänst (`services/plattform`) | 2 794 | | Designsystem (`app/src/alva`) | 785 | | Infrastruktur (`infra`, Terraform + schema) | 4 055 | **17 metodiker**, **48 händelsetyper**, **39 API-vägar**, **18 databastabeller**, **24 testfiler**. ### Metodiker Vibration under körning · Bromssystem · Styrning och fjädring · Elsystem och strömförsörjning · Start- och laddningssystem · Motorgång och effekt · Kylsystem och överhettning · Växellåda och drivlina · Avgassystem och emissioner · Klimatanläggning · Högvoltsystem (elbil och hybrid) · Felkoder och kommunikation · Läckage · Missljud · ADAS · Generisk. Varje metodik är en sekvens av steg med kontroller. En kontroll har ett krav (text, mätvärde eller foto) och kan undantas — men bara med skriven motivering. ### Ärendeflödet, i den ordning teknikern möter det 1. **Objektidentifiering** — regnr eller VIN, verifierad. 2. **Pre-diagnostik.** Metodiken öppnas inte förrän den är besvarad. Ingår: - **Fordonshistorik** — måste aktivt besvaras; ett *nej* kräver motivering. - **Ingående mätarställning** — måste **fotograferas**; en inskriven siffra utan foto graderas E1 i stället för E2 och spärrar avslut. - **Felbeskrivning verifierad** och **tidiga observationer**. 3. **Symptomverifiering** — kundens beskrivning blir aldrig ett konstaterat fel förrän den reproducerats, eller dokumenterats som ej reproducerbar. 4. **Metodiken** — steg för steg, med evidens per kontroll. 5. **Felorsaksanalys** — avvikelse, orsakskategori, underlag, säkerhetsgrad. 6. **Åtgärdsförslag och kundbeslut** — arbete får inte redovisas som utfört utan registrerat kundbesked. 7. **Åtgärd och verifiering.** 8. **Avslutssats (ALVA-RULE-200)** och **utgående mätarställning**. ### Evidensmodellen | Grad | Vad det är | |---|---| | E5 | Dokument (skannad arbetsorder) | | E4 | Mätvärde med **kalibrerat instrument uppslaget i registret** | | E3 | Video med ljud | | E2 | Foto — inklusive fotograferad mätarställning | | E1 | Teknikerns observation, kontrollresultat, **transkriberad** mätarställning | E4 kräver att `matdonId` går att slå upp i organisationens mätdonsregister. Beteckning och kalibreringsdatum **härleds därifrån** och skriver över det klienten skickade. Ett okänt mätdon avvisas. ### Kvalitetsgrinden Server-auktoritativ. Klienten har ingen egen åsikt — den frågar `grinda()` och renderar grindens egna hinder. Grinden kräver bl.a. objektidentifiering, besvarad historik, fotograferade mätarställningar in och ut, symptomverifiering, felorsaksanalys, kundbeslut när arbete utförts, och en avslutssats som passerar ALVA-RULE-200. ### Portalen och webbplatsen Publikt: översikt, kontoansökan, inloggning, Impressum, utgåvor. Portal (kräver session): dashboard, analys, kunskapskällor, integration, fakturor, **garantier**, **försäkring**, **support**, diagnostik. ### Regelverksmoduler **Garantier (ALVA-SPEC-040).** EU och USA, med källa och kontrolldatum per post. Bärande skiljelinje: **lagstadgat mot avtalat**. Nybils-, rostskydds-, lack- och drivlinegaranti är *avtalade* — ingen lag kräver dem. Avgasgarantin är lagstadgad i bägge jurisdiktionerna och den enda som är det. **Försäkring (ALVA-SPEC-041).** Sju villkor som avgör en maskinskadefråga, och ett register över svenska bolags noterade gränser med avläsningsdatum. Poster äldre än 180 dagar märks som föråldrade. Modulen avgör aldrig något. **Support (ALVA-PROC-0050).** Felanmälan i varje ärende. Sammanhanget härleds — ärende, metodik, plattformsversion, spår-id — och identifierande fält kan inte smugglas med. Anmälan är oföränderlig, statusen en projektion. **Abonnemang (ALVA-PROC-0002).** Kontot startar på Free och stannar där tills någon väljer annat — ingen provperiod som tyst börjar kosta. Faktura utfärdas vid registreringen (på noll) och sedan månadsvis av ett eget jobb, idempotent på perioden. Fyra nivåer: Free, Standard, Premium, Enterprise (per avtal, utan listpris). Basavgift plus per aktiv användare. PDF genereras utan beroenden — formatet skrivs för hand. Vid utebliven betalning: synlig nedräkning på 14 dagar, sedan låsning av nya ärenden. **Läsning och export påverkas aldrig, i något tillstånd** — loggen är verkstadens underlag i en tvist som gäller deras kund. **Fakturering (ALVA-PROC-0001).** Fakturan härleds ur organisationens tillstånd. Utfärdad faktura ändras aldrig; betalning är en händelse. Nummerserie utan luckor. Ingen betalleverantör. --- ## 3. Tekniken ### Stack | | | |---|---| | Klient | Vite 5.4 · React 18 · TypeScript · Tailwind · zustand · react-router 7 | | Tjänster | Node 22, `node:http` utan ramverk. Enda beroende: `pg` | | Databas | PostgreSQL | | Test | vitest (enhet) · Playwright (genomgång, portalspärr) · bash + riktig Postgres (integration) | | Typsnitt | IBM Plex Sans/Mono, **inbäddade som data-URI** — noll externa hämtningar | Att plattformstjänsten är ramverkslös är ett val: den ska gå att läsa i sin helhet av den som ska lita på den. ### Arkitektoniska principer **Händelsekälla.** Append-only-loggen är enda sanningskällan; allt annat är projektioner. Det gäller genomgående — ärendets status, fakturans status, supportärendets status, evidensrapporten. **Härlett, inte inskrivet.** Sammanfattningen, fakturan, mätdonets kalibrering, supportens sammanhang och versionen vid avslut härleds. Det som går att härleda skrivs inte av. **Stängt schema.** `granskaHändelse` itererar händelsens *egna* nycklar och avvisar allt odeklarerat — hårt, inte genom tyst strippning. **Server-ägd härkomst.** `tillPost()` skriver över användare och tidpunkt från den verifierade sessionen och serverklockan. Klientens klocka bevaras separat för offlinearbete. **Krypto-shredding.** Identifierande fält krypteras med en nyckel per subjekt. Radering = förstöra nyckeln. Nycklarna är **kuverterade** under en huvudnyckel utanför databasen. ### Databasen 18 tabeller. Append-only-skydd (databastrigger, inte applikationslogik) på: `felsokning_handelser`, `felsokning_arenden` (kolumnvis), `fakturor`, `fakturahandelser`, `atkomstlogg`, `raderingar`, `supportarenden`, `supportinlagg`. `personnycklar` har ett smalare skydd — nyckeln måste kunna förstöras, men identiteten kan inte ändras. Händelsenyckeln är `(arende_id, id)`, inte `id` ensamt. Se TÜV T-1. ### Infrastruktur Självhostad på AWS, Terraform-beskriven: EKS, RDS (Aurora Postgres), S3 för bilagor, Secrets Manager + External Secrets, KMS, IRSA för tjänsteidentitet. Nattlig CronJob för gallring. **Inga hemligheter i Terraforms tillstånd.** Hemligheter: `DATABASE_URL`, `JWT_SECRET`, `INTEGRATION_NYCKEL`, `PERSONNYCKEL_HUVUD`, `FAKTURERING_NYCKEL`, `SUPPORT_NYCKEL`, `ECM_REGLER_NYCKEL`/`_SIGNATUR`. ### CI Fyra jobb: `check` (värdapplikationen), `alva` (460 enhetstester, lint, typkontroll), `genomgang` (fyra hela ärenden genom det byggda gränssnittet + portalspärren), `plattform` (157 integrationskontroller mot riktig Postgres). --- ## 4. Mognad ### Vad som är bevisat | Garanti | Hur den är bevisad | |---|---| | Append-only håller | Direkt `UPDATE`/`DELETE` avvisas oavsett anslutande konto. Prövat mot riktig Postgres. | | Grinden är auktoritativ | Klienten har ingen egen regel; testet kräver att den inte har någon. | | Schemat är stängt | Prövat mot verklig trafik: 41 händelser ur ett kört ärende. | | Portalen är stängd | Byggd med plattform konfigurerad, kontrollerat var besökaren hamnar. Mutationstestat. | | Mätkedjan är spårbar | Okänt mätdon avvisas; registrets datum skriver över klientens. | | En hyresgäst kan inte blockera en annan | Motspelande-hyresgäst-harness i CI. | | Återställning fungerar | Dump återställs och triggarna kontrolleras. | ### Vad som är öppet, uttryckligen | Punkt | Läge | |---|---| | **TÜV T-3, restdel** | Kuverteringen stänger "nyckeln bredvid chiffertexten", inte backupfönstret. En backup tagen före en radering plus huvudnyckeln återställer uppgifterna. Kräver nyckel per subjekt i KMS. | | **T-12** | Ingen react-router-version är fri från bägge avvikelserna; den som bärs gäller RSC-läge som inte används. | | **Terraform** | CronJob och hemlighetskoppling skrivna men **ej applicerade** — ingen terraform-binär i miljön. | | **Rev 1 · C-4** | Personuppgiftsbiträdesavtal och DPIA — dokument att skriva och skriva under. | | **Rev 1 · m-4** | Avveckla Supabase-orkestratorn — driftbeslut. | | **Rev 1 · m-6** | Manuell tillgänglighetsgranskning. | | **Impressum** | Strukturen finns; driftens uppgifter är **inte satta** och redovisas som åtgärdslista. | | **Försäkringsregistret** | Sex svenska bolag. Inte en marknadsundersökning. | | **Leverantörsintegrationer** | Register och kryptering finns; verkliga leverantörs-API:er är inte inkopplade. | ### Revisionshistorik Tre revisioner, alla interna, alla med reproducerade fynd: - **Revision 1** — fann att grinden bara fanns i klienten (C-2). Stängd. - **Revision 2** (VAG-lins) — fann att händelseschemat var öppet (C-5) och att klientens regel drivit isär från serverns (M-7). Stängda. - **TÜV-revisionen** (ALVA-DOC-0003) — 12 fynd, 3 kritiska. 10 stängda, 2 reducerade med skälen utskrivna. Mönstret i alla tre: kontrollerna är riktiga i sina egna termer och oprövade vid sina gränser. ### Ärlig sammanfattning av mognaden **Kärnan är produktionsmässig.** Metoden, loggen, grinden, evidensmodellen och rapporten är genomarbetade, prövade mot riktig databas och riktigt gränssnitt, och har överlevt tre revisioner som letade fel på allvar. **Kommersiellt finns nu hela kedjan** — registrering, gratisnivå, månadsfaktura, PDF, nivåbyte, betalningspåminnelse och spärr. Prislistan är platshållare och ska sättas per marknad; utskicket av PDF per e-post har ingen avsändartjänst konfigurerad, så kunden hämtar den från portalen tills en sådan finns. **Juridiskt är strukturen på plats men inte fylld.** Impressum, dataskydd, tillgänglighet och tvistlösning har sina platser och sina rättsliga grunder; uppgifterna är inte ifyllda och två dokument (biträdesavtal, DPIA) är inte skrivna. **Driftsmässigt är den beskriven men inte driftsatt.** Terraform beskriver hela klustret; ingenting har applicerats mot ett riktigt AWS-konto. Rimligaste nästa steg, i ordning: applicera Terraform mot en riktig miljö · fyll Impressum · skriv biträdesavtal och DPIA · stäng T-3 med KMS. --- ## 5. Nomenklatur | Beteckning | Vad | |---|---| | `ALVA-CASE-91821` | Ärende | | `ALVA-PROC-0001` | Process (fakturering) | | `ALVA-PROC-0030` | Ärendesammanfattning | | `ALVA-PROC-0040` | Gallring | | `ALVA-PROC-0050` | Support | | `ALVA-RULE-200` | Avslutssatsen | | `ALVA-SPEC-001` | Designsystem och typografi | | `ALVA-SPEC-002` | Utgåvor | | `ALVA-SPEC-004` | Mätdon | | `ALVA-SPEC-020/021` | Integrationsgränssnitt | | `ALVA-SPEC-040` | Garantiregimer | | `ALVA-SPEC-041` | Försäkringsvillkor | | `ALVA-SPEC-050` | Företagsuppgifter | | `ALVA-SRC-010` | Kunskapskälla | | `ALVA-INV-0001` | Faktura | | `ALVA-SUP-0001` | Supportärende | | `ALVA-REP-0100` | Driftrapport | | `ALVA-DOC-0002/0003/0004` | Revision 2 · TÜV-revision · denna fil | ## 6. Designsystem i korthet 8 px-rutnät utan undantag, låst av test. Palett: Graphite `#1B1E22`, Steel `#4D5662`, Light Steel `#D7DCE2`, Background `#F6F7F8`, ALVA Blue `#005CA9`. Räta hörn. Inga gradienter, ingen animation, inga emojier, inga marknadsföringsord — allt låst av test som läser källkoden. **Språkgränsen:** ALVA:s *struktur* är engelsk och oföränderlig (stegen, beteckningarna, rubrikerna). *Innehållet* är på arbetsspråket. Därför är portalen engelsk och felsökningsgränssnittet svenskt. --- *ALVA-DOC-0004 · Räknat och skrivet 2026-08-06 mot `ae5acbe`*