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.
Turn based potato combat!
Section 01 · proposed
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."
The Decade Plan · declared 2026-08-05
i through x. Each numeral ships one mechanic. The full engine already exists — it waits at the end as x.
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.
| System | State |
|---|---|
| 6-phase combat resolver · dynamic grid · 21 types · 62+ attacks | WORKING |
| Classic mode — 16v16 earth-line chess on 8×8, claim-KO promotion | WORKING |
| Multi-mon battles · general evolution · overworld/story · AI strategy | PARTIAL |
| Online PvP · capture · economy · progression · session telemetry | STUB |
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.
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
strangers finish a match unaided and ask for another
Everything travels in straight cardinal lines; nothing turns mid-flight.
S1
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
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
The tori may boop their own fellow Potuhs — a friendly launch, for repositioning and transport.
S4
The tori may walk into their own Potuhs as well as boop them. Still 100% linear.
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
8×8. Eight Potuhs each, on the back rows — yours on the bottom, theirs on the top. Nothing else exists at setup.
▸PROPOSED — the Tato coin is flipped; the flip's winner moves first. Friend games animate the flip; Compete lets the server flip.
Exactly one action with exactly one Potuh: Boop, Goop, or Move — the three buttons, in that order. Then it is their move.
One square — up, down, left, or right — onto an empty square. All four directions. Never diagonal.
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.
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
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.
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.
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.
▸PROPOSED — capture all eight enemy Potuhs. Resign is always available. No legal action passes the turn. Board Tatos are worth nothing at the end.
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.
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.
The one new rule: redirect. A teammate can re-aim an incoming Tato — linearity finally bends.
sod_tori · ii
chains get shared — clips leave the game
The one new rule: levels. Knock out a Potuh and the knocker evolves — identity enters the game.
sod_tori · iii
a player keeps a favorite piece on purpose
The one new rule: the set board. A chess-style opening with leveled pieces at the back — the first non-flat starting position.
sod_tori · iv
the two modes trade players, not split them
Reserved rings. Each is named only when it opens — the mechanic is chosen when the numeral before it is proven, not before.
sod_tori · v–ix
each numeral survives the GAMES questions
The end of the series: the full engine. It already exists — types, seasons, weather, 166 species — held as inventory and shipped last, once the numerals have built its audience.
sod_tori · x
the audience the numerals built arrives home
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
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 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
Section 03 · declared 2026-08-05
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.
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.
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 | Ratio | WCAG AA |
|---|---|---|
| Wheat on Night | 15.4 : 1 | PASS — all text |
| Wheat on Loam | 12.7 : 1 | PASS — all text |
| Straw on Night | 9.9 : 1 | PASS — all text |
| Straw on Loam | 8.2 : 1 | PASS — all text |
| Gold on Night | 11.3 : 1 | PASS — all text |
| Orange on Night | 5.4 : 1 | PASS — all text |
| Fern on Night | 5.1 : 1 | PASS — all text |
| Dust on Night | 5.3 : 1 | PASS — captions |
| Player on Night | 4.5 : 1 | PASS — at the limit |
| Enemy on Night | 3.5 : 1 | indicators / 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
Monospace is the voice. The whole game speaks in fixed-width — like the rulebook it is.
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
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.
Section 05 · declared 2026-08-05
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.
| System | Unit | Where |
|---|---|---|
| Game-i icon set | 24px stroke-2 SVG | the two verbs, the four doors, board marks |
| The Tato coin | 16×16 pixel mark | identity, favicon, future physical piece |
| Codex numbers | N-name | species identity, collection order |
| Element marks | 16px color chip | x inventory — types wait for their numeral |
Section 06 · proposed
Pixel-true illustration at dusk; photography of people playing — at the table, once the table exists.
Inventory (x-era): 175 codex portraits · 12+ NPC sprites · 7 tilesets · 15 maps. Game i draws from the earth line only.
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
AI-generated (gpt-image-1, disclosed per §13) — direction targets, not final art.
Section 07 · declared 2026-08-05
Two words carry game i: Potuhs and Tatos. Everything else in the canon waits its turn.
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.
Section 08 · proposed
Loam cards on the night, bark lines, one honest shadow — a board read by dusk light.
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.
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.
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.
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.
BOOP OR GOOP
THE RULES
PLAY A FRIEND
— or —
ENTER CODE
the link is the game
SCENARIOS
nobody watches practice
MATCHED BY GOOP
vs
← swipe the prototype — the coin rolls the rail →
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.
Boop right: the path lights, and the dashed ghost is exactly where the Tato will rest. No surprises, ever.
The launch will strike a second Tato — so the preview shows that one flying too, fresh at full distance. The whole cascade renders before you commit.
Fellow Potuhs are boopable — repositioning at launch speed. The ghost shows your teammate's landing before you send them.
The Tato will reach the enemy Potuh: the dim ✕ marks the capture that will happen — and the goop you're about to take.
← swipe the previews →
Section 09 · proposed
One shadow, bark borders, four radii. Handheld flatness is a discipline, not a deficiency.
| Token | Value | Job |
|---|---|---|
| --sh-card | 3px 3px 0 black | every card at rest — opaque, no blur |
| --sh-lift | 5px 5px 0 black | highlighted / hovered |
| (pressed) | none | press collapses flat |
| --border | 2px solid bark | cards, inputs, chips |
| --border-panel | 1px panel line | separators, quiet dividers |
| --r-sm / md / card | 4 / 8 / 12px | chips / 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.
Section 10 · proposed
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.
| Token | Value | Job |
|---|---|---|
| step | 400ms | one resolution beat — long enough to read |
| fast | 120ms | press feedback |
| snap | steps(1) | state changes — no tween between states |
no measured motion values exist — game i sets them fresh; x's Flame layer remains unsurveyed
Each beat is one --dur-step. Under reduced motion the whole chain renders at once — the log IS the fallback.
The virtual game must show what the physical game implies. This is the declared animation contract for each verb.
Section 11 · declared 2026-08-05
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 Potuh focuses; the earth answers. A Tato coin rises on an adjacent tile. The goop counter ticks up — forever.
Boop an adjacent Tato and it flies — full standard distance, tile by tile, cardinal only. Blocked target = no launch.
Contact captures. No health, no chip damage, no second chances — every piece on the board is one touch from gone.
The physics cheat that makes the game: a hit doesn't dampen — whatever moves next moves at FULL distance again.
One Boop, two captures. Launches resolve fully, one at a time, tile by tile — the whole chain is readable, then it's their move.
Select the Potuh → Boop or Goop → everything your move caused resolves to stillness → their move. No overlaps, no ambiguity.
← swipe the mechanics →
Section 12 · declared 2026-08-05
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).
"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)
Section 13 · proposed
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.
| Surface | Rule |
|---|---|
| Game code | AI welcome, directed live, human-reviewed before ship |
| The CPUs | Training 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 & balance | The rules docs are authored and human-owned; AI proposes, the bible decides |
| Session data | CPU matches are tagged CPU; never counted as human sessions or goop-farmed |
| Playtest feedback | Only what players actually said — no generated entries |
| Player data | Never 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
Sod Tori is ten games wearing one name. Here is the whole shelf, including the nine that don't exist yet.
| Game | The one mechanic it adds | State |
|---|---|---|
| sod_tori i | Boop or Goop — the pawn game | SCAFFOLDING |
| sod_tori ii | The hot potato rule — teammate redirects | DECLARED |
| sod_tori iii | Levels — KOs promote; reach 3/5/7; profit | DECLARED |
| sod_tori iv | The set board — chess-style ranks | DECLARED |
| sod_tori v | reserved — board resize is the leading candidate | SEALED |
| sod_tori vi | reserved | SEALED |
| sod_tori vii | reserved — fire, water, air enter somewhere here | SEALED |
| sod_tori viii | reserved | SEALED |
| sod_tori ix | reserved | SEALED |
| sod_tori x | Everything — types, seasons, weather, the world | EXISTS TODAY |
A numeral unseals only when the one before it is fun with real players. x is the strange one: built first, shipped last.
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
If the whole game is about the goop, governance is one question: what does the most goop win?
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.
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.
| Authority | Governs |
|---|---|
| DESIGN.md (this book) | brand: color, type, surfaces, voice, the numeral sequence |
| _status/sod_tori.md | the series status board — goals, numerals, gates |
| docs/MECHANICS_BIBLE.md | x's rules — human-owned |
| docs/GAME_CANON.md | lore: 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
The handoff sheet: stack, data model, protocol, and the ship script. Full pseudo-tables in the architecture doc.
| Layer | Decision |
|---|---|
| Client | Flutter, BLoC, portrait web-first — flutter build web; iOS/Android later from the same codebase |
| Rules engine | lib/engine/ — pure Dart, zero Flutter imports, deterministic; one test group per rulebook rule |
| Auth | Firebase Anonymous Auth (goop persists), upgradeable to full accounts later |
| Data | Firestore (native) on project hot-potato-games — matches are append-only move logs; board state is always derived, never stored |
| Hosting | Site sod-tori-i (x keeps sod-tori); the link is the game |
| Rules file | The canonical symlink: ~/Potatuhs/.config/firestore.rules → deploy via /deploy-rules, never a local copy |
| Sessions | Emit 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 script | Engine tests gate → build web with BUILD_ID dart-defines → firebase deploy --only hosting:sod-tori-i |
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.
| Artifact | Canonical home |
|---|---|
| This book + DESIGN.md + ARCHITECTURE.md | potatocore/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 strategy | potatocore/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
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).
{ 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.
| Event | Emitted by | Visible signature |
|---|---|---|
| MOVE | Move — one step | the piece slides one tile |
| GOOP | Goop — the summon | Tato rises · counter ticks +1 |
| BOOP | Boop — the strike | contact flash on the struck tile |
| LAUNCH | a Boop's causes[] | flight, tile by tile, to rest |
| CAPTURE | contact on a hostile | 1HKO — the ✕, then gone |
| CHAIN | a launch striking a Tato | fresh full-distance relaunch |
| TURN_END | resolution reaches stillness | the side chip flips |
If it changed the board and you couldn't see it, it wasn't an event — and it isn't allowed.