271 lines
6.7 KiB
Markdown
271 lines
6.7 KiB
Markdown
|
|
# quiXzoom — Audit Spec
|
|||
|
|
*Beslutad: 2026-06-17. Körs innan Smart Scan, AVO och Liveness byggs ut.*
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Kill-kriterier (commitas INNAN körning)
|
|||
|
|
|
|||
|
|
| Kriterie | Kill om |
|
|||
|
|
|----------|---------|
|
|||
|
|
| Evidenstäckning Fas 1 | <70% av sekvenser ger alla required datapunkter |
|
|||
|
|
| Extraherbarhet Fas 2 | OCR/detection <80% på serienummer under verkliga förhållanden |
|
|||
|
|
| Tid per claim Fas 2 | >3 min genomsnitt → marginalproblemet |
|
|||
|
|
| Liveness Fas 3 | >20% av replay-attacker passerar utan detection |
|
|||
|
|
| Översättning Fas 4 | <80% av uppdrag kan formuleras som datakrav (ej bildkrav) |
|
|||
|
|
|
|||
|
|
Bryts ett kill-kriterium → stopp, omvärdering innan kod.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Fas 4 först — 5 pilot-claims (gör detta innan WoZ)
|
|||
|
|
|
|||
|
|
Formulera datakrav för dessa 5 objekt. Det är linjalen för Fas 1.
|
|||
|
|
|
|||
|
|
### Claim 1: Elmätare
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Claim: electricity_meter_verified
|
|||
|
|
Datakrav:
|
|||
|
|
- serienummer (OCR, alfanumerisk sträng)
|
|||
|
|
- mätarställning (OCR, numerisk)
|
|||
|
|
- plombering synlig (presence_check)
|
|||
|
|
- GPS inom 15m från uppdragsadress
|
|||
|
|
Tröskel för godkänt: alla 4 datapunkter extraherbara med confidence >0.85
|
|||
|
|
Kill-signal: serienummer <80% läsbart i testset
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Claim 2: Fordonsregistreringsskylt
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Claim: reg_plate_verified
|
|||
|
|
Datakrav:
|
|||
|
|
- registreringsnummer (OCR, format: ABC 123)
|
|||
|
|
- framruta/bakruta tydlig (framing_check)
|
|||
|
|
- GPS inom 50m
|
|||
|
|
Tröskel: reg_nr confidence >0.90
|
|||
|
|
Kill-signal: avläsningsfel >15% i testset (smutsiga/blinkande skyltar)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Claim 3: Butiksskylt/fasad
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Claim: storefront_condition_verified
|
|||
|
|
Datakrav:
|
|||
|
|
- butiksnamn läsbart (OCR)
|
|||
|
|
- fasadens helhet synlig (coverage >85%)
|
|||
|
|
- skador dokumenterade om synliga (anomaly_detection)
|
|||
|
|
- GPS inom 20m
|
|||
|
|
Tröskel: namn + helhet = godkänt; skador är bonus
|
|||
|
|
Kill-signal: <70% av uppdrag ger täckning >85%
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Claim 4: Livboj (maritim säkerhet)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Claim: lifebuoy_present_and_accessible
|
|||
|
|
Datakrav:
|
|||
|
|
- livboj identifierad (object_detection, class: lifebuoy)
|
|||
|
|
- position synlig (framing)
|
|||
|
|
- tillgänglighet verifierbar (ej blockerad)
|
|||
|
|
- GPS inom 10m
|
|||
|
|
Tröskel: object_detection confidence >0.88
|
|||
|
|
Kill-signal: dark/backlit environments → detection <70%
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Claim 5: Serienummerplåt (industrimaskiner)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Claim: machine_serial_verified
|
|||
|
|
Datakrav:
|
|||
|
|
- serienummer (OCR, variabelt format)
|
|||
|
|
- maskintyp identifierad (object_detection)
|
|||
|
|
- position dokumenterad (GPS)
|
|||
|
|
Tröskel: OCR confidence >0.85
|
|||
|
|
Kill-signal: graverade/inpräglade serienummer → OCR <60% (hårt kill-kriterium)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Fas 1 — Wizard of Oz (20–50 uppdrag)
|
|||
|
|
|
|||
|
|
**Frågan:** Får vi tillräckligt med evidens utan att användaren tar ett enda foto?
|
|||
|
|
|
|||
|
|
### Setup
|
|||
|
|
|
|||
|
|
- Zoomer filmar med vanlig telefon-kamera (videoläge)
|
|||
|
|
- Operatör bakom kulisserna skickar textinstruktioner i realtid via Telegram/chat
|
|||
|
|
- Ingen AI — bara en människa som läser videon live
|
|||
|
|
|
|||
|
|
### Instruktionsvokabulär (samma som AVO)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
"Gå närmare — ca 30 cm"
|
|||
|
|
"Visa etiketten"
|
|||
|
|
"Vrid kameran lite åt höger"
|
|||
|
|
"Håll still"
|
|||
|
|
"Visa undersidan"
|
|||
|
|
"Zooma in serienumret"
|
|||
|
|
"Visa hela objektet"
|
|||
|
|
"Perfekt — klar"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Mätpunkter per sekvens
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
session_id: WoZ_001
|
|||
|
|
object_type: electricity_meter
|
|||
|
|
duration_seconds: 0
|
|||
|
|
instruction_count: 0
|
|||
|
|
datakrav_uppfyllda:
|
|||
|
|
serienummer: null # true/false/partial
|
|||
|
|
matarstandning: null
|
|||
|
|
plombering: null
|
|||
|
|
gps: null
|
|||
|
|
evidens_tillracklig: null # true/false
|
|||
|
|
anteckningar: ""
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Gränsvärde
|
|||
|
|
|
|||
|
|
>70% av sekvenser måste ge alla datakrav uppfyllda. Annars: kill.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Fas 2 — Evidensaudit (100–500 sekvenser)
|
|||
|
|
|
|||
|
|
**Frågan:** Vad misslyckas, hur ofta, och vad kostar det?
|
|||
|
|
|
|||
|
|
### Per sekvens
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
session_id: EA_001
|
|||
|
|
object_type: electricity_meter
|
|||
|
|
zoomer_id: anonymized
|
|||
|
|
|
|||
|
|
timing:
|
|||
|
|
total_seconds: 0
|
|||
|
|
instructions_given: 0
|
|||
|
|
first_clear_frame_at_s: 0
|
|||
|
|
|
|||
|
|
extraction_results:
|
|||
|
|
serienummer:
|
|||
|
|
extracted: null
|
|||
|
|
confidence: null
|
|||
|
|
attempts: 0
|
|||
|
|
matarstandning:
|
|||
|
|
extracted: null
|
|||
|
|
confidence: null
|
|||
|
|
plombering:
|
|||
|
|
visible: null
|
|||
|
|
|
|||
|
|
environment:
|
|||
|
|
lighting: good/bad/mixed
|
|||
|
|
distance_issues: false
|
|||
|
|
occlusion: false
|
|||
|
|
|
|||
|
|
outcome: approved/rejected/partial
|
|||
|
|
reject_reason: ""
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Nyckeltal att samla
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Genomsnittstid per claim: X sek
|
|||
|
|
Instruktioner per claim: X st
|
|||
|
|
Extraktionssäkerhet serienummer: X%
|
|||
|
|
Extraktionssäkerhet numeriska värden: X%
|
|||
|
|
Presence detection: X%
|
|||
|
|
Vanligaste felpunkter: [lista]
|
|||
|
|
Kostnad per claim (tid × Zoomer-ersättning): X kr
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Fas 3 — Livenessaudit (attackscenarier)
|
|||
|
|
|
|||
|
|
**Frågan:** Vilka signaler skiljer verklighet från bedrägeri?
|
|||
|
|
|
|||
|
|
### Attackscenarier att testa
|
|||
|
|
|
|||
|
|
| # | Attack | Förväntat utfall | Faktiskt utfall |
|
|||
|
|
|---|--------|-----------------|-----------------|
|
|||
|
|
| L1 | Foto av objekt på annan telefon | Fail — ingen parallax | |
|
|||
|
|
| L2 | Video av annan telefon (replay) | Fail — ingen challenge-respons | |
|
|||
|
|
| L3 | Utskrivet foto | Fail — platt, ingen djupinfo | |
|
|||
|
|
| L4 | Skärm som spelar upp video | Fail — moiré-mönster + platt | |
|
|||
|
|
| L5 | AI-genererad bild (DALL-E/Midjourney) | Fail — inga sensordata | |
|
|||
|
|
| L6 | Zoom/Teams-samtal som visar objektet | Fail — kompression + latens | |
|
|||
|
|
| L7 | Äkta video men fel plats (GPS-spoof) | Fail — GPS matchar ej | |
|
|||
|
|
| L8 | Äkta video men för gammalt (timestamp) | Fail — timestamp-drift | |
|
|||
|
|
|
|||
|
|
### Liveness-signaler att mäta
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Parallax-detektionsrate: X%
|
|||
|
|
Gyro-avvikelse från naturlig rörelse: X%
|
|||
|
|
Fokusförändrings-frekvens: X/min
|
|||
|
|
GPS-timestamp-korrelation: X%
|
|||
|
|
Challenge-respons-pass-rate (äkta): X%
|
|||
|
|
Challenge-respons-pass-rate (attack): X%
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Fas 4 fullständig — 50 verkliga uppdrag
|
|||
|
|
|
|||
|
|
Upprepa pilot-processen på 50 uppdrag från verkliga kundkategorier:
|
|||
|
|
|
|||
|
|
| Kategori | Antal | Datakrav formulerade? |
|
|||
|
|
|----------|-------|-----------------------|
|
|||
|
|
| Fastighetsfasader | 10 | |
|
|||
|
|
| Infrastruktur (skyltar, vägmärken) | 10 | |
|
|||
|
|
| Fordon | 10 | |
|
|||
|
|
| Industrimaskiner | 10 | |
|
|||
|
|
| Maritim säkerhet | 5 | |
|
|||
|
|
| Retail/butiker | 5 | |
|
|||
|
|
|
|||
|
|
**Frågan per uppdrag:** Kan vi formulera detta som datakrav (inte bildkrav)?
|
|||
|
|
|
|||
|
|
Kill: <80% översättningsbara → affärsmodellen håller inte.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Audit-verktyget (minimalt)
|
|||
|
|
|
|||
|
|
Bygg detta, inte Smart Scan:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Video in (upload)
|
|||
|
|
↓
|
|||
|
|
Manuell taggning per datapunkt (UI: checkbox + confidence slider)
|
|||
|
|
↓
|
|||
|
|
Automatisk sammanräkning mot claim-kraven
|
|||
|
|
↓
|
|||
|
|
Output: covered ✓ / missing ✗ / partial ~ per datapunkt
|
|||
|
|
↓
|
|||
|
|
Aggregerat per objekt-typ
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Stack: enkel HTML-sida + SQLite. En dag att bygga. Kör 1000 videor på den.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Tidslinje
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Dag 1: Fas 4 pilot (5 claims) → datakravsmall klar
|
|||
|
|
Dag 2–3: Fas 1 WoZ (20 uppdrag, 2 objekt-typer)
|
|||
|
|
Dag 4: Utvärdering Fas 1 — kill check
|
|||
|
|
Dag 5–10: Fas 2 evidensaudit (100 sekvenser)
|
|||
|
|
Dag 11: Fas 3 liveness (8 attackscenarier)
|
|||
|
|
Dag 12: Fas 4 fullständig (50 uppdrag)
|
|||
|
|
Dag 13: Sammanställning → go/kill per komponent
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Innan dag 14 byggs inget mer av Smart Scan.**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*Bygger på: QUIXZOOM_VISION.md, QUIXZOOM_AVO_MASTERPROMPT_V3.md*
|
|||
|
|
*Nästa steg: Bygg audit-verktyget (dag 1, en dag).*
|