docs: correct stacking rule, barcode flow, and device-check gaps

- README/.vch-description overstated the stacking rule as a hard
  "identical specs AND identical part number" requirement. In reality
  specsCompatible (src/spec.js) only compares fields known on both
  sides, so an unread part number is skipped rather than compared;
  proposeAssignment (src/session.js) only prompts when multiple stacks
  match. Documented the actual rule and its deliberate trade-off.
- Added a sentence on how pipeline.js handles multiple barcodes with
  an unknown numbering scheme that disagree: no part number is taken
  over and OCR alone decides, without prompting.
- Added src/styles.css to the "Aufbau" file table.
- Added the two barcode-adapter device checks from
  .superpowers/sdd/task-9-report.md (first-load timing, reload after
  an interrupted first load) to "Am Gerät noch zu prüfen"; reviewed
  task-8 and task-10..13 reports and confirmed their other device
  checks were already present.
This commit is contained in:
vchuser
2026-07-28 17:50:38 +02:00
parent 2d3a9b0ddb
commit cfdccb3f74
2 changed files with 28 additions and 6 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
Sortierhilfe fuer gebrauchte Server-RAM-Module. Man haelt ein Modul vor die Sortierhilfe fuer gebrauchte Server-RAM-Module. Man haelt ein Modul vor die
Handykamera, und die App sagt sofort, auf welchen Stapel es gehoert - Module Handykamera, und die App sagt sofort, auf welchen Stapel es gehoert - Module
mit identischen technischen Daten und identischer Hersteller-Teilenummer mit gleichen technischen Daten und, soweit lesbar, gleicher Hersteller-
landen zusammen, damit daraus verkaufsfertige Kits entstehen. Teilenummer landen zusammen, damit daraus verkaufsfertige Kits entstehen.
Gedacht fuer den Wareneingang im Gebrauchthandel mit Serverkomponenten, wo Gedacht fuer den Wareneingang im Gebrauchthandel mit Serverkomponenten, wo
gemischte Chargen ankommen und von Hand sortiert werden muessen. Die App gemischte Chargen ankommen und von Hand sortiert werden muessen. Die App
+26 -4
View File
@@ -2,9 +2,18 @@
Browser-App, die per Handykamera gebrauchte Server-RAM-Module erkennt und Browser-App, die per Handykamera gebrauchte Server-RAM-Module erkennt und
beim physischen Sortieren am Tisch anleitet: Modul vor die Kamera halten, die beim physischen Sortieren am Tisch anleitet: Modul vor die Kamera halten, die
App nennt den Stapel. Module mit identischer Spec **und** identischer App nennt den Stapel. Verglichen wird über alle Merkmale, die bei Modul und
Hersteller-Teilenummer bilden einen Stapel, damit daraus verkaufsfertige Kits Stapel bekannt sind — Kapazität, Bauform, Rank, Geschwindigkeit und, sofern
entstehen. gelesen, Hersteller-Teilenummer (`specsCompatible` in `src/spec.js`); ein auf
einer Seite fehlendes Merkmal wird dabei übersprungen, nicht als Widerspruch
gewertet. Passt danach genau ein Stapel, wird das Modul zugewiesen; passen
mehrere, fragt die App nach (`proposeAssignment` in `src/session.js`). Das hat
eine bewusst in Kauf genommene Folge: Konnte die Teilenummer nicht gelesen
werden — der häufige Fall bei überklebten oder beschädigten Etiketten — und
passt anhand der übrigen Merkmale nur ein Stapel, landet das Modul dort, auch
wenn seine tatsächliche Teilenummer eine andere wäre. Diese Abwägung ist
Absicht: Ohne sie müsste die App bei jedem zweiten Modul nachfragen, sobald
die Texterkennung keine Teilenummer liefert.
Die Erkennung läuft vollständig lokal im Browser — kein Server, keine Cloud, Die Erkennung läuft vollständig lokal im Browser — kein Server, keine Cloud,
keine Daten verlassen das Gerät. keine Daten verlassen das Gerät.
@@ -15,7 +24,10 @@ keine Daten verlassen das Gerät.
dekodiert (`zxing-wasm`). Das ist exakt, im Gegensatz zu Texterkennung. dekodiert (`zxing-wasm`). Das ist exakt, im Gegensatz zu Texterkennung.
Werden mehrere Barcodes im Bild gefunden, die sich widersprechen (nicht Werden mehrere Barcodes im Bild gefunden, die sich widersprechen (nicht
dieselbe Teilenummer), gilt das als mehrdeutig — die App rät nicht, dieselbe Teilenummer), gilt das als mehrdeutig — die App rät nicht,
sondern fragt nach. sondern fragt nach. Das gilt nur für Barcodes mit einem bekannten
Nummernschema; widersprechen sich mehrere Barcodes mit unbekanntem
Nummernschema, wird keine ihrer Teilenummern übernommen und das Ergebnis
stützt sich allein auf die Texterkennung, ohne dass die App nachfragt.
2. **Teilenummer-Decoder.** Aus einer Hersteller-PN wie `M386A8K40BM1-CRC4Y` 2. **Teilenummer-Decoder.** Aus einer Hersteller-PN wie `M386A8K40BM1-CRC4Y`
werden Kapazität, Bauform und Geschwindigkeit tabellengesteuert werden Kapazität, Bauform und Geschwindigkeit tabellengesteuert
abgeleitet. Gelingt das, entfällt OCR vollständig. abgeleitet. Gelingt das, entfällt OCR vollständig.
@@ -108,6 +120,7 @@ nicht gesetzt ist).
| `src/ocr.js` | Bildaufbereitung (Otsu) und Adapter zu `tesseract.js` | | `src/ocr.js` | Bildaufbereitung (Otsu) und Adapter zu `tesseract.js` |
| `src/ui/` | Ansichten: Scan-Ansicht, Ergebnis-Einblendung, Rot-Dialog bei Mehrdeutigkeit, Sitzungsliste | | `src/ui/` | Ansichten: Scan-Ansicht, Ergebnis-Einblendung, Rot-Dialog bei Mehrdeutigkeit, Sitzungsliste |
| `src/main.js` | Verdrahtung aller Module zur lauffähigen App | | `src/main.js` | Verdrahtung aller Module zur lauffähigen App |
| `src/styles.css` | Farbvariablen (Grün/Gelb/Rot der Ampel-Rückmeldung), Layout des Kamera-Vollbilds samt Zielrahmen, Stapel-Leiste und Aktionsknöpfe sowie die Overlays für Treffer-Rückmeldung, Rot-Dialog und Sitzungsliste |
`spec`, `pn-decoder`, `ocr-extract`, `session`, `pipeline` und `storage` sind `spec`, `pn-decoder`, `ocr-extract`, `session`, `pipeline` und `storage` sind
reine Funktionen ohne Browser-Zugriff (kein `window`, `document` oder reine Funktionen ohne Browser-Zugriff (kein `window`, `document` oder
@@ -201,6 +214,15 @@ werden:
Otsu-Aufbereitung liefert auf einem echten, glänzenden Etikettenfoto Otsu-Aufbereitung liefert auf einem echten, glänzenden Etikettenfoto
tatsächlich brauchbaren Text (bisher nur an synthetischen Testbildern tatsächlich brauchbaren Text (bisher nur an synthetischen Testbildern
geprüft, nie an einem echten Foto). geprüft, nie an einem echten Foto).
- Ladezeit des WASM-Barcode-Moduls (`zxing-wasm`) beim allerersten Scan einer
Sitzung beobachten — bleibt sie deutlich unter der 10-Sekunden-Zeitgrenze
der Pipeline, und braucht ein zweiter, schnell nachfolgender Scan nicht
erneut die volle Ladezeit (Beleg, dass die Vorbereitung tatsächlich nur
einmal läuft)?
- Verbindung während des allerersten Scans einer Sitzung unterbrechen (WASM
lädt per CDN), danach mit wiederhergestellter Verbindung erneut scannen:
Das muss einen echten neuen Ladeversuch auslösen statt dauerhaft mit
demselben Fehler zu scheitern.
- Ladezeit des Tesseract-Arbeiters beim allerersten Scan einer Sitzung - Ladezeit des Tesseract-Arbeiters beim allerersten Scan einer Sitzung
beobachten — bleibt sie auf einem normalen Handy deutlich unter der beobachten — bleibt sie auf einem normalen Handy deutlich unter der
20-Sekunden-Zeitgrenze der Pipeline? 20-Sekunden-Zeitgrenze der Pipeline?