Bluetooth observation is evidence, not proof of identity or intent.
The app should show confidence as a conservative classification built from observable signals.
| Level | Meaning | Example |
|---|---|---|
LOW |
One weak clue matched | Name contains a known word, generic service UUID |
MEDIUM |
One strong clue or several weak clues matched | Manufacturer data family, known service pattern, repeated appearance |
HIGH |
Multiple independent clues point to the same class | Vendor/manufacturer data + service UUID + repeated stable behavior |
CRITICAL |
High confidence plus user-relevant behavior | Watchlist hit, repeated follow-me pattern, or user-confirmed suspicious device |
- Name-only matching cannot exceed
MEDIUM. - RSSI cannot prove distance.
- A random/private address lowers identity confidence unless correlated by stronger evidence.
- A watchlist hit is strong only for that saved fingerprint, not for the real-world owner.
- "Axon", "police", or similar labels must be shown as device classification evidence, not as proof that a specific service/person is present.
- Public-safety-like review decisions can mark repeated benign context as
Known SafeorFalse Positive, but they do not prove or disprove that a real-world service/person is present. - Active probing results must be marked as active evidence.
CRITICALshould be reserved for user-confirmed/watchlist evidence or very strong independent evidence. The current implementation uses it for watchlist hits and registry entries that are explicitly marked critical.
The domain model is implemented in
core/model/src/main/kotlin/io/blueeye/core/model/DetectionEvidence.kt.
Current confidence mapping:
NAME:LOWfor a plain advertised name,MEDIUMfor tactical name matches.MODEL:LOWfor inferred model metadata shown as identity context, not a risk signal.OUI: mapped from tactical registry confidence.MANUFACTURER_ID:HIGHfor tactical manufacturer matches.SERVICE_UUID:HIGHfor tactical service UUID matches,LOWfor neutral identity context. Provenance is explicit: BLE advertisement, Classic SDP, or active GATT service discovery.RAW_PAYLOAD:LOWwhen an advertisement payload was decoded.RSSI_PATTERN:LOW,MEDIUM, orHIGHfrom Follow-Me status.IDENTITY_CARRYOVER:LOWwhen a rotating address was correlated with an existing device record; this is continuity context, not a risk signal. User review of that merge is stored asIdentityCarryoverVerdict, not as a higher confidence risk signal. Reviewed verdicts are also copied into the carryover evidence context soFALSE_MATCHandINCONCLUSIVEdecisions stay visible in Details/export without raising confidence.WATCHLIST:CRITICALfor user-selected saved fingerprints.GATT_PROBE/RFCOMM_PROBE:MEDIUMand marked as active evidence.
Every classified device should expose:
- confidence level,
- reasons,
- evidence source,
- last observation time,
- whether evidence came from passive scan or active probe,
- raw/parsed values where safe to show.
Use:
- "Matches Axon-like Bluetooth signature"
- "Possible tracker behavior"
- "Watchlist device reappeared"
Avoid:
- "Police nearby"
- "You are being tracked"
- "Distance: 3m"