Moduldokumenten på engelska som källa

De åtta moduldokumenten och exempelflödet får engelska versioner.
Kataloger och filnamn följer med: moduler/ → modules/, exempel/ →
examples/, och de svenska filnamnen ersätts av engelska. Ett engelskt
dokument i moduler/arendebrief.md hade varit inkonsekvent.

Bytet gjordes med git mv så historiken följer med, och interna länkar i
de svenska versionerna pekar nu på svenska syskon i stället för på
filnamn som inte längre finns.

Kodidentifierare och JSON-exempel står oöversatta även i de engelska
versionerna — falt, hemlig, uppslag och svarsfalt är fältnamn i
integrationer.json, inte prosa.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
Claude
2026-08-04 20:19:47 +00:00
parent 9035dfebc9
commit 86efbaaca5
18 changed files with 1102 additions and 2 deletions
@@ -0,0 +1,104 @@
# Brand-specific integrations
> Canonical version. Swedish: [brand-integrations.sv.md](brand-integrations.sv.md).
> Code identifiers are Swedish and appear verbatim.
The workshop already has its contracts. The Volvo workshop has VIDA, the VAG
workshop has erWin, the independent workshop has a vehicle-data vendor. None of
them wants us to be the middleman for their subscription — and none of them has
the same set as the workshop next door.
That is why **the customer configures their own integrations** under
**Settings → Brand-specific integrations**, with their own credentials. We
provide the frame, not the account.
## Principles
**The credentials never reach the browser.** The same rule as for the
platform's own API keys: secrets live on the server. Credentials are encrypted
with AES-256-GCM before being written to the database, and the API returns
secret fields masked (`••••3456`). The client can see *that* an integration
exists and when it last worked — never what the key is.
**All lookups are performed by the server.** The client sends an identifier
(VIN or registration number); the server fetches the credentials, decrypts them
in memory, calls the vendor and returns only the mapped vehicle fields.
**Fail closed.** If the encryption key (`INTEGRATION_NYCKEL`) is missing,
nothing is saved — the API answers 503 and the settings page explains why. The
alternative, storing in plaintext "for now", does not exist.
**System administrator only.** Adding, changing and removing integrations
requires the `admin` role. A technician can read the register of available
vendors (otherwise the settings page cannot show them) but never any
organisation's credentials.
**Organisation-scoped.** Integrations belong to the organisation, just like case
data. No tenant sees another's.
## Vendors are data, not code
The register lives in `services/plattform/integrationer.json` and can be swapped
for a ConfigMap mount via `INTEGRATIONER_FIL`. A vendor is described entirely
declaratively:
```json
{
"id": "volvo_vida",
"namn": "Volvo VIDA",
"falt": [
{ "nyckel": "bas_url", "etikett": "Bas-URL (använd {vin} som platshållare)", "hemlig": false },
{ "nyckel": "api_nyckel", "etikett": "API-nyckel", "hemlig": true }
],
"uppslag": {
"urlFalt": "bas_url",
"auth": "header",
"authHeader": "X-Api-Key",
"authFalt": "api_nyckel",
"svarsfalt": { "marke": "make", "modell": "model", "arsmodell": "year" }
}
}
```
* `falt` (fields) — what the administrator has to fill in. `hemlig: true`
(secret) governs both encryption and masking.
* `uppslag.auth` (lookup auth) — `bearer`, `header`, `basic` or `query`. No
vendor-specific code branches; all variation lives in the register.
* `svarsfalt` (response fields) — mapping from the vendor's JSON (dot notation
supported) to our vehicle fields.
* `nyckeltyp: "regnr"` — the lookup is done on registration number instead of
VIN. `{vin}` / `{regnr}` in the URL template are substituted URL-encoded.
A new brand is therefore added by describing it — not by rebuilding the
application.
## What a lookup does and does not do
The lookup fills in the **vehicle description** (make, model, year, engine,
transmission). That is context data, not evidence: an answer from a vendor is
never a performed check and does not count in the
[evidence engine](evidence-engine.md). If the vendor returns no known fields,
the system says so plainly instead of showing empty rows.
Every lookup writes `senast_testad` (last tested) and `senaste_status` (last
status) on the integration. An expired subscription therefore shows up in
settings as an error message from the vendor, not as silently empty answers.
## API
| Route | Method | Role | What |
| --- | --- | --- | --- |
| `/api/integrationer/leverantorer` | GET | logged in | The register (field definitions, no credentials) |
| `/api/integrationer` | GET | admin | The organisation's integrations, secrets masked |
| `/api/integrationer` | POST | admin | Save/update credentials (encrypted) |
| `/api/integrationer/{leverantor}` | DELETE | admin | Remove |
| `/api/integrationer/{leverantor}/uppslag` | POST | logged in | Look up VIN/registration via the server |
Fully documented in `services/plattform/openapi.yaml`.
## Operations
`INTEGRATION_NYCKEL` is 32 bytes of hex or base64 (`openssl rand -hex 32`),
delivered via the secret `felsokning-hemligheter` — see
[OPERATIONS.md](../OPERATIONS.md). If the key is rotated, the integrations must
be saved again; the service then shows no values rather than guessing.
@@ -0,0 +1,104 @@
# Märkesspecifika kopplingar
> **Svensk översättning.** Källan är [brand-integrations.md](brand-integrations.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
Verkstaden har redan sina avtal. Volvo-verkstaden har VIDA, VAG-verkstaden
har erWin, den fria verkstaden har en fordonsdataleverantör. Ingen av dem
vill att vi ska vara mellanhand för deras abonnemang — och ingen av dem
har samma uppsättning som grannen.
Därför konfigurerar **kunden själv** sina kopplingar under
**Inställningar → Märkesspecifika kopplingar**, med sina egna credentials.
Vi tillhandahåller ramen, inte kontot.
## Principer
**Uppgifterna når aldrig webbläsaren.** Samma regel som för
plattformens egna API-nycklar: hemligheter bor på servern. Credentials
krypteras med AES-256-GCM innan de skrivs till databasen, och API:t
returnerar hemliga fält maskerade (`••••3456`). Klienten kan se *att* en
koppling finns och när den senast fungerade — aldrig vad nyckeln är.
**Alla uppslag görs av servern.** Klienten skickar en identifierare
(VIN eller regnr); servern hämtar uppgifterna, dekrypterar dem i minnet,
anropar leverantören och returnerar bara de mappade fordonsfälten.
**Fail closed.** Saknas krypteringsnyckeln (`INTEGRATION_NYCKEL`) sparas
ingenting — API:t svarar 503 och inställningssidan förklarar varför.
Alternativet, att lagra i klartext "så länge", finns inte.
**Endast systemadministratören.** Att lägga till, ändra och ta bort
kopplingar kräver rollen `admin`. Teknikern kan läsa registret över
tillgängliga leverantörer (annars kan inställningssidan inte visa dem)
men aldrig någon organisations uppgifter.
**Organisationsknutet.** Kopplingarna hör till organisationen, precis
som ärendedata. Ingen tenant ser en annans.
## Leverantörer är data, inte kod
Registret ligger i `services/plattform/integrationer.json` och kan bytas
mot en ConfigMap-mount via `INTEGRATIONER_FIL`. En leverantör beskrivs
helt deklarativt:
```json
{
"id": "volvo_vida",
"namn": "Volvo VIDA",
"falt": [
{ "nyckel": "bas_url", "etikett": "Bas-URL (använd {vin} som platshållare)", "hemlig": false },
{ "nyckel": "api_nyckel", "etikett": "API-nyckel", "hemlig": true }
],
"uppslag": {
"urlFalt": "bas_url",
"auth": "header",
"authHeader": "X-Api-Key",
"authFalt": "api_nyckel",
"svarsfalt": { "marke": "make", "modell": "model", "arsmodell": "year" }
}
}
```
* `falt` — vad administratören ska fylla i. `hemlig: true` styr både
kryptering och maskering.
* `uppslag.auth``bearer`, `header`, `basic` eller `query`. Inga
leverantörsspecifika kodgrenar; all variation ligger i registret.
* `svarsfalt` — mappning från leverantörens JSON (punktnotation stöds)
till våra fordonsfält.
* `nyckeltyp: "regnr"` — uppslaget sker på registreringsnummer i stället
för VIN. `{vin}`/`{regnr}` i URL-mallen ersätts URL-kodat.
Ett nytt märke läggs alltså till genom att beskriva det — inte genom att
bygga om applikationen.
## Vad ett uppslag gör och inte gör
Uppslaget fyller i **fordonsbeskrivningen** (märke, modell, årsmodell,
motor, växellåda). Det är kontextdata, inte evidens: ett svar från en
leverantör är aldrig en utförd kontroll och räknas inte i
[evidensmotorn](evidence-engine.sv.md). Returnerar leverantören inga kända fält
säger systemet det rakt ut i stället för att visa tomma rader.
Varje uppslag skriver `senast_testad` och `senaste_status`
kopplingen. Ett utgånget abonnemang syns därför i inställningarna som ett
felmeddelande från leverantören, inte som tysta tomma svar.
## API
| Väg | Metod | Roll | Vad |
| --- | --- | --- | --- |
| `/api/integrationer/leverantorer` | GET | inloggad | Registret (fältdefinitioner, inga uppgifter) |
| `/api/integrationer` | GET | admin | Organisationens kopplingar, hemligheter maskerade |
| `/api/integrationer` | POST | admin | Spara/uppdatera credentials (krypteras) |
| `/api/integrationer/{leverantor}` | DELETE | admin | Ta bort |
| `/api/integrationer/{leverantor}/uppslag` | POST | inloggad | Slå upp VIN/regnr via servern |
Fullständigt dokumenterat i `services/plattform/openapi.yaml`.
## Drift
`INTEGRATION_NYCKEL` är 32 byte hex eller base64 (`openssl rand -hex 32`),
levererad via secret:en `felsokning-hemligheter` — se
[DRIFT.md](../DRIFT.md). Byts nyckeln måste kopplingarna sparas om;
tjänsten visar då inga värden i stället för att gissa.
+154
View File
@@ -0,0 +1,154 @@
# Module: The case brief
> Canonical version. Swedish: [case-brief.sv.md](case-brief.sv.md).
## Purpose
When a new technician takes over an ongoing case, they should become productive
in under a minute, without having to read the whole history.
The system automatically generates a structured summary of the case, updated
continuously.
This is not a chat but a **living case** in which the system maintains an
up-to-date working picture at all times.
---
## Example
**Object**
> Volvo XC60 D4 2019
> Registration ABC123
> Customer: Anders Svensson
**Customer's description**
> The car vibrates at around 88 km/h.
> The symptom occurs only while driving.
**Checks performed**
- ✓ Tyre pressure checked
- ✓ Wheel torque checked
- ✓ DOT codes documented
- ✓ Four wheels photographed
- ✓ Road test carried out
- ✓ Balance weights checked
**Observations**
- The right front tyre shows uneven wear.
- No obvious damage to the rims.
- The vibration is felt mainly in the steering wheel.
- No change under acceleration.
**Not checked**
- Radial runout
- Driveshafts
- Wheel bearings
- Four-wheel alignment
**Recommended next step**
1. Measure radial runout.
2. Check the driveshafts.
3. New road test.
**Total working time**
2 hours 14 minutes
**Reliability**
- 🟢 Customer details verified
- 🟢 Images documented
- 🟢 Measured values recorded
- 🟡 Root cause not yet verified
---
## The role of the analysis
The system should not merely summarise the history but also keep track of the
case's current position. When a new technician joins, it should be able to
answer questions such as:
- "What is left?"
- "What is most likely worth checking next?"
- "Which tests have already been performed?"
- "Are there any contradictory observations?"
- "What needs verifying before we go further?"
---
## Collaboration
This is built as a genuine multi-user system. Each case becomes a workspace in
which several people can take part.
Example:
```
Case #45281
Responsible: Anna
Participants: Johan, Erik, Lisa
```
- Everyone sees the same information in real time.
- All images end up in the same case.
- All measured values end up in the same log.
- All comments are timestamped.
- All generated summaries update automatically.
---
## Shift change — handover in one click
At shift change the technician simply presses **Hand over work**. The system
then generates a handover report automatically.
The incoming technician receives:
- what the customer experiences,
- what has already been done,
- which measurements exist,
- which images have been taken,
- which conclusions can be drawn with high confidence,
- which questions remain unanswered,
- the recommended next step.
Nobody has to read through hundreds of chat messages.
The same function is used for escalation: when a technician leaves their shift
or escalates a case, a short briefing is generated automatically containing:
- current position,
- verified facts,
- remaining work,
- risks or uncertainties,
- recommended next steps.
This lets the next technician carry on almost immediately, which is especially
valuable in larger workshops and service organisations where several people work
on the same object across different shifts.
---
## Architecture
The module fits a multi-tenant SaaS architecture well:
- **Tenant** = workshop or service organisation.
- **User** = technician, supervisor, workshop manager, administrator.
- **Case** = a shared workspace with common context.
- **Model context** = a structured, continuously maintained summary of the case,
used for briefing and guidance.
The last point matters: the model should not have to read the entire history
every time someone opens a case. Instead a structured case summary is
maintained and updated after every relevant event. That makes the system faster,
cheaper to run and more consistent, while the full log still remains for audit
and export.
+140
View File
@@ -0,0 +1,140 @@
# Modul: Ärendebrief
> **Svensk översättning.** Källan är [case-brief.md](case-brief.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
## Syfte
När en ny tekniker tar över ett pågående ärende ska denne kunna bli produktiv på under en minut, utan att behöva läsa hela historiken.
Systemet genererar automatiskt en strukturerad sammanfattning av ärendet som uppdateras löpande.
Det här är inte en chatt, utan ett **levande ärende** där AI:n hela tiden håller en uppdaterad arbetsbild.
---
## Exempel
**Objekt**
> Volvo XC60 D4 2019
> Reg.nr ABC123
> Kund: Anders Svensson
**Kundens beskrivning**
> Bilen vibrerar runt 88 km/h.
> Symptomet uppträder endast under körning.
**Utförda kontroller**
- ✓ Lufttryck kontrollerat
- ✓ Hjulmoment kontrollerat
- ✓ DOT-koder dokumenterade
- ✓ Fyra hjul fotograferade
- ✓ Provkörning genomförd
- ✓ Balanseringsvikter kontrollerade
**Observationer**
- Höger framdäck visar ojämnt slitage.
- Ingen uppenbar skada på fälgar.
- Vibration känns främst i ratten.
- Ingen förändring vid acceleration.
**Ej kontrollerat**
- Radialkast
- Drivaxlar
- Hjullager
- Fyrhjulsmätning
**Rekommenderat nästa steg**
1. Mät radialkast.
2. Kontrollera drivaxlar.
3. Ny provkörning.
**Total arbetstid**
2 timmar 14 minuter
**Tillförlitlighet**
- 🟢 Kunduppgifter verifierade
- 🟢 Bilder dokumenterade
- 🟢 Mätvärden registrerade
- 🟡 Felorsak ännu inte verifierad
---
## AI:s roll
AI:n ska inte bara sammanfatta historiken, utan också hålla reda på ärendets aktuella läge. Om en ny tekniker ansluter ska systemet kunna svara på frågor som:
- ”Vad återstår?”
- ”Vad är mest sannolikt att kontrollera härnäst?”
- ”Vilka tester är redan utförda?”
- ”Finns det några motsägelsefulla observationer?”
- ”Vad behöver verifieras innan vi går vidare?”
---
## Samarbete
Detta byggs som ett riktigt fleranvändarsystem. Varje ärende blir en arbetsyta där flera personer kan delta.
Exempel:
```
Ärende #45281
Ansvarig: Anna
Deltagare: Johan, Erik, Lisa
```
- Alla ser samma information i realtid.
- Alla bilder hamnar i samma ärende.
- Alla mätvärden hamnar i samma logg.
- Alla kommentarer tidsstämplas.
- Alla AI-sammanfattningar uppdateras automatiskt.
---
## Skiftbyte Överlämning med ett klick
Vid skiftbyte trycker teknikern bara på **Lämna över arbete**. Systemet genererar då automatiskt en överlämningsrapport.
Den nya teknikern får:
- vad kunden upplever,
- vad som redan gjorts,
- vilka mätningar som finns,
- vilka bilder som tagits,
- vilka slutsatser som kan dras med hög säkerhet,
- vilka frågor som fortfarande är obesvarade,
- nästa rekommenderade steg.
Ingen behöver läsa igenom hundratals chattmeddelanden.
Samma funktion används vid eskalering: när en tekniker lämnar sitt pass eller eskalerar ett ärende genereras automatiskt en kort briefing med:
- nuläge,
- verifierade fakta,
- återstående arbete,
- risker eller osäkerheter,
- rekommenderade nästa steg.
Det gör att nästa tekniker kan fortsätta arbetet nästan omedelbart, vilket är särskilt värdefullt i större verkstäder och serviceorganisationer där flera personer arbetar med samma objekt under olika skift.
---
## Arkitektur
Modulen passar mycket bra med en multi-tenant SaaS-arkitektur:
- **Tenant** = verkstad eller serviceorganisation.
- **Användare** = tekniker, arbetsledare, verkstadschef, administratör.
- **Ärende** = en delad arbetsyta med gemensam kontext.
- **AI-kontext** = en strukturerad, löpande sammanfattning av ärendet som används för briefing och vägledning.
Det sista är viktigt: AI:n bör inte behöva läsa hela historiken varje gång någon öppnar ett ärende. I stället underhålls en strukturerad ärendesammanfattning som uppdateras efter varje relevant händelse. Det gör systemet snabbare, billigare att köra och mer konsekvent, samtidigt som hela loggen fortfarande finns kvar för revision och export.
@@ -0,0 +1,106 @@
# Module: Communication model (voice)
> Canonical version. Swedish: [communication-model.sv.md](communication-model.sv.md).
## Core principle
**The user speaks, the system writes.**
The system uses voice-to-text for all spoken input. The technician should never
have to type on a keyboard while work is in progress.
No voice agent: the system does not hold a running spoken conversation, does not
read long answers aloud, and does not try to imitate a human conversation. The
communication is **speech in, text out**.
## Important design principle
> All voice is treated as an input method, not as a separate interface.
All logic in the system is built on text. Voice-to-text is only a way of
producing that text. That makes the solution easier to maintain, easier to
search, easier to export, and easier to develop further with new models in the
future.
## Workflow
1. The technician presses the microphone: *"I've measured between pin 14 and
ground. I get 12.4 volts."*
2. Voice-to-text transcribes the speech.
3. The transcribed text is sent to the model as an ordinary text request.
4. The answer always comes back in writing: *Verified: supply voltage present at
pin 14. Next step: check the ground connection at pin 7.*
## Why this choice?
- it works better in noisy workshops,
- it produces a permanent text log with no extra step,
- it makes the history easy to search,
- it reduces the risk of misunderstanding compared with a continuous spoken
conversation,
- it suits cases where several technicians work on the same job.
## Push-to-talk (PTT)
Voice input works on a push-to-talk basis. The app listens **only** while the
user actively holds the microphone button, or after they have started an
explicit recording. No background listening. No automatic activation.
### Flow
1. The user holds down the microphone button (or presses a clear "Record"
button, depending on the platform).
2. Recording starts immediately.
3. The app shows clearly that recording is in progress: a red indicator, a
timer, a level meter, and the text "Recording".
4. The speech is transcribed in real time — the user watches the text appear and
gets immediate feedback on whether the speech was understood correctly.
5. When the recording ends, the transcribed text is shown in an **editable**
text field.
6. The user can accept, edit or re-record.
7. **Only when the user confirms** is the text sent onward and saved to the work
log.
### Editing before sending
The transcription is always editable. Common corrections: registration numbers,
serial numbers, component designations, personal names, technical terms.
**"Send" never happens automatically.** The technician always gets a quick
chance to correct the transcription before it becomes part of the permanent work
log. That reduces the risk of incorrect registration numbers, component
designations and measured values.
### No hidden functionality
The user must always be able to see:
- when recording is in progress,
- when it has ended,
- what will be sent,
- what has actually been saved.
There must never be any doubt about when audio is being recorded or when
information is being sent.
## Automatic record keeping
Every transcribed sentence automatically becomes part of the work log:
```
08:14 "Measured voltage between pin 14 and ground. 12.4 volts."
08:14 System: Supply voltage verified.
08:15 "Relay doesn't click."
08:15 System: Check the control signal to the relay.
```
Everything is saved without the technician having to type a single line.
## Hands-free working
The app is optimised for busy or dirty hands. During a normal case the user
should be able to identify the object with the camera, photograph components,
dictate observations, be shown the next step and carry on working — without
typing manually. The interface has to work with gloves, dirty hands, strong
sunlight, noise and vibration; the microphone button is large, easy to hit and
gives clear visual feedback.
@@ -0,0 +1,81 @@
# Modul: Kommunikationsmodell (röst)
> **Svensk översättning.** Källan är [communication-model.md](communication-model.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
## Grundprincip
**Användaren pratar, systemet skriver.**
Systemet använder tal-till-text (Voice-to-Text) för all röstinmatning. Teknikern ska aldrig behöva skriva med tangentbord under ett pågående arbete.
Ingen röstagent: systemet för inte ett löpande röstsamtal, läser inte upp långa svar och försöker inte efterlikna en mänsklig konversation. Kommunikationen är **tal in, text ut**.
## Viktig designprincip
> All röst behandlas som ett inmatningssätt, inte som ett separat gränssnitt.
All logik i systemet bygger på text. Voice-to-Text är endast ett sätt att skapa den texten. Det gör lösningen enklare att underhålla, enklare att söka i, enklare att exportera och enklare att utveckla vidare med nya AI-modeller i framtiden.
## Arbetsflöde
1. Teknikern trycker på mikrofonen: *"Jag har mätt mellan stift 14 och jord. Jag får 12,4 volt."*
2. Voice-to-Text transkriberar talet.
3. Den transkriberade texten skickas till AI:n som en vanlig textförfrågan.
4. AI:n svarar alltid skriftligt: *Verifierat: Matningsspänning finns på stift 14. Nästa steg: Kontrollera jordanslutningen på stift 7.*
## Varför detta val?
- fungerar bättre i bullriga verkstäder,
- ger en permanent textlogg utan extra steg,
- gör det enkelt att söka i historiken,
- minskar risken för missförstånd jämfört med ett kontinuerligt röstsamtal,
- passar bättre när flera tekniker arbetar i samma ärende.
## Push-to-Talk (PTT)
Röstinmatning fungerar enligt Push-to-Talk. Appen lyssnar **endast** när användaren aktivt håller inne mikrofonknappen eller har startat en tydlig inspelning. Ingen bakgrundslyssning. Ingen automatisk aktivering.
### Flöde
1. Användaren håller inne mikrofonknappen (eller trycker på en tydlig "Spela in"-knapp beroende på plattform).
2. Inspelning startar omedelbart.
3. Appen visar tydligt att inspelning pågår: röd indikator, timer, ljudnivåmätare, texten "Inspelning pågår".
4. Talet transkriberas i realtid — användaren ser texten växa fram och får direkt återkoppling om talet uppfattats korrekt.
5. När inspelningen avslutas visas den transkriberade texten i ett **redigerbart** textfält.
6. Användaren kan godkänna, redigera eller spela in på nytt.
7. **Först när användaren bekräftar** skickas texten vidare till AI:n och sparas i arbetsloggen.
### Redigering före skick
Transkriberingen är alltid redigerbar. Vanliga korrigeringar: registreringsnummer, serienummer, komponentbeteckningar, personnamn, facktermer.
**"Skicka" sker aldrig automatiskt.** Teknikern får alltid en snabb chans att rätta transkriberingen innan den blir en del av den permanenta arbetsloggen. Det minskar risken för felaktiga registreringsnummer, komponentbeteckningar och mätvärden.
### Ingen dold funktionalitet
Användaren ska alltid kunna se:
- när inspelning pågår,
- när den är avslutad,
- vad som kommer att skickas,
- vad som faktiskt har sparats.
Det ska aldrig råda någon tvekan om när ljud spelas in eller när information skickas.
## Automatisk journalföring
Varje transkriberad mening blir automatiskt en del av arbetsloggen:
```
08:14 "Mätt spänning mellan stift 14 och jord. 12,4 volt."
08:14 AI: Matningsspänning verifierad.
08:15 "Relä klickar inte."
08:15 AI: Kontrollera styrsignal till relä.
```
Allt sparas utan att teknikern behöver skriva en enda rad.
## Handsfree-arbete
Appen är optimerad för upptagna eller smutsiga händer. Under ett normalt ärende ska användaren kunna identifiera objektet med kameran, fotografera komponenter, diktera observationer, få nästa steg presenterat och fortsätta arbetet — utan att skriva manuellt. Gränssnittet ska fungera med handskar, smutsiga händer, starkt solljus, buller och vibrationer; mikrofonknappen är stor, lätt att träffa och har tydlig visuell återkoppling.
@@ -0,0 +1,34 @@
# Module: Shareable customer report (customer view)
> Canonical version. Swedish: [customer-report.sv.md](customer-report.sv.md).
## Purpose
Instead of the customer receiving a line on the invoice reading "Diagnosis —
2.5 hours", they can be given a clear timeline of what was actually done.
Example:
```
08:03 Vehicle identified
08:10 Fault description recorded
08:18 Tyres documented
08:26 Visual check completed
08:42 Tyre pressure verified
08:57 Road test carried out
09:18 Conclusion and recommendation documented
```
With images, measured values and comments it becomes clear what the customer has
actually paid for. That strengthens trust and can reduce arguments about
diagnostic time.
---
## Relationship to the other modules
The customer report is a derived view of the same event log that
[Work log and time tracking](work-log-and-time-tracking.md) builds on — no
separate documentation has to be created. The workshop chooses what level of
detail is shared with the customer, in line with the role-based permission
model.
@@ -0,0 +1,28 @@
# Modul: Delningsbar kundrapport (Kundvy)
> **Svensk översättning.** Källan är [customer-report.md](customer-report.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
## Syfte
I stället för att kunden får en rad på fakturan som säger ”Felsökning 2,5 timmar” kan de få en tydlig tidslinje över vad som faktiskt utförts.
Exempel:
```
08:03 Fordonet identifierat
08:10 Felbeskrivning registrerad
08:18 Däck dokumenterade
08:26 Visuell kontroll genomförd
08:42 Lufttryck verifierat
08:57 Provkörning utförd
09:18 Slutsats och rekommendation dokumenterad
```
Med bilder, mätvärden och kommentarer blir det tydligt vad kunden faktiskt har betalat för. Det stärker förtroendet och kan minska diskussioner om felsökningstid.
---
## Relation till övriga moduler
Kundrapporten är en härledd vy av samma händelselogg som [Arbetslogg & Tidredovisning](work-log-and-time-tracking.sv.md) bygger på ingen separat dokumentation behöver skapas. Verkstaden väljer vilken detaljnivå som delas med kund, i linje med den rollbaserade behörighetsstyrningen.
+251
View File
@@ -0,0 +1,251 @@
# Module: The Evidence Engine (ECM — Evidence & Compliance Matrix)
> Canonical version. Swedish: [evidence-engine.sv.md](evidence-engine.sv.md).
> Code identifiers are Swedish and appear verbatim.
**Version: ECM v2.0** · ECM is its own subsystem — not a table in the database
— and the engine that governs the whole platform: it decides what documentation
is required, when documentation is missing, what level of evidence has been
reached, which rules apply, and whether a case may be closed.
**The system can never write a conclusion that ECM has not approved.**
The rule library is versioned and separate from the application logic
(`src/felsokning/ecm.ts`); the views only call the engine's pure functions.
## The six engines
### 1. Evidence Engine
Catalogues all evidence from the event log. Each evidence entry receives an id,
timestamp, technician, category, evidence level, summary and a **content hash**
— the same entry always yields the same hash, and the append-only log (database
triggers) makes every attempt at alteration impossible.
| Level | Type | Probative value |
| --- | --- | --- |
| E0 | No supporting evidence | 0 % |
| E1 | Technician's observation | Low |
| E2 | Photo | Medium |
| E3 | Video (with sound — for what makes noise or moves) | High |
| E4 | Measured value | High |
| E5 | Diagnostic data / document | Very high |
| E6 | Multiple independent sources | Highest |
### 2. Rule Engine
The documentation requirements: the methodology's `krav` field per check, plus
the automatic rules — *can it be photographed → require a photo; does it make
noise → video with sound; does it move → video; is it measured → a measured
value; does a display show the information → photograph the display; does a
document exist → photograph the document.* The exemption reasons ("supporting
evidence cannot be obtained") live here.
### 3. Compliance Engine
The case type determines which rules apply on top of the methodology. The case
type is chosen in the identity row and logged (`arendetyp_satt`):
| Case type | Additional requirements (v2.0) |
| --- | --- |
| Warranty | Odometer documented · service history checked · claim/warranty number |
| Goodwill | Odometer · service history |
| Insurance | Claim reference · photographic evidence |
| Complaint | History and previous attempts checked |
| Used-vehicle warranty | Odometer |
**The ECM Knowledge Library is implemented**: the rules are declarative data
(requirement type, not code) and are distributed from the platform via
`GET /api/ecm/regler` (`services/plattform/ecm-regler.json` — replaceable in the
cluster via a ConfigMap and the environment variable `ECM_REGLER_FIL`). The
client fetches the pack on page load, caches it, and falls back to its built-in
default pack when offline; broken packs and unknown requirement types are
filtered out. The rule pack's version travels with every traceability package.
New rules — warranty terms per manufacturer, insurers' requirements, consumer
complaint legislation, OEM checkpoints — are added in operations without
rebuilding the application.
### 4. Validation Engine
No claims without support, in three layers: (a) the orchestrator's base prompt —
never "OK / checked / no faults / repaired" without evidence, instead "Evidens
saknas" (evidence missing) plus a request for the right documentation; (b) the
projections — hypotheses can never become confirmed faults; (c) the quality gate
below.
### 5. Completion Engine
The quality gate before the final report and closing — printing is blocked until
every mandatory row is green:
| Check | Requirement |
| --- | --- |
| Vehicle/object identification verified | Mandatory |
| Work order read in | Recommended |
| Vehicle history checked or justified | Mandatory |
| Incoming odometer reading documented | Mandatory |
| Customer's fault description verified | Recommended |
| Customer's decision on the repair proposal | Mandatory when work has been performed |
| Repair documented or justified | Mandatory on closing |
| Quality check performed | Mandatory on closing after a repair |
| Outgoing odometer reading | Mandatory on closing |
| Methodology checks: evidence or documented exemption | Mandatory |
| Photos for photo-requiring checks | Mandatory |
| The case type's compliance requirements | Mandatory |
| Technician's conclusion signed | Automatic on closing |
| Evidence level above E0 | Mandatory |
### 6. Traceability Engine
Every export carries a traceability package: ECM version, case type, evidence
level, gate status per rule id, and all evidence entries with their hashes.
Together with the log, every conclusion can be traced: which image → which
measurement → which technician → which rule → which rule-set version → when.
## Pre-Diagnostic Validation
No diagnosis begins until the basic checks are performed or documented as
justified — the methodology unlocks only afterwards:
1. **Vehicle history** — the system automatically retrieves the organisation's
earlier cases on the same object (registration/VIN) together with their
documented root causes (`GET /api/fordon/{identifierare}/historik`; the local
store when offline) and shows them in the history step. The technician can
link the **causal chain** to the current case with one tap ("linked to
earlier case #N — …"), acknowledge the check — or answer No with a mandatory
reason → quality warning.
2. **Incoming odometer reading** — the instrument cluster is photographed; the
image interpretation proposes the value and the technician confirms it. The
photo becomes the official incoming reading.
3. **Customer's fault description verified** — additional symptoms are
documented as separate observations, never mixed in with the customer's
description.
4. **Early observations** — traces of previous repair, modifications, damage,
leakage and so on are documented with a photo or observation, or acknowledged
as "none further".
The **outgoing odometer reading** is photographed before closing and becomes
mandatory in the gate when the case is closed. The report shows in and out.
## Symptom Verification Protocol (SVP)
A fault is never diagnosed straight from a vague customer description. The chain
is always: **documented → clarified → reproduced, or documented as not
reproducible.**
- The customer's description is recorded verbatim at case start and verified in
pre-diagnostics; new symptoms become separate observations.
- Clarification happens through the methodology's symptom questions (when /
where / how / conditions / frequency — the generic methodology carries the
full SVP question set).
- **Reproduction** (Yes / Partly / No) is documented before closing: Yes
requires how and under what conditions; Partly requires what could and could
not be recreated; No requires a justification. The system never writes "fault
confirmed" without reproduction or other verification — instead: *"The
customer's description could not be reproduced under the conditions that
prevailed during the examination."* (also encoded in the orchestrator's base
prompt).
- The report's chain of evidence always separates: the customer's description →
verified observation → root-cause analysis → recommended action.
## Root-cause analysis
A case never closes with merely "component defective, replace component". Every
confirmed fault requires four mandatory answers:
1. **Observed deviation** — the quality rule rejects generic phrasing ("broken",
"defective", "worn", "needs replacing") without explanation.
2. **Most probable cause** — one or more categories (normal wear, material
fatigue, manufacturing defect, poor maintenance, incorrect previous repair,
external influence, corrosion, overheating, modification … plus *Unknown
cause*, which requires a justification).
3. **Supporting evidence** — at least one evidence source, and the source is
validated against the log: "Photo" is accepted only if a photo actually
exists.
4. **Confidence level** — high / medium / low; at medium or low, the technician
must state which further checks would strengthen the assessment.
The close button is blocked until SVP and the root-cause analysis are
documented, and the quality gate makes both mandatory when the case is closed.
The fleet data is already running: the **root-cause statistics** in the
supervisor view (`GET /api/statistik/felorsaker`) aggregate the cause categories
across the organisation — which components fail from wear, which after previous
repairs, which point to a design problem.
## Customer approval before work
The workshop may never carry out proposed work without the customer's decision
being recorded and traceable:
- **The repair proposal** is written in the guide (pre-filled from the
root-cause analysis's recommended action) with any estimated cost, and is
**shown to the customer in Live Share** — it is customer-shareable material.
- **The customer's decision** is recorded with an outcome (approved / declined /
partial), a **channel** (telephone, in person, e-mail, SMS, share link) and a
justification when declined or partial. The log entry carries who at the
workshop received the decision and when.
- **The "Document work performed" button is locked** as long as a proposal has
no decision — and stays locked when the decision is a refusal. The "No work
performed" path is open and refers to the recorded decision.
- The quality gate requires a recorded decision when work has been performed,
and flags the conflict *"Work performed despite a declined proposal"* as a
hard error.
**The customer can answer directly in their share link**
(`POST /api/delad/{kod}/beslut`) — the only writing public route in the entire
API, with six safeguards, each verified in the integration test:
1. Only shares at **customer level** (partner and internal links may never
answer on the customer's behalf) and never revoked ones.
2. The case's original share code has no recorded level and therefore cannot
answer either.
3. There must be a repair proposal to answer.
4. **One decision per case** — the answer cannot be changed afterwards (contact
the workshop instead).
5. Only `godkant` / `avbojt` / `delvis` plus a comment of at most 500
characters; nothing else can be written to the log by that route.
6. Rate limiting per share code.
The decision is logged as `kundbeslut` with the channel `Delningslänk` (share
link) and the sender "Kund via delningslänk" — the workshop's own entries
(telephone, in person …) work exactly as before.
## The repair phase (Repair & Verification)
The loop opened by symptom verification is closed here — a case cannot be
finished without it being clear what was done and whether it helped:
1. **Repair documented or justified** — either what was actually performed (with
any parts), or why no work was done (the customer declined, waiting for a
part, investigation only, quotation submitted, repair at another workshop).
2. **Quality check** — mandatory when a repair has actually been performed: is
the symptom gone, does it remain wholly or partly, or could it not be
verified? The outcome is documented together with how the verification was
carried out (the same conditions under which the symptom was reproduced).
A remaining symptom is never hidden: the gate states in writing that the case
should not be closed as repaired. The close button is blocked until the chain
**symptom verification → root-cause analysis → repair → quality check** is
complete, and the report presents it in its own sections.
## Case identity and vehicle context
The vehicle object is the connecting thread: the identity is recorded **once**
(normally via the work-order scan, which now also reads claim/warranty numbers
and insurance references) and is then reused everywhere:
- **Identity row in the workspace** — work order, claim, insurance reference,
vehicle, registration, VIN, odometer, responsible technician, plus the case
type selector.
- **Live Share** — a locked panel at the top with vehicle, references and
status, derived from the level-filtered record.
- **First page of the final report** — case information and vehicle information,
automatically.
- **The export** — identity plus traceability package in every JSON.
## Terminology
The product is never described as an "AI app" but as an **evidence-based
diagnostic system** / **intelligent decision support**. In the user interface
and in documents the words used are *the system, the analysis, the assessment,
the interpretation, the image interpretation, the decision support, the rule
engine* — not "AI", unless technically necessary.
@@ -0,0 +1,245 @@
# Modul: Evidensmotorn (ECM — Evidence & Compliance Matrix)
> **Svensk översättning.** Källan är [evidence-engine.md](evidence-engine.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
**Version: ECM v2.0** · ECM är ett eget subsystem — inte en tabell i
databasen — och motorn som styr hela plattformen: den avgör vilken
dokumentation som krävs, när dokumentation saknas, vilken bevisnivå som
uppnåtts, vilka regler som gäller och om ett ärende kan avslutas.
**Systemet kan aldrig skriva en slutsats som ECM inte har godkänt.**
Regelbiblioteket är versionshanterat och skilt från applikationslogiken
(`src/felsokning/ecm.ts`); vyerna anropar bara motorns rena funktioner.
## De sex motorerna
### 1. Evidence Engine
Katalogiserar all bevisning ur händelseloggen. Varje evidenspost får
id, tidpunkt, tekniker, kategori, evidensnivå, sammanfattning och
**innehållshash** — samma post ger alltid samma hash, och den
append-only-låsta loggen (databastriggers) gör varje ändringsförsök
omöjligt.
| Nivå | Typ | Bevisvärde |
| --- | --- | --- |
| E0 | Inget underlag | 0 % |
| E1 | Teknikerns observation | Lågt |
| E2 | Foto | Medel |
| E3 | Video (med ljud — för det som låter eller rör sig) | Högt |
| E4 | Mätvärde | Högt |
| E5 | Diagnosdata/dokument | Mycket högt |
| E6 | Flera oberoende källor | Högsta |
### 2. Rule Engine
Dokumentationskraven: metodikens `krav`-fält per kontroll plus de
automatiska reglerna — *kan det fotograferas → begär foto; låter det →
video med ljud; rör det sig → video; mäts det → mätvärde; visar en
display informationen → fota displayen; finns ett dokument → fota
dokumentet.* Undantagsorsakerna ("Underlag kan inte tas fram") ligger
här.
### 3. Compliance Engine
Ärendetypen styr vilka regler som gäller utöver metodiken. Ärendetyp
väljs i identitetsraden och loggas (`arendetyp_satt`):
| Ärendetyp | Extra krav (v2.0) |
| --- | --- |
| Garanti | Miltal dokumenterat · servicehistorik kontrollerad · claim-/garantinummer |
| Goodwill | Miltal · servicehistorik |
| Försäkring | Skadenummer · bildbevis |
| Reklamation | Historik och tidigare försök kontrollerade |
| Begagnatgaranti | Miltal |
**ECM Knowledge Library är implementerat**: reglerna är deklarativa data
(krav-typ, inte kod) och distribueras från plattformen via
`GET /api/ecm/regler` (`services/plattform/ecm-regler.json` — i klustret
utbytbar via ConfigMap och miljövariabeln `ECM_REGLER_FIL`). Klienten
hämtar paketet vid sidladdning, cachar det och faller tillbaka till sitt
inbyggda standardpaket offline; trasiga paket och okända krav-typer
filtreras. Regelpaketets version följer med i varje spårbarhetspaket.
Nya regler — garantivillkor per tillverkare, försäkringsbolagens krav,
reklamationslagstiftning, OEM-kontrollpunkter — läggs till i driften
utan att applikationen byggs om.
### 4. Validation Engine
Inga påståenden utan underlag, i tre lager: (a) orkesterns grundprompt —
aldrig "OK/kontrollerad/inga fel/åtgärdad" utan evidens, i stället
"Evidens saknas" plus begäran om rätt underlag; (b) projektionerna —
hypoteser kan aldrig bli konstaterade fel; (c) kvalitetsgrinden nedan.
### 5. Completion Engine
Kvalitetsgrinden före slutrapport/avslut — utskriften är spärrad tills
alla obligatoriska rader är gröna:
| Kontroll | Krav |
| --- | --- |
| Fordons-/objektidentifiering verifierad | Obligatorisk |
| Arbetsorder inläst | Rekommenderas |
| Fordonshistorik kontrollerad eller motiverad | Obligatorisk |
| Ingående mätarställning dokumenterad | Obligatorisk |
| Kundens felbeskrivning verifierad | Rekommenderas |
| Kundens besked på åtgärdsförslaget | Obligatoriskt när arbete utförts |
| Åtgärd dokumenterad eller motiverad | Obligatorisk vid avslut |
| Kvalitetskontroll genomförd | Obligatorisk vid avslut efter utförd åtgärd |
| Utgående mätarställning | Obligatorisk vid avslut |
| Metodikens kontroller: evidens eller dokumenterat undantag | Obligatorisk |
| Foton för fotokrävande kontroller | Obligatorisk |
| Ärendetypens compliance-krav | Obligatoriska |
| Teknikerns slutsats signerad | Automatisk vid avslut |
| Evidensnivå över E0 | Obligatorisk |
### 6. Traceability Engine
Varje export bär ett spårbarhetspaket: ECM-version, ärendetyp,
evidensnivå, grindstatus per regel-id och samtliga evidensposter med
hash. Tillsammans med loggen kan varje slutsats härledas: vilken bild →
vilken mätning → vilken tekniker → vilken regel → vilken regelverksversion
→ när.
## Pre-Diagnostic Validation
Ingen felsökning påbörjas förrän grundkontrollerna är genomförda eller
dokumenterat motiverade — metodiken låses upp först därefter:
1. **Fordonshistorik** — systemet hämtar automatiskt organisationens
tidigare ärenden på samma objekt (regnr/VIN) med deras dokumenterade
felorsaker (`GET /api/fordon/{identifierare}/historik`; lokala storen
offline) och visar dem i historiksteget. Teknikern kan koppla
**orsakskedjan** till det aktuella ärendet med ett tryck ("kopplat
till tidigare ärende #N — …"), kvitterar kontrollen — eller anger Nej
med obligatorisk orsak → kvalitetsvarning.
2. **Ingående mätarställning** — instrumentpanelen fotograferas;
bildtolkningen föreslår värdet, teknikern bekräftar. Fotot blir den
officiella ingående mätarställningen.
3. **Kundens felbeskrivning verifierad** — ytterligare symptom
dokumenteras som separata observationer, aldrig hopblandade med
kundens beskrivning.
4. **Tidiga observationer** — reparationsspår, modifieringar, skador,
läckage m.m. dokumenteras med foto/observation, eller kvitteras
"inga ytterligare".
**Utgående mätarställning** fotograferas inför avslut och blir
obligatorisk i grinden när ärendet stängs. Rapporten visar in/ut.
## Symptom Verification Protocol (SVP)
Ett fel diagnostiseras aldrig direkt från en vag kundbeskrivning.
Kedjan är alltid: **dokumenterats → förtydligats → reproducerats eller
dokumenterats som ej reproducerbart.**
- Kundens beskrivning registreras ordagrant vid ärendestart och
verifieras i pre-diagnostiken; nya symptom blir separata observationer.
- Förtydligandet sker genom metodikens symptomfrågor (när/var/hur/
förhållanden/frekvens — generiska metodiken har hela SVP-frågesetet).
- **Reproducering** (Ja/Delvis/Nej) dokumenteras innan avslut: Ja kräver
hur och under vilka förhållanden; Delvis vad som kunde respektive inte
kunde återskapas; Nej kräver motivering. Systemet skriver aldrig
"felet konstaterat" utan reproducering eller annan verifiering — i
stället: *"Kundens beskrivning kunde inte reproduceras under de
förhållanden som rådde vid undersökningen."* (kodat även i orkesterns
grundprompt).
- Rapportens beviskedja skiljer alltid: kundens beskrivning →
verifierad observation → felorsaksanalys → rekommenderad åtgärd.
## Felorsaksanalys (Root Cause Analysis)
Ett ärende avslutas aldrig med enbart "komponent defekt, byt komponent".
Varje konstaterat fel kräver fyra obligatoriska svar:
1. **Konstaterad avvikelse** — kvalitetsregeln avvisar generella
formuleringar ("trasig", "defekt", "sliten", "behöver bytas") utan
förklaring.
2. **Mest sannolik orsak** — en eller flera kategorier (normalt slitage,
materialutmattning, tillverkningsfel, bristande underhåll, felaktig
tidigare reparation, yttre påverkan, korrosion, överhettning,
modifiering … samt *Okänd orsak*, som kräver motivering).
3. **Underlag** — minst en evidenskälla, och källan valideras mot
loggen: "Foto" godtas bara om ett foto faktiskt finns.
4. **Säkerhetsnivå** — hög/medel/låg; vid medel/låg krävs vilka
ytterligare kontroller som skulle stärka bedömningen.
Avslutsknappen är spärrad tills SVP + felorsaksanalys är dokumenterade,
och kvalitetsgrinden gör båda obligatoriska när ärendet stängs.
Flottdatan är redan igång: **felorsaksstatistiken** i arbetsledarvyn
(`GET /api/statistik/felorsaker`) aggregerar orsakskategorierna över
organisationen — vilka komponenter fallerar av slitage, vilka efter
tidigare reparationer, vilka tyder på konstruktionsproblem.
## Kundgodkännande före arbete
Verkstaden får aldrig utföra föreslaget arbete utan att kundens besked är
registrerat och spårbart:
- **Åtgärdsförslaget** skrivs i guiden (förifyllt ur felorsaksanalysens
rekommenderade åtgärd) med eventuell uppskattad kostnad, och **visas
för kunden i Live Share** — det är kunddelbart material.
- **Kundens besked** registreras med utfall (godkänt/avböjt/delvis),
**kanal** (telefon, på plats, e-post, SMS, delningslänk) och
motivering vid avböjt/delvis. Loggposten bär vem i verkstaden som tog
emot beskedet och när.
- **Knappen "Dokumentera utförd åtgärd" är låst** så länge ett förslag
saknar besked — och förblir låst vid avböjt besked. Vägen "Ingen
åtgärd utförd" är öppen och hänvisar till det registrerade beskedet.
- Kvalitetsgrinden kräver registrerat besked när arbete utförts, och
flaggar konflikten *"Utfört arbete trots avböjt åtgärdsförslag"* som
ett hårt fel.
**Kunden kan svara direkt i sin delningslänk** (`POST /api/delad/{kod}/beslut`)
— den enda skrivande publika vägen i hela API:t, med sex spärrar som var
och en verifieras i integrationstestet:
1. Endast delningar på **kundnivå** (partner-/internlänkar får aldrig
svara åt kunden) och aldrig återkallade.
2. Ärendets ursprungliga delningskod saknar registrerad nivå och kan inte
heller svara.
3. Det måste finnas ett åtgärdsförslag att svara på.
4. **Ett besked per ärende** — svaret kan inte ändras i efterhand
(kontakta verkstaden i stället).
5. Endast `godkant`/`avbojt`/`delvis` plus en kommentar på högst 500
tecken; inget annat kan skrivas till loggen den vägen.
6. Takt-begränsning per delningskod.
Beskedet loggas som `kundbeslut` med kanal `Delningslänk` och avsändaren
"Kund via delningslänk" — verkstadens egna registreringar (telefon, på
plats …) fungerar precis som förut.
## Åtgärdsfasen (Repair & Verification)
Loopen som symptomverifieringen öppnade sluts här — ett ärende kan inte
avslutas utan att det framgår vad som gjordes och om det hjälpte:
1. **Åtgärd dokumenterad eller motiverad** — antingen vad som faktiskt
utfördes (med eventuella delar), eller varför ingen åtgärd gjordes
(kunden avböjde, väntar på reservdel, endast utredning beställd,
kostnadsförslag lämnat, åtgärd hos annan verkstad).
2. **Kvalitetskontroll** — obligatorisk när en åtgärd faktiskt utförts:
är symptomet borta, kvarstår det helt eller delvis, eller kunde det
inte verifieras? Utfallet dokumenteras med hur verifieringen gick
till (samma förhållanden som symptomet reproducerades under).
Kvarstående symptom döljs aldrig: grinden skriver ut att ärendet inte
bör avslutas som åtgärdat. Avslutsknappen är spärrad tills kedjan
**symptomverifiering → felorsaksanalys → åtgärd → kvalitetskontroll** är
komplett, och rapporten redovisar den i egna avsnitt.
## Ärendeidentitet (Case Identity & Vehicle Context)
Fordonsobjektet är den röda tråden: identiteten registreras **en gång**
(normalt via arbetsorderskanningen, som nu även läser claim-/garantinummer
och skadenummer) och återanvänds sedan överallt:
- **Identitetsrad i arbetsytan** — AO, claim, skadenummer, fordon, regnr,
VIN, miltal, ansvarig tekniker + ärendetypsval.
- **Live Share** — låst panel överst med fordon, referenser och status,
härledd ur det nivåfiltrerade underlaget.
- **Slutrapportens första sida** — Ärendeinformation + Fordonsinformation
automatiskt.
- **Exporten** — identitet + spårbarhetspaket i varje JSON.
## Terminologi
Produkten beskrivs aldrig som en "AI-app" utan som ett **evidensbaserat
diagnossystem** / **intelligent beslutsstöd**. I användargränssnitt och
dokument används *systemet, analysen, bedömningen, tolkningen,
bildtolkningen, beslutsstödet, regelmotorn* — inte "AI", om det inte är
tekniskt nödvändigt.
+90
View File
@@ -0,0 +1,90 @@
# Module: Live Share
> Canonical version. Swedish: [live-share.sv.md](live-share.sv.md).
## Purpose
Every case can be published through a unique secure share link. The link shows
the case's current status in real time and updates automatically as new
information is recorded. No manual export is needed.
A live view is of great value to customers, supervisors, insurers and
manufacturers — but it must **always remain under the workshop's control**, with
clear permissions and security levels.
## Example customer view
```
Case: Volvo XC60
Status: 🟢 Diagnosis in progress
Customer's fault description
The car vibrates at about 88 km/h.
Current status
✔ Object identified
✔ Road test carried out
✔ Tyres documented
✔ Tyre pressure checked
🔄 Wheel balancing being checked
⏳ Driveshafts not checked
Images · Measurements · Timeline
Recommended next step
Check radial runout.
```
## Live updating
While the technician works, the page updates automatically without reloading.
The recipient immediately sees new images, new measurements, new comments and
status changes.
## Permission levels
Links can be created with different access levels:
- **Customer** — read access to the information the workshop has chosen to
share.
- **Internal** — full visibility for colleagues and supervisors.
- **External partner** — for example an insurer or a manufacturer, with a
restricted set of information (including hypotheses, clearly marked as
unverified).
Implemented in the platform: every link is created with a level, the filtering
happens server-side, and links can be revoked — a revoked link returns 404.
## Export
From the same case it should be possible to export:
- PDF
- JSON
- CSV
- API
- Print-friendly HTML
All exports build on the same data source (the event log), which reduces the
risk of discrepancies.
## Versioning
Every export is stamped with:
- a version number,
- date,
- time,
- who exported it,
- the export format.
That makes it possible to establish afterwards exactly what information was
shared at a given moment.
## Product vision
A diagnostic case is not merely a chat or a log, but a **living digital work
journal**. It can be followed in real time, taken over by a colleague, reviewed
by a supervisor, shared with the customer and concluded with a complete report —
all from the same data model. That reduces duplicated work and means every party
starts from the same current information.
+75
View File
@@ -0,0 +1,75 @@
# Modul: Live Share
> **Svensk översättning.** Källan är [live-share.md](live-share.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
## Syfte
Varje ärende kan publiceras via en unik säker delningslänk. Länken visar ärendets aktuella status i realtid och uppdateras automatiskt när ny information registreras. Ingen manuell export behövs.
En livevy ger stort värde för kunder, arbetsledare, försäkringsbolag och tillverkare — men den ska **alltid vara under verkstadens kontroll**, med tydliga behörigheter och säkerhetsnivåer.
## Exempel på kundvy
```
Ärende: Volvo XC60
Status: 🟢 Felsökning pågår
Kundens felbeskrivning
Bilen vibrerar vid cirka 88 km/h.
Aktuell status
✔ Objekt identifierat
✔ Provkörning utförd
✔ Däck dokumenterade
✔ Lufttryck kontrollerat
🔄 Hjulbalansering kontrolleras
⏳ Drivaxlar ej kontrollerade
Bilder · Mätvärden · Tidslinje
Rekommenderat nästa steg
Kontroll av radialkast.
```
## Liveuppdatering
När teknikern arbetar uppdateras sidan automatiskt, utan omladdning. Mottagaren ser direkt nya bilder, nya mätvärden, nya kommentarer och statusändringar.
## Behörighetsnivåer
Länkar kan skapas med olika åtkomstnivåer:
- **Kund** läsbehörighet till den information verkstaden valt att dela.
- **Intern** full insyn för kollegor och arbetsledare.
- **Extern partner** exempelvis försäkringsbolag eller tillverkare, med avgränsad information (inklusive hypoteser, tydligt märkta som ej verifierade).
Implementerat i plattformen: varje länk skapas med en nivå, filtreringen sker på serversidan och länkar kan återkallas — en återkallad länk ger 404.
## Export
Från samma ärende ska det gå att exportera:
- PDF
- JSON
- CSV
- API
- Utskriftsvänlig HTML
Alla exporter bygger på samma datakälla (händelseloggen), vilket minskar risken för avvikelser.
## Versionshantering
Varje export märks med:
- versionsnummer,
- datum,
- tid,
- vem som exporterade,
- exportformat.
Det gör det möjligt att i efterhand se exakt vilken information som delades vid en viss tidpunkt.
## Produktvision
Ett felsökningsärende är inte bara en chatt eller en logg, utan en **levande digital arbetsjournal**. Den kan följas i realtid, tas över av en kollega, granskas av en arbetsledare, delas med kunden och avslutas med en komplett rapport — allt från samma datamodell. Det minskar dubbelarbete och gör att alla parter utgår från samma aktuella information.
@@ -0,0 +1,84 @@
# Module: Verified checklists
> Canonical version. Swedish: [verified-checklists.sv.md](verified-checklists.sv.md).
## Core principle
A check item is not complete merely by ticking a box.
The system records not only *that* a box has been ticked — it collects
**evidence and context**. Every check must contain one or more of the following:
- ✔ Confirmation that the check was performed.
- 📝 A short observation or conclusion.
- 📷 A photo (where relevant).
- 📹 Video (where needed).
- 🎤 Speech-to-text (for quick documentation).
- 📏 A measured value (where applicable).
In this way every step becomes both traceable and comprehensible.
## Examples
**Check battery voltage**
> The technician marks "Performed".
> The system: *What value was measured?* → **12.63 V**
> The system: *How was this measured? (optional)* → **Directly at the battery
> terminals.**
> The check item is marked as verified.
**Check fuse F24**
> ✔ Performed
> The system: *What was observed?* → **The fuse is intact and voltage is present
> on both sides.**
> The check item is closed.
## The role of the analysis
The system helps detect when documentation appears incomplete:
> "You have marked wheel balancing as checked, but no observation or measurement
> has been recorded. Would you like to add a short comment before moving on?"
It should be **support, not an obstacle**.
## Adapted to the type of check
Not every step needs the same level of documentation.
| Type of check | Minimum requirement |
| --- | --- |
| Visual check | Confirmation + short comment |
| Measurement | Measured value + comment |
| Disassembly | Comment, photo where needed |
| Road test | Summary of the result |
| Image-based check | Photo + observation |
## Purpose
The aim is not to "catch" the technician, but to create a working record that
shows:
- what was checked,
- how it was checked,
- what the result was,
- and which conclusions it is reasonable to draw.
That strengthens the quality of the work, makes handovers easier, and gives a
better record towards the customer and management.
## Important design principle
Avoid making free text mandatory everywhere. If every check requires long
passages of text, the system quickly feels cumbersome. Use instead a combination
of:
- preset answers where they fit,
- short speech-to-text for observations,
- measured-value fields,
- and photo or video where they add the most value.
The documentation then becomes rich without slowing the workflow — and the
technicians use the system consistently in everyday work.
@@ -0,0 +1,76 @@
# Modul: Verifierade checklistor
> **Svensk översättning.** Källan är [verified-checklists.md](verified-checklists.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
## Grundprincip
En kontrollpunkt är inte slutförd enbart genom att kryssa i en ruta.
Systemet registrerar inte bara *att* en ruta har kryssats i — det samlar in **bevis och kontext**. Varje kontroll ska innehålla ett eller flera av följande:
- ✔ Bekräftelse att kontrollen är utförd.
- 📝 Kort observation eller slutsats.
- 📷 Foto (när det är relevant).
- 📹 Video (vid behov).
- 🎤 Tal-till-text (för snabb dokumentation).
- 📏 Mätvärde (när tillämpligt).
På så sätt blir varje moment både spårbart och begripligt.
## Exempel
**Kontrollera batterispänning**
> Teknikern markerar "Utförd".
> Systemet: *Vilket värde uppmättes?* → **12,63 V**
> Systemet: *Hur mättes detta? (valfritt)* → **Direkt på batteripolerna.**
> Kontrollpunkten markeras som verifierad.
**Kontrollera säkring F24**
> ✔ Utförd
> Systemet: *Vad observerades?* → **Säkringen är hel och spänning finns på båda sidor.**
> Kontrollpunkten avslutas.
## AI:s roll
AI:n hjälper till att upptäcka när dokumentationen verkar ofullständig:
> "Du har markerat att hjulbalanseringen är kontrollerad, men ingen observation eller mätning har registrerats. Vill du lägga till en kort kommentar innan du går vidare?"
Det ska vara ett **stöd, inte ett hinder**.
## Anpassning efter kontrolltyp
Alla moment behöver inte samma nivå av dokumentation.
| Kontrolltyp | Minimikrav |
| --- | --- |
| Visuell kontroll | Bekräftelse + kort kommentar |
| Mätning | Mätvärde + kommentar |
| Demontering | Kommentar, foto vid behov |
| Provkörning | Sammanfattning av resultat |
| Bildbaserad kontroll | Foto + observation |
## Syfte
Målet är inte att "fånga" teknikern, utan att skapa ett arbetsunderlag som visar:
- vad som kontrollerades,
- hur det kontrollerades,
- vad resultatet blev,
- och vilka slutsatser som är rimliga att dra.
Det stärker kvaliteten i arbetet, gör överlämningar enklare och ger ett bättre underlag gentemot kund och arbetsledning.
## Viktig designprincip
Undvik att göra fritext obligatorisk överallt. Om varje kontroll kräver långa texter upplevs systemet snabbt som tungrott. Använd i stället en kombination av:
- förvalda svar där det passar,
- kort tal-till-text för observationer,
- mätvärdesfält,
- och foto eller video när det ger mest värde.
Då blir dokumentationen rik utan att arbetsflödet bromsas — och teknikerna använder systemet konsekvent i vardagen.
@@ -0,0 +1,141 @@
# Module: Work log and time tracking
> Canonical version. Swedish: [work-log-and-time-tracking.sv.md](work-log-and-time-tracking.sv.md).
## Purpose
All work carried out during a diagnostic case should be timed, traceable and
tied to concrete activities.
The system records not only how long a piece of work took, but also what was
done during that time.
This is more than a time clock — it is a digital work record in which time,
activity and technical reasoning hang together. It produces a considerably
stronger record than traditional time reporting.
---
## Starting work
The technician begins by identifying the object.
For example:
- A photo of the registration plate
- A VIN scan
- A QR code
- A serial number
- A machine number
Once the object is verified, the work log starts.
Example:
```
08:03 Work started
Object: ABC123
Volvo XC60
```
---
## Automatic timeline
All activities are timestamped automatically.
Example:
```
08:03 Object identified
08:05 Fault description recorded
08:11 Fuse F23 checked
08:18 Supply voltage measured
08:27 Photo uploaded
08:35 Direct feed applied
08:48 Wiring diagram opened
09:01 New check
09:09 Diagnosis completed
```
No manual administration is required.
---
## Active working time
The system distinguishes between:
- active diagnosis
- waiting time
- administrative time
- parts lookup
- road testing
- customer contact
This gives a fairer account of the time spent.
---
## Context after longer breaks
If a longer period passes without activity, the system can ask for context, for
example:
> "No activity has been recorded in the last 20 minutes. Briefly describe what
> was done during this period."
The technician can answer in text or by voice, for example:
> "Removed the instrument panel to reach the wiring harness."
That becomes part of the work log.
---
## The system as documentation support
The system does not judge whether the technician is working "fast enough". What
it does is help ensure the log is comprehensible and complete. If a step lacks
context, it can ask for a short clarification so the report is useful to the
customer or to the technician's own organisation.
---
## Final report
When the work is finished, a report is generated automatically, for example:
**Total time: 1 hour 37 minutes**
Distribution:
- Diagnosis: 54 min
- Disassembly: 18 min
- Measurements: 11 min
- Documentation: 6 min
- Road test: 8 min
The report also contains:
- checks performed,
- measured values,
- attached images,
- technical conclusions,
- recommended next steps.
---
## Business value
This function may become one of the system's strongest arguments, because it:
- reduces administration after the work is finished,
- gives the customer a clear basis for the invoice,
- strengthens the record in warranty and insurance cases,
- makes internal follow-up easier,
- creates a searchable knowledge base of earlier diagnoses.
It makes Guidad Felsökning more than an assistant — it becomes a complete work
tool in which identification, methodical diagnosis, documentation and time
tracking form one coherent and traceable process.
@@ -0,0 +1,131 @@
# Modul: Arbetslogg & Tidredovisning
> **Svensk översättning.** Källan är [work-log-and-time-tracking.md](work-log-and-time-tracking.md) (engelska).
> Vid avvikelse gäller det engelska dokumentet.
## Syfte
Allt arbete som utförs under ett felsökningsärende ska vara tidsatt, spårbart och kopplat till konkreta aktiviteter.
Systemet registrerar inte bara hur lång tid ett arbete tagit, utan även vad som utförts under tiden.
Det här är mer än en stämpelklocka ett digitalt arbetsprotokoll där tid, aktivitet och tekniskt resonemang hänger ihop. Det ger ett betydligt starkare underlag än traditionell tidrapportering.
---
## Start av arbete
Teknikern börjar genom att identifiera objektet.
Exempel:
- Foto av registreringsnummer
- VIN-skanning
- QR-kod
- Serienummer
- Maskinnummer
När objektet är verifierat startar arbetsloggen.
Exempel:
```
08:03 Arbete startat
Objekt: ABC123
Volvo XC60
```
---
## Automatisk tidslinje
Alla aktiviteter tidsstämplas automatiskt.
Exempel:
```
08:03 Objekt identifierat
08:05 Felbeskrivning registrerad
08:11 Säkring F23 kontrollerad
08:18 Mätning av matningsspänning
08:27 Foto uppladdat
08:35 Direktmatning utförd
08:48 Elschema öppnat
09:01 Ny kontroll
09:09 Felsökning avslutad
```
Ingen manuell administration krävs.
---
## Aktiv arbetstid
Systemet skiljer på:
- aktiv felsökning
- väntetid
- administrativ tid
- reservdelssökning
- provkörning
- kundkontakt
Det ger en mer rättvisande tidsredovisning.
---
## Kontext vid längre avbrott
Om det gått en längre stund utan aktivitet kan systemet fråga efter sammanhang, exempelvis:
> ”Ingen aktivitet har registrerats de senaste 20 minuterna. Beskriv kort vad som gjorts under denna period.”
Teknikern kan svara med text eller tal, till exempel:
> ”Demonterade instrumentpanelen för att komma åt kabelstammen.”
Det blir en del av arbetsloggen.
---
## AI som dokumentationsstöd
AI bedömer inte om teknikern arbetar ”tillräckligt snabbt”. Däremot hjälper den till att säkerställa att loggen blir begriplig och komplett. Om ett steg saknar sammanhang kan den be om ett kort förtydligande så att rapporten blir användbar för kunden eller den egna organisationen.
---
## Slutrapport
När arbetet avslutas genereras automatiskt en rapport med exempelvis:
**Total tid: 1 timme 37 minuter**
Fördelning:
- Diagnos: 54 min
- Demontering: 18 min
- Mätningar: 11 min
- Dokumentation: 6 min
- Provkörning: 8 min
Rapporten innehåller även:
- utförda kontroller,
- mätvärden,
- bifogade bilder,
- tekniska slutsatser,
- rekommenderade nästa steg.
---
## Affärsvärde
Den här funktionen kan bli ett av systemets starkaste argument, eftersom den:
- minskar administration efter avslutat arbete,
- ger kunden ett tydligt underlag för debiteringen,
- stärker underlaget vid garanti- och försäkringsärenden,
- gör intern uppföljning enklare,
- skapar en sökbar kunskapsbank över tidigare felsökningar.
Det gör att Guidad Felsökning blir mer än en AI-assistent den blir ett komplett arbetsverktyg där identifiering, metodisk felsökning, dokumentation och tidredovisning bildar en sammanhängande och spårbar process.