Fortunautica creates the hidden answers first and publishes a digital fingerprint. Your guesses are then locked before each answer is revealed. Afterward, anyone can check that neither side was changed.
Before: the hidden sequence is created and fingerprinted.
During: each guess is saved before its answer appears.
After: the sequence is revealed and checked against the original fingerprint.
Result: the score can be independently recalculated from the saved data.
| protocol | version | spec hash | |
|---|---|---|---|
arena_duel_v1 | 1.0.0 | 8c4fa5308e5e0b3ded7ba1d1… | spec |
arena_duel_v2 | 2.0.0 | 897f5f9b5f21302344ae7936… | spec |
daily_target_v1 | 1.0.0 | 28f558f41b0fc0b0dc99e112… | spec |
play_solo_binary_v1 | 1.0.0 | 901893d71e1890ce7de62303… | spec |
research_c1_v1 | 1.0.0 | 4a1aada22c60bf7d8c4e1c76… | spec |
struct_target_v1 | 1.0.0 | 583157a4b8655320b35b85f1… | spec |
Fortunautica event semantics (protocol v1)
LIFECYCLE
ANNOUNCED -> OPEN -> LOCKED -> LIVE -> SEALED -> FINAL
terminal alternatives: DRAW | CANCELLED | VOID
OPEN the event exists, the target is committed, predictions may be made
LOCKED predictions are closed; no further guesses are accepted
SEALED the session is closed and the evidence chain is computed
FINAL public verification succeeded; the result is authoritative
VOID verification failed, or a correction superseded the result
Corrections: a FINAL event is immutable except through the published
exceptional correction mechanism (below). Original values are never
overwritten; each correction records prior status and prior evidence root.
TARGET DERIVATION
A 128-byte block is drawn from the hardware QRNG and its SHA-256 is published
as the target commitment BEFORE the first guess. The preimage is revealed
publicly only after SEALED.
target_commit = sha256(preimage)
bit i = (preimage[i // 8] >> (i % 8)) & 1 (bit 0 = LSB)
EVIDENCE CHAIN
guess_norm = user_guess if answered, else "miss"
leaf_hash = sha256(f"{session_id}|{seq}|{qrng_bit}|{guess_norm}|{ts}")
head_hash = sha256(concatenation of leaf_hash in seq order)
PROTOCOL REGISTRY
Each event names a protocol id. The protocol spec is published with a
canonical SHA-256: sha256(json.dumps(spec, sort_keys=True,
separators=(",", ":"))). Published specs are never rewritten; a change
requires a new protocol id.
EXCEPTIONAL CORRECTIONS
reason codes: protocol_defect | target_source_failure | evidence_mismatch |
identity_fraud | operator_error | legal_order
new status: VOID | CANCELLED | DRAW
Each correction requires a written note (>= 20 chars) and is published on the
event page together with the prior status and prior evidence root. At most one
correction is accepted per event; any further change requires force=true and is
recorded as an additional, publicly visible correction.
HOW TO VERIFY WITHOUT TRUSTING US
1. GET /api/events/{event_id} the claim
2. GET /api/events/{event_id}/reveal the preimage and every trial row
3. GET /api/integrity/protocols/{id} the protocol spec and hash
Then recompute, locally: sha256(preimage) == target_commit; every derived bit
equals the recorded bit; every leaf hash and the head hash reproduce; the
protocol spec hashes to the recorded protocol hash. A reference implementation
is included with the service: tools/verify_event.py <base_url> <event_id>.Local, standard-library only: python3 tools/verify_event.py https://fortunautica.com FNA-EVT-2026-000003. It fetches only public data and recomputes the entire evidence chain itself.
You do not have to trust the player or Fortunautica. The finished data contains what is needed to check the result.