Book of Odin

5×3 line slot with a BOOK Wild/Scatter, a selected expanding symbol in Free Spins, and a 5×3 Hold & Win that triggers in either the base game or Free Spins.

book-of-odin-v2 EXISTS AS A DRAFT. NOT FOR PRODUCTION OR CERTIFICATION.

The Hold & Win described here is implemented, measured and seeded as a new config version. It is Draft: not frozen, not published, not enabled for any operator. Every RTP, frequency, volatility and maximum-exposure figure below is an internal measurement of an unfrozen pack.

FieldValue
Stable Game IDbook-of-odin
Display nameBook of Odin
Grid5 reels × 3 rows
Evaluation10 fixed paylines
Primary feature10 Free Spins with one selected expanding regular symbol
Secondary feature5×3 Hold & Win, triggerable from base game and Free Spins
GDDgdd/book-of-odin-gdd.md
Math change requestmath/book-of-odin-math-change-request.md
Math Spec (v2)math/book-of-odin-v2-math-spec.md
Evidence manifest (v2)evidence/book-of-odin-v2-evidence-manifest.md

Config versions

Two versions of one game. They share a game_id and coexist as separate game_configs rows.

VersionCanonical sourceSHA-256Status
book-of-odin-v1apps/game-engine/migrations/008_seed_book_of_odin.sqle87b3e29396ac8ff05196ae6d56fe46e7282a53b77388c1e0fc9af5d33346990demo seed, unchanged
book-of-odin-v2libs/mathengine/games/book_of_odin/book-of-odin.yamld42a0d819b9fd9e8fa52b7646925778fd82192e4512be9dfd88839b2f85e8f01Draft draft-v0.1

book-of-odin-v2 also carries a canonical config hashb3ac1b12f3225dafb6f098a01ba2ae3237383a523e217a84abe22d8544cc4f40 — computed by the repository's single canonicalisation implementation. That is the identity the runtime records on durable feature rows; the SHA-256 above identifies the source file.

Seed migration: apps/game-engine/migrations/024_seed_book_of_odin_v2.sql. It does not touch migration 008.

FieldValue
Recorded backend revisionecd6a70ade8a63e8ce35dde6b3a387f4d8df8504 (local, 2026-08-19)

The previously recorded revision 4e1e907d245b9cc9656d262336121f7655a24e5e was stale — it did not match backend HEAD when this work began — and is replaced here together with the v2 identity, not separately.

Source-of-truth boundary

The backend pack is the mathematical source of truth. This folder records the design, the measured result and the evidence trail; it does not duplicate the complete paytable, reels or weights. The seed migration's config_json is generated from the pack and must never be edited by hand.

What v2 is, in one paragraph

Whole-game RTP 97.9979% against a 98.00% target (tolerance ±0.10 pp), composed of 39.51% base lines, 30.67% Free Spins lines and expansion, 25.08% base-origin Hold & Win and 2.73% FS-origin Hold & Win, with 0.29% of GRAND inside the last two. Free Spins trigger 1 in 91.7 base spins; Hold & Win 1 in 146.0. The base and Free Spins terms are exact enumerations; the Hold & Win terms are seeded Monte Carlo over 5 000 000 features with a stated interval.

v2 does not inherit anything from v1. In particular it does not inherit v1's ~9.7% Free Spins trigger rate — that rate is a mechanical consequence of v1's reel layout rather than a tuning slip, and v2 targets ~1% by design. It also does not inherit weights or RTP from magic-vault-5x3 or hold_and_win_reference.

Status split

SurfaceStatus
book-of-odin-v1recorded, unchanged
Hold & Win player rulesimplemented as designed
Coin values and weightsdecided — see Math Spec §4.2
GRAND amountdecided — 500×, additive on a full grid
Base/FS trigger frequenciesmeasured exactly
RTP split and total RTPmeasured, reconciles to 97.9979%
Volatilityceilings and feature duration recorded; a volatility index is not
Max exposurebase and FS exact; the Hold & Win ceiling is an analytic bound
Runtime/API implementationdone, including the nested feature, with PostgreSQL integration evidence
Simulation, parity and QA evidencesee the evidence manifest; whole-game RunBatch remains blocked
Freeze / certificationnot started

Known limitation carried forward

Whole-game batch simulation is unavailable for this pack. FreeSpinsExecutor — the driver RunRound and RunBatch use — spins the base reel set and expands the configured symbol, ignoring FreeSpinsConfig.Variants entirely, so it does not model this game's free spins. The RTP decomposition routes around it using drivers that are faithful to the runtime, and the limitation is proven rather than described by libs/mathengine/games/book_of_odin/reference_driver_test.go.