docs(wiki): DT-008 phantom-scan diagnosis + backfill bypass/relay-test concept pages

Two independent wiki updates bundled (all docs):

1. dingtian-dt008-reader.md: phantom optical decodes on the park-buzi EXIT
   reader (empty pre-opening site, low-sun afternoons). Chain of evidence:
   READ log lines carry the reader's own serial (H05MA5B0) → physical device,
   not a network source; snapshot shows nobody present; code shapes are the
   giveaway (6-digit numerics = checksum-less Interleaved 2-of-5, lone "C" =
   Code39/Codabar artifact) → 1D engine decoding sun-made stripe patterns
   (striped arm, fence shadows, glare). No fraud exposure (11-digit Luhn ids
   can't match); noise only. Fix on the entity page: vendor-tool symbology cut
   to QR+Code128 + min decode length, BOTH readers; config lives ON the device
   → re-apply after any factory reset/swap. Deliberately NOT filtering
   impossible codes server-side — probe recording is the anomaly path's job.

2. Backfilled two shipped-but-undocumented features (six code files already
   linked the first page as if it existed):
   - concepts/entry-presence-bypass.md — admin drops a FAULTY presence signal
     (granular radar/camera by decision, not a master switch); every flip is a
     signed config_change; persists till off; tickets stamped presenceBypassed;
     radar-bypass cooldown tradeoff; "the admin is not the adversary, but
     trusted never means invisible".
   - concepts/setup-relay-test.md — admin-only commissioning pulse, signed
     barrier_open_command BEFORE the fire so a test open never reads as the
     out-of-band-open fraud signal; saved controllers/declared relays only;
     radarAlert lamps excluded; pulseOpen only.
   Cross-linked from operator-issued-entry.md, cataloged in index.md, logged.

Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
This commit is contained in:
2026-07-04 19:00:49 +02:00
parent b4f1418858
commit 35e593ab63
6 changed files with 175 additions and 4 deletions
+28 -1
View File
@@ -2,7 +2,7 @@
type: entity
tags: [parking, hardware, readers, qr, dingtian]
sources: [dingtian-dt008]
updated: 2026-06-28
updated: 2026-07-04
status: open
---
@@ -120,6 +120,33 @@ host in the **vendor tool**; assign + enter its serial + bind it here.
- `output` is replied as `0` (Access). Confirm on hardware whether the reader needs `1`/`2` (WG26/34)
to drive its access line, vs. `0`.
## ⚠️ Phantom optical decodes from sunlight patterns (park-buzi, 2026-07-04)
With the site EMPTY (pre-opening, verified live + by snapshot), the **exit reader
(`cjihao=H05MA5B0`) pushed spontaneous scans** at random afternoon times (observed 16:38–18:14,
low-western-sun hours): `cardid` values like `997492`, `389861`, `024358`, `192793` — and once a
lone **`C`**. Server logs (`READ serial=` lines) confirm the pushes carry the reader's own serial
and resolve to its assigned row, so this is **the physical reader decoding, not a network source**.
**Diagnosis:** the scan engine ships with many 1D symbologies enabled, some with weak/no checksums.
Six-digit all-numeric strings are the signature of **Interleaved 2-of-5** (even-length, digits-only,
no checksum — any high-contrast stripe pattern of the right proportions "decodes"); a lone `C` is a
**Code39/Codabar** artifact (Codabar start/stop chars are A–D). Low sun creates exactly such
patterns at a gate: the striped barrier arm, fence/railing shadows sweeping as the sun moves, glare
bands. RFID noise would instead give repeating UID-shaped values.
**Impact: noise, not risk.** Every phantom was REFUSED fail-closed (`exit.refused.noSession`, a
signed anomaly — #52–58 in the feed); a phantom can never match a ticket ([[ticket-encoding]] ids
are 11-digit + Luhn, so a 6-digit read has nothing to match). Do NOT filter "impossible" codes
server-side — recording every probe of an exit reader is what the anomaly path is for; fix at the
source instead:
**Fix (vendor tool, per reader — config lives ON THE DEVICE, not in our DB):** disable every
symbology except **QR + Code128** (all our credentials); if offered, set **minimum decode length
≥ 10** and require checksums. Apply to BOTH readers. ⚠️ A factory reset or a swapped unit silently
re-enables the phantom symbologies — re-apply after any reset/replacement. Physical fallback if any
noise survives: hood/visor the window, tilt it down, avoid facing the striped arm.
## ⚠️ Reply MUST set `Connection: close` (verified on hardware)
The reader sends `Connection: keep-alive` but **only acts on the verdict (beep/output) once the TCP