docs(wiki): vision fitness assessment for entry/exit flows

Record the verdict: the ANPR service is worthy to consume NOW as an advisory plate
IDENTITY source (Job 1) — the flows already treat a kind:"plate" read as first-class
(exit signs source:"lpr"; subscription matches read plate vs bound plates), so it feeds
an existing input with no flow rewrite. It is NOT worthy as the sole authority to open a
transient barrier (a plate is not a payment; spoofing needs Job 2 vehicle verification,
unbuilt) — gated by the confidence floor with ticket/manual fallback. Lists the four
gaps before consumption (VisionClient adapter, opt-in trigger, field accuracy,
weight-provenance). Next step is the adapter, not more model work.

Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
This commit is contained in:
2026-06-19 15:55:16 +02:00
parent 4833b4373d
commit 17fdf3d482
2 changed files with 36 additions and 0 deletions
+32
View File
@@ -143,6 +143,38 @@ The ranking should hold; re-benchmark on real on-site captures once the cameras
stake — confidence thresholds + fallback to ticket/manual; a low-confidence read must not strand a
car ([[fail-state-safety]]).
## Fitness for the entry/exit flows (assessment, 2026-06-19)
Asked after the scaffold + AL benchmark: *is the service worthy to consume in the entry/exit flows?*
The benchmark settles **accuracy** (0.99+ on clean AL plates); "worthy" then turns on **what authority
the read is given** — and the answer splits by role:
- **✅ Worthy NOW — as an ADVISORY identity source (Job 1).** The flows are **already built for a
plate**: a `kind:"plate"` [[device-events|read]] is a first-class identity today — `exit-flow.ts`
signs `source:"lpr"` for it, and `subscription-flow.ts` matches a read plate against
`subscriptionPlates` ([[subscription]] plate binding). So the service just **produces** the plate
string a snapshot → `/analyze` → (if confident) a `DeviceReadEvent{kind:"plate"}` on the existing
read bus. **No flow rewrite — it feeds an existing input.** Concretely worthy for: hands-free
**subscriber** barrier open (plate-bound), and **evidence enrichment** (plate + image on the signed
entry/exit for disputes).
- **⚠️ NOT worthy as the SOLE AUTHORITY to open a TRANSIENT barrier.** Two threat-model reasons: (1) **a
plate is not a payment** — a transient still needs a ticket + `payment`; letting a plate open the
exit would be an unpaid-exit bypass. The `min_confidence` floor → `low_confidence` → ticket/manual
fallback is the guard (already in the scaffold). (2) **Plate-spoofing** (a printed plate on a
different car) — plate-only ANPR *cannot* catch it; that needs **Job 2 (vehicle verification), which
is NOT built**. So plate-as-identity is convenience + evidence, never the lone reason a paid barrier
opens. Consistent with "advisory, never sole authority" above.
**Gaps before it's actually consumed (capable ≠ wired):** (1) the Node→service **`VisionClient`**
adapter (localhost HTTP, behind the [[device-adapter-pattern]] interface) — the real integration work;
(2) **trigger wiring** — snapshots today fire *after* a barrier opens (evidence); plate-as-identity
needs a snapshot *before* the decision, on a **per-camera opt-in** lane (open item below); (3)
**field-accuracy** unknown — re-benchmark/tune the threshold on real on-site captures
(angle/night/dirt); (4) the **weight-provenance** check (open). **Bottom line: consume it as a
gated advisory identity source feeding the existing `kind:"plate"` path — not as sole authority — and
Job 2 is still required for the anti-spoofing value.** Next concrete step is the `VisionClient` adapter
+ the opt-in trigger, not more model work.
## Open
- **Recognizer choice** — **fast-alpr (MIT, YOLOv9+CCT on ONNX) is the baseline, AL-benchmarked**: the