Logga metodikens mätkontroller som mätvärden

En kontroll vars krav är "matvarde" loggade bara kontroll_utford. Det
gällde 56 av metodikernas 153 kontroller — drygt en tredjedel — och fick
två följder som bägge upptäcktes när tio ärenden kördes igenom
gränssnittet:

Felorsaksanalysen nekade "Mätresultat" som underlag med motiveringen att
underlaget inte finns i loggen, trots att teknikern just hade matat in
mätvärdet som kontrollen krävde. Enda vägen förbi var att mata in samma
siffra en gång till via dokumentationspanelen.

Evidensprofilen i analysvyn underskattade systematiskt hur mycket som
faktiskt mäts, eftersom mätningarna aldrig fanns som mätvärden.

Mätningen loggas nu som det den är. Utan känt mätdon graderas den E1 och
inte E4 (QUALITY-AUDIT M-1) — ett avläst tal utan spårbart instrument är
inte en spårbar mätning.

Tre tester låser förhållandet mellan metodikernas kravtyper och den
evidens de producerar, så att en ny kravtyp inte kan införas utan att
någon tar ställning till vad den ska ge för evidens.

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-05 17:35:26 +00:00
parent f0f5cc670e
commit 6fa7953012
2 changed files with 53 additions and 1 deletions
@@ -245,3 +245,42 @@ describe("schemat följer domänmodellen", () => {
expect([...new Set(avvisade)]).toEqual([]);
});
});
// ---- En mätning ska loggas som en mätning -------------------------------
//
// Bakgrund: en kontroll vars krav är "matvarde" loggade bara
// kontroll_utford. Följden var att 56 av metodikernas 153 kontroller —
// drygt en tredjedel — mätte utan att det syntes någonstans:
// felorsaksanalysen nekade "Mätresultat" som underlag trots att
// teknikern just hade mätt, och evidensprofilen i analysvyn underskattade
// systematiskt hur mycket som faktiskt mäts i verkstaden.
//
// Testet låser förhållandet mellan metodikernas krav och den evidens de
// måste ge, så att en framtida kontrolltyp inte kan införas utan att
// någon tar ställning till vilken evidens den producerar.
describe("metodikernas mätkontroller producerar mätevidens", () => {
it("varje kontroll har ett känt krav", async () => {
const { ALLA_METODIKER } = await import("../../../../services/gemensam/metodiker.mjs");
const kravtyper = new Set<string>();
for (const m of ALLA_METODIKER) {
for (const steg of m.steg) {
for (const k of steg.kontroller ?? []) if (k.krav) kravtyper.add(k.krav);
}
}
expect([...kravtyper].sort()).toEqual(["foto", "kommentar", "matvarde"]);
});
it("KontrollKort loggar ett matvarde när kravet är matvarde", () => {
const kod = readFileSync("src/pages/felsokning/ArendeSida.tsx", "utf8");
expect(kod).toMatch(/krav === "matvarde" && resultat\.trim\(\)/);
expect(kod).toMatch(/skicka\(\{ typ: "matvarde", beskrivning: kontroll\.text/);
});
it('underlagskällan "Mätresultat" godtar just den händelsetypen', async () => {
const { underlagFinns } = await import("../ecm");
const arende = {
handelser: [{ id: "1", tidpunkt: "", anvandare: "A", handelse: { typ: "matvarde", beskrivning: "Lufttryck", varde: "2,4 bar" } }],
} as never;
expect(underlagFinns(arende, "Mätresultat")).toBe(true);
});
});
@@ -1527,7 +1527,19 @@ function KontrollKort({ steg, skicka }: { steg: NastaSteg; skicka: (h: Handelse)
const filRef = useRef<HTMLInputElement>(null);
const krav = kontroll.krav;
const utford = () =>
const utford = () => {
// En kontroll vars krav är ett mätvärde ger ett mätvärde. Tidigare
// loggades bara kontroll_utford, med följden att 56 av metodikernas
// 153 kontroller — drygt en tredjedel — mätte utan att det syntes:
// felorsaksanalysen nekade ”Mätresultat” som underlag, och
// evidensprofilen i analysvyn underskattade systematiskt hur mycket
// som faktiskt mättes. Mätningen loggas därför som det den är.
//
// Utan känt mätdon graderas den E1, inte E4 (QUALITY-AUDIT M-1) —
// ett avläst tal utan spårbart instrument är inte en spårbar mätning.
if (krav === "matvarde" && resultat.trim()) {
skicka({ typ: "matvarde", beskrivning: kontroll.text, varde: resultat.trim() });
}
skicka({
typ: "kontroll_utford",
stegId: steg.steg.id,
@@ -1535,6 +1547,7 @@ function KontrollKort({ steg, skicka }: { steg: NastaSteg; skicka: (h: Handelse)
text: kontroll.text,
resultat: resultat.trim() || undefined,
});
};
const kravUppfyllt = krav === "foto" || !krav || resultat.trim().length > 0;