Files
alva/felsokning/docs/MVP.md
T
Claude e94a97715a Kartan och driftshandboken stämmer med AWS igen
Infrastrukturen byttes ut men dokumentationen beskrev fortfarande den
gamla världen: kustomize, Argo CD, nginx-ingress, Postgres i klustret,
GHCR och tre databaslägen. En inaktuell karta är sämre än ingen — den
lurar den som litar på den.

Infrakartan är omritad mot AWS: tjänsterna och var de ligger, den egna
bygg- och driftkedjan från commit till kluster, gränserna inklusive
IRSA-bindningen, nätets tre lager och de fyra sakerna som återstår innan
skarp drift. Ärendets flöde är oförändrat — produkten är densamma, det är
grunden under den som bytts.

DRIFT.md beskriver nu de två Terraform-lagren och varför de är två,
Aurora med PITR i ett subnätlager utan routing ut, hemligheterna i
Secrets Manager där Terraform aldrig ser värdena, och CD-kedjan över
Gitea med egna runners. MVP.md har fått en rad för AWS-driften.

Kartan säger också rakt ut vad som INTE verifierats: terraform validate
kunde inte köras eftersom registry.terraform.io var blockerad, så det
som kontrollerats är formatering och statisk referenskontroll. Det står
först i listan över vad som ska göras innan skarp drift.

Verifierat: 96 vitest-tester, rotens lint och format:check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
2026-08-04 13:11:58 +00:00

20 KiB
Raw Blame History

Guidad Felsökning MVP

Första körbara versionen av kärnan i Master Prompt v1.0. Byggd som en fristående del av denna kodbas under /felsokning.

Kör

npm install
npm run dev        # öppna http://localhost:8080/felsokning
npm test           # projektions-, synk- och demotester
npm run typkontroll # tsc --noEmit (vite build typkontrollerar inte)

Förhandsvisning som en enda fil (t.ex. för delning) byggs med hash-routing, annars fungerar den bara när den serveras från roten:

VITE_HASH_ROUTER=1 npm run build

I det läget är / Guidad Felsökning i stället för värdapplikationens startsida, och sidan fungerar oavsett vilken sökväg den ligger på.

Demomanus för visning: DEMO.md. Knappen Skapa demoärende på startsidan lägger in ett komplett vibrationsärende med 1 tim 35 min historik.

Vad som ingår

Direktivets kärna Status i MVP
Objektidentifiering först QR-/streckkodsläsning (src/felsokning/streckkod.ts): kameraströmmen läser QR, Code 39/128, Data Matrix och PDF417 via webbläsarens BarcodeDetector. Avläst kod klassificeras innan den används — VIN (17 tecken utan I/O/Q), svenskt regnr (båda serierna) eller serienummer — och identifieraren plockas ut även ur QR-innehåll som URL:er eller vin=…-fält; fritext och nakna URL:er avvisas. Saknar webbläsaren API:t (t.ex. iOS/Safari) fotograferas typskylten i stället och plattformens bildtolkning läser av den — kameran är gränssnittet oavsett enhet. Manuell inmatning med bekräftelsesteg finns kvar.
AI-guidad felsökning Deterministisk metodikmotor (en fråga i taget, tre metodiker) plus Claude-orkestern driven av plattformen: edge-funktionen felsokning-ai äger Claude API-nyckeln (serverhemligheten ANTHROPIC_API_KEY) och routar per uppgift — handledning i realtid (Sonnet 5), djupgranskning av hela underlaget via knapp i briefen (Opus 5, hög effort), AI-komplettering av överlämningen med risker & osäkerheter (Sonnet 5) och metodikklassificering av felbeskrivningen (Haiku 4.5). Alla svar är schema-bundna och klassificerade enligt AI-reglerna, med automatisk fallback till Anthropics rekommenderade reservmodell vid avböjd förfrågan; modellen som svarade loggas i varje händelse. Kräver inloggad användare; svaren är interna och delas aldrig i kundvyer. I lokalt läge guidar metodiken ensam.
Arbetslogg Append-only händelselogg med tidsstämpel och användare på varje post. Ingenting skrivs över.
Tidredovisning Kategorier (aktiv felsökning, väntetid, provkörning …) via kategoribyten i loggen; paus räknas inte i total tid. Inaktivitetsfråga efter 20 min utan händelser.
Dokumentation Observationer, mätvärden, foton (nedskalade), video med ljud (E3-evidens för det som låter eller rör sig — kort klipp med obligatorisk beskrivning, hård storleksgräns, originalfilen bevaras och visas i logg, rapport och Live Share), kommentarer och hypoteser. Hypoteser märks alltid som ej verifierade och kan aldrig loggas som konstaterade fel. Avslutet signeras automatiskt av teknikern (”Felsökning avslutad — signerad av …”), redovisat i kvalitetsgrinden.
Ärendebrief Regenereras ur loggen vid varje visning: utförda kontroller, observationer, ej kontrollerat, rekommenderat nästa steg, tillförlitlighet, total arbetstid.
Överlämning ”Lämna över arbete” genererar överlämningsrapport ur briefen och loggar överlämningen.
Kundrapport Tidslinjevy utan interna poster, med bilder och tidsfördelning. Utskrift/PDF via webbläsaren, med påminnelse om granskning före delning.
Röstinmatning (tal in, text ut) Push-to-Talk via webbläsarens taligenkänning (sv-SE): lyssnar bara efter aktivt tryck, röd indikator med realtidstranskript, texten hamnar i ett redigerbart fält och skickas aldrig automatiskt. Knappen visas bara i webbläsare med talstöd. Produktionsversionen byter motor till leverantörens Voice-to-Text bakom samma gränssnitt.
Verifierade checklistor Varje kontroll i metodiken har ett minimikrav (foto, mätvärde eller kort observation). Foto-kontroller verifieras med bild; mätningar kan inte markeras verifierade utan värde.
Export Versionsmärkt JSON-export (version = antal händelser vid exporttillfället, med användare och tidpunkt); exporten loggas själv som händelse. PDF via utskrift. CSV och API i backend-fasen.
Multi-tenant & roller I självhostat läge: registrering skapar organisation + systemadministratör; admin hanterar användare (tekniker/arbetsledare/admin) via UI; all ärendedata organisationsisolerad i API:t; roll + organisation i JWT:n. Arbetsledarvy (/felsokning/oversikt): organisationens alla ärenden med status, deltagande tekniker och statistik (pågående/avslutade/ledtid) — härlett ur händelseloggen; ärenden kan hämtas till enheten med konfliktfri flätning. Felorsaksstatistik (flottdata): orsakskategorierna ur alla felorsaksanalyser aggregeras per organisation och visas som stapelöversikt i arbetsledarvyn. Ansvarig tekniker per ärende härleds ur loggen (skapare → överlämning → omfördelning) och arbetsledaren kan omfördela pågående ärenden — loggat som den organisationsinterna händelsen ansvarig_satt, aldrig synlig i kund-/partnerdelningar. Integrationstestat mot riktig Postgres (isolering, rollstyrning, append-only, översiktens behörighet och härledningar).
Backend & synk Databas-migration (supabase/migrations/20260802230000_guidad_felsokning.sql): ärenden + händelser med RLS, append-only även i databasen (inga update/delete-rättigheter). Synklager i klienten: konfliktfri ihopflätning av händelser per id (testad), push av lokala + pull av kollegors händelser var 15:e sekund. Utan inloggning arbetar appen i lokalt läge; status visas i ärendehuvudet.
Metodiker Tre: vibration, elsystem/strömförsörjning (relä-exemplet ur visionen) och generisk — vald automatiskt utifrån felbeskrivningen.
Live Share Delningsgränsen är en tillåtelselista: händelsetyper räknas upp per nivå (kund/partner/intern) i stället för att nekas en och en, så en ny händelsetyp är intern tills någon aktivt släpper fram den — låst av ett test som kräver att varje typ i domänmodellen är klassificerad. Skrivskyddad livevy per ärende (/felsokning/dela/:id): status ✔/🔄/, bilder, mätvärdestabell, tidslinje, rekommenderat nästa steg. Uppdateras automatiskt, interna poster filtreras bort. Publik delningssida (/felsokning/delad/:kod) läser via hamta_delat_arende utan inloggning och pollar för liveuppdatering; "Kopiera delningslänk" finns i rapportfliken. Behörighetsnivåer: återkallbara delningslänkar per nivå — kund (det kunddelbara), extern partner (även hypoteser, märkta ej verifierade), intern (full insyn) — med serverstyrd filtrering, hanterade från rapportfliken i självhostat läge.
Dashboard Enligt direktivet: räknare och filter för Alla/Pågående/Klara plus Starta nytt ärende.
Ärendestart via arbetsorder Primärvägen när ett ärende startas: fota arbetsorderns framsida — orkesterns dokumenttolkning (Claude Sonnet 5, vision) läser kund-, fordons- och verkstadsuppgifter oavsett layout och sätter konfidens per fält. 🟢 ≥95 % godkänns automatiskt, 🟡 8095 % markeras för genomläsning, 🔴 <80 % kräver aktiv bekräftelse — teknikern granskar bara osäkra fält. Visuell granskning med dokumentet bredvid fälten (klick markerar ungefärlig position), sedan skapas hela ärendet med ett tryck. Tolkningen loggas som organisationsintern händelse (arbetsorder_skannad) och delas aldrig i kund-/partnervyer. Manuell inmatning finns kvar som andrahandsväg; i lokalt läge visas en tydligt märkt demo-tolkning. Inloggade användare tillfrågas aldrig om namn — kontot vet redan.
Inställningar Systemadministratören väljer vilka objekttyper och identifieringsmetoder som visas när ett ärende startas (/felsokning/installningar). På plattformen gäller valet hela organisationen (sparas på organisationen, endast admin får ändra — verifierat i integrationstestet); i lokalt läge gäller valet enheten. Okända värden filtreras och tomma listor faller tillbaka till standard.
Evidensmotor (ECM) Eget subsystem med sex motorer (moduler/evidensmotor.md, src/felsokning/ecm.ts, ECM v2.0): Evidence (evidensposter med nivå E0E6, tekniker och innehållshash), Rule (dokumentationskrav + undantagsregeln med obligatorisk orsak), Compliance (ärendetypen — garanti/försäkring/reklamation m.fl. — styr extra krav), Validation ("Evidens saknas" i stället för antaganden, kodat i orkesterns grundprompt), Completion (kvalitetsgrind som spärrar slutrapporten) och Traceability (spårbarhetspaket med regelversion + hash i varje export). ECM Knowledge Library: compliance-reglerna är deklarativ data som serveras av plattformen (GET /api/ecm/regler, utbytbar via ConfigMap) — uppdateras i driften utan appändring; klienten cachar och faller tillbaka till inbyggt standardpaket offline.
Pre-diagnostik Ingen felsökning förrän grundkontrollerna är gjorda eller motiverade: fordonshistorik — tidigare ärenden på samma fordon hämtas automatiskt med sina felorsaker (server i inloggat läge, lokala storen annars) och orsakskedjan kopplas med ett tryck; Ja/Nej med obligatorisk orsak → kvalitetsvarning, ingående mätarställning (foto av instrumentpanelen, bildtolkningen föreslår värdet), kundens felbeskrivning verifierad och tidiga observationer hanterade. Metodiken låses upp först därefter. Utgående mätarställning fotograferas inför avslut och blir obligatorisk i grinden när ärendet stängs.
Symptomverifiering (SVP) Kundens beskrivning ≠ konstaterat fel: beskrivningen dokumenteras ordagrant, förtydligas via metodikens symptomfrågor (generiska metodiken har SVP-setet när/var/hur) och reproduceras — Ja (hur/förhållanden), Delvis (vad kunde/kunde inte) eller Nej (obligatorisk motivering). Rapportens beviskedja skiljer kundens beskrivning, verifierad observation, felorsaksanalys och rekommenderad åtgärd; formuleringen "kunde inte reproduceras under de förhållanden som rådde" används i stället för "felet konstaterat" (kodat även i orkesterns grundprompt).
Felorsaksanalys Obligatorisk före avslut: konstaterad avvikelse (kvalitetsregeln avvisar "trasig/defekt/sliten" utan förklaring), orsakskategorier (inkl. Okänd orsak med krav på motivering), minst en evidenskälla som valideras mot loggen, säkerhetsnivå (medel/låg kräver stärkande kontroller) och rekommenderad åtgärd. Avslutsknappen spärrad tills SVP + felorsak finns; kvalitetsgrinden gör båda obligatoriska vid stängning. Eget avsnitt i slutrapporten.
Kundgodkännande Åtgärdsförslag lämnas till kund innan arbetet påbörjas (förifyllt ur felorsaksanalysen, med uppskattad kostnad) och visas i Live Share — kunden ser vad som föreslås. Kundens besked registreras med utfall, kanal (telefon/på plats/e-post/SMS/delningslänk) och motivering vid avböjt. Åtgärdsknappen är låst tills beskedet finns och förblir låst vid avböjt; kvalitetsgrinden flaggar hårt om arbete utförts trots avböjt förslag. Kunden kan även svara direkt i sin delningslänk — den enda skrivande publika vägen, med sex spärrar (endast kundnivå, ej återkallad, förslag måste finnas, ett besked per ärende, begränsat innehåll, takt-begränsning), samtliga verifierade i integrationstestet.
Åtgärd och kvalitetskontroll Arbetsflödets sista led: åtgärden dokumenteras (vad som gjordes + delar) eller motiveras varför den uteblev (kunden avböjde, väntar på reservdel …). Har en åtgärd utförts krävs kvalitetskontroll — symptomet borta / kvarstår / delvis / kunde inte verifieras, med beskrivning av hur det verifierades under samma förhållanden som symptomet reproducerades. Kvarstående symptom flaggas i grinden i stället för att döljas. Avslutsknappen är spärrad tills hela kedjan symptomverifiering → felorsak → åtgärd → kvalitetskontroll är komplett; rapporten har ett eget avsnitt ”Utförd åtgärd och verifiering”.
Ärendeidentitet Fordonsobjektet som röd tråd: identiteten (AO-nummer, claim-/garantinummer, skadenummer, regnr, VIN, miltal, kund) registreras en gång — normalt via arbetsorderskanningen — och återanvänds i identitetsraden i arbetsytan (med ärendetypsval), låst panel överst i Live Share, slutrapportens första sida (Ärendeinformation + Fordonsinformation) och exporten.
Instrumentavläsning (visual-first) Kameran som universellt gränssnitt: 📷 Instrument i Dokumentera-panelen fotograferar multimetrar, diagnosskärmar, batteritestare m.m. — bildtolkningen identifierar instrumenttyp och extraherar värden/enheter/felkoder med konfidens per värde; teknikern bekräftar innan något loggas. Originalbilden loggas alltid tillsammans med de strukturerade mätvärdena — strukturerad data ersätter aldrig originalevidensen. Ingen integration mot diagnossystem krävs.
Utskrift Kundrapport och Live Share-vy skrivs ut svart på vitt; interaktiva element döljs automatiskt. Utskriften går genom ECM-kvalitetsgrinden.
Märkesspecifika kopplingar Verkstaden konfigurerar sina egna OEM-/fordonsdataleverantörer under Inställningar med sina egna credentials (moduler/markesspecifika-kopplingar.md): uppgifterna krypteras med AES-256-GCM i vila, returneras alltid maskerade (••••3456) och alla uppslag görs av servern — leverantörsnycklar når aldrig webbläsaren. Endast systemadministratören hanterar dem, kopplingarna är organisationsknutna och saknas krypteringsnyckeln sparas ingenting alls (fail closed). Leverantörer är data, inte kod: URL-mall, autentiseringstyp (bearer/header/basic/query) och svarsmappning beskrivs i integrationer.json (ConfigMap-utbytbar via INTEGRATIONER_FIL) — nya märken läggs till utan ombyggnad. Varje uppslag loggar teststatus, så ett utgånget abonnemang syns i inställningarna i stället för att ge tysta tomma svar. Verifierat i integrationstestet (rollstyrning, maskering, kryptering i databasen, organisationsisolering, fail closed).
Bilagor Foton, video och instrumentbilder ligger utanför händelsen; loggen bär en referens med innehållets SHA-256. Det stärker bevisvärdet: hashen står i den append-only-skyddade loggen, så en utbytt bild går att upptäcka — och innehållet kontrolleras mot hashen varje gång det lämnas ut (409 i stället för att visa bilden). Innehållsadresserat, så samma foto lagras en gång. Två lägen: databas (bytea, fungerar överallt) och s3 (AWS/MinIO/Ceph) med egen SigV4-signering som korsverifieras bit för bit mot botocore i testerna. Delningsgränsen gäller även bilagor — den skannade arbetsordern nås aldrig via kundlänken. Äldre händelser med inbäddad data-URL fortsätter fungera för alltid, och lokalt läge bäddar in som förut så dokumentation aldrig går förlorad utan nät.
Åtkomstkontroll Återkallelse är omedelbar: varje autentiserat anrop kontrollerar att kontot är aktivt och att token-versionen stämmer, i stället för att en avstängning börjar gälla när token går ut. Administratören stänger av och öppnar konton i användarlistan (kan inte stänga av sig själv, aldrig över organisationsgränsen), och var och en kan logga ut på alla enheter när en telefon tappats bort. Takt-begränsning på inloggning ligger i databasen och håller därför bakom flera repliker: 10 försök per konto och 30 per källadress inom 15 minuter, och spärren gäller kontot även vid rätt lösenord. Samtliga gränser verifierade i integrationstestet.
Drift på AWS Allt eget, inget GitHub: Gitea med egna Actions-runners i samma kluster, ECR med oföränderliga taggar, EKS med noder utan publika adresser, Aurora PostgreSQL i ett subnätlager utan routing ut, S3 för bilagor och Secrets Manager som sanningskälla för hemligheter — speglade av External Secrets, aldrig synliga för Terraform. Åtkomst via IRSA där varje roll är bunden till exakt ett tjänstekonto i en namnrymd; bygge och drift har skilda roller så ett komprometterat bygge inte kan driftsätta. Observation: CloudWatch med Container Insights, instrumentpanel och fyra larm — varav ett larmar på saknad data, eftersom en backup man tror finns är värre än ingen.
Infrastruktur som kod infra/terraform är systemets definition (README): karta.tf beskriver hela systemet en gång som data — tjänster, portar, routing, hemligheter per tjänst, dataflöden och gränser — och terraform output karta skriver ut samma sak i klartext. Namnrymden är stängd med nätverkspolicyer (bara ingress→tjänster, plattform→postgres, HTTPS ut utom privata nät), Postgres kör med säkerhetskontext, hemligheter kan genereras eller komma från en secrets-hanterare. Två lager i ordning: infra/aws (VPC, EKS, Aurora, S3, ECR, Secrets Manager, Route 53/ACM, CloudWatch) och infra/terraform (arbetslasten), där det andra läser det förstas utdata så inget anges två gånger. Uppdelningen är inte smak — en apply som både skapar ett kluster och schemalägger in i det är en känd Terraform-fälla.
Öppet API Plattforms-API:t är dokumenterat med OpenAPI 3.0 (services/plattform/openapi.yaml) — auth, användare, ärenden/händelser (append-only), översikt, publik delning och AI-orkestern, med scheman för alla händelsetyper. Specen valideras maskinellt, paritetstestas mot serverns rutter och serveras live på GET /api/openapi.yaml.

Arkitekturprinciper i koden

  • Händelseloggen är enda sanningskällan. src/felsokning/domain.ts definierar händelsetyperna; poster läggs endast till.
  • Alla vyer är projektioner. src/felsokning/projektioner.ts — brief, tidsfördelning, överlämningstext och kundrapport är rena funktioner av loggen och kan alltid regenereras. Testerna i src/felsokning/__tests__/ låser detta.
  • Metodikmotorn är deterministisk. src/felsokning/metodik.ts — nästa steg härleds ur vad som redan dokumenterats. Det är här den framtida AI:n ansluter, utan att logg eller projektioner ändras.
  • Ingen slutsats utan evidens. src/felsokning/ecm.ts — regelmotorn (ECM) validerar varje påstående mot händelseloggen: fullbordansregler, evidensnivåer och kvalitetsgrind. Kameran är integrationslagret (visual-first) — det som syns på en skärm eller ett instrument fotograferas och tolkas i stället för att integreras.
  • Terminologi. Produkten beskrivs som ett evidensbaserat diagnossystem/intelligent beslutsstöd — i UI och kundkommunikation används systemet/analysen/bedömningen/beslutsstödet, aldrig "AI" om det inte är tekniskt nödvändigt.
  • Egen ikongrafik. src/felsokning/ikoner.tsx — enkla industriella linjeikoner (SVG, stroke i aktuell textfärg) i stället för emojis; tillförlitlighets- och statusnivåer visas som färgpunkter.
  • Industriellt verkstads-UI (ETKA-inspirerat). src/felsokning/ui.tsx — plana ljusgrå ytor (#ECECEC/#F7F7F7), skarpa kanter, djup marinblå som primärfärg, tät typografi (1115 px), rektangulära knappar (max 4 px radie), verktygsrad ~44 px. Ärendesidan har klassisk trekolumnslayout på skrivbord: navigationsträd (vyer + metodikstegens status) till vänster, arbetsyta i mitten, kontextpanel (teknisk information, tillförlitlighet, teknisk rekommendation) till höger; en kolumn med flikrad på smala skärmar.

Medvetna avgränsningar

  • Ramen för tillverkarintegrationer finns (kunden lägger in sina egna credentials och slår upp fordonsuppgifter), men de anrikade datamängderna — utrustningsnivå, återkallelser, TSB:er — mappas inte ännu; registret behöver fler svarsfält och leverantörsprofiler innan det är meningsfullt.