You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(design): key rumble compatibility and epochs on behaviorVersion
Release versions stay lockstep across all artifacts; a server-owned
integer behaviorVersion, bumped only on game-observable changes, becomes
the compatibility contract for clients, result validation, and epochs.
Supersedes the earlier patch-vs-minor rule.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/design/rumble/README.md
+9-5Lines changed: 9 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -112,7 +112,7 @@ tracks them so sub-documents stay consistent:
112
112
|-----------|----------------|
113
113
|**Ruleset and scoring = RoboRumble/LiteRumble, unchanged** (APS primary; Win%, Survival, Vote, NPP/ANPP, KNNPBI, Glicko-2). Battle tested for two decades; do not reinvent. | Aggregation doc |
114
114
|**Own-bot priority: yes**, with the self-reported-only marker plus independent confirmation for trust. | Client doc |
115
-
|**Engine pinning at minor granularity, patch range allowed.**Requires an engine release-policy commitment: patch releases (1.1.x) must never change game-observable behavior; anything that could alter outcomes is at least a minor bump. A minor bump obsoletes all clients at once and opens a new result **epoch**. | Client + aggregation docs |
115
+
|**Engine pinning by `behaviorVersion`.**Release versions stay lockstep across all Tank Royale artifacts (the right model for the product); a separate integer `behaviorVersion`, owned by the server and bumped only on game-observable changes (server physics/scoring/turn processing/RNG plus Bot API behavior), is the compatibility contract. Compatibility, client rollout, and result **epochs**all key on it; releases that do not bump it (e.g. GUI-only) cause no rollout and no epoch reset. Supersedes the earlier patch-vs-minor rule. | Client + aggregation docs |
116
116
|**One active version per bot** (version bump supersedes the old one, RoboRumble style), plus a per-owner **bot slot** budget. | Submission doc |
117
117
|**Owner (forge account) is distinct from authors (display names)**; ownership drives permissions, slots, bans, and self-report detection. | Submission doc |
118
118
|**Banning** of owners/bots via an auditable list; enforced automatically in submission CI and result validation. | Submission + aggregation docs |
@@ -148,9 +148,12 @@ Questions that span more than one sub-document. Per-document questions live in t
148
148
2.**Game types.** Start with 1v1 only, or 1v1 and melee from day one? Melee multiplies the pairing
149
149
space and the matchmaking math.
150
150
3.**Working name.** "Tank Royale Rumble" is used throughout as a placeholder.
151
-
4.**Enforcing patch behavior-invariance.** The epoch model leans on "patches never change game
152
-
behavior". How is that guarded in the engine's release process (deterministic replay regression
153
-
tests against recorded battles would be the strong version)?
151
+
4.**Guarding `behaviorVersion` bumps.** The epoch model leans on the behavior version being
152
+
bumped exactly when game-observable behavior changes. The strong guard is a deterministic
153
+
replay regression test in the engine's CI: replay recorded battles and compare outcomes; an
154
+
unintended difference fails the build, an intended one requires bumping `behaviorVersion` in
155
+
the same change. The concrete test design (which battles, how many, where recordings live) is
156
+
open.
154
157
155
158
## Glossary
156
159
@@ -163,6 +166,7 @@ Questions that span more than one sub-document. Per-document questions live in t
163
166
| Issue-ops | Using forge issues as a write-free submission inbox, drained by CI. |
164
167
| Single writer | The rule that only the aggregation CI commits to `rumble-data`. |
165
168
| Owner | The forge account that submitted a bot; drives permissions, slots, bans. Distinct from the display `authors` in the bot config. |
166
-
| Epoch | The result partition for one engine minor version. Patches stay in the epoch; a minor bump opens a new one and the ranked table restarts sampling. |
169
+
| Behavior version | Server-owned integer bumped only on game-observable changes (physics, scoring, turn processing, RNG, Bot API behavior). The compatibility contract between engine, clients, and results; independent of the lockstep release version. |
170
+
| Epoch | The result partition for one `behaviorVersion`. Releases that keep the behavior version stay in the epoch; a bump opens a new one and the ranked table restarts sampling. |
167
171
| Practice mode | Client mode for private tuning battles; results are never submitted. Ranked mode auto-submits everything. |
168
172
| Journal | The client's local append-only file of ranked results, submitted in batches. |
├── scripts/aggregate.py (facts → all projections, pure function)
@@ -45,7 +45,7 @@ sequenceDiagram
45
45
Cl->>Ib: result payloads (all day)
46
46
CI->>Ib: drain all open items
47
47
loop each payload (a batch of 1..N results)
48
-
CI->>CI: validate.py per result<br/>(schema, engine pin, plausibility,<br/>known active bots, ban list,<br/>duplicate battleId / payload hash)
48
+
CI->>CI: validate.py per result<br/>(schema, behaviorVersion pin, plausibility,<br/>known active bots, ban list,<br/>duplicate battleId / payload hash)
49
49
alt valid
50
50
CI->>Raw: stage file (content-addressed name)
51
51
else invalid
@@ -188,13 +188,15 @@ batch for the rest) if full recompute proves slow.
188
188
`bots/index.json`, see the submission document). Superseded, retired, and disqualified versions
189
189
keep their facts and per-version detail shards but leave the ranked table, exactly like a
190
190
RoboRumble version bump.
191
-
- Results are partitioned into **epochs by engine minor version** (`1.1`, `1.2`, ...). Patch
192
-
releases do not open a new epoch (the engine release policy guarantees patches are
193
-
behavior-neutral; see the client document). A minor/major bump opens a new epoch: the ranked
194
-
leaderboard is computed from the current epoch only, while old epochs remain browsable archives.
195
-
This is the honest consequence of "mixed engine versions corrupt comparability": rather than
196
-
pretending results across minors are comparable, the rumble restarts sampling and lets
197
-
matchmaking (everything is suddenly under-sampled) rebuild the table quickly.
191
+
- Results are partitioned into **epochs by `behaviorVersion`** (the server-owned integer that
192
+
bumps only on game-observable changes; see the client document's Engine Pinning section). The
193
+
release version is irrelevant here: a GUI-only release, whatever its semver bump, keeps the
194
+
behavior version and therefore the epoch. A `behaviorVersion` bump opens a new epoch: the
195
+
ranked leaderboard is computed from the current epoch only, while old epochs remain browsable
196
+
archives. This is the honest consequence of "mixed game behavior corrupts comparability":
197
+
rather than pretending results across behavior versions are comparable, the rumble restarts
198
+
sampling and lets matchmaking (everything is suddenly under-sampled) rebuild the table
199
+
quickly.
198
200
199
201
### Matchmaking output
200
202
@@ -240,7 +242,7 @@ as the classic rumble; per-pairing averaging makes extra samples harmless.
Copy file name to clipboardExpand all lines: docs/design/rumble/client-battles-and-results.md
+40-22Lines changed: 40 additions & 22 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -152,7 +152,7 @@ or corrupted results, which is a bigger practical risk than malicious bot code.
152
152
| Layer | Mechanism | Cost |
153
153
|-------|-----------|------|
154
154
| Identity | The forge account that opens the result issue / fork-PR **is** the identity. No extra key management in v1. | Free |
155
-
| Plausibility | Server-side validation: schema, engine version matches the pin, scores consistent with rounds and ranks, known bot versions, duplicate hash detection. | Script |
155
+
| Plausibility | Server-side validation: schema, `behaviorVersion` matches the pin, scores consistent with rounds and ranks, known bot versions, duplicate hash detection. | Script |
156
156
| Consensus | With dozens of clients, most pairings get samples from several submitters. Per-client deviation from pairing consensus is computed; outliers are flagged in a report for moderators, and a client can be quarantined (its results excluded by the pure recompute, since facts are never deleted). | Script |
157
157
| Self-report marker | Pairings sampled only by a participant's owner stay "unconfirmed" until an independent client contributes (see above). | Script |
158
158
| Evidence | Each battle has a `battleId` (UUID) binding the result record to a locally kept, read-only `.battle.gz` replay whose SHA-256 is in the record. Moderators can request the replay for a disputed result. Spot-check, not universal verification. See "Replay evidence store" below. | Optional |
@@ -170,7 +170,7 @@ One immutable JSON file per battle. Participant fields map 1:1 onto the existing
0 commit comments