# `scene`-Block — Kontrakt für Produkt & Monorepo-Team > **Für wen:** Product Owner + das Team am Monorepo (`alami-platform`). > **Was:** Die Vision-API bekommt ein neues, **optionales** Antwortfeld `scene` > mit einer Einschätzung „Ist auf diesem Foto überhaupt Müll?". > **Status:** Kontrakt festgezurrt (Typen im Code), **noch nicht aktiv** — > heute liefert keine Antwort das Feld. Erst nach eurem Go. > **Gegenstück:** `alami-platform/docs/VISION-API-BOUNDARY.md`. --- ## 1. Das Problem, das es löst (in einem Satz) Unser Detektor feuert auf **39 % zufälliger Nicht-Müll-Bilder** einen False Positive — jedes davon ist potenziell eine Auszahlung für ein Foto ohne Müll. Der `scene`-Block liefert ein zweites, unabhängiges Signal: ein Weltmodell schaut sich die Szene an („Katze", „Rasen", „Plastikflasche") und sagt, wie plausibel Müll ist. ## 2. Was es messbar kann (Stand 2026-07-26) Gemessen auf 620 Bildern (339 mit Müll, 281 ohne), fair out-of-fold validiert: | Wenn wir … | … dann bleiben von echtem Müll erhalten | |---|---| | **80 % der Falsch-Fälle wegfiltern** | **88 %** | | 90 % der Falsch-Fälle wegfiltern | 70 % | Zum Vergleich: die naive Vorversion schaffte bei 80 % Filterwirkung nur 50 %. Details + Methodik: `docs/PHASE_A_SCENE_GATE.md` §8i. **Ehrliche Grenzen — bitte mitlesen:** - Gemessen auf **TACO-Datensatz-Fotos**, nicht auf echten App-Uploads. Die Zahl ist eine belastbare Richtgröße, **keine Produktionsgarantie**. - Es ist **kein 100-%-Detektor.** Bei 80 % Filterwirkung gehen 12 % echter Müll-Fotos fälschlich in die Prüfung. Deshalb Punkt 3. ## 3. Die wichtigste Regel: **advisory, nicht Auszahlung** `waste_likelihood` ist ein **Hinweis**, kein Urteil. - ✅ **Erlaubt:** Einreichung zur **manuellen Prüfung** markieren, im Admin sortieren/priorisieren, Betrugsmuster sichtbar machen, dem Nutzer einen Hinweis zeigen („Wir konnten keinen Müll erkennen — trotzdem einreichen?"). - ❌ **Nicht erlaubt:** Trash Coins automatisch verweigern, Einreichung ablehnen, Nutzer sperren — **allein** aufgrund dieses Werts. Grund: ein Nutzer, der echten Müll gesammelt hat und wegen eines Modellfehlers leer ausgeht, ist ein schwerer Vertrauensschaden. Der bestehende Review-Pfad (`needs_review` → Admin gibt frei) fängt das sauber ab. Falls wir später **automatisch** verweigern wollen, braucht es eine andere Qualitätsstufe (≥99 % erhaltener Müll) — die ist heute **nicht** erreicht, und der Weg dahin steht in Punkt 6. ## 4. Was sich technisch ändert — **nichts**, bis ihr es nutzt `scene` ist ein **optionales** Feld auf `AnalyzeResponse`. Es fehlt heute in jeder Antwort. Kein Feld wird umbenannt, entfernt oder in der Bedeutung geändert. **Bestehende Clients brauchen keine Zeile Code.** ```jsonc { "prediction_id": "…", "model_version": "…", "objects": [ … ], "summary": { … }, // NEU, optional, fehlt wenn nicht aktiviert: "scene": { "scene_gate_version": "yolo-worldv2-…", "waste_likelihood": 0.87, // 0..1 — ADVISORY (siehe §3) "score_method": "learned", // "learned" | "max_conf" (Transparenz) "waste_objects": [ { "label": "plastic bottle", "label_de": "Plastikflasche", "confidence": 0.81, "bbox_norm": [0.12, 0.4, 0.2, 0.3], "material_hint": "plastic" } ], "non_waste_objects": [ { "label": "cat", "label_de": "Katze", "confidence": 0.88, "bbox_norm": [0.5, 0.1, 0.3, 0.4] } ], "counts": { "waste": 1, "non_waste": 1 }, "inventory_text": "Plastikflasche · Katze" // fertig zum Anzeigen } } ``` Feldbedeutungen: | Feld | Bedeutung | |---|---| | `waste_likelihood` | 0..1, wie plausibel Müll im Bild ist. **Advisory.** | | `score_method` | `learned` = gelerntes Modell, `max_conf` = einfache Rückfallebene. Immer mitloggen — sonst sind Metriken über verschiedene Stände nicht vergleichbar. | | `waste_objects` / `non_waste_objects` | erkannte Dinge mit deutschem Label + Box (0..1, wie `objects[]`) | | `inventory_text` | fertiger Anzeigestring, keine eigene Formatierung nötig | | `counts` | Schnellzugriff ohne Listen zu zählen | `bbox_norm` ist identisch normiert wie in `objects[]` — dieselbe Overlay-Logik funktioniert. ## 5. Was wir vom Produkt brauchen (Entscheidungen für den PO) 1. **Schwelle:** Ab welchem `waste_likelihood` soll eine Einreichung in die Prüfung wandern? *Empfehlung: konservativ starten* (nur sehr niedrige Werte markieren), Wirkung beobachten, dann nachziehen. Die Schwelle gehört **auf eure Seite** — so ändert ihr sie ohne Vision-Deployment. 2. **Sichtbarkeit:** Sieht der Nutzer etwas (z. B. „kein Müll erkannt") oder zunächst nur der Admin? *Empfehlung: erst nur Admin*, bis wir Feldzahlen haben. 3. **Rollout:** Erst mitlaufen lassen und **nur loggen** (keine Wirkung), damit wir echte Verteilungen sehen — dann entscheiden. *Empfehlung: ja.* ## 6. Wie es besser wird (und warum euer Feedback der Motor ist) Das Modell lernt aus Korrekturen. Über den bereits gebauten Feedback-v2-Pfad (`added_items`, `reasons`, `action` — siehe `docs/api.md`) kommen genau die Fälle zurück, in denen die KI danebenlag. Damit trainieren wir den Score auf **echten App-Fotos** statt auf Datensatz-Bildern nach. Der Weg zum harten Auto-Gate führt **nur** hierüber. Je mehr Feedback fließt, desto eher ist es realistisch. ## 7. Offene Punkte auf unserer Seite (Vision) - **Serving:** Das Weltmodell läuft heute nur in der Auswertung, nicht im Live-Space (anderer Runtime-Stack, Latenz-Budget zu prüfen). Das ist der nächste Arbeitsblock — Aufwand entsteht **bevor** ihr etwas tun müsst. - **Latenz:** Zusätzliche Inferenz kostet Zeit. Vor Aktivierung messen wir und melden die Zahl; notfalls läuft es asynchron statt im Antwortpfad. ## 8. Zeitliche Reihenfolge (Vorschlag) 1. **Jetzt:** Ihr lest den Kontrakt, sagt ob die Feldform passt. *(kein Code)* 2. Wir bauen Serving + messen Latenz. 3. **Schattenbetrieb:** Feld wird geliefert, nur geloggt, keine Wirkung. 4. Nach echten Zahlen: PO entscheidet Schwelle + Sichtbarkeit. 5. Später, datenabhängig: Auto-Gate — nur bei ≥99 % erhaltenem Müll. **Vertragsänderungen** (Felder, Bedeutungen, Auth) stimmen wir vorher ab — wie Schema-Migrationen, gemäß `VISION-API-BOUNDARY.md`.