Scan-Time Validation Sequence¶
Date: 2026-05-17
Status: - draft reference flow - non-normative - aligned to the paper's scanner-visible trust model
Purpose¶
This sequence describes the online scanner path for a verifier that already has local trust state. It keeps the paper's distinction intact:
- QR decoding is not trust.
- Signature validation is not enough.
- A green scanner result requires issuer legitimacy, destination binding, runtime safety, and fresh enough verifier state.
Sequence¶
sequenceDiagram
participant Scanner as Scanner client
participant Verifier as Verifier API
participant Cache as Verifier cache
participant Runtime as Runtime safety provider
participant Audit as Scanner decision log
Scanner->>Verifier: Submit decoded QR payload
Verifier->>Verifier: Parse QR envelope or plain URL
alt Plain URL or unknown envelope
Verifier->>Verifier: Build orange unverified decision
Verifier->>Audit: Record scanner-visible decision
Verifier-->>Scanner: Orange, destination visible, hold/open guidance
else Signed QR artifact
Verifier->>Verifier: Verify signature and canonical claims
Verifier->>Cache: Load issuer namespace and destination policy
alt Cache missing, stale, or expired
Verifier->>Verifier: Build orange or red freshness decision
Verifier->>Audit: Record scanner-visible decision
Verifier-->>Scanner: Not green; freshness reason code
else Cache fresh
Verifier->>Verifier: Check issuer enrollment and assurance
Verifier->>Verifier: Check destination binding and redirect policy
Verifier->>Runtime: Request current destination verdict
alt Runtime unavailable
Verifier->>Verifier: Build orange runtime-unavailable decision
Verifier->>Audit: Record scanner-visible decision
Verifier-->>Scanner: Orange; visible destination but not fully checked
else Runtime risky or blocked
Verifier->>Verifier: Build orange/red runtime-risk decision
Verifier->>Audit: Record scanner-visible decision
Verifier-->>Scanner: User-visible warning with destination
else Runtime clear and binding valid
Verifier->>Verifier: Evaluate the residual vector (freshness = validity window)
Verifier->>Audit: Record scanner-visible decision
Verifier-->>Scanner: Green decision with the residual vector
end
end
end
Decision Rules¶
| Condition | Scanner result | Reason |
|---|---|---|
| Plain URL without trust envelope | Orange | No recognized issuer trust signal |
| Signature invalid | Red | Artifact cannot be trusted |
| Issuer missing from cache | Orange | Lack of enrollment is not proof of maliciousness |
| Issuer revoked or suspended | Red | Trust path fails before destination checks |
| Destination outside issuer policy | Red | Destination binding fails |
| Runtime service unavailable | Orange | Destination may be visible but not fully checked |
| Runtime service reports risk | Orange or red | Present-time destination safety changed |
| Expired envelope | Red | freshness block, cause object-expired |
| Envelope scanned repeatedly inside its window | Green if other checks pass | Every presentation is evaluated the same way |
Implementation Notes¶
- The verifier should return a
scanner-decision.schema.jsonresponse for every path, including failures. - Scanner clients should not expose raw implementation reasons as the main user message. They should map reason codes to plain green, orange, or red guidance.
- Runtime safety must be fresh enough to affect a green result.
- Verifiers should be able to resynchronize cache state without blocking every scan on the event bus.