How the game stays honest

We lock the answers before you play.

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.

In plain English

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.

Technical protocol and registered versions

Registered protocols

protocolversionspec hash
arena_duel_v11.0.08c4fa5308e5e0b3ded7ba1d1…spec
arena_duel_v22.0.0897f5f9b5f21302344ae7936…spec
daily_target_v11.0.028f558f41b0fc0b0dc99e112…spec
play_solo_binary_v11.0.0901893d71e1890ce7de62303…spec
research_c1_v11.0.04a1aada22c60bf7d8c4e1c76…spec
struct_target_v11.0.0583157a4b8655320b35b85f1…spec

Technical specification

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>.

Verify it yourself

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.