Videoevidens (E3) och signerat avslut

Video med ljud är nu en riktig evidenstyp — den sista luckan i
evidensskalan E0–E6:

- Ny händelse video (beskrivning + dataUrl): Video-knappen i
  Dokumentera-panelen spelar in/väljer ett kort klipp via kameran,
  beskrivningen är obligatorisk ("det som låter eller rör sig") och
  hård storleksgräns avvisar för långa klipp med tydligt besked
- Evidence Engine: video katalogiseras som E3 och räknas som oberoende
  källa mot E6; underlagskällan "Video" i felorsaksanalysen valideras
  nu mot loggen precis som foto/mätresultat
- Originalfilen bevaras och visas i arbetsloggen, kundrapporten och
  Live Share-vyn

Signerat avslut (ur Completion-checklistan): "Avsluta felsökning"
loggar teknikerns signatur — "Felsökning avslutad — signerad av …" —
och kvalitetsgrinden redovisar signaturen.

61 vitest-tester, integrationstest, OpenAPI-validering och
preview-klicktest (beskrivningskrav, storleksgräns, videospelare i
loggen, signerat avslut) gröna.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
Claude
2026-08-03 10:05:41 +00:00
parent 09d3558e0c
commit 786e2159f5
10 changed files with 174 additions and 13 deletions
+9 -2
View File
@@ -67,6 +67,10 @@ export type Handelse =
| { typ: "matvarde"; beskrivning: string; varde: string; enhet?: string }
| { typ: "hypotes"; text: string; niva: Exclude<Tillforlitlighet, "hog"> }
| { typ: "foto"; beskrivning: string; dataUrl: string }
// Video med ljud (E3-evidens): för det som låter eller rör sig —
// motorljud, hjullager, fjädringsrörelse. Kort och komprimerad;
// originalfilen bevaras som evidens precis som foton.
| { typ: "video"; beskrivning: string; dataUrl: string }
| { typ: "kommentar"; text: string }
| { typ: "kategori_byte"; kategori: TidKategori }
| { typ: "inaktivitet_forklarad"; text: string; minuter: number }
@@ -104,7 +108,8 @@ export type Handelse =
nastaSteg: string;
modell: string;
}
| { typ: "arende_avslutat" };
// Avslutet signeras av teknikern — slutsatsen får en ansvarig avsändare.
| { typ: "arende_avslutat"; signatur?: string };
export interface LoggPost {
id: string;
@@ -160,6 +165,8 @@ export function handelseRubrik(post: LoggPost): string {
return `Hypotes (${TILLFORLITLIGHET_LABEL[h.niva]}): ${h.text}`;
case "foto":
return `Foto: ${h.beskrivning}`;
case "video":
return `Video: ${h.beskrivning}`;
case "kommentar":
return h.text;
case "kategori_byte":
@@ -194,6 +201,6 @@ export function handelseRubrik(post: LoggPost): string {
return `AI: ${forsta ? `${forsta.text} ` : ""}— Nästa steg: ${h.nastaSteg}`;
}
case "arende_avslutat":
return "Felsökning avslutad";
return h.signatur ? `Felsökning avslutad — signerad av ${h.signatur}` : "Felsökning avslutad";
}
}