Section 01 · proposed

Brand Overview

The Torus Principle: every potato emits a torus-shaped energy field. Sod is the soil; Tori are the fields. And every field ends at the horizon.

Sod Tori is a series. Game i is a derivation of chess so clear that anyone can pick it up; game x is the full engine — types, seasons, weather — hyped the whole way there. Each roman numeral ships exactly one new mechanic, and no numeral opens until the one before it is fun with real players.

"Everything is a pawn — but pawns can summon potatoes. Boop an adjacent Tato to launch it and capture on contact; Boop an adjacent Potuh to capture it outright; or launch your own pieces."

Mission
The game you get better at for a decade. Depth from simple primitives, revealed one numeral at a time.
Vision
From a link you send a friend, to Tato coins on real tables — a collected-pieces institution feeding the annual Hot Potato Games tournament.
Audiences
Strategy-first players · board-game tables · collectors, later. Derived as facets of James / Ike / Horatio (the HPG ICP arc).

Personality

Deliberate
Moves are chosen, not mashed. Thinking time is the game.
Simple
Simple to play, difficult to master. The floor is two verbs; the ceiling is the product.
Earthy
Sod first — soil, browns, living greens. The board is a field.
Horizon
So you've mastered the basics — what's next on the horizon? There is always a next numeral, a next rank, a next line. The shimmer is that promise made visible.
Strategic
Chess-like on purpose. Position, tempo, sacrifice — the thinking is the fun.

The Decade Plan · declared 2026-08-05

The Numeral Series

i through x. Each numeral ships one mechanic. The full engine already exists — it waits at the end as x.

The rule of the rings

A numeral does not open until the one inside it is fun — verified with real, non-Brett players who finish a match unaided and ask for another. Every numeral re-asks the five GAMES questions (Good? Aggressive? Marketable? Entertaining? Simple?). Profitable by iii.

The physical floor: the simplest Sod Tori is a board game — an 8×8 grid, pieces, and secret intentions. The collected physical pieces are Tato coins: the mark in section 02 is the face of that coin. What genuinely needs a computer — chain bookkeeping, room codes, replays — stays digital. Everything else must survive a kitchen table.

What already exists — sod_tori_x, held as inventory

SystemState
6-phase combat resolver · dynamic grid · 21 types · 62+ attacksWORKING
Classic mode — 16v16 earth-line chess on 8×8, claim-KO promotionWORKING
Multi-mon battles · general evolution · overworld/story · AI strategyPARTIAL
Online PvP · capture · economy · progression · session telemetrySTUB

78,275 lines of Dart, a 698-line mechanics bible, a 22-page print-to-play manual. The problem was never invention — it's sequence. The series below is the sequence. None of x's inventory carries market weight until the numerals earn it an audience.

Two constraints hold the early years steady.

  • Chessboard-playable through ST I. Nothing that couldn't run on a physical 8×8 with coins until ST II. Binds Seasons 1–4.
  • No Potuh evolution until ST III. Leveling waits two full years. Binds Seasons 1–8.

One spec sheet per numeral — tap to open. Each ships exactly one new mechanic; none opens until the one before it is fun with real players.

The rule of this numeral, up front: everything is a pawn — three verbs, one hit, one counter. No levels, no types, no redirect. The whole game is Boop, Goop, Move on an 8×8.

sod_tori · i

The Pawn Game

  • 8×8, one row of eight each — bottom vs top, chess.com familiar
  • Three actions: Boop (launch & capture) · Goop (summon) · Move (one step, any direction)
  • All hits capture (1HKO) · momentum resets on contact · blocked = no launch
  • The goop counter — every summon banked; defeat an opponent, take their match goop
  • Four doors: Tutorial · Play · Practice · Compete (matched by goop, W/L tracked)

strangers finish a match unaided and ask for another

The four seasons of I — one rule each

Everything travels in straight cardinal lines; nothing turns mid-flight.

S1

Boop or Goop

Three verbs — Move, Goop (a directional summon), Boop (launch the goop 3 tiles out). Capture is by goop: a struck Potuh burrows into the sod. Ships with the three leaderboards + the empire gauge.

S2

Walk into the goop

A choice: boop it (3 tiles) or walk into it — step 1, then send it 3 from the new tile (4 total). The extra tile costs a step of commitment.

S3

Boop your own

The tori may boop their own fellow Potuhs — a friendly launch, for repositioning and transport.

S4

Walk into your own

The tori may walk into their own Potuhs as well as boop them. Still 100% linear.

The Rulebook — game i, complete

Twelve rules, declared up front — the spec the whole app resolves against. Where Brett hasn't ruled, the rule is marked ▸PROPOSED — accept or strike, and the spec is closed.

The Law of the Sod · I–VI

I The Board

8×8. Eight Potuhs each, on the back rows — yours on the bottom, theirs on the top. Nothing else exists at setup.

II First Move

▸PROPOSED — the Tato coin is flipped; the flip's winner moves first. Friend games animate the flip; Compete lets the server flip.

III The Turn

Exactly one action with exactly one Potuh: Boop, Goop, or Move — the three buttons, in that order. Then it is their move.

IV The Move

One square — up, down, left, or right — onto an empty square. All four directions. Never diagonal.

V The Goop

Summon a Tato onto an empty adjacent square of your choice. ▸PROPOSED — one live summoned Tato per Potuh. Every summon: +1 to your forever counter, +1 to the match pot.

VI The Boop

Strike an adjacent piece. An enemy Potuh is captured outright. Any Tato is launched away from you. A friendly Potuh is launched away from you — repositioning at launch speed. Direction is always the line away from the booper.

The Law of the Sod · VII–XII

VII The Launch

A straight cardinal line, tile by tile, up to three squares. Stops on contact or at the board's edge. The edge is safe — the piece rests on the last square.

VIII Contact & the Chain

All hits are 1HKO on hostiles. ▸PROPOSED — strike an enemy Potuh: captured; the mover takes the square. Strike any Tato: it flies the same direction at fresh full distance — momentum resets; the chain. A friendly Potuh stops you one square short, harmless. Each link resolves fully before the next.

IX Legal Directions

Every verb works all four ways; only legal directions are offered. Move needs an empty step. Goop needs an empty tile. Boop needs a launch of at least one tile ▸PROPOSED: or immediate enemy contact. Illegal directions grey on the pad and never light on the board. From the starting rows every sideways Boop and Goop is grey — the opening teaches itself.

X Victory

▸PROPOSED — capture all eight enemy Potuhs. Resign is always available. No legal action passes the turn. Board Tatos are worth nothing at the end.

XI The Goop Economy

The counter is forever and never decreases. Every summon: +1. Beat a human: gain a copy of their match-pot summons — they keep theirs. The number only goes up. CPU matches: summons count; no pot, no record.

XII Honesty

Self-play, bot loops, and farmed matches are tagged and excluded from steals, records, and sessions. If the number can be cheated, the number means nothing.

The rulebook is the test plan. The engine (pure Dart, no Flutter imports — see Build & Deploy) carries one test group per rule, RB-1 through RB-12. The preview, the resolution animation, and the stored match are the same engine — divergence anywhere is a bug. The print manual and the in-app Tutorial both derive from this sheet and section 11's mechanic slides.

Every (numeral × season) stays live forever. Players say “ST I, Season 1” or “ST III, S3” to pick the mode they’re in the mood for — the ladder is a permanent menu, not just a timeline.

Section 02 · proposed

Logo System — the Tato Coin

The mark is a Tato on a coin. One day it is a physical piece on a real board; today it is the pixel identity.

The Tato coin on the night surface
on night — default
The Tato coin on a loam card
on loam — cards
The Tato coin on the shell gradient
on the shell — sparingly

The mark is the Tato coin — the pixel Tato, struck like currency. It renders pixelated on purpose: never smooth it, never upscale it with interpolation. It ships on transparency — the white-plate export is retired (2026-08-05); the coin sits directly on the night, on loam, or on the shell.

a wordmark to pair with the coin — undrawn; the box lid and the app header both need it

clear space, minimum sizes, coin-back variant — unset until the wordmark exists

Do

  • Render the coin with image-rendering: pixelated
  • Use the transparent export — the coin sits on the surface itself
  • Treat the coin as the future physical piece — it is product, not just mark

Don't

  • Ship the white-background version anywhere — retired
  • Smooth, blur, or vector-trace the pixel art
  • Set it over busy art without a quiet surface behind it

Section 03 · declared 2026-08-05

Color

Dark mode is the brand: earth browns and living greens under a dark sky — and the signature orange-gold shimmer where they meet. Never black-and-white chess.

Surfaces & text — the dusk field

Night

#14100A · page ground

Soil

#1E1811 · panels

Loam

#2B2213 · cards

Bark

#55402A · borders

Moss

#2F3A22 · green surface

Wheat

#F0E7D2 · primary text

Straw

#C8BA9C · secondary text

Dust

#93866C · tertiary

Fern

#6B8E4E · living green

Gold

#E1C916 · links, cursors

The horizon & the shell

horizon · the core theme — the shimmer where sky meets sod. Section rules, the cover, loading moments.

shell · 135° · the Potatuhs tri-orange. Hype surfaces and the coin's frame — never the game board.

Sides & vitals — unchanged game colors

Player

#2E8B57 · your side

Enemy

#C0392B · their side

HP Full

#4ADF6A · later numerals

HP Mid

#DFDF4A

HP Low

#DF4A4A

The element bench — sod_tori_x inventory

Game i is all EARTH — no types. The bench waits with x; fire, water and air enter in the reserved numerals.

prophetic's hex is malformed in theme.dart (#DAAEF50 — seven digits) — renders ecliptic slate here until the reingest fix

Pairing & contrast — measured, recorded honestly

PairingRatioWCAG AA
Wheat on Night15.4 : 1PASS — all text
Wheat on Loam12.7 : 1PASS — all text
Straw on Night9.9 : 1PASS — all text
Straw on Loam8.2 : 1PASS — all text
Gold on Night11.3 : 1PASS — all text
Orange on Night5.4 : 1PASS — all text
Fern on Night5.1 : 1PASS — all text
Dust on Night5.3 : 1PASS — captions
Player on Night4.5 : 1PASS — at the limit
Enemy on Night3.5 : 1indicators / large only

Rule: prose is Wheat on the dark earth. Side colors and the bench carry state — chips, tints, coins — never body text. The shimmer belongs to the horizon: section rules, the cover, victory. Spend it like it's rare, because it is.

Section 04 · proposed

Typography

Monospace is the voice. The whole game speaks in fixed-width — like the rulebook it is.

A/B — the parent display face (Bungee) instead of the all-mono voice:

BOOP

hero · mono 700 · clamp(2.4rem → 4.4rem)

Your move — the board is listening

h1 · mono 700 · letter-spacing 0.06em

Potatyke boops the Tato!

h2 / battle text · mono 700

Document prose sets in Outfit for reading comfort — a documentation-layer choice, not an app face. Everything the game itself says is monospace.

doc body · Outfit 400

launch 3 → contact e5 → capture · momentum reset

data · mono · all stats and IDs

The GBA scale — inherited from x

xs 8 sm 10 md 12 lg 14 · header xl 18

Five sizes, one family. The scale is deliberately tiny — handheld truth — and the app renders it crisp. Game i, mobile-first, keeps the same discipline: few sizes, one family, weight carries hierarchy.

Do

  • Monospace for everything the game says — rules, stats, battle text
  • Weight and size carry hierarchy, never a second family in-game
  • Outfit for long-form documentation prose only

Don't

  • Introduce a display face in-game without a lock here first
  • Anti-alias the pixel UI into softness
  • Set battle numbers in anything proportional

Section 05 · declared 2026-08-05

Iconography

The twelve marks that actually ship in game i — the verbs, the doors, and the coin.

The two verbs and the goop bank render in the coin color — precious things are amber. Everything else is wheat line-work, stroke 2, rounded caps. Alongside the set: the Tato coin itself (section 02) and the codex numbering — every species is N-name.png, a collector-grade convention protected from day one.

SystemUnitWhere
Game-i icon set24px stroke-2 SVGthe two verbs, the four doors, board marks
The Tato coin16×16 pixel markidentity, favicon, future physical piece
Codex numbersN-namespecies identity, collection order
Element marks16px color chipx inventory — types wait for their numeral

Section 06 · proposed

Photography & Illustration

Pixel-true illustration at dusk; photography of people playing — at the table, once the table exists.

Illustration

Pixel-true
Sprites and pieces are pixel art, rendered crisp. Never smoothed, never upscaled soft.
Dusk palette
Dark earth browns and living greens under a dark sky; the horizon shimmer is the light source. Element colors are the exceptions that read as magic.
Silhouette first
If a piece doesn't read at coin size against the night, it doesn't ship.

Inventory (x-era): 175 codex portraits · 12+ NPC sprites · 7 tilesets · 15 maps. Game i draws from the earth line only.

Photography

Inherited from the parent (answered 2026-08-03): photography is always people playing — and Sod Tori is the brand where that means a table. Two phones and a couch. Later: Tato coins in hands, the lean-in before a launch, the victory face after a chain.

no real photography exists yet — first collection lands with game i's kitchen-table alpha; the concepts below are generated stand-ins

Generated concepts — 2026-08-05

AI-generated (gpt-image-1, disclosed per §13) — direction targets, not final art.

Concept: the physical Sod Tori board game — an 8×8 dark earth board with amber Tato coins in rows, the horizon gradient across the box, pixel SOD TORI lettering
The board game — where the series ends up: Tato coins on a real table, the horizon on the box.
Concept: a retro tournament flier — two rubber-hose potato characters over a board, BOOP OR GOOP! Tournament Night, MOST GOOP WINS, BRING A FRIEND
The competition flier — Boop or Goop Tournament Night. Most goop wins. Bring a friend. (Note: the AI garbled one text block — regenerate before print.)

Section 07 · declared 2026-08-05

Mascots & Characters

Two words carry game i: Potuhs and Tatos. Everything else in the canon waits its turn.

The Potuh ranks — Potatyke is the first Potuh

Potatyke, codex number 1
Potatykecodex 001 · the first Potuh · level i
Potatot, codex number 2
Potatotcodex 002 · level ii (series iii)
Potatohr, codex number 3
Potatohrcodex 003 · level iii (series iii)

In series iii, knocking out an enemy Potuh promotes the knocker up this line — the character system and the chess system are the same system. The Tato is the other character: summoned, launched, redirected — and struck on the coin. On game i's board, Potuhs and Tatos both render as coins — 2D faces until each earns its 3D geometry.

Potuh
Your pieces — the pawns. Everything is a pawn; that's the point. They move in a T, summon, Boop, and launch.
Tato
The summoned potato. Projectile, shield, currency, coin. The whole physical product line is Tatos.
Goop
The summon, and the loot. A Potuh focuses with such intensity that the earth answers — goop, in the form of a Tato. Every summon banks on your goop counter; defeat an opponent and their match goop is yours. The game for people who like the number going up.
The sleeping words
They were called Ouips before, and one day they may be again — Ouip, Zeep, Cheep and the 166 species belong to sod_tori_x. That world exists in code, holds no market weight yet, and is not spoken by game i.
The village cast
Root Farms Village canon: Carpenter · Engineer · Merchant · Trader · Guide · Elder · Rival. Written, waiting with x.

Section 08 · proposed

UI Components

Loam cards on the night, bark lines, one honest shadow — a board read by dusk light.

Cards & buttons

The card is the atom: loam fill, 2px bark line, 12px radius, the 3px opaque shadow. A highlighted card thickens its border to 3px in the accent and lifts. Buttons are the same card, pressed — hover lifts gold, press collapses flat.

State chips & vitals

PLAYER ENEMY GOOP 47

Side colors mark ownership everywhere: chips, tile tints, territory. Game i is 1HKO — no health bars on the board. The HP system stands ready in inventory for the numerals that need it.

In situ — the stage, game i tokens

Game i is 8×8 — chess-sized, always. Same tokens as the components at left: loam card, bark line, one honest shadow, ownership by side chip. No territory tints, no overworld grid — that machinery is x inventory, dark until its numeral opens.

App surfaces — game i, visualized

The whole app, chess-app simple: four doors off the home screen, and the board. A swipeable prototype — mockups, not implementation; the scaffold reads these.

The preview — see the future before you commit

While aiming, the first tap on a lit target doesn't commit — it previews. The preview runs the real resolver ahead of time: amber dots for the path, dashed ghosts where things land, dim ✕ where things die — chains included. Second tap makes it happen, exactly as promised.

Section 09 · proposed

Shadows & Borders

One shadow, bark borders, four radii. Handheld flatness is a discipline, not a deficiency.

TokenValueJob
--sh-card3px 3px 0 blackevery card at rest — opaque, no blur
--sh-lift5px 5px 0 blackhighlighted / hovered
(pressed)nonepress collapses flat
--border2px solid barkcards, inputs, chips
--border-panel1px panel lineseparators, quiet dividers
--r-sm / md / card4 / 8 / 12pxchips / controls / cards

The rule: shadows are pure black, offset, and never blurred — a piece sitting on the board, not a glow. There is exactly one elevation story: rest, lift, pressed-flat. Nothing floats. The only glow permitted anywhere is the horizon's.

Live

rest
lift
pressed

Radii

4
8
12
pill

Section 10 · proposed

Motion

The chain is the identity: launches resolve tile by tile, one readable beat at a time. No juice before correctness.

Sod Tori's motion is not bounce — it is procedure. A Boop launches a Tato; the Tato crosses the board one tile per beat; contact captures; momentum resets and the chain continues. The player watches every step land. Motion serves the question what just happened? — never spectacle. The one indulgence: the horizon shimmers.

TokenValueJob
step400msone resolution beat — long enough to read
fast120mspress feedback
snapsteps(1)state changes — no tween between states

no measured motion values exist — game i sets them fresh; x's Flame layer remains unsurveyed

Live — one chain, step by step

01 Potuh boops the adjacent Tato
02 Tato launches — 3 tiles, tile by tile
03 Contact: enemy Potuh captured
04 Momentum resets — full distance again
05 The chain continues into the next piece
06 Board settles — their move

Each beat is one --dur-step. Under reduced motion the whole chain renders at once — the log IS the fallback.

The two verbs, on screen

The virtual game must show what the physical game implies. This is the declared animation contract for each verb.

GOOP — the summon

Press GOOP → the summoning Potuh holds focus → the target tile warms flat amber (a tint, never a gradient) → a tiny russet circle swells from the soil (one beat) → it reveals as the golden coin — a snap, not a fade (one beat). The goop counter ticks up on the reveal. Two beats, then play continues.

BOOP — the launch

Press BOOP → the Tato glides — one smooth, eased gesture with a breath of overshoot that settles exactly on the square the state machine expects. The engine still thinks tile-by-tile; the motion doesn't. Contact: the struck piece pops on impact. Momentum resets — each chain link is its own clean glide.

Section 11 · declared 2026-08-05

Layout — the Board

The layout IS the board: 8×8, one row each, thumb-reach first. Everything else arranges itself around it.

The start: chess.com-familiar. One row of eight each, portrait, board full-width, verbs at the thumb. The horizon sits above: sky, shimmer, sod.

The mechanics, one slide each

Section 12 · declared 2026-08-05

Voice & Tone

Silly, and entirely about the goop. The rules stay exact; everything around them is delightfully unserious.

Sod Tori's voice is silly on purpose, and it is all oriented toward one thing: the goop. Menus talk about goop. Victory talks about goop. Defeat consoles you about the goop you'll earn back. The one place silliness stops is rules text — a rule states facts, monospace, no vibes — and then the very next line is about goop again. Chess words are worn proudly (pawn, capture, board); external marketing defers to Butter (smooth, brief, never winks — even about goop).

Samples

"BOOP OR GOOP!"

"GOOP GET. The earth provides. (+1 goop)"

"Victory! Their goop is your goop now. That's 12 goop. Goop."

"Defeat. The goop remembers. The goop always remembers."

"Tato launched — 3 tiles. Contact. Capture." (rules text: exact, always)

Words we use

  • Potuh — your pieces, the pawns of the game
  • Tato — the summoned potato; the coin; the projectile
  • Boop — the adjacent hit: launch a Tato, capture a Potuh
  • Goop — the summon, and the loot it banks
  • Pawn, capture, board — chess words, worn proudly

Words we hold (and words we never use)

  • Ouip · Zeep · Cheep — sod_tori_x vocabulary; asleep until its numeral
  • Pokeball, Pokémon, trainer, catch — the world never borrows
  • Vibes-y hedges in rules text — rules are exact

Section 13 · proposed

AI Policy

AI-assisted, human-directed — and the CPU fights aggressive, not strategic. That's doctrine.

AI builds the game. The CPUs never stop training. You can always vs one.

SurfaceRule
Game codeAI welcome, directed live, human-reviewed before ship
The CPUsTraining constantly against each other to find the best strategy — and one is always available to vs. Beat today's best and it learns from the loss
Rules & balanceThe rules docs are authored and human-owned; AI proposes, the bible decides
Session dataCPU matches are tagged CPU; never counted as human sessions or goop-farmed
Playtest feedbackOnly what players actually said — no generated entries
Player dataNever enters third-party AI tools

The always-open dojo. Somewhere, the CPUs are playing each other right now, working out what the best strategy even is — and you can always walk in and vs one. Disclosure is the default: Sod Tori is built in the open with Claude Code, the rules are a bible, not a black box, and every resolution is explainable.

Section 14 · declared 2026-08-05

Sub-brands & Ecosystem — the Ten Games

Sod Tori is ten games wearing one name. Here is the whole shelf, including the nine that don't exist yet.

GameThe one mechanic it addsState
sod_tori iBoop or Goop — the pawn gameSCAFFOLDING
sod_tori iiThe hot potato rule — teammate redirectsDECLARED
sod_tori iiiLevels — KOs promote; reach 3/5/7; profitDECLARED
sod_tori ivThe set board — chess-style ranksDECLARED
sod_tori vreserved — board resize is the leading candidateSEALED
sod_tori vireservedSEALED
sod_tori viireserved — fire, water, air enter somewhere hereSEALED
sod_tori viiireservedSEALED
sod_tori ixreservedSEALED
sod_tori xEverything — types, seasons, weather, the worldEXISTS TODAY

A numeral unseals only when the one before it is fun with real players. x is the strange one: built first, shipped last.

Parent chain
Potatuhs → Hot Potato Games (Clubs) → Sod Tori. Where this spec is silent, the HPG book and then the umbrella govern.
Siblings
Explore The Cell (the launch artifact) · Tater Dash (iOS runner). Sod Tori is the mastery pillar among them.
Sub-products
The Tato coin line (the collected physical pieces) · Plate Edition (print-to-play). "Tori Chess" retires into x's Classic-mode label; the series carries the public name now.

The Potato World Saga. The repo carries a seven-game franchise arc (docs/POTATO_WORLD_SAGA.md). It is architecture beyond x: nothing in this book budgets for it before the numerals are fun — but the brand is built knowing it's there.

Shared hard core inherited from the deck: the tri-orange shimmer, honest sessions, the GAMES questions. Sod Tori's own deviation, recorded: the dark-horizon surface system and the all-mono voice.

Section 15 · proposed — Brett rules on the prize

Governance — the Goop & its Prize

If the whole game is about the goop, governance is one question: what does the most goop win?

The prize — proposed, unruled

Proposal: each season, the player holding the most goop is struck a physical Tato coin — real, numbered, one per season, never sold — and a named seat at the annual Hot Potato Games tournament. The digital number buys the physical object: goop becomes the coin it was always a picture of.

Alternatives on the table: a goop-leaderboard title (silly, loud, expires with the season) · naming rights to a Practice scenario · the season's board skin. The rule that matters: the prize must be worth wanting and impossible to buy — goop is earned or taken, never purchased.

Goop integrity

The counter only counts if it can't be cheated: CPU matches earn no stealable goop · self-play and bot loops are tagged and excluded (the honest-sessions doctrine) · Compete steals require a completed, real match. If the number can be farmed, the number means nothing.

AuthorityGoverns
DESIGN.md (this book)brand: color, type, surfaces, voice, the numeral sequence
_status/sod_tori.mdthe series status board — goals, numerals, gates
docs/MECHANICS_BIBLE.mdx's rules — human-owned
docs/GAME_CANON.mdlore: the Torus Principle, the village, the vocabulary
theme.dart (per game)app tokens — mirrors this spec after reingest

the prize is UNRULED — the proposal above awaits Brett's yumutsu

session telemetry lands with game i (gameId sod_tori_i, SESSIONS-CONTRACT.md)

Asset naming stands: {brand}-{category}-{label}-{season}.{type} · codex N-name.png. Registry: brands.potatocore.com. Lock here → reingest → QA in-app.

Build & Deploy · Flutter + Firebase — locked 2026-08-05

Build & Deploy

The handoff sheet: stack, data model, protocol, and the ship script. Full pseudo-tables in the architecture doc.

The stack

LayerDecision
ClientFlutter, BLoC, portrait web-first — flutter build web; iOS/Android later from the same codebase
Rules enginelib/engine/ — pure Dart, zero Flutter imports, deterministic; one test group per rulebook rule
AuthFirebase Anonymous Auth (goop persists), upgradeable to full accounts later
DataFirestore (native) on project hot-potato-games — matches are append-only move logs; board state is always derived, never stored
HostingSite sod-tori-i (x keeps sod-tori); the link is the game
Rules fileThe canonical symlink: ~/Potatuhs/.config/firestore.rules → deploy via /deploy-rules, never a local copy
SessionsEmit play + session events, gameId sod_tori_i, per SESSIONS-CONTRACT.md — cell_mobile owns the counter
The CPU (v1)Local engine bot, greedy (capture > chain > develop); the constantly-training ladder of bots is the roadmap
Ship scriptEngine tests gate → build web with BUILD_ID dart-defines → firebase deploy --only hosting:sod-tori-i

The tables, in brief

users/{uid} — displayName · goop · wins · losses
matches/{id} — code · mode · players · firstMove ·
  moves[] (n · by · verb · potuh · target) ·
  matchGoop{green,red} · winner
queue/{uid} — goop · enqueuedAt (window widens)
scenarios — LOCAL json; Practice is offline
events — emit-only, SESSIONS-CONTRACT shape

The doctrine that makes it small: a match IS its move list. Every client runs the same engine over the same moves; preview, animation, and truth are one function. Transactions enforce turn parity; history is append-only; the goop steal is auditable from the log.

Full pseudo-tables, relationships, turn protocol, and security notes: ARCHITECTURE.md — the architecture link. It ships beside this book.

The linked triangle — brand · customer · market

ArtifactCanonical home
This book + DESIGN.md + ARCHITECTURE.mdpotatocore/brands/public/brands/sod-tori/head/
Ideal customer profile (facets of James / Ike / Horatio)potatocore/ic-profiles/hotpotatogames/sod-tori/ICP.md
Go-to-market strategypotatocore/gtm-strategies/hotpotatogames/sod-tori.md
Series status board (the consultant reads this)hotpotatogames/_status/sod_tori.md

Each artifact cites the other two. Change one, ripple all three — the triangle is the spec.

The Event Log · the receipt behind every move

Event Log — reversible & auditable

Nothing on this board happens invisibly. Every state change is an event, appended to a log that can be replayed, reversed, and audited. The log is the single source of truth — the board is just its latest frame.

The doctrine, stated up front. A move is not a mutation — it is an event. The board never changes except by appending an event and folding it in. Same events, same order → same board, every time, on every device. Preview, live resolution, and stored replay are the same reducer run over the same events — divergence anywhere is a bug (see the Rulebook, RB-1…RB-12).

The event record

{ seq: 128,
  turn: 12, actor: "P",
  type: "BOOP",
  from: [4,6], dir: "UP",
  causes: [ {t:"LAUNCH", pc:"tato", path:[…]},
         {t:"CAPTURE", at:[4,2], pc:"potuh"} ],
  goopΔ: 0, at: 171…, sig: "a1f9" }

One player action, one top-level event; every consequence it triggers rides inside causes[], resolved in order, tile by tile. seq is monotonic and gap-free. sig hashes the prior signature plus this event — a tamper-evident chain, so a doctored log fails its own math.

Every verb is an event

EventEmitted byVisible signature
MOVEMove — one stepthe piece slides one tile
GOOPGoop — the summonTato rises · counter ticks +1
BOOPBoop — the strikecontact flash on the struck tile
LAUNCHa Boop's causes[]flight, tile by tile, to rest
CAPTUREcontact on a hostile1HKO — the ✕, then gone
CHAINa launch striking a Tatofresh full-distance relaunch
TURN_ENDresolution reaches stillnessthe side chip flips

If it changed the board and you couldn't see it, it wasn't an event — and it isn't allowed.

Reversible

Undo
Truncate the log to seq−1 and re-fold from the last snapshot. Available in Tutorial & Practice; a real take-back, not a patch.
Replay
Any match re-runs from seq 0 — scrub, step, or watch. The clip that leaves the game (Rulebook §VIII) is just a replay with a share code.
Snapshots
Every N events the folded board is cached, so undo and mid-match join are O(1), not O(history).

Auditable

Append-only
Events are never edited or deleted — only appended. The board is derived; the log is authoritative.
Server-authoritative
In Compete the server folds the log and owns the outcome. No undo online — a committed event is final.
Honest-sessions gate
The signature chain plus actor timing flags self-play, bot loops, and farmed matches (Rulebook §XII) — excluded from steals, records, and the session count.