pkr2gotrack · design
Page 01 · v2

Glossary & data model

The source of truth for what track captures. Two entities, one capture grammar, one extensible tag system, and connections that let us learn from history.

One golden idea: "New session" and "log an event" are the same card — they differ only in which fields are primary and what they write to. Second idea: everything we capture should be groupable (tags + connections) so details auto-populate from what's already known.
1 · Entities 2 · Field states 3 · Tag system 4 · Connections & memory 5 · Session fields 6 · Money model 7 · Event fields 8 · Event catalog 9 · Mirrors 10 · Gates 11 · Media library 12 · Mental-game pulse 13 · Derived metrics 14 · Still open 15 · Term glossary

1 The two entities

EntityCapturesOne-liner
SessionWhat the tournament is & how it endedThe container: title, venue/operator, format, money/chip config, structure, payouts, result — plus connections & tags.
EventWhat happened at one instantA timestamped row: money, a chip/field snapshot, a hand, a pulse, a note, media, visibility, tags.

A session has many events. Live metrics ($/hr, stack-in-BB, ICM equity) are derived (§13) — never stored. Two satellite concepts hang off both: Media (§11) and Connections (§4).

2 Field kinds & the three states

Kinds: text select tags datetime money chips count number level hand media rating toggle ref meta.

StateMeaningExamples
CapturedTyped / picked by the player.title, buy-in, your chips, players left, a hand.
Auto-generatedSystem fills it, stays editable & pins on edit (GR5), or a mirror applies it (GR6), or it's recalled from history/connections (§4).fee = 20%·buy-in, entry = now, currency = your default, finish place from a payout, venue defaults recalled.
DerivedComputed on the fly, never stored.net, ROI, $/hr, stack-in-BB, ICM equity, counts.

3 Tag system new

One extensible type:value tag system, used on sessions, events, and media. Adding a capability or category never needs a schema change — just a new namespace or value. This replaces the old confusing formatTags + free tags split.

NamespaceUsed onExamplesPurpose
game_type:sessiongame_type:mtt · game_type:cashmirrors the format field (see note)
format:sessionformat:freezeout · :rebuy · :reentry · :pko · :mystery · :last-longer · :addon · :turbocapabilities — these gate fields & event types (§10)
series: / custom:sessionseries:WSOP-C · custom:vegas-trip-26free grouping (trips, festivals, your own filing)
event:eventevent:key · event:cooler · event:bad-beatflag notable moments for later review
mind: / tilt:event / sessionmind:tilt · tilt:bad-beat · tilt:ego · tilt:fatiguemental-game triggers (§12)
media:mediamedia:chips · media:receipt · media:handclassify photos for analysis (§11)
Why this replaces the old triad: format stays a real first-class field because MTT vs Cash changes the whole schema. But the old formatTags (Re-entry/Rebuy/PKO…) were just capabilities — they become format:* tags. And the old free tags become series:/custom:. One system, fully extensible, nothing special-cased.

4 Connections & entity memory new

Every session can connect to canonical pkr2go entities. All nullable — but even when null, we still remember and group so details auto-populate next time.

FieldKindLinks toNotes
venuetextwhat the player types ("The Tote, Collingwood")
venueIdrefpkr2go venue directorynullable; matched/confirmed when we recognise the venue
operatortextthe league/series operator running it
operatorIdrefpkr2go operator directorynullable; matched when known
pkr2goEventIdrefpkr2go tournament/eventnullable; the actual scorekept event, if this session is a pkr2go game

Why it matters — mass data & auto-populate

New venue = silently remembered. When a player types a venue/operator we don't recognise, we auto-save it to their history behind the scenes (a soft entity). Next time it autocompletes and carries its learned defaults; if it later matches a canonical pkr2go entity, we link the id — no re-entry, no duplicate.

5 Session fields

= auto-generated (editable + pins). "Shows" = main card, behind More, or gated by a format: tag (§10). Money fields use the §6 convention.

FieldKindAuto?Default / sourceShows
id · createdAtgeneratedsystem
titletextalways
venue · operator + idstext · reftyped; ids matched from directory (§4)always
pkr2goEventIdreflinked if it's a pkr2go game (§4)More
formatselectMTT (Cash later) — see calloutalways
tagstagsthe §3 type:value set (incl. format:* capabilities)always
currencyselect= your profile defaultMore
tourneyStart · entryTimedatetimepaired; entry = now, tourneyStart = entryentry always
endedAt · netHoursdatetime · numberset on end; netHours = entry→end − overnightresult
buyinmoneyheadline in-play amount (what folks see)always
buyinFeemoney= 20%·buyininline, faint
buyinBountymoney= 50%·buyin (the KO split, see §6); else 0tag format:pko/mystery
buyinCostmoneyderived= buyin + buyinFeeinline, faint
reentry · reentryFee · reentryBounty · reentryCostmoneydefault to the buyin set; cost derivedtag format:reentry
rebuy · rebuyFee · rebuyCostmoneyrebuy = buyin; cost derivedtag format:rebuy
addon · addonFee · addonCostmoneyaddon = buyin; cost derivedtag format:addon
lastLongerBuyinmoneyflat side-pool entry (no prizepool/fee split)tag format:last-longer
startingChipschipsalways
rebuyChips · reentryChips · addonChipschipsrebuy/reentry chips = startingby tag
reentriesCount · rebuysCount · addonsCountcountyour own counts — from your events, editable (§13)result
gtd · structure · payoutsnumber · metaguarantee; blind ladder; prize ladderMore
finishPlace · entrantscountmirrors from payout/bust & field snapshot (§9)result
statusselectplanned · setup · live · busted · cashed · endedalways
pulse (start/end)ratingA-game · energy · focus snapshot (§12)More
format vs tags: format = the structural class (MTT now; Cash later changes the schema — blinds/sessions instead of buy-ins/places). Everything that used to be a "format tag" (re-entry, rebuy, PKO…) is now a format:* tag from §3. Cleaner and extensible.

6 Money model — one naming convention reworked

No more guessing "cost vs fee". For every entry action X ∈ {buyin, reentry, rebuy, addon}, the same four parts:

PartAlways means
Xthe headline in-play amount — what folks see / quote
Xfeethe fee / rake (auto = 20%·X, editable)
Xbountythe bounty split inside X for KO formats (auto = 50%·X → 50/50; 0 otherwise). Prize-pool part = X − Xbounty. Informational — it's already inside X, not added on top.
Xcost (derived)= X + Xfee — total cash out of pocket per bullet

Worked examples

Same rule for re-entry/rebuy/add-on. So: buyin + buyinFee = buyinCost, and bounty is a clearly-labelled split, never a mystery extra. Open to your naming — if you prefer buyinRake over buyinFee, say so and it's a one-line change here.

7 Event fields

FieldKindNotes
id · sessionIdsystem
tsdatetimeabsolute instant. Default now. Tail field.
type · categoryone of §8; category derived from type
visibilitytogglepublic · friends · private. Default per type. (friends needs the friend graph — see §14)
moneymoneycost/income amount, session currency
breakKindtoggle auto from the break→resume gap: overnight if it crosses local midnight or > 4h, else short. Editable. (threshold tunable — §14)
payload.chipschipsyour stack after this event
payload.playersLeft · totalEntriescountpaired; totalEntries → entrants
payload.chipsInPlaycount two-way with entries: chipsInPlay ⇄ totalEntries·startingChips + rebuys·rebuyChips + addons·addonChips. Give one, get the other.
payload.levellevel{ num, sb, bb, ante }
payload.rebuys · addons · reentriescountsfield-wide counters (everyone) — feed chips-in-play
payload.lastLongerLeftcountplayers alive in the last-longer pool
payload.placecountfinishing place → finishPlace + status (§9)
handhand{ position, hole, board, action, result, potChips }
pulserating{ aGame, energy, focus } 1–5 (§12)
notetextshareable per visibility. Tail field.
privateNote newtextalways player-only, regardless of visibility — your candid read / mental-hand-history.
mediamedia[]attached photos — also live in the library (§11)
tagstagsevent:key, mind:tilt… (§3)
Universal tail (every event card ends with): Media · Time (now) · Note · Private note · Visibility · Tags.

8 Event catalog — what each one shows

19 types. Key fields = the primary zone; the universal tail is implicit. Trigger: + the log sheet · footer a session action button · auto system. Lifecycle events can carry a place — there's no special "menu only" rule any more.

TypeCat.Key fields shownDefault vis.Auto-fill · gate · trigger
stackSnapshotstackYour chipspublicchips = latest stack · +
fieldSnapshotfieldPlayers left · Total entries · Level · Chips-in-play · Rebuys/Re-entries/Add-ons · LL leftpublicchips-in-play two-way (§7) · +
handhandPosition · Hole · Board · Action · Result · Pot chips (±)public+
pulse newmindA-game · Energy · Focus (1–5)privateoptional tilt:* tag · + / footer
rebuycostAmount · Chips afterpublicamount = rebuyCost; chips = latest + rebuyChips · gate format:rebuy · +
reentrycostAmount · Chips afterpublicamount = reentryCost; chips = starting · gate format:reentry · +
addoncostAmount · Chips afterpublicamount = addonCost · gate format:addon · +
tokecostAmountprivate+
foodcostAmountprivate+
lastLongerEntrycostAmountprivateamount = lastLongerBuyin · gate format:last-longer · +
otherCostcostAmountprivate+
payoutincomeAmount · Finishing placepublicplace → finishPlace + cashed · + / footer
bountyincomeAmountpublicgate format:pko/mystery · +
lastLongerPayoutincomeAmountpublicgate format:last-longer · +
breakbreakChipspublicbreakKind auto (§7) · footer
resumebreakpublicends a break · footer
bustedlifecyclePlacepublicplace → finishPlace + busted · footer
cashedlifecyclePlace · Amountpublicplace → finishPlace + cashed · footer
endedlifecycle(note)publicstamps endedAt, netHours · footer
notenoteNote textpublic+
Default visibility rule: money housekeeping (toke, food, otherCost, lastLongerEntry) and pulse default private; the rest of the journey defaults public. Always editable, now incl. friends.

9 Mirrors — events that write back to the session

Results auto-apply; config is only offered (never silent). [GR6]

TriggerWrites to sessionMode
payout/cashed.placefinishPlace + status = cashedauto
busted.placefinishPlace + status = bustedauto
fieldSnapshot.totalEntriesentrantsauto
your rebuy / reentry / addon eventsrebuysCount · reentriesCount · addonsCountauto
any entry-cost moneythe matching session cost (rebuy, …)offered when blank

10 Gates — format: tags unlock fields & event types

A format: tag (§3) is what makes the relevant fields/events appear. [GR7]

TagUnlocks
format:freezeout (default)baseline — nothing extra
format:reentryreentry money set + reentry event
format:rebuyrebuy money set + rebuyChips + rebuy event
format:addonaddon money set + addonChips + addon event
format:pko / :mysterybuyinBounty split + bounty event
format:last-longerlastLongerBuyin + LL events + lastLongerLeft
level has antethe ante input on the level field

11 Media library new

Photos go two ways: attached to an event and into a tagged, classified library we can batch-analyse later (OCR chips/levels, read receipts, auto-populate fields).

FieldKindNotes
id · playerId · keystorage object key (uploaded — not an ephemeral blob URL)
mediaTypeselectclassification: chips · field-screenshot · hand-screenshot · invoice · receipt · ticket · other
tagstagsmedia:* + any §3 tag
capturedAtdatetimewhen taken
sessionId · eventIdrefnullable — media can be standalone in the library or linked
classificationmetaauto (later)ML-suggested type + confidence
ocrText / extractedmetaauto (later)read values → prefill an event (chips, level, amount)
Why first-class: a chip photo isn't just a memory — it's data. Classifying & OCR-ing media is how we auto-populate the boring fields and run mass analysis across a player's whole history.

12 Mental-game pulse new

What mental-game coaches actually track, distilled to three one-tap ratings + a tilt tag. Deliberately not overdone.

MetricScaleWhy it's the one to keep
A-game1–5 (C→A)"Which game did you play?" — the core of Tendler's framework. One number captures decision quality vs your ceiling.
Energy1–5 (spent→fresh)Yerkes–Dodson: performance tanks when energy is too low or too high. Decision fatigue is the silent leak.
Focus1–5 (scattered→locked-in)Mental fatigue shows up as distraction & second-guessing before you feel "tired".

Sources: Tendler — The Mental Game of Poker · 888poker mental-game guide · vip-grinders session management.

13 Derived metrics — never stored, always computed

MetricMeaning
invested · returned · net · roi · perHourtotal in (cost + entry events); total out (income events); profit; ROI %; net ÷ netHours
reentriesCount · rebuysCount · addonsCountyour bullets — counted from your events (also stored on session, editable)
bountiesWon new$ & count from bounty events
bountyTargetsLeft new≈ playersLeft − 1 in a KO — how many bounties are still on the table
latestStack · stackInBB · avgStack · vsAvgchips; chips ÷ BB; total ÷ players left; you ÷ average
totalChipschips-in-play, explicit or from entries × starting (+ rebuys/add-ons) — two-way (§7)
currentLevel · playedHoursmanual level wins, else structure predictor; entry→end − overnight
prizepool · paidSpots · moneyStatusfrom payouts; ITM / bubble / from-the-money
liveEquity$ value of your seat — ICM ≤9 left, chip-chop for big fields
stackSeries · avgSeries · stackExtremes · strategyHintstrajectory; peak/low; tactical nudges
pulseAvg · pulseTrend newavg A-game/energy/focus this session & across sessions (§12)

14 What's still open — candidate fields decide

Surfaced by the review. Each is real for a serious bankroll tracker; none are in v1 unless you say so — flagged so we don't quietly balloon scope.

CandidateWhat it addsLean call
Staking / backingmarkup, % sold → personal vs investor ROI. Big for serious players (most are staked).likely v2 — touches every money metric
Satellite / ticket entryentry paid by a won ticket → cost basis differs from cash.v2 — a flag on the entry
Currency conversionroll USD/AUD/… sessions into one home-currency bankroll.needed once multi-currency is real
Multi-day bagsexplicit Day-N bagged chip count (now implicit via overnight break).nice-to-have; overnight break covers most
Table & seattable #, seat, draw — table-change events.low priority
Friend graphrequired to make friends visibility real (§7).blocks friends-visibility
Profile defaultshome currency, default visibility, home venue → feed the auto-fills.small, do early
breakKind thresholdconfirm the overnight rule (midnight-cross / >4h) (§7).one constant to set

15 Plain-English term glossary

TermMeaning
MTTMulti-Table Tournament — played across many tables, players merging as they bust.
Cash gameChips = cash, sit/leave any time. Structurally different from an MTT — hence format is a real field (v2).
Buy-in / fee / costBuy-in = headline in-play amount; fee = the house rake; cost = buy-in + fee (total out of pocket).
FreezeoutOne entry, one stack — bust and you're out. The default.
Re-entry / Rebuy / Add-onRe-entry = a brand-new entry after busting; rebuy = top up while seated; add-on = one-time top-up at a break.
Bounty / PKO / MysteryA prize for a knockout. PKO = Progressive (part of the bounty grows your own head); Mystery = bounty drawn from a random pool. Typically a 50/50 split of the buy-in.
Last-longerA side bet: whoever survives longest wins the side pool (independent of the prizepool).
GTD / Structure / Level / SB·BB·anteGuaranteed prizepool; the blind ladder; one rung; the forced bets (small/big blind + ante).
Stack / BB / Average stackYour chips; your stack in big blinds (the real measure of room); total chips ÷ players left.
ITM / BubbleIn The Money; the last spot before the money.
ICM / Chip-chopIndependent Chip Model — chips→$ equity near the money; chip-chop = simpler proportional estimate for big fields.
A-game / B-game / C-gameTendler's framing for the level you played at — your best, average, and worst decision-making selves.
TiltEmotion-driven bad play (bad beat, ego, fatigue…). Tracked here as a tag with its trigger.
Staking / markupSelling a % of your action to investors, often at a markup. Splits results into personal vs investor ROI (§14).
TokeA tip to the dealer.
Overnight (break)A multi-day gap (Day 1 → bag → Day 2). Excluded from played hours.
Public / Friends / PrivateWho sees an event when you share. The flag is the decision — no cherry-picking.