Metodikerna på engelska — och nyckelorden på båda språken

Sexton metodiker: fasnamn, steg, frågor, svarsalternativ, kontroller och
de notiser som säger varför ett steg finns. Cirka 390 strängar, plus
demoärendets underlag och evidensmotorns poster.

Det här är den enda text i systemet som säger åt någon vad den ska göra
med ett fordon. "Mät och dokumentera spänningsfrihet före ingrepp" är
inte en etikett, och därför står granskningsstatusen nu i modulhuvudet:
texten är skriven på svenska och ÖVERSATT till engelska, alltså inte
läst av en fackman på målspråket. Samma krav som ställs på de nio andra
språken ställs på den — språksidan säger det rakt ut i stället för att
tyst undanta källspråket. Att göra undantaget hade varit precis det
sidan varnar för.

NYCKELORDEN är avsiktligt tvåspråkiga och blev en union, inte en
översättning. De matchas mot teknikerns egen fritext; att byta ut de
svenska hade gjort metodikvalet blint för allt en svensk verkstad
skriver. 155 engelska nyckelord tillagda, inga svenska borttagna — fler
nyckelord kan bara ge fler träffar, aldrig färre.

Genomgången är beviset: fyra ärenden drivs genom hela flödet i det
byggda gränssnittet — identifiering, pre-diagnostik, metodik,
reproducering, felorsak, åtgärd, kvalitetskontroll, slutsats, avslut —
och alla fyra stängs. Rubrikerna i utskriften läser nu VIBRATION WHILE
DRIVING och HIGH-VOLTAGE SYSTEM — ELECTRIC AND HYBRID.

609 tester, 186 integrationskontroller mot riktig Postgres, genomgång,
portalspärr, typkontroll och lint gröna. Artefakten byggd och mätt på
390 och 1280 px: inget spill, inga externa begäranden.

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-06 18:17:06 +00:00
parent 8aae3a2a97
commit aba9b50c52
8 changed files with 462 additions and 435 deletions
@@ -18,8 +18,8 @@ describe("demoärendet", () => {
it("lämnar kontroller kvar så att guiden kan fortsätta i demon", () => {
const b = brief(arende, VIBRATION_METODIK);
expect(b.ejKontrollerat).toContain("Kontrollera radial- och sidokast");
expect(b.ejKontrollerat).toContain("Förändring vid kurvtagning");
expect(b.ejKontrollerat).toContain("Check radial and lateral runout");
expect(b.ejKontrollerat).toContain("Change when cornering");
expect(b.rekommenderatNastaSteg.length).toBeGreaterThan(0);
});
@@ -87,7 +87,7 @@ describe("Evidence Engine", () => {
const poster = evidensposter(arende);
expect(poster).toHaveLength(2);
expect(poster[0].niva).toBe("E2");
expect(poster[1].sammanfattning).toBe("Obalans = 38 g (instrument ej angivet)");
expect(poster[1].sammanfattning).toBe("Obalans = 38 g (instrument not stated)");
expect(poster[0].tekniker).toBe("Anna");
expect(poster[0].hash).toMatch(/^[0-9a-f]{8}$/);
// Samma innehåll → samma hash (deterministisk spårbarhet).
@@ -69,7 +69,7 @@ describe("metodikbiblioteket", () => {
const krav = HOGVOLT.steg[0].kontroller ?? [];
expect(krav.some((k) => k.id === "spanningsfrihet" && k.krav === "matvarde")).toBe(true);
expect(krav.some((k) => k.id === "service_disconnect")).toBe(true);
expect(HOGVOLT.steg[0].beskrivning).toMatch(/livsfarlig/i);
expect(HOGVOLT.steg[0].beskrivning).toMatch(/lethal/i);
});
});
@@ -101,17 +101,17 @@ describe("ejKontrollerat", () => {
it("krymper när kontroller utförs och härleds helt ur loggen", () => {
const utan = byggArende([["2026-08-02T08:00:00Z", OBJEKT]]);
const alla = ejKontrollerat(utan, VIBRATION_METODIK);
expect(alla).toContain("Kontrollera lufttryck");
expect(alla).toContain("Check tyre pressure");
const med = byggArende([
["2026-08-02T08:00:00Z", OBJEKT],
[
"2026-08-02T08:15:00Z",
{ typ: "kontroll_utford", stegId: "kontroller", kontrollId: "lufttryck", text: "Kontrollera lufttryck" },
{ typ: "kontroll_utford", stegId: "kontroller", kontrollId: "lufttryck", text: "Check tyre pressure" },
],
]);
const kvar = ejKontrollerat(med, VIBRATION_METODIK);
expect(kvar).not.toContain("Kontrollera lufttryck");
expect(kvar).not.toContain("Check tyre pressure");
expect(kvar.length).toBe(alla.length - 1);
});
});
@@ -168,7 +168,7 @@ describe("brief", () => {
["2026-08-02T08:05:00Z", { typ: "felbeskrivning", text: "Bilen vibrerar runt 88 km/h" }],
[
"2026-08-02T08:11:00Z",
{ typ: "kontroll_utford", stegId: "kontroller", kontrollId: "lufttryck", text: "Kontrollera lufttryck", resultat: "2,4 bar" },
{ typ: "kontroll_utford", stegId: "kontroller", kontrollId: "lufttryck", text: "Check tyre pressure", resultat: "2,4 bar" },
],
["2026-08-02T08:18:00Z", { typ: "matvarde", beskrivning: "Matningsspänning", varde: "13,9", enhet: "V" }],
["2026-08-02T08:20:00Z", { typ: "observation", text: "Höger framdäck visar ojämnt slitage" }],
@@ -179,12 +179,12 @@ describe("brief", () => {
const b = brief(arende, VIBRATION_METODIK, "2026-08-02T08:30:00Z");
expect(b.objekt?.identifierare).toBe("ABC123");
expect(b.felbeskrivning).toBe("Bilen vibrerar runt 88 km/h");
expect(b.utfordaKontroller.map((k) => k.text)).toContain("Kontrollera lufttryck");
expect(b.utfordaKontroller.map((k) => k.text)).toContain("Check tyre pressure");
expect(b.observationer).toContain("Höger framdäck visar ojämnt slitage");
expect(b.observationer).toContain("Matningsspänning: 13,9 V");
expect(b.ejKontrollerat).toContain("Kontrollera hjulbalansering");
expect(b.ejKontrollerat).not.toContain("Kontrollera lufttryck");
expect(b.rekommenderatNastaSteg[0]).toContain("hastighetsberoende");
expect(b.ejKontrollerat).toContain("Check wheel balance");
expect(b.ejKontrollerat).not.toContain("Check tyre pressure");
expect(b.rekommenderatNastaSteg[0]).toContain("speed-dependent");
expect(b.totalArbetstid).toBe("27 min");
});
+54 -54
View File
@@ -54,7 +54,7 @@ function demoFoto(text: string): string {
// visa den praxis produkten kräver, inte den som fanns innan.
const DACKTRYCKSMATARE = {
matdonId: "demo-tryck-01",
matdonBeteckning: "Däcktrycksmätare PCL DPG7",
matdonBeteckning: "Tyre pressure gauge PCL DPG7",
matdonKalibreradTill: "2027-03-31",
};
const BALANSMASKIN = {
@@ -83,71 +83,71 @@ export function byggDemoArende(nummer: number, anvandare = "Anna"): Arende {
arbetsorder: "AO-2496",
},
}),
post(2, { typ: "felbeskrivning", text: "Bilen vibrerar runt 88 km/h. Symptomet uppträder endast under körning." }),
post(2, { typ: "felbeskrivning", text: "The car vibrates at around 88 km/h. The symptom appears only while driving." }),
// Pre-diagnostiken: historik, ingående mätarställning, verifierad
// felbeskrivning och tidiga observationer — innan metodiken börjar.
post(3, { typ: "historik_kontrollerad", kontrollerad: true, kommentar: "Däck roterade vid service för 2 månader sedan" }),
post(3, { typ: "historik_kontrollerad", kontrollerad: true, kommentar: "Tyres rotated at a service two months ago" }),
post(3, { typ: "matarstallning", lage: "ingaende", varde: "84 320 km", dataUrl: demoFoto("Instrumentpanel 84 320 km") }),
post(4, { typ: "kommentar", text: "Kundens felbeskrivning verifierad vid mottagandet." }),
post(4, { typ: "kommentar", text: "Inga ytterligare observationer vid mottagandet." }),
post(4, { typ: "fraga_besvarad", stegId: "symptom", frageId: "hastighetsberoende", fraga: "Är vibrationen hastighetsberoende?", svar: "Ja" }),
post(5, { typ: "fraga_besvarad", stegId: "symptom", frageId: "var", fraga: "Var känns vibrationen?", svar: "I ratten" }),
post(6, { typ: "fraga_besvarad", stegId: "symptom", frageId: "nar", fraga: "När uppstår vibrationen?", svar: "Vid jämn fart" }),
post(8, { typ: "fraga_besvarad", stegId: "symptom", frageId: "intervall", fraga: "Försvinner den över eller under ett visst hastighetsintervall?", svar: "Märks tydligast 8595 km/h, försvinner under 80" }),
post(12, { typ: "foto", beskrivning: "Fotografera vänster framhjul", dataUrl: demoFoto("Vänster framhjul") }),
post(12, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_vf", text: "Fotografera vänster framhjul" }),
post(14, { typ: "foto", beskrivning: "Fotografera höger framhjul", dataUrl: demoFoto("Höger framhjul") }),
post(14, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_hf", text: "Fotografera höger framhjul" }),
post(16, { typ: "foto", beskrivning: "Fotografera vänster bakhjul", dataUrl: demoFoto("Vänster bakhjul") }),
post(16, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_vb", text: "Fotografera vänster bakhjul" }),
post(18, { typ: "foto", beskrivning: "Fotografera höger bakhjul", dataUrl: demoFoto("Höger bakhjul") }),
post(18, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_hb", text: "Fotografera höger bakhjul" }),
post(22, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "dot", text: "Dokumentera DOT-/tillverkningsdatum", resultat: "Fram: DOT 2318, bak: DOT 2318 — samtliga från vecka 23 2018" }),
post(26, { typ: "observation", text: "Höger framdäck visar ojämnt slitage på innerkanten" }),
post(26, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "slitage", text: "Kontrollera däckslitage", resultat: "Ojämnt slitage höger fram, övriga ok" }),
post(31, { typ: "matvarde", beskrivning: "Lufttryck vänster fram", varde: "2,4", enhet: "bar", ...DACKTRYCKSMATARE }),
post(32, { typ: "matvarde", beskrivning: "Lufttryck höger fram", varde: "2,1", enhet: "bar", ...DACKTRYCKSMATARE }),
post(33, { typ: "kontroll_utford", stegId: "kontroller", kontrollId: "lufttryck", text: "Kontrollera lufttryck", resultat: "VF 2,4 / HF 2,1 / VB 2,4 / HB 2,4 bar — justerat till 2,4 runtom" }),
post(4, { typ: "kommentar", text: "Customer's fault description verified on receipt." }),
post(4, { typ: "kommentar", text: "No further observations on receipt." }),
post(4, { typ: "fraga_besvarad", stegId: "symptom", frageId: "hastighetsberoende", fraga: "Is the vibration speed-dependent?", svar: "Ja" }),
post(5, { typ: "fraga_besvarad", stegId: "symptom", frageId: "var", fraga: "Where is the vibration felt?", svar: "I ratten" }),
post(6, { typ: "fraga_besvarad", stegId: "symptom", frageId: "nar", fraga: "When does the vibration occur?", svar: "At steady speed" }),
post(8, { typ: "fraga_besvarad", stegId: "symptom", frageId: "intervall", fraga: "Does it disappear above or below a certain speed range?", svar: "Most noticeable at 8595 km/h, disappears below 80" }),
post(12, { typ: "foto", beskrivning: "Photograph the left front wheel", dataUrl: demoFoto("Left front wheel") }),
post(12, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_vf", text: "Photograph the left front wheel" }),
post(14, { typ: "foto", beskrivning: "Photograph the right front wheel", dataUrl: demoFoto("Right front wheel") }),
post(14, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_hf", text: "Photograph the right front wheel" }),
post(16, { typ: "foto", beskrivning: "Photograph the left rear wheel", dataUrl: demoFoto("Left rear wheel") }),
post(16, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_vb", text: "Photograph the left rear wheel" }),
post(18, { typ: "foto", beskrivning: "Photograph the right rear wheel", dataUrl: demoFoto("Right rear wheel") }),
post(18, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "foto_hb", text: "Photograph the right rear wheel" }),
post(22, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "dot", text: "Dokumentera DOT-/tillverkningsdatum", resultat: "Front: DOT 2318, rear: DOT 2318 — all from week 23 of 2018" }),
post(26, { typ: "observation", text: "The right front tyre shows uneven wear on the inner edge" }),
post(26, { typ: "kontroll_utford", stegId: "visuell", kontrollId: "slitage", text: "Check tyre wear", resultat: "Uneven wear right front, the others in order" }),
post(31, { typ: "matvarde", beskrivning: "Tyre pressure left front", varde: "2,4", enhet: "bar", ...DACKTRYCKSMATARE }),
post(32, { typ: "matvarde", beskrivning: "Tyre pressure right front", varde: "2,1", enhet: "bar", ...DACKTRYCKSMATARE }),
post(33, { typ: "kontroll_utford", stegId: "kontroller", kontrollId: "lufttryck", text: "Kontrollera lufttryck", resultat: "LF 2.4 / RF 2.1 / LR 2.4 / RR 2.4 bar — adjusted to 2.4 all round" }),
post(38, { typ: "kontroll_utford", stegId: "kontroller", kontrollId: "hjulmoment", text: "Kontrollera hjulmoment", resultat: "140 Nm samtliga hjul, ok" }),
post(40, { typ: "hypotes", text: "Obalans eller kast i höger framhjul", niva: "lag" }),
post(40, { typ: "hypotes", text: "Imbalance or runout in the right front wheel", niva: "lag" }),
post(41, { typ: "kategori_byte", kategori: "provkorning" }),
post(55, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_hastighet", text: "Hastighet där vibration uppstår", resultat: "Tydlig vibration 8595 km/h, max vid 88" }),
post(56, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_acc", text: "Förändring vid acceleration", resultat: "Ingen förändring vid acceleration" }),
post(57, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_motorbroms", text: "Förändring vid motorbroms", resultat: "Ingen förändring vid motorbroms" }),
post(58, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_var", text: "Om vibration känns i ratt eller kaross", resultat: "Endast i ratten" }),
post(55, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_hastighet", text: "Speed at which the vibration occurs", resultat: "Clear vibration at 8595 km/h, worst at 88" }),
post(56, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_acc", text: "Change under acceleration", resultat: "No change under acceleration" }),
post(57, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_motorbroms", text: "Change under engine braking", resultat: "No change under engine braking" }),
post(58, { typ: "kontroll_utford", stegId: "provkorning", kontrollId: "pk_var", text: "Whether the vibration is felt in the steering wheel or the body", resultat: "Endast i ratten" }),
post(60, { typ: "kategori_byte", kategori: "aktiv_felsokning" }),
post(75, { typ: "inaktivitet_forklarad", text: "Lyfte bilen och demonterade höger framhjul för kontroll i balanseringsmaskin.", minuter: 15 }),
post(82, { typ: "matvarde", beskrivning: "Obalans höger framhjul", varde: "38", enhet: "g", ...BALANSMASKIN }),
post(83, { typ: "kontroll_utford", stegId: "kontroller", kontrollId: "balansering", text: "Kontrollera hjulbalansering", resultat: "38 g obalans höger framen balansvikt saknas. Övriga hjul inom 5 g." }),
post(85, { typ: "observation", text: "Spår efter lossnad klistervikt på höger framfälgs insida" }),
post(75, { typ: "inaktivitet_forklarad", text: "Lifted the car and removed the right front wheel for checking on the balancing machine.", minuter: 15 }),
post(82, { typ: "matvarde", beskrivning: "Imbalance in the right front wheel", varde: "38", enhet: "g", ...BALANSMASKIN }),
post(83, { typ: "kontroll_utford", stegId: "kontroller", kontrollId: "balansering", text: "Kontrollera hjulbalansering", resultat: "38 g imbalance right fronta balance weight is missing. The other wheels within 5 g." }),
post(85, { typ: "observation", text: "Traces of a detached adhesive weight on the inner face of the right front rim" }),
post(85, {
typ: "reproducering",
status: "ja",
beskrivning: "Reproducerad vid provkörning på plan väg: vibrationen återskapades tre gånger mellan 92 och 108 km/h, tydligast i ratten.",
beskrivning: "Reproduced on a road test on level road: the vibration was recreated three times between 92 and 108 km/h, most clearly in the steering wheel.",
}),
post(86, {
typ: "felorsak",
avvikelse: "Framhjulen uppvisar obalans (38 g höger fram). Ingen deformation av fälgar eller däck kunde konstateras.",
orsaker: ["Yttre påverkan"],
underlag: ["Mätresultat", "Foto", "Direkt observation"],
avvikelse: "The front wheels show imbalance (38 g right front). No deformation of rims or tyres could be established.",
orsaker: ["External influence"],
underlag: ["Measurement result", "Foto", "Direkt observation"],
sakerhet: "medel",
atgard: "Balansera framhjulen och genomför ny provkörning i 80100 km/h.",
ytterligareKontroller: "Ny provkörning efter balansering bekräftar att symptomet är åtgärdat.",
atgard: "Balance the front wheels and perform a new road test at 80100 km/h.",
ytterligareKontroller: "A new road test after balancing confirms the symptom is resolved.",
}),
// Exempel på AI-handledning, märkt "demo" — riktiga svar kräver API-nyckel.
post(86, {
typ: "ai_svar",
rader: [
{ typ: "verifierat", text: "Obalans uppmätt: 38 g höger framhjul. Övriga hjul inom tolerans." },
{ typ: "observation", text: "Spår efter lossnad klistervikt förklarar var vikten suttit — orsaken till obalansen är dock inte verifierad." },
{ typ: "rekommendation", text: "Balansera om hjulet och verifiera att symptomet försvinner innan ärendet avslutas." },
{ typ: "verifierat", text: "Imbalance measured: 38 g right front wheel. The other wheels within tolerance." },
{ typ: "observation", text: "Traces of a detached adhesive weight explain where the weight sat — the cause of the imbalance is not verified, however." },
{ typ: "rekommendation", text: "Rebalance the wheel and verify that the symptom disappears before the case is closed." },
],
nastaSteg: "Balansera om höger framhjul och genomför ny provkörning i 80100 km/h.",
nastaSteg: "Rebalance the right front wheel and perform a new road test at 80100 km/h.",
modell: "demo",
}),
post(86, {
typ: "atgardsforslag",
beskrivning: "Balansera om höger framhjul och genomför ny provkörning i 80100 km/h.",
beskrivning: "Rebalance the right front wheel and perform a new road test at 80100 km/h.",
uppskattadKostnad: "890 kr inkl. moms",
}),
post(87, { typ: "kategori_byte", kategori: "kundkontakt" }),
@@ -155,23 +155,23 @@ export function byggDemoArende(nummer: number, anvandare = "Anna"): Arende {
typ: "kundbeslut",
beslut: "godkant",
kanal: "Telefon",
kommentar: "Kunden godkände ombalansering.",
kommentar: "The customer approved the rebalancing.",
}),
post(87, { typ: "kategori_byte", kategori: "aktiv_felsokning" }),
post(87, {
typ: "atgard_utford",
beskrivning: "Balanserade om höger framhjul och monterade ny balansvikt på fälgens insida.",
beskrivning: "Rebalanced the right front wheel and fitted a new weight on the inner face of the rim.",
delar: "Balansvikter 40 g",
utford: true,
}),
post(88, {
typ: "kvalitetskontroll",
resultat: "symptomet_borta",
beskrivning: "Ny provkörning 80110 km/h på samma vägsträcka — ingen vibration i ratten.",
beskrivning: "New road test at 80110 km/h on the same stretch — no vibration in the steering wheel.",
}),
post(90, { typ: "overlamning", fran: anvandare, till: "Johan" }),
post(92, { typ: "kategori_byte", kategori: "administration" }, "Johan"),
post(95, { typ: "kommentar", text: "Balanserat om höger framhjul, ny provkörning planerad." }, "Johan"),
post(95, { typ: "kommentar", text: "Rebalanced the right front wheel, a new road test is planned." }, "Johan"),
];
return {
@@ -192,13 +192,13 @@ export function byggDemoTolkning(): TolkatFalt[] {
{ id: "kund_telefon", etikett: "Telefon", grupp: "Customer", varde: "070-123 45 67", konfidens: 0.91, omrade: { x: 0.08, y: 0.22, bredd: 0.3, hojd: 0.04 } },
{ id: "fordon_regnr", etikett: "Regnr", grupp: "Vehicle", varde: "ABC123", konfidens: 0.99, omrade: { x: 0.62, y: 0.12, bredd: 0.2, hojd: 0.05 } },
{ id: "fordon_vin", etikett: "VIN", grupp: "Vehicle", varde: "YV1DZ8256F2123456", konfidens: 0.74, omrade: { x: 0.55, y: 0.19, bredd: 0.38, hojd: 0.04 } },
{ id: "fordon_marke", etikett: "Märke", grupp: "Vehicle", varde: "Volvo", konfidens: 0.99 },
{ id: "fordon_marke", etikett: "Make", grupp: "Vehicle", varde: "Volvo", konfidens: 0.99 },
{ id: "fordon_modell", etikett: "Modell", grupp: "Vehicle", varde: "XC60 D4", konfidens: 0.97 },
{ id: "fordon_arsmodell", etikett: "Årsmodell", grupp: "Vehicle", varde: "2019", konfidens: 0.96 },
{ id: "fordon_matarstallning", etikett: "Mätarställning", grupp: "Vehicle", varde: "8 432 mil", konfidens: 0.87, omrade: { x: 0.62, y: 0.27, bredd: 0.18, hojd: 0.04 } },
{ id: "fordon_arsmodell", etikett: "Model year", grupp: "Vehicle", varde: "2019", konfidens: 0.96 },
{ id: "fordon_matarstallning", etikett: "Odometer", grupp: "Vehicle", varde: "8 432 mil", konfidens: 0.87, omrade: { x: 0.62, y: 0.27, bredd: 0.18, hojd: 0.04 } },
{ id: "ao_nummer", etikett: "Arbetsordernr", grupp: "Workshop", varde: "AO-2496", konfidens: 0.99 },
{ id: "ao_serviceradgivare", etikett: "Servicerådgivare", grupp: "Workshop", varde: "M. Lindqvist", konfidens: 0.82 },
{ id: "felbeskrivning", etikett: "Felbeskrivning", grupp: "Case", varde: "Kunden upplever vibrationer i ratten vid ca 90 km/h", konfidens: 0.97, omrade: { x: 0.08, y: 0.45, bredd: 0.84, hojd: 0.07 } },
{ id: "ao_serviceradgivare", etikett: "Service advisor", grupp: "Workshop", varde: "M. Lindqvist", konfidens: 0.82 },
{ id: "felbeskrivning", etikett: "Felbeskrivning", grupp: "Case", varde: "The customer experiences vibration in the steering wheel at about 90 km/h", konfidens: 0.97, omrade: { x: 0.08, y: 0.45, bredd: 0.84, hojd: 0.07 } },
];
}
@@ -208,8 +208,8 @@ export function byggDemoInstrument(): InstrumentTolkning {
return {
instrumenttyp: "multimeter",
varden: [
{ beskrivning: "Batterispänning (vila)", varde: "12,4", enhet: "V", konfidens: 0.97 },
{ beskrivning: "Spänning vid start", varde: "9,8", enhet: "V", konfidens: 0.84 },
{ beskrivning: "Battery voltage (at rest)", varde: "12,4", enhet: "V", konfidens: 0.97 },
{ beskrivning: "Voltage during cranking", varde: "9,8", enhet: "V", konfidens: 0.84 },
],
};
}
+10 -10
View File
@@ -92,7 +92,7 @@ export function evidensposter(arende: Arende): Evidenspost[] {
});
for (const post of arende.handelser) {
const h = post.handelse;
if (h.typ === "foto") lagg(post, "foto", "E2", h.beskrivning);
if (h.typ === "foto") lagg(post, "photo", "E2", h.beskrivning);
if (h.typ === "video") lagg(post, "video", "E3", h.beskrivning);
if (h.typ === "matvarde") {
// Ett mätvärde är E4 bara när det går att visa vad som mätte och
@@ -105,8 +105,8 @@ export function evidensposter(arende: Arende): Evidenspost[] {
const spårbar = Boolean(h.matdonId) && kalibreradVid(h.matdonKalibreradTill, post.tidpunkt);
const märkning = [
h.matdonBeteckning
? `${h.matdonBeteckning}${spårbar ? "" : " — kalibrering saknas eller utgången"}`
: "instrument ej angivet",
? `${h.matdonBeteckning}${spårbar ? "" : " — calibration missing or expired"}`
: "instrument not stated",
// Härkomsten står i rapporten, inte bara i loggen: den som läser
// ska se att siffran är maskinläst utan att gräva (TÜV T-5).
h.kalla,
@@ -115,7 +115,7 @@ export function evidensposter(arende: Arende): Evidenspost[] {
.join("; ");
lagg(
post,
"mätvärde",
"measurement",
spårbar ? "E4" : "E1",
`${h.beskrivning} = ${h.varde}${h.enhet ? ` ${h.enhet}` : ""} (${märkning})`,
);
@@ -130,14 +130,14 @@ export function evidensposter(arende: Arende): Evidenspost[] {
const fotograferad = Boolean(h.bilagaId || h.dataUrl);
lagg(
post,
"mätarställning",
"odometer",
fotograferad ? "E2" : "E1",
`${h.lage === "ingaende" ? "In" : "Ut"}: ${h.varde}${fotograferad ? "" : " (inskriven, ej fotograferad)"}`,
`${h.lage === "ingaende" ? "In" : "Out"}: ${h.varde}${fotograferad ? "" : " (entered, not photographed)"}`,
);
}
if (h.typ === "arbetsorder_skannad") lagg(post, "dokument", "E5", `Arbetsorder, ${h.falt.length} fält`);
if (h.typ === "arbetsorder_skannad") lagg(post, "document", "E5", `Work order, ${h.falt.length} fields`);
if (h.typ === "observation") lagg(post, "observation", "E1", h.text);
if (h.typ === "kontroll_utford" && !h.undantag) lagg(post, "kontroll", "E1", h.text);
if (h.typ === "kontroll_utford" && !h.undantag) lagg(post, "check", "E1", h.text);
}
return poster;
}
@@ -239,7 +239,7 @@ const GENERISKA_FRASER = /^(trasig|defekt|sliten|utsliten|kass|död|behöver byt
export function granskaAvvikelse(text: string): string | null {
const ren = text.trim();
if (ren.length < 20 || GENERISKA_FRASER.test(ren)) {
return "Felorsak saknas. Beskriv den konstaterade avvikelsen — inte bara komponenten. Exempel: ”Startmotorn aktiverar inte trots korrekt matningsspänning och god jordförbindelse.”";
return "Root cause missing. Describe the established deviation — not only the component. Example: “The starter motor does not engage despite correct supply voltage and a good earth connection.”";
}
return null;
}
@@ -673,7 +673,7 @@ export function kvalitetsgrind(arende: Arende, metodik: Metodik): GrindRad[] {
ok: !!beslut,
kravs: utfordAtgard,
detalj: beslut
? `${beslut.beslut === "godkant" ? "Godkänt" : beslut.beslut === "avbojt" ? "Avböjt" : "Delvis godkänt"} via ${beslut.kanal}.`
? `${beslut.beslut === "godkant" ? "Approved" : beslut.beslut === "avbojt" ? "Declined" : "Partly approved"} via ${beslut.kanal}.`
: "A proposal has been given — record the customer's decision before the work is performed.",
});
if (beslut?.beslut === "avbojt" && utfordAtgard) {
+10
View File
@@ -114,6 +114,16 @@ export default function Sprak() {
Interface coverage is measured, not estimated: a test fails the build if any key is missing from
any language. Review status is a statement about people, not about files, and is set by hand.
</p>
{/* Att engelska är källspråket betyder inte att den engelska
metodiktexten är fackgranskad. Den är översatt från svenska,
och att inte säga det hade varit att göra precis det sidan
varnar för på de andra nio språken. */}
<p className="mt-4 max-w-[680px] border-l-2 pl-6 text-[13px] leading-[20px]"
style={{ borderColor: FARG.varning, color: FARG.graphite }}>
The English procedure text is a translation of the Swedish source and has not yet been read by a
specialist working in the trade. It is held to the same standard as the other nine languages, and
the same statement is made about it here rather than quietly excepted because it is the source.
</p>
</Sektion>
{/* ---- Beviset ---- */}